From 4140019ddaae0ae883962647b3997d4aca0094b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=98=8E=E6=B3=A2?= Date: Wed, 17 Apr 2019 23:00:53 +0800 Subject: [PATCH 1/4] tijiao --- .idea/workspace.xml | 371 +++++++++++++----- .../main/resources/config/application-dev.yml | 8 + .../target/classes/config/application-dev.yml | 8 + 3 files changed, 288 insertions(+), 99 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index e1eee16..07acb38 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,36 +2,8 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + @@ -58,54 +30,54 @@ + + + - - - - + + + + + + - + + - - - + + + + + - + + - + + - - - - - - - - - - - + @@ -149,10 +123,9 @@ @@ -228,9 +194,15 @@ + + + + + + - + @@ -248,7 +220,7 @@ - + + + + + + + + + + @@ -297,18 +284,18 @@ - - + - + @@ -318,7 +305,7 @@ - + @@ -337,7 +324,7 @@ - + @@ -351,75 +338,261 @@ - + - - + + - + - - + + - + - - + + - + - - + + + + + + + + + - + + + + + + + + + JAVA + com.my.simon.generator.JavaGeneratorFactory + + com.my.simon.generator.JavaGeneratorFactory + + + + + + com.my.simon.generator.JavaGeneratorFactory + + + All + private + + + + + + + JAVA + com.my.simon.generator.JavaGenerator + + com.my.simon.generator.JavaGenerator + com.my.simon.base.Generator + + + + + + + + + + + com.my.simon.generator.JavaGenerator + + + All + private + + + + + + + + + + JAVA + com.my.simon.generator.JavaAppBuilder + + lombok.extern.slf4j.Slf4j + com.my.simon.base.Builder + com.my.simon.generator.JavaAppBuilder + + + + + + + + + + + + + + + + + + + com.my.simon.generator.JavaAppBuilder + + + All + private + + + + + + + + + + - - + + - + + + + + + + + + + + + + + + + + + + - - + + - + - - + + - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/generator-web/src/main/resources/config/application-dev.yml b/generator-web/src/main/resources/config/application-dev.yml index b38dd33..0c4c4ae 100644 --- a/generator-web/src/main/resources/config/application-dev.yml +++ b/generator-web/src/main/resources/config/application-dev.yml @@ -9,6 +9,14 @@ spring: force: true charset: UTF-8 enabled: true + datasource: + name: c2c + url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8 + username: root + password: 123456 + # 使用druid数据源 + type: com.alibaba.druid.pool.DruidDataSource + driver-class-name: com.mysql.jdbc.Driver mybatis: mapperLocations: classpath*:mapper/*Mapper.xml diff --git a/generator-web/target/classes/config/application-dev.yml b/generator-web/target/classes/config/application-dev.yml index b38dd33..0c4c4ae 100644 --- a/generator-web/target/classes/config/application-dev.yml +++ b/generator-web/target/classes/config/application-dev.yml @@ -9,6 +9,14 @@ spring: force: true charset: UTF-8 enabled: true + datasource: + name: c2c + url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8 + username: root + password: 123456 + # 使用druid数据源 + type: com.alibaba.druid.pool.DruidDataSource + driver-class-name: com.mysql.jdbc.Driver mybatis: mapperLocations: classpath*:mapper/*Mapper.xml -- Gitee From a80d3a4d592853434f114a510cf75f77fe3142a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=98=8E=E6=B3=A2?= Date: Mon, 22 Apr 2019 20:57:31 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../artifacts/generator_web_war_exploded.xml | 16 +- ...t_sourceforge_nekohtml_nekohtml_1_9_22.xml | 13 + ...ymeleaf_thymeleaf_layout_dialect_1_4_0.xml | 13 + .idea/libraries/Maven__ognl_ognl_3_0_8.xml | 13 + ...ven__org_codehaus_groovy_groovy_2_4_12.xml | 13 + ...ven__org_javassist_javassist_3_21_0_GA.xml | 13 + ...oot_spring_boot_devtools_1_5_6_RELEASE.xml | 13 + ...g_boot_starter_thymeleaf_1_5_3_RELEASE.xml | 13 + ..._org_thymeleaf_thymeleaf_2_1_5_RELEASE.xml | 13 + ...meleaf_thymeleaf_spring4_2_1_5_RELEASE.xml | 13 + ..._org_unbescape_unbescape_1_1_0_RELEASE.xml | 13 + .../Maven__xerces_xercesImpl_2_11_0.xml | 13 + .../Maven__xml_apis_xml_apis_1_4_01.xml | 13 + .idea/uiDesigner.xml | 124 + .idea/workspace.xml | 966 +- .../my/simon/common/util/CsvExportUtil.java | 156 - .../com/my/simon/common/util/ExportExcel.java | 282 - generator-web/pom.xml | 16 + .../my/simon/{ => web}/WebApplication.java | 2 +- .../java/com/my/simon/web/WebMvcConfig.java | 18 + .../com/my/simon/{ => web}/base/Builder.java | 2 +- .../simon/{ => web}/base/Configuration.java | 2 +- .../my/simon/{ => web}/base/Generator.java | 2 +- .../web/controller/GeneratorController.java | 44 + .../my/simon/{ => web}/dao/GeneratorDao.java | 23 +- .../simon/{ => web}/dao/GeneratorDaoImpl.java | 46 +- .../my/simon/{ => web}/entity/ColumnInfo.java | 4 +- .../DBInfo.java => web/entity/DB.java} | 18 +- .../my/simon/{ => web}/entity/JavaModel.java | 4 +- .../simon/{ => web}/entity/JdbcRelation.java | 2 +- .../com/my/simon/{ => web}/entity/Pom.java | 2 +- .../my/simon/{ => web}/entity/TableInfo.java | 6 +- .../my/simon/{ => web}/entity/TableMeta.java | 2 +- .../{ => web}/exceptions/ExceptionEnum.java | 4 +- .../exceptions/GeneratorException.java | 2 +- .../{ => web}/generator/JavaAppBuilder.java | 10 +- .../generator/JavaConfiguration.java | 47 +- .../{ => web}/generator/JavaGenerator.java | 12 +- .../generator/JavaGeneratorFactory.java | 30 +- .../generator/builders/ApiModuleBuilder.java | 12 +- .../generator/builders/AppBuilder.java | 10 +- .../builders/CommonModuleBuilder.java | 12 +- .../builders/DomainModuleBuilder.java | 16 +- .../generator/builders/OrmModuleBuilder.java | 16 +- .../builders/ProviderModuleBuilder.java | 12 +- .../generator/builders/RpcModuleBuilder.java | 12 +- .../builders/ServiceModuleBuilder.java | 16 +- .../generator/builders/WebModuleBuilder.java | 29 +- .../com/my/simon/{ => web}/utils/DBUtils.java | 27 +- .../my/simon/{ => web}/utils/DateUtils.java | 2 +- .../my/simon/{ => web}/utils/FileUtil.java | 6 +- .../my/simon/{ => web}/utils/JavaTypes.java | 5 +- .../{ => web}/utils/PropertiesUtils.java | 6 +- .../com/my/simon/{ => web}/utils/Test.java | 4 +- .../main/java/com/my/simon/web/vo/DBInfo.java | 65 + .../main/resources/config/application-dev.yml | 6 +- .../src/main/resources/static/404.html | 25 + .../src/main/resources/static/500.html | 24 + .../src/main/resources/static/alerts.html | 343 + .../src/main/resources/static/blank.html | 316 + .../src/main/resources/static/buttons.html | 355 + .../src/main/resources/static/cards.html | 424 + .../src/main/resources/static/chartjs.html | 314 + .../css/bootstrap-datetimepicker.min.css | 9 + .../src/main/resources/static/css/styles.css | 1 + .../src/main/resources/static/css/toast.css | 32 + .../src/main/resources/static/favicon.ico | Bin 0 -> 1150 bytes .../src/main/resources/static/forms.html | 595 + .../main/resources/static/imgs/avatar-1.png | Bin 0 -> 27093 bytes .../src/main/resources/static/imgs/female.jpg | Bin 0 -> 15009 bytes .../main/resources/static/imgs/logo-wd.png | Bin 0 -> 40473 bytes .../src/main/resources/static/imgs/logo.png | Bin 0 -> 16494 bytes .../src/main/resources/static/imgs/male.jpg | Bin 0 -> 14124 bytes .../src/main/resources/static/index.html | 365 + .../src/main/resources/static/invoice.html | 365 + .../src/main/resources/static/js/carbon.js | 54 + .../src/main/resources/static/js/demo.js | 190 + .../src/main/resources/static/js/page.js | 48 + .../resources/static/js/templateHelper.js | 37 + .../static/layouts-fixed-header.html | 424 + .../static/layouts-fixed-sidebar.html | 424 + .../static/layouts-hidden-sidebar.html | 424 + .../main/resources/static/layouts-normal.html | 424 + .../src/main/resources/static/login.html | 62 + .../src/main/resources/static/modals.html | 602 + .../main/resources/static/progress-bars.html | 412 + .../src/main/resources/static/register.html | 59 + .../src/main/resources/static/settings.html | 359 + .../src/main/resources/static/tables.html | 512 + .../src/main/resources/static/tabs.html | 394 + .../bootstrap/js/bootstrap-datetimepicker.js | 1967 +++ .../js/bootstrap-datetimepicker.zh-CN.js | 16 + .../bootstrap/js/bootstrap-paginator.js | 659 + .../vendor/bootstrap/js/bootstrap.min.js | 7 + .../resources/static/vendor/chart.js/chart.js | 14145 ++++++++++++++++ .../static/vendor/chart.js/chart.min.js | 10 + .../vendor/font-awesome/css/fa-brands.css | 13 + .../vendor/font-awesome/css/fa-brands.min.css | 5 + .../vendor/font-awesome/css/fa-regular.css | 14 + .../font-awesome/css/fa-regular.min.css | 5 + .../vendor/font-awesome/css/fa-solid.css | 15 + .../vendor/font-awesome/css/fa-solid.min.css | 5 + .../font-awesome/css/fontawesome-all.css | 2603 +++ .../font-awesome/css/fontawesome-all.min.css | 5 + .../vendor/font-awesome/css/fontawesome.css | 2573 +++ .../font-awesome/css/fontawesome.min.css | 5 + .../font-awesome/webfonts/fa-brands-400.eot | Bin 0 -> 97180 bytes .../font-awesome/webfonts/fa-brands-400.svg | 990 ++ .../font-awesome/webfonts/fa-brands-400.ttf | Bin 0 -> 96944 bytes .../font-awesome/webfonts/fa-brands-400.woff | Bin 0 -> 62811 bytes .../font-awesome/webfonts/fa-brands-400.woff2 | Bin 0 -> 53794 bytes .../font-awesome/webfonts/fa-regular-400.eot | Bin 0 -> 31004 bytes .../font-awesome/webfonts/fa-regular-400.svg | 363 + .../font-awesome/webfonts/fa-regular-400.ttf | Bin 0 -> 30776 bytes .../font-awesome/webfonts/fa-regular-400.woff | Bin 0 -> 14556 bytes .../webfonts/fa-regular-400.woff2 | Bin 0 -> 12176 bytes .../font-awesome/webfonts/fa-solid-900.eot | Bin 0 -> 97828 bytes .../font-awesome/webfonts/fa-solid-900.svg | 1413 ++ .../font-awesome/webfonts/fa-solid-900.ttf | Bin 0 -> 97608 bytes .../font-awesome/webfonts/fa-solid-900.woff | Bin 0 -> 46284 bytes .../font-awesome/webfonts/fa-solid-900.woff2 | Bin 0 -> 36854 bytes .../resources/static/vendor/jquery/jquery.js | 10253 +++++++++++ .../static/vendor/jquery/jquery.min.js | 4 + .../static/vendor/popper.js/popper.min.js | 4 + .../css/simple-line-icons.css | 778 + .../fonts/Simple-Line-Icons.eot | Bin 0 -> 54266 bytes .../fonts/Simple-Line-Icons.svg | 200 + .../fonts/Simple-Line-Icons.ttf | Bin 0 -> 54056 bytes .../fonts/Simple-Line-Icons.woff | Bin 0 -> 81331 bytes .../fonts/Simple-Line-Icons.woff2 | Bin 0 -> 30063 bytes .../main/resources/static/vendor/template.js | 742 + .../static/vendor/validate/ValidateUtil.js | 198 + .../static/vendor/validate/jquery.validate.js | 1650 ++ .../static/vendor/validate/messages_zh.js | 36 + .../src/main/resources/static/widgets.html | 470 + .../templates/html/common/footer.html | 22 + .../templates/html/common/header.html | 15 + .../main/resources/templates/html/index.html | 208 + .../main/resources/templates/html/layout.html | 27 + .../java/api/pagination.vm | 0 .../{template => templates}/java/api/pom.vm | 0 .../{template => templates}/java/app/pom.vm | 0 .../java/app/readme.vm | 0 .../java/common/pom.vm | 0 .../java/domain/condition.vm | 0 .../java/domain/entity.vm | 0 .../java/domain/pom.vm | 0 .../{template => templates}/java/orm/dao.vm | 0 .../java/orm/mapper.vm | 0 .../{template => templates}/java/orm/pom.vm | 0 .../java/provider/pom.vm | 0 .../{template => templates}/java/rpc/pom.vm | 0 .../java/service/pom.vm | 0 .../java/service/service.vm | 0 .../java/service/serviceImpl.vm | 0 .../java/web/application-dev.vm | 0 .../java/web/application.vm | 0 .../java/web/log-back.vm | 0 .../{template => templates}/java/web/pom.vm | 0 .../java/web/webApplication.vm | 0 .../target/classes/config/application-dev.yml | 6 +- generator-web/target/classes/static/404.html | 25 + generator-web/target/classes/static/500.html | 24 + .../target/classes/static/alerts.html | 343 + .../target/classes/static/blank.html | 316 + .../target/classes/static/buttons.html | 355 + .../target/classes/static/cards.html | 424 + .../target/classes/static/chartjs.html | 314 + .../css/bootstrap-datetimepicker.min.css | 9 + .../target/classes/static/css/styles.css | 1 + .../target/classes/static/css/toast.css | 32 + .../target/classes/static/favicon.ico | Bin 0 -> 1150 bytes .../target/classes/static/forms.html | 595 + .../target/classes/static/imgs/avatar-1.png | Bin 0 -> 27093 bytes .../target/classes/static/imgs/female.jpg | Bin 0 -> 15009 bytes .../target/classes/static/imgs/logo-wd.png | Bin 0 -> 40473 bytes .../target/classes/static/imgs/logo.png | Bin 0 -> 16494 bytes .../target/classes/static/imgs/male.jpg | Bin 0 -> 14124 bytes .../target/classes/static/index.html | 365 + .../target/classes/static/invoice.html | 365 + .../target/classes/static/js/carbon.js | 54 + .../target/classes/static/js/demo.js | 190 + .../target/classes/static/js/page.js | 48 + .../classes/static/js/templateHelper.js | 37 + .../classes/static/layouts-fixed-header.html | 424 + .../classes/static/layouts-fixed-sidebar.html | 424 + .../static/layouts-hidden-sidebar.html | 424 + .../target/classes/static/layouts-normal.html | 424 + .../target/classes/static/login.html | 62 + .../target/classes/static/modals.html | 602 + .../target/classes/static/progress-bars.html | 412 + .../target/classes/static/register.html | 59 + .../target/classes/static/settings.html | 359 + .../target/classes/static/tables.html | 512 + generator-web/target/classes/static/tabs.html | 394 + .../bootstrap/js/bootstrap-datetimepicker.js | 1967 +++ .../js/bootstrap-datetimepicker.zh-CN.js | 16 + .../bootstrap/js/bootstrap-paginator.js | 659 + .../vendor/bootstrap/js/bootstrap.min.js | 7 + .../classes/static/vendor/chart.js/chart.js | 14145 ++++++++++++++++ .../static/vendor/chart.js/chart.min.js | 10 + .../vendor/font-awesome/css/fa-brands.css | 13 + .../vendor/font-awesome/css/fa-brands.min.css | 5 + .../vendor/font-awesome/css/fa-regular.css | 14 + .../font-awesome/css/fa-regular.min.css | 5 + .../vendor/font-awesome/css/fa-solid.css | 15 + .../vendor/font-awesome/css/fa-solid.min.css | 5 + .../font-awesome/css/fontawesome-all.css | 2603 +++ .../font-awesome/css/fontawesome-all.min.css | 5 + .../vendor/font-awesome/css/fontawesome.css | 2573 +++ .../font-awesome/css/fontawesome.min.css | 5 + .../font-awesome/webfonts/fa-brands-400.eot | Bin 0 -> 97180 bytes .../font-awesome/webfonts/fa-brands-400.svg | 990 ++ .../font-awesome/webfonts/fa-brands-400.ttf | Bin 0 -> 96944 bytes .../font-awesome/webfonts/fa-brands-400.woff | Bin 0 -> 62811 bytes .../font-awesome/webfonts/fa-brands-400.woff2 | Bin 0 -> 53794 bytes .../font-awesome/webfonts/fa-regular-400.eot | Bin 0 -> 31004 bytes .../font-awesome/webfonts/fa-regular-400.svg | 363 + .../font-awesome/webfonts/fa-regular-400.ttf | Bin 0 -> 30776 bytes .../font-awesome/webfonts/fa-regular-400.woff | Bin 0 -> 14556 bytes .../webfonts/fa-regular-400.woff2 | Bin 0 -> 12176 bytes .../font-awesome/webfonts/fa-solid-900.eot | Bin 0 -> 97828 bytes .../font-awesome/webfonts/fa-solid-900.svg | 1413 ++ .../font-awesome/webfonts/fa-solid-900.ttf | Bin 0 -> 97608 bytes .../font-awesome/webfonts/fa-solid-900.woff | Bin 0 -> 46284 bytes .../font-awesome/webfonts/fa-solid-900.woff2 | Bin 0 -> 36854 bytes .../classes/static/vendor/jquery/jquery.js | 10253 +++++++++++ .../static/vendor/jquery/jquery.min.js | 4 + .../static/vendor/popper.js/popper.min.js | 4 + .../css/simple-line-icons.css | 778 + .../fonts/Simple-Line-Icons.eot | Bin 0 -> 54266 bytes .../fonts/Simple-Line-Icons.svg | 200 + .../fonts/Simple-Line-Icons.ttf | Bin 0 -> 54056 bytes .../fonts/Simple-Line-Icons.woff | Bin 0 -> 81331 bytes .../fonts/Simple-Line-Icons.woff2 | Bin 0 -> 30063 bytes .../target/classes/static/vendor/template.js | 742 + .../static/vendor/validate/ValidateUtil.js | 198 + .../static/vendor/validate/jquery.validate.js | 1650 ++ .../static/vendor/validate/messages_zh.js | 36 + .../target/classes/static/widgets.html | 470 + .../classes/templates/html/common/footer.html | 22 + .../classes/templates/html/common/header.html | 15 + .../target/classes/templates/html/index.html | 208 + .../target/classes/templates/html/layout.html | 27 + .../java/api/pagination.vm | 0 .../{template => templates}/java/api/pom.vm | 0 .../{template => templates}/java/app/pom.vm | 0 .../java/app/readme.vm | 0 .../java/common/pom.vm | 0 .../java/domain/condition.vm | 0 .../java/domain/entity.vm | 0 .../java/domain/pom.vm | 0 .../{template => templates}/java/orm/dao.vm | 0 .../java/orm/mapper.vm | 0 .../{template => templates}/java/orm/pom.vm | 0 .../java/provider/pom.vm | 0 .../{template => templates}/java/rpc/pom.vm | 0 .../java/service/pom.vm | 0 .../java/service/service.vm | 0 .../java/service/serviceImpl.vm | 0 .../java/web/application-dev.vm | 0 .../java/web/application.vm | 0 .../java/web/log-back.vm | 0 .../{template => templates}/java/web/pom.vm | 0 .../java/web/webApplication.vm | 0 pom.xml | 1 - 266 files changed, 95475 insertions(+), 812 deletions(-) create mode 100644 .idea/libraries/Maven__net_sourceforge_nekohtml_nekohtml_1_9_22.xml create mode 100644 .idea/libraries/Maven__nz_net_ultraq_thymeleaf_thymeleaf_layout_dialect_1_4_0.xml create mode 100644 .idea/libraries/Maven__ognl_ognl_3_0_8.xml create mode 100644 .idea/libraries/Maven__org_codehaus_groovy_groovy_2_4_12.xml create mode 100644 .idea/libraries/Maven__org_javassist_javassist_3_21_0_GA.xml create mode 100644 .idea/libraries/Maven__org_springframework_boot_spring_boot_devtools_1_5_6_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_boot_spring_boot_starter_thymeleaf_1_5_3_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_thymeleaf_thymeleaf_2_1_5_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_thymeleaf_thymeleaf_spring4_2_1_5_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_unbescape_unbescape_1_1_0_RELEASE.xml create mode 100644 .idea/libraries/Maven__xerces_xercesImpl_2_11_0.xml create mode 100644 .idea/libraries/Maven__xml_apis_xml_apis_1_4_01.xml create mode 100644 .idea/uiDesigner.xml delete mode 100644 generator-common/src/main/java/com/my/simon/common/util/CsvExportUtil.java delete mode 100644 generator-common/src/main/java/com/my/simon/common/util/ExportExcel.java rename generator-web/src/main/java/com/my/simon/{ => web}/WebApplication.java (96%) create mode 100644 generator-web/src/main/java/com/my/simon/web/WebMvcConfig.java rename generator-web/src/main/java/com/my/simon/{ => web}/base/Builder.java (85%) rename generator-web/src/main/java/com/my/simon/{ => web}/base/Configuration.java (82%) rename generator-web/src/main/java/com/my/simon/{ => web}/base/Generator.java (86%) create mode 100644 generator-web/src/main/java/com/my/simon/web/controller/GeneratorController.java rename generator-web/src/main/java/com/my/simon/{ => web}/dao/GeneratorDao.java (58%) rename generator-web/src/main/java/com/my/simon/{ => web}/dao/GeneratorDaoImpl.java (62%) rename generator-web/src/main/java/com/my/simon/{ => web}/entity/ColumnInfo.java (94%) rename generator-web/src/main/java/com/my/simon/{entity/DBInfo.java => web/entity/DB.java} (55%) rename generator-web/src/main/java/com/my/simon/{ => web}/entity/JavaModel.java (93%) rename generator-web/src/main/java/com/my/simon/{ => web}/entity/JdbcRelation.java (94%) rename generator-web/src/main/java/com/my/simon/{ => web}/entity/Pom.java (96%) rename generator-web/src/main/java/com/my/simon/{ => web}/entity/TableInfo.java (89%) rename generator-web/src/main/java/com/my/simon/{ => web}/entity/TableMeta.java (91%) rename generator-web/src/main/java/com/my/simon/{ => web}/exceptions/ExceptionEnum.java (94%) rename generator-web/src/main/java/com/my/simon/{ => web}/exceptions/GeneratorException.java (89%) rename generator-web/src/main/java/com/my/simon/{ => web}/generator/JavaAppBuilder.java (95%) rename generator-web/src/main/java/com/my/simon/{ => web}/generator/JavaConfiguration.java (63%) rename generator-web/src/main/java/com/my/simon/{ => web}/generator/JavaGenerator.java (85%) rename generator-web/src/main/java/com/my/simon/{ => web}/generator/JavaGeneratorFactory.java (66%) rename generator-web/src/main/java/com/my/simon/{ => web}/generator/builders/ApiModuleBuilder.java (89%) rename generator-web/src/main/java/com/my/simon/{ => web}/generator/builders/AppBuilder.java (91%) rename generator-web/src/main/java/com/my/simon/{ => web}/generator/builders/CommonModuleBuilder.java (91%) rename generator-web/src/main/java/com/my/simon/{ => web}/generator/builders/DomainModuleBuilder.java (93%) rename generator-web/src/main/java/com/my/simon/{ => web}/generator/builders/OrmModuleBuilder.java (93%) rename generator-web/src/main/java/com/my/simon/{ => web}/generator/builders/ProviderModuleBuilder.java (86%) rename generator-web/src/main/java/com/my/simon/{ => web}/generator/builders/RpcModuleBuilder.java (88%) rename generator-web/src/main/java/com/my/simon/{ => web}/generator/builders/ServiceModuleBuilder.java (93%) rename generator-web/src/main/java/com/my/simon/{ => web}/generator/builders/WebModuleBuilder.java (90%) rename generator-web/src/main/java/com/my/simon/{ => web}/utils/DBUtils.java (85%) rename generator-web/src/main/java/com/my/simon/{ => web}/utils/DateUtils.java (99%) rename generator-web/src/main/java/com/my/simon/{ => web}/utils/FileUtil.java (88%) rename generator-web/src/main/java/com/my/simon/{ => web}/utils/JavaTypes.java (95%) rename generator-web/src/main/java/com/my/simon/{ => web}/utils/PropertiesUtils.java (91%) rename generator-web/src/main/java/com/my/simon/{ => web}/utils/Test.java (77%) create mode 100644 generator-web/src/main/java/com/my/simon/web/vo/DBInfo.java create mode 100644 generator-web/src/main/resources/static/404.html create mode 100644 generator-web/src/main/resources/static/500.html create mode 100644 generator-web/src/main/resources/static/alerts.html create mode 100644 generator-web/src/main/resources/static/blank.html create mode 100644 generator-web/src/main/resources/static/buttons.html create mode 100644 generator-web/src/main/resources/static/cards.html create mode 100644 generator-web/src/main/resources/static/chartjs.html create mode 100755 generator-web/src/main/resources/static/css/bootstrap-datetimepicker.min.css create mode 100644 generator-web/src/main/resources/static/css/styles.css create mode 100644 generator-web/src/main/resources/static/css/toast.css create mode 100644 generator-web/src/main/resources/static/favicon.ico create mode 100644 generator-web/src/main/resources/static/forms.html create mode 100644 generator-web/src/main/resources/static/imgs/avatar-1.png create mode 100644 generator-web/src/main/resources/static/imgs/female.jpg create mode 100644 generator-web/src/main/resources/static/imgs/logo-wd.png create mode 100644 generator-web/src/main/resources/static/imgs/logo.png create mode 100644 generator-web/src/main/resources/static/imgs/male.jpg create mode 100644 generator-web/src/main/resources/static/index.html create mode 100644 generator-web/src/main/resources/static/invoice.html create mode 100644 generator-web/src/main/resources/static/js/carbon.js create mode 100644 generator-web/src/main/resources/static/js/demo.js create mode 100644 generator-web/src/main/resources/static/js/page.js create mode 100644 generator-web/src/main/resources/static/js/templateHelper.js create mode 100644 generator-web/src/main/resources/static/layouts-fixed-header.html create mode 100644 generator-web/src/main/resources/static/layouts-fixed-sidebar.html create mode 100644 generator-web/src/main/resources/static/layouts-hidden-sidebar.html create mode 100644 generator-web/src/main/resources/static/layouts-normal.html create mode 100644 generator-web/src/main/resources/static/login.html create mode 100644 generator-web/src/main/resources/static/modals.html create mode 100644 generator-web/src/main/resources/static/progress-bars.html create mode 100644 generator-web/src/main/resources/static/register.html create mode 100644 generator-web/src/main/resources/static/settings.html create mode 100644 generator-web/src/main/resources/static/tables.html create mode 100644 generator-web/src/main/resources/static/tabs.html create mode 100755 generator-web/src/main/resources/static/vendor/bootstrap/js/bootstrap-datetimepicker.js create mode 100755 generator-web/src/main/resources/static/vendor/bootstrap/js/bootstrap-datetimepicker.zh-CN.js create mode 100644 generator-web/src/main/resources/static/vendor/bootstrap/js/bootstrap-paginator.js create mode 100644 generator-web/src/main/resources/static/vendor/bootstrap/js/bootstrap.min.js create mode 100644 generator-web/src/main/resources/static/vendor/chart.js/chart.js create mode 100644 generator-web/src/main/resources/static/vendor/chart.js/chart.min.js create mode 100644 generator-web/src/main/resources/static/vendor/font-awesome/css/fa-brands.css create mode 100644 generator-web/src/main/resources/static/vendor/font-awesome/css/fa-brands.min.css create mode 100644 generator-web/src/main/resources/static/vendor/font-awesome/css/fa-regular.css create mode 100644 generator-web/src/main/resources/static/vendor/font-awesome/css/fa-regular.min.css create mode 100644 generator-web/src/main/resources/static/vendor/font-awesome/css/fa-solid.css create mode 100644 generator-web/src/main/resources/static/vendor/font-awesome/css/fa-solid.min.css create mode 100644 generator-web/src/main/resources/static/vendor/font-awesome/css/fontawesome-all.css create mode 100644 generator-web/src/main/resources/static/vendor/font-awesome/css/fontawesome-all.min.css create mode 100644 generator-web/src/main/resources/static/vendor/font-awesome/css/fontawesome.css create mode 100644 generator-web/src/main/resources/static/vendor/font-awesome/css/fontawesome.min.css create mode 100644 generator-web/src/main/resources/static/vendor/font-awesome/webfonts/fa-brands-400.eot create mode 100644 generator-web/src/main/resources/static/vendor/font-awesome/webfonts/fa-brands-400.svg create mode 100644 generator-web/src/main/resources/static/vendor/font-awesome/webfonts/fa-brands-400.ttf create mode 100644 generator-web/src/main/resources/static/vendor/font-awesome/webfonts/fa-brands-400.woff create mode 100644 generator-web/src/main/resources/static/vendor/font-awesome/webfonts/fa-brands-400.woff2 create mode 100644 generator-web/src/main/resources/static/vendor/font-awesome/webfonts/fa-regular-400.eot create mode 100644 generator-web/src/main/resources/static/vendor/font-awesome/webfonts/fa-regular-400.svg create mode 100644 generator-web/src/main/resources/static/vendor/font-awesome/webfonts/fa-regular-400.ttf create mode 100644 generator-web/src/main/resources/static/vendor/font-awesome/webfonts/fa-regular-400.woff create mode 100644 generator-web/src/main/resources/static/vendor/font-awesome/webfonts/fa-regular-400.woff2 create mode 100644 generator-web/src/main/resources/static/vendor/font-awesome/webfonts/fa-solid-900.eot create mode 100644 generator-web/src/main/resources/static/vendor/font-awesome/webfonts/fa-solid-900.svg create mode 100644 generator-web/src/main/resources/static/vendor/font-awesome/webfonts/fa-solid-900.ttf create mode 100644 generator-web/src/main/resources/static/vendor/font-awesome/webfonts/fa-solid-900.woff create mode 100644 generator-web/src/main/resources/static/vendor/font-awesome/webfonts/fa-solid-900.woff2 create mode 100644 generator-web/src/main/resources/static/vendor/jquery/jquery.js create mode 100644 generator-web/src/main/resources/static/vendor/jquery/jquery.min.js create mode 100644 generator-web/src/main/resources/static/vendor/popper.js/popper.min.js create mode 100644 generator-web/src/main/resources/static/vendor/simple-line-icons/css/simple-line-icons.css create mode 100644 generator-web/src/main/resources/static/vendor/simple-line-icons/fonts/Simple-Line-Icons.eot create mode 100644 generator-web/src/main/resources/static/vendor/simple-line-icons/fonts/Simple-Line-Icons.svg create mode 100644 generator-web/src/main/resources/static/vendor/simple-line-icons/fonts/Simple-Line-Icons.ttf create mode 100644 generator-web/src/main/resources/static/vendor/simple-line-icons/fonts/Simple-Line-Icons.woff create mode 100644 generator-web/src/main/resources/static/vendor/simple-line-icons/fonts/Simple-Line-Icons.woff2 create mode 100644 generator-web/src/main/resources/static/vendor/template.js create mode 100644 generator-web/src/main/resources/static/vendor/validate/ValidateUtil.js create mode 100644 generator-web/src/main/resources/static/vendor/validate/jquery.validate.js create mode 100644 generator-web/src/main/resources/static/vendor/validate/messages_zh.js create mode 100644 generator-web/src/main/resources/static/widgets.html create mode 100644 generator-web/src/main/resources/templates/html/common/footer.html create mode 100644 generator-web/src/main/resources/templates/html/common/header.html create mode 100644 generator-web/src/main/resources/templates/html/index.html create mode 100644 generator-web/src/main/resources/templates/html/layout.html rename generator-web/src/main/resources/{template => templates}/java/api/pagination.vm (100%) rename generator-web/src/main/resources/{template => templates}/java/api/pom.vm (100%) rename generator-web/src/main/resources/{template => templates}/java/app/pom.vm (100%) rename generator-web/src/main/resources/{template => templates}/java/app/readme.vm (100%) rename generator-web/src/main/resources/{template => templates}/java/common/pom.vm (100%) rename generator-web/src/main/resources/{template => templates}/java/domain/condition.vm (100%) rename generator-web/src/main/resources/{template => templates}/java/domain/entity.vm (100%) rename generator-web/src/main/resources/{template => templates}/java/domain/pom.vm (100%) rename generator-web/src/main/resources/{template => templates}/java/orm/dao.vm (100%) rename generator-web/src/main/resources/{template => templates}/java/orm/mapper.vm (100%) rename generator-web/src/main/resources/{template => templates}/java/orm/pom.vm (100%) rename generator-web/src/main/resources/{template => templates}/java/provider/pom.vm (100%) rename generator-web/src/main/resources/{template => templates}/java/rpc/pom.vm (100%) rename generator-web/src/main/resources/{template => templates}/java/service/pom.vm (100%) rename generator-web/src/main/resources/{template => templates}/java/service/service.vm (100%) rename generator-web/src/main/resources/{template => templates}/java/service/serviceImpl.vm (100%) rename generator-web/src/main/resources/{template => templates}/java/web/application-dev.vm (100%) rename generator-web/src/main/resources/{template => templates}/java/web/application.vm (100%) rename generator-web/src/main/resources/{template => templates}/java/web/log-back.vm (100%) rename generator-web/src/main/resources/{template => templates}/java/web/pom.vm (100%) rename generator-web/src/main/resources/{template => templates}/java/web/webApplication.vm (100%) create mode 100644 generator-web/target/classes/static/404.html create mode 100644 generator-web/target/classes/static/500.html create mode 100644 generator-web/target/classes/static/alerts.html create mode 100644 generator-web/target/classes/static/blank.html create mode 100644 generator-web/target/classes/static/buttons.html create mode 100644 generator-web/target/classes/static/cards.html create mode 100644 generator-web/target/classes/static/chartjs.html create mode 100755 generator-web/target/classes/static/css/bootstrap-datetimepicker.min.css create mode 100644 generator-web/target/classes/static/css/styles.css create mode 100644 generator-web/target/classes/static/css/toast.css create mode 100644 generator-web/target/classes/static/favicon.ico create mode 100644 generator-web/target/classes/static/forms.html create mode 100644 generator-web/target/classes/static/imgs/avatar-1.png create mode 100644 generator-web/target/classes/static/imgs/female.jpg create mode 100644 generator-web/target/classes/static/imgs/logo-wd.png create mode 100644 generator-web/target/classes/static/imgs/logo.png create mode 100644 generator-web/target/classes/static/imgs/male.jpg create mode 100644 generator-web/target/classes/static/index.html create mode 100644 generator-web/target/classes/static/invoice.html create mode 100644 generator-web/target/classes/static/js/carbon.js create mode 100644 generator-web/target/classes/static/js/demo.js create mode 100644 generator-web/target/classes/static/js/page.js create mode 100644 generator-web/target/classes/static/js/templateHelper.js create mode 100644 generator-web/target/classes/static/layouts-fixed-header.html create mode 100644 generator-web/target/classes/static/layouts-fixed-sidebar.html create mode 100644 generator-web/target/classes/static/layouts-hidden-sidebar.html create mode 100644 generator-web/target/classes/static/layouts-normal.html create mode 100644 generator-web/target/classes/static/login.html create mode 100644 generator-web/target/classes/static/modals.html create mode 100644 generator-web/target/classes/static/progress-bars.html create mode 100644 generator-web/target/classes/static/register.html create mode 100644 generator-web/target/classes/static/settings.html create mode 100644 generator-web/target/classes/static/tables.html create mode 100644 generator-web/target/classes/static/tabs.html create mode 100755 generator-web/target/classes/static/vendor/bootstrap/js/bootstrap-datetimepicker.js create mode 100755 generator-web/target/classes/static/vendor/bootstrap/js/bootstrap-datetimepicker.zh-CN.js create mode 100644 generator-web/target/classes/static/vendor/bootstrap/js/bootstrap-paginator.js create mode 100644 generator-web/target/classes/static/vendor/bootstrap/js/bootstrap.min.js create mode 100644 generator-web/target/classes/static/vendor/chart.js/chart.js create mode 100644 generator-web/target/classes/static/vendor/chart.js/chart.min.js create mode 100644 generator-web/target/classes/static/vendor/font-awesome/css/fa-brands.css create mode 100644 generator-web/target/classes/static/vendor/font-awesome/css/fa-brands.min.css create mode 100644 generator-web/target/classes/static/vendor/font-awesome/css/fa-regular.css create mode 100644 generator-web/target/classes/static/vendor/font-awesome/css/fa-regular.min.css create mode 100644 generator-web/target/classes/static/vendor/font-awesome/css/fa-solid.css create mode 100644 generator-web/target/classes/static/vendor/font-awesome/css/fa-solid.min.css create mode 100644 generator-web/target/classes/static/vendor/font-awesome/css/fontawesome-all.css create mode 100644 generator-web/target/classes/static/vendor/font-awesome/css/fontawesome-all.min.css create mode 100644 generator-web/target/classes/static/vendor/font-awesome/css/fontawesome.css create mode 100644 generator-web/target/classes/static/vendor/font-awesome/css/fontawesome.min.css create mode 100644 generator-web/target/classes/static/vendor/font-awesome/webfonts/fa-brands-400.eot create mode 100644 generator-web/target/classes/static/vendor/font-awesome/webfonts/fa-brands-400.svg create mode 100644 generator-web/target/classes/static/vendor/font-awesome/webfonts/fa-brands-400.ttf create mode 100644 generator-web/target/classes/static/vendor/font-awesome/webfonts/fa-brands-400.woff create mode 100644 generator-web/target/classes/static/vendor/font-awesome/webfonts/fa-brands-400.woff2 create mode 100644 generator-web/target/classes/static/vendor/font-awesome/webfonts/fa-regular-400.eot create mode 100644 generator-web/target/classes/static/vendor/font-awesome/webfonts/fa-regular-400.svg create mode 100644 generator-web/target/classes/static/vendor/font-awesome/webfonts/fa-regular-400.ttf create mode 100644 generator-web/target/classes/static/vendor/font-awesome/webfonts/fa-regular-400.woff create mode 100644 generator-web/target/classes/static/vendor/font-awesome/webfonts/fa-regular-400.woff2 create mode 100644 generator-web/target/classes/static/vendor/font-awesome/webfonts/fa-solid-900.eot create mode 100644 generator-web/target/classes/static/vendor/font-awesome/webfonts/fa-solid-900.svg create mode 100644 generator-web/target/classes/static/vendor/font-awesome/webfonts/fa-solid-900.ttf create mode 100644 generator-web/target/classes/static/vendor/font-awesome/webfonts/fa-solid-900.woff create mode 100644 generator-web/target/classes/static/vendor/font-awesome/webfonts/fa-solid-900.woff2 create mode 100644 generator-web/target/classes/static/vendor/jquery/jquery.js create mode 100644 generator-web/target/classes/static/vendor/jquery/jquery.min.js create mode 100644 generator-web/target/classes/static/vendor/popper.js/popper.min.js create mode 100644 generator-web/target/classes/static/vendor/simple-line-icons/css/simple-line-icons.css create mode 100644 generator-web/target/classes/static/vendor/simple-line-icons/fonts/Simple-Line-Icons.eot create mode 100644 generator-web/target/classes/static/vendor/simple-line-icons/fonts/Simple-Line-Icons.svg create mode 100644 generator-web/target/classes/static/vendor/simple-line-icons/fonts/Simple-Line-Icons.ttf create mode 100644 generator-web/target/classes/static/vendor/simple-line-icons/fonts/Simple-Line-Icons.woff create mode 100644 generator-web/target/classes/static/vendor/simple-line-icons/fonts/Simple-Line-Icons.woff2 create mode 100644 generator-web/target/classes/static/vendor/template.js create mode 100644 generator-web/target/classes/static/vendor/validate/ValidateUtil.js create mode 100644 generator-web/target/classes/static/vendor/validate/jquery.validate.js create mode 100644 generator-web/target/classes/static/vendor/validate/messages_zh.js create mode 100644 generator-web/target/classes/static/widgets.html create mode 100644 generator-web/target/classes/templates/html/common/footer.html create mode 100644 generator-web/target/classes/templates/html/common/header.html create mode 100644 generator-web/target/classes/templates/html/index.html create mode 100644 generator-web/target/classes/templates/html/layout.html rename generator-web/target/classes/{template => templates}/java/api/pagination.vm (100%) rename generator-web/target/classes/{template => templates}/java/api/pom.vm (100%) rename generator-web/target/classes/{template => templates}/java/app/pom.vm (100%) rename generator-web/target/classes/{template => templates}/java/app/readme.vm (100%) rename generator-web/target/classes/{template => templates}/java/common/pom.vm (100%) rename generator-web/target/classes/{template => templates}/java/domain/condition.vm (100%) rename generator-web/target/classes/{template => templates}/java/domain/entity.vm (100%) rename generator-web/target/classes/{template => templates}/java/domain/pom.vm (100%) rename generator-web/target/classes/{template => templates}/java/orm/dao.vm (100%) rename generator-web/target/classes/{template => templates}/java/orm/mapper.vm (100%) rename generator-web/target/classes/{template => templates}/java/orm/pom.vm (100%) rename generator-web/target/classes/{template => templates}/java/provider/pom.vm (100%) rename generator-web/target/classes/{template => templates}/java/rpc/pom.vm (100%) rename generator-web/target/classes/{template => templates}/java/service/pom.vm (100%) rename generator-web/target/classes/{template => templates}/java/service/service.vm (100%) rename generator-web/target/classes/{template => templates}/java/service/serviceImpl.vm (100%) rename generator-web/target/classes/{template => templates}/java/web/application-dev.vm (100%) rename generator-web/target/classes/{template => templates}/java/web/application.vm (100%) rename generator-web/target/classes/{template => templates}/java/web/log-back.vm (100%) rename generator-web/target/classes/{template => templates}/java/web/pom.vm (100%) rename generator-web/target/classes/{template => templates}/java/web/webApplication.vm (100%) diff --git a/.idea/artifacts/generator_web_war_exploded.xml b/.idea/artifacts/generator_web_war_exploded.xml index 20360dc..c05531b 100644 --- a/.idea/artifacts/generator_web_war_exploded.xml +++ b/.idea/artifacts/generator_web_war_exploded.xml @@ -35,8 +35,6 @@ - - @@ -59,16 +57,30 @@ + + + + + + + + + + + + + + diff --git a/.idea/libraries/Maven__net_sourceforge_nekohtml_nekohtml_1_9_22.xml b/.idea/libraries/Maven__net_sourceforge_nekohtml_nekohtml_1_9_22.xml new file mode 100644 index 0000000..d81ee35 --- /dev/null +++ b/.idea/libraries/Maven__net_sourceforge_nekohtml_nekohtml_1_9_22.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__nz_net_ultraq_thymeleaf_thymeleaf_layout_dialect_1_4_0.xml b/.idea/libraries/Maven__nz_net_ultraq_thymeleaf_thymeleaf_layout_dialect_1_4_0.xml new file mode 100644 index 0000000..f1832bc --- /dev/null +++ b/.idea/libraries/Maven__nz_net_ultraq_thymeleaf_thymeleaf_layout_dialect_1_4_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__ognl_ognl_3_0_8.xml b/.idea/libraries/Maven__ognl_ognl_3_0_8.xml new file mode 100644 index 0000000..470859d --- /dev/null +++ b/.idea/libraries/Maven__ognl_ognl_3_0_8.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_codehaus_groovy_groovy_2_4_12.xml b/.idea/libraries/Maven__org_codehaus_groovy_groovy_2_4_12.xml new file mode 100644 index 0000000..d352532 --- /dev/null +++ b/.idea/libraries/Maven__org_codehaus_groovy_groovy_2_4_12.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_javassist_javassist_3_21_0_GA.xml b/.idea/libraries/Maven__org_javassist_javassist_3_21_0_GA.xml new file mode 100644 index 0000000..a4a0a9f --- /dev/null +++ b/.idea/libraries/Maven__org_javassist_javassist_3_21_0_GA.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_devtools_1_5_6_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_devtools_1_5_6_RELEASE.xml new file mode 100644 index 0000000..1a72376 --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_devtools_1_5_6_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_thymeleaf_1_5_3_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_thymeleaf_1_5_3_RELEASE.xml new file mode 100644 index 0000000..4193552 --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_thymeleaf_1_5_3_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_thymeleaf_thymeleaf_2_1_5_RELEASE.xml b/.idea/libraries/Maven__org_thymeleaf_thymeleaf_2_1_5_RELEASE.xml new file mode 100644 index 0000000..f6da500 --- /dev/null +++ b/.idea/libraries/Maven__org_thymeleaf_thymeleaf_2_1_5_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_thymeleaf_thymeleaf_spring4_2_1_5_RELEASE.xml b/.idea/libraries/Maven__org_thymeleaf_thymeleaf_spring4_2_1_5_RELEASE.xml new file mode 100644 index 0000000..3d66255 --- /dev/null +++ b/.idea/libraries/Maven__org_thymeleaf_thymeleaf_spring4_2_1_5_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_unbescape_unbescape_1_1_0_RELEASE.xml b/.idea/libraries/Maven__org_unbescape_unbescape_1_1_0_RELEASE.xml new file mode 100644 index 0000000..216a81a --- /dev/null +++ b/.idea/libraries/Maven__org_unbescape_unbescape_1_1_0_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__xerces_xercesImpl_2_11_0.xml b/.idea/libraries/Maven__xerces_xercesImpl_2_11_0.xml new file mode 100644 index 0000000..74d923d --- /dev/null +++ b/.idea/libraries/Maven__xerces_xercesImpl_2_11_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__xml_apis_xml_apis_1_4_01.xml b/.idea/libraries/Maven__xml_apis_xml_apis_1_4_01.xml new file mode 100644 index 0000000..9fbb09c --- /dev/null +++ b/.idea/libraries/Maven__xml_apis_xml_apis_1_4_01.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..e96534f --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 07acb38..0ea8a38 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,8 +2,107 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -18,14 +117,17 @@ + + - - + + - + @@ -33,51 +135,179 @@ - + + - + + + - - - - + + + + + - - + + + + + - + - - - + + + - + + - - + + + - + + - - + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + base.package + ¬ + tem + @@ -133,7 +384,6 @@ - @@ -175,7 +425,7 @@ - + @@ -184,13 +434,69 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+
+ +
+
+ + +
+
+ + +
+
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ +

email@example.com

+
+
+
+ +
+
+
+ + + We'll never share your email with anyone else. +
+
+
+ +
+
+ + +
+ +
+ +
+ +
+ +
+ +
+
+ +
+
+ + +
+ +
+ + +
+
+ +
+
+ + +
+
+
+ + + + + +
+
+
+
+ Input Groups +
+ +
+
+
+ + +
+
+ @ +
+ +
+ +
+ +
+ @ +
+
+ +
+
+ $ +
+ +
+ .00 +
+
+
+ +
+ + +
+
+ +
+ +
+ +
+ +
+ +
+
+ +
+
+ +
+ +
+ +
+
+
+ +
+ + +
+
+ @ +
+ +
+ +
+
+ @ +
+ +
+ +
+
+ @ +
+ +
+
+
+ +
+
+ +
+ + + + +
+
+ +
+ +
+ + + + +
+
+ +
+ +
+
+ + + +
+ + +
+
+
+
+
+
+
+ +
+
+
+
+ Switches +
+ +
+
+
+
+ + + +
+
+ +
+
+ + + +
+
+ +
+
+ + + +
+
+ +
+
+ + + +
+
+
+ +
+ +
+
+
+ + + +
+
+ +
+
+ + + +
+
+ +
+
+ + + +
+
+
+
+
+
+
+ + + + + + + + + + + + diff --git a/generator-web/src/main/resources/static/imgs/avatar-1.png b/generator-web/src/main/resources/static/imgs/avatar-1.png new file mode 100644 index 0000000000000000000000000000000000000000..d05067bdccf0dfefa6bd32a11bf10357d3b17319 GIT binary patch literal 27093 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 z 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 KMNUMnLSTX=OUw)a literal 0 HcmV?d00001 diff --git a/generator-web/src/main/resources/static/imgs/female.jpg b/generator-web/src/main/resources/static/imgs/female.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a8fd4328c9ad936586c1da3b90ffcf30f6b331d7 GIT binary patch literal 15009 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 literal 0 HcmV?d00001 diff --git a/generator-web/src/main/resources/static/imgs/logo-wd.png b/generator-web/src/main/resources/static/imgs/logo-wd.png new file mode 100644 index 0000000000000000000000000000000000000000..dec5b9cee8606b04913a22ded0a36cbea696b241 GIT binary patch literal 40473 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 VYyJN^um8ramHzG57tY^f{}&S3UcdkV literal 0 HcmV?d00001 diff --git a/generator-web/src/main/resources/static/imgs/logo.png b/generator-web/src/main/resources/static/imgs/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..099bdc464736d75d5a018006bf3b40f82502e546 GIT binary patch literal 16494 zcmeI4eN+=y7QhEA7Q%}7(aKuI7^|W+Og;!9A%sGLKuZvTu4q*lW+pI_WYSD9K}(AY zJ#JSkRJ&S5Yip~eJ=*$()mpT5smJzI+lpfGi*D7HDpE!93(CGpfP@Fkx@Wup?3o<$ zaqoTi-uHg*zB}{J@Yl4|#36#w0t7*ZBq!<9!FMBg%lrp}&xEt}wcsnjnlzh1kiZe_ z+Xq=+8G<0uaa3lOJ$GBc0cjWJl6jORM%41@A(4r~p?HqFAj!<5YtHX3~xcoo17TQ9ENquDELOn^mJC zp=*e}AVw6&CKP5F(u6wNMhX?-kz!mbj}j_X;ZlVvN)|CqD3eGdQHctbMu;U+wM35d1ovxqWl@3TTqI|pEszyBqc$;4oUm?^T@ zF{jwVOmGM3j-w|T+(udL6m1c*aj{&w&>kZav59(KUF$MidlFfgE_Q$->cp(5G+crX z;AAjxyP3`XdNTHegfuv13Q=JZ+uYZ)*d>7)j5V=ZnsS1Gu6NCWCm zt+SDsowjAtv`Oo(vb6413w1iSs+7X8S(JsK9n2IB3cGmr+Y^n{V|G#tJflD*g1=0O zM6FP$71F09aa*Y}|2tym~4$MZz<$(%$n3L&_+S?5duR+;f zZKD1M8^K@;|GRB?xKs6iu??Oo#`7^t9!Y4??gH*sJlxK?_p|rO>OQS~Pol=tSu#nd zJq0TwZA|Y{aGlh6EU&kgov*ua{++IikV5R4zuNgdxl9Sdo(&J&mOHo`x^x> zpPd0Tj$OjPkLDT$N9+F>xV60(?>)PInR(4hN1JGyfhI_;+}q8g_Dn-V;A$gnGh=ow zWybPI)N0AopdO{yNcMuS2Avml0nF9$q#Cr34j!Myc2HBHYrIk>0WVa_es;Nfn_<`4 z+^*hc*wy3toQ1M$WnI}IwU-xrSE6?D$pAOdq&8Bakb?^vtcE?(C?{#k(o^8t$*|V| znJl8q3AXg>Ioso@07P8bT#jCbE=PAsc-`x|&V^eG?xev@Jlb;?-{;8mTzdY|{23j)F|^0>J9Kvo_X1cY1UadGp3tUN9V2)D@N;^qTc zd0Y?>Zjr~u%?GmbxF8_hB9Duk4`k(WK|r`g9v3$s$jak_fN+aEE^a=MmB$4E;TCyZ z+Y1-5A{(euE`VNl|6OJEQ9vtrz0JOn^BvuQIK+76^0>&S? zyZG9u9NC+d)1JV$A_63!q-ux7r%sf9aTogKy7xlmKFF|RHTQ3CG_QIVDO{as{-p)) z3@w!14{Y?$Um-;zUvp{|C1uO)%Hh9Viq+{SWzVgdQu5Y;EJe|t%_S*u==pZPl6k9M zM9O`gHJCE!cuR9<!e102RQnn)+2`k!v{L)$E%s16XBg&-+vR?DSUb9bQQFY9ugSIiHMS)8%+>F=j zuYNqJ)T6JCx>_{nO~Lln#Xhx*&(u!En&v(c^u>yb zdoONs7S5Y2x-%%FKJm_!mV`9rJH`Xo@5OJJqu;fu;~urZII*sw@MK1YQS|+2yuH=* z*~stCU%9YWBfKapS4{&Gztu9OBynDLWYM0}w|`d&N^Um&Xj!8WWqjKjx7M=x#e`MU zCO;Tip$>jdJLl1fk-1dn*}1BH8{6J)t~$|fem(TY_dm3KQop|F*QDruH~rdLrq}K_ z23Xp5cK-fT{gnr+vZa1c>T1K<*Uy}AKJWDMH?HqKP%e8=#Z)z)UxS`*dL!-K-OX1W zS|s;p>^a|0=$lF5buT~a2>STgmSw4lcaMrIJ9Z5oGc2#-^Nt^{7BuLqifBNjSiN6dF#}i;;(i8I8=S&`o?BjvGTjYqWbv-@lm%g z*0%1M@b>&6v++`i=K2SgFSZK$ZXA*_6U!>k?N}PY=rG|#vGtYjcxu@;8?6a{x@YJ@+ zd#g5fep)^+6RC-bId=;G>`qwYAtI#h{;Z~R8eR6N4MB62MDRazCREpqnLqDp%ibwv zvE|4BaEvqA>)sW~jqaZH&)jvN|wg9(hrI;C#gxa%7~9^ZqN=*nNfN8L`9fz+>w35 zq^Fnr3zB>SupvpkI|DfUpfiA$FkrtZA9`akvUKmi literal 0 HcmV?d00001 diff --git a/generator-web/src/main/resources/static/imgs/male.jpg b/generator-web/src/main/resources/static/imgs/male.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a4d26d81e4fc1680a75c78aa11948a5fdbf92c0a GIT binary patch literal 14124 zcmbWecQjmI_%}L?UPDH&K`?q5qBD}w+sx=KdKn2p5F`>r#OR&T%V6~0rR&kgkPt){ zJ$exG`u^U#?!D{&b?@D0?Y-7{&a?K}pY=RvKhI~Mz5jjxw+OhUr=_a}AR+<)h;A;x zziWW)z#DH)iZ%<^9IVxfW>%y0~{ZD zJ`Lto<-I3I_3sDZK7fLZjGT;=f}EV3l9Gao21H9kO-;kbc$*%?#m>Xc#m>peDuR3u~}GXHf#L`g|WLrudeS5Qb8 zECP{}zo($6bpHWNOIt@*4{2&GPM~zW#y1A^ap^YWmyvnc1b~mDRQNjbEEv z2Zu+;C#PqB&M*GMMFar;Z&)|&{|5H|z{PNbiJ@^mW{~-H+2Q1?M7qb5o*#CuV7C-|e zx-lM*0iX^r+<}qgx^;bOW zNNTq@Aas_NxPGx2pNnTH74P$m`EJ*~Z}1Vsrq1q;c>zwE<(}b$ccDF;K4TTA06_MT zE_R4wBUp%hG@qBfp1JcUx8(L2**NLM`XwN6Vf=)A+gZFu&3SO(?znYCuOPw zaDuPV*J$D5z)U8hF5bm_k=$>?e^sWyLhgz+{6?3#>At$p1^a(!@PuNeeo81!EBJ5g z$@q>uY}BG>Q~u=x3+n2z)(x*_E${)h*d#2jH>N3br5&(XW3C;_vSmf{{XUbw%i_LAhbbKR{|J1Von!=jKq*-%LkWk8<1r}=sq{(6N)^G+RNjd zlFlE9>L4M%J+-ZY8LMFrdpL}j5KfWbK(>ln;UmHZlOI5fs+;m^h$Md_+GKR~-E}OT zw3(xz%Ia~cV&MSMNy#WuCxqtta+VQ!8F**$!jw+iy7WN|vk^F6f}X5+w^wV1b5dt; zBsE5{utUzqcSJ=ErhI!;H(!_>l|z5p6X5vv2s*kRkuLOL$z)#qaj_DR3-sx|zz~z~equ#UMXbbM8duN$I{d*@)$V z;U&Gw(;Bk}zTI+~>8cbDLt4e6i^^j)==D^K!Hy`~T8?}a%=w(K{IeDOfVFyVqT6GT zM$=COuh3^sOkfS<@g+gRGKLid01pCH7QHr``etfN9+wQBd<_7iA>- zu%25pW}WEy$n@>&z*0yInet>i2raAkfiO352MX$n(lU=TA?YB?D6&^3Wbf*D(sPDR zMj~Ncn@rBP;N9VHo*FLE!sQMrAA|>;vGwa#Qmx6|;x9+o4j(O=4L;wIye{dv@AhHy(Ll4Sec(MFRNqOikvSgmz&n~cIysR z$bgZ@nulIxD6=Wyl{@EDfVV7?-@zYoEEn5;RT@|d*ueOPczVm~;0F-&px4~TIThlw z;oc$%;2+w09*`~^s9M=U6{kt%?K=q}_TWnDQY`UlVS_LiiYXJP4hzN;f?wT$PKr_( z+}1!YWR8%Ia5n3_q(Nn72G=$!YxiA-?%(qak=^zE>T>AIfjhS{%^| zXOf&0e_DS~CcUZSKr#vYz}j)A4$1Zzp(qRKWIN znktOnfQUCj=ZOyU^0L*-H=|~lr_X}!7nM*S@my<}6PjGAUal^_-MkFE2xHlm( zeX;bj%xC_&lWkOG3>UeCaQ1XG!l%gjSs%1y1aLHRzkWG&NUgaVy`Jghqrm+p$?)7% zlRhLUMPpkld_U#9Cm73kR`FWI75OTEHD|s5+uV;_HTPY(fRu0*RTuv>O zC;6fu*7NA)KTDh$D836>0#`*FDQrR~F$vGocUCQ|U^-kOgorO2dj|;d%r(UNo5F!0 z;%AU0biEh~*2v#-A0rOUeM2j3?N`B9YC;+)AAInt*B%^5l?iGG)q3EPSpNao;kWpc zk$~nCKv3zbx(oVRr@uugMb^AEVIEACh_YSW zFLJml_gPEotZjExU+eL>b43Y9s#czkhxj5$xYI(RA{1kX3gy(kf2MxN{=htW>x>mL zX^Dn0wJjbPF@MP?wLd)2yUip~ghGQ~U~sbt=Vs!2bZQ2 znP+y%gcs1KCO z4LP_Sggvx8tF!)fc+SRs^al|=#w7eUe4xmQ72?mk>THrrD0F+(ULKB^DSn&d`MevS zeq2tMeh>V><8A)&KY%dzaaHnc!I-V7zYO8l1SR$`coTucnVNRUq(jVZZj7WBr&{2c ztOxXP#1=Eoc9asGbO(s_pkUzwFB5Gdw$duHw_cx?zvfPV4$UVl`Sj}*pwOo<2A&q- z*dH|>FA8Q8o1CyyqBChK3D3$YP-jV`LaE4IEnIOy`bpUUv%<{Wt{I!aF>&3w*@pTp zxi9i<@(jie&Ud)T7m^dzlX$XwB|X4*nf%(`s_{X+xqs-u#qwx&)ZoWl+haa*p_k{@ z`Z*n?&RhLV#*p-!RCm!-M@*X+Zo%pwpugwKTlG$k#Gy*K-fDj8($BYbEPE$pPVe`h zUc3yiy?PFfMLu!VEuQ6sNT!$`D=3`R<;&UyMf`=`eSJ9dwRbUFGs^i>lK;6MDy^=g zSwuB^H^jdDF)o{#YgoX+C%%trIw=uz^bbJuko7M#K*7W*NqUYW_j&iqWa4xW1ILpQ zgM{>oNVHuy{y;w&lN0rtN(ud>gfBG+Meg_+($i5EoaS=^B8}eNs1atO$H-1+ejN)T zb%KAy{zY+Z+$0awj3LfFTw7Ad*z;1++upsTTOCQ0`l;iST(QbWhB8!j-DvOY;6gDg z83%lDZa`%XFV|LcQ~Cyk;4R8o0ct1C=L5f8C~YI#iuwRaJEV`*WYNt zOI~KcM=#m9#&pgzsI5kaCH$ea8gc;_{3dTb8J}d?a)>sl*fld4K|330rWgZUQZ+1F z?X;N|!_+%$3YZt1ehztz_H8IP%zZ2IQd6HeZs7xm&8T}UsnAyi)^Sg@fLrYJmM}vm#UsZd1Mu&Xb}OzCED&u@2*$Tq5N8LDlP<8q3z>t3A_?=Je(~yO0;O1YnZ*jFvC3UR!sEy`hN4N~Ufa6EzsIVZVO*;zR`p^z)SgCOe9k zobFJqVBi$TI8t#I2iO{LlvF5*UZILJWHKCND`v*L7>K=;I0w_Dg(JC8gAQQqs|^V0Ta{|Mv`L;8O9|Qs z{erI=m_LZ}e=%oa&xi_g_2SjV8h}S-$Bg^2kC=P?)gXkOoo;2n%zN}4qfva{!<^=y zmBpl|*^SY6wq@Y=Y&_E_`JAeW#`uZ_5RCq*=NQkbp5%2Z!#l-sZiOWKFbS|QpcpL- zsC~b5T_}E%`sk49Hc|6NTqI^yWH*wjtIZ?)i0O<`wWACj*_^8S58$ZQ9IVYH(#>)n zAs>c?;-U_(yo{_)mCuvj>4zWhaB~#m&y~T`v!=s*1R&& zFOIDlN!CLs<5qm^Pra(KdTRkqy#4W#7jOAh{d!`{L~vBG*5mxt9efzmz1dCJ2Zi-a z$ma|JbvGaDhj*Hg=PT2hqe%Vy`)d!l?^BV8iS%dnRM08oH-{6SS zyLpH23=@Js|GsS+lx%oJ7cw#Qq0=4mvsn%i4Sg_eTAcCQlzJ#v8Z3@KpPO9$xSrEQ4fic~(NddT|^iv~Zw+Sl8yr z%PDGA>*5&yhS~rs=Z8mD+@7E}KGt;(Z%@l|e)`)x9+2CjueU@g##2#Wn(|jy!tEwP zR-VHa&w4sCPWvP}%yQBmB>*AmPFtV0`ZP18R1B}jd(CTu!pfzZ z-7#Qk9l%L(oQcPOM!sd?yf{L%w{fqHYS_Dk`bV%@{#5+Z2wO`$oR9Y$e5AJ!iSG$p z5H5;$ir3_e6G`~gT25C+D0*R8B%`pYV~VbqU#TS}H9aHiRP4%85M}!9I~`xGin1%@ z79J?~3x?miub+Ujr$@yTPRp|796h+F80LCHkkimOlkwF1ANZ%^FlMe7lQH&X>BIN$ zn$q}I31-4_janG7$7akmw(A=S^G%>uY<|F+N z;NiOv>9>-PlKJoy5&=6YNhg=xvymB$^M;W7DPdBFOTpo`-2+=qe0N8KAvvW$HaW0; zItL@YUh{-F%}>D)jNg#9eKUThjQhk|`jO?OHtN2_zIC-F-7#e*#4nIV-EZ*GSy?_z zN~wNvagtqAc+L6oZDRA(uayXct4g`-qrocEuX#4g>|~nCgs?Dr!Kx-^`xd*2OF2`A z&Qy{3N1l}TgGzYMs$U73kM0ToUkkg>yHb%TNJh|a-TNH zH79-V<7}61o(|I=bwnIS0Q>Ule z91_)2q06W)`+GGAnbm;xVi{jUq)yE8>IH`H{Nt81B3>uivQLv#&PCv)@>HjPd(!Be zd_qyU_G!BFp32QyNWyVXnjy3Ni;|Z;e^M{$gk; zb7vo(4f4fIi)ZUTcvU4CVz;A&Z>p=PnCbP1%S+}BQ1$r!riz7a6eTO6#ExYi2w<~BUVy@vQCv4#C)L-W+r9z3TynB^{PpZ}wr%cZTg{Aim`;?F1J_1K3a|^w$KttJG z_$1*WYg#NuxJ#FP2jXv$mW|3!V#oV)0z7!q~WBZ(kQ9mXAVt(M+@6{iq`ytVfniF2i_2 z%j~97A4De)SrJ}o+;fx z8(?Ii_qeTZa#7F1api^}{}G8j#WLUsh_rX?5gcPgpmG8Q6k_zGH#InR#d7LdC%>c+ zr5GYT4}+-S&!qhE-Fw>KFWx@}ow#Opq;jEv!Ga;VRB>}fWZ4}Qa(ZCzxHYr)Q5mqM zK3xdMcqpcvUwF~<*_d97p)A+}6KL@MwEOIa^QyH#wHEx17>WLxcCcue6(ClWxlh=V zqeCKh*%kvzzS77T%5eZI3lK=K9Eajqh}#KyzNbNjwq9x6+~j<`+gO-qS3D^JW4K(y zs$09fy8g-tTm~J7ceB&fcEz?&bfLYZxVB`@f1#?~Hk=-t!);LGbqikGK1h z{0(iMYbtb+gbNGm;83}p5rI)7V_Fy z3HBgT+|<|dl-<=J6+SD4xFt~umzI`EdlaX{#Ie|C*z9wjkwd2 z;7xtBG;DA!iCi$k7_z8}3uL!|RU%xTA85-7Wz78YnC)*U|0?OsCsjT^4*gqcShJ}$ zxv4GH6MJWs9dHv|LJ$mwvO=)A*j#-0$8rW!Ih(cmrh#?sp^EF~ayi!4UUo)5UC!rw z_CbDrRxuSgW5JYe=Do3JU~nh`!CD-ti;puQMq5Lt(~uhCf}Wl|n{P2})@+P0bs2eB z;BURA4=K0-N6eB%O@JC_=GXdXiGug81Aau{JpIlT8k#$n0y^bhvipQ&^$8#LhCClQ z?1_8(#$!acZ8lMi``DlNRED1mtW5X;?h@{#cfONdh)%josw%t=-6_@9HKs({mE-fq zd(z(i8qq!ZG3{`B^!fDFz$IJoTY_x02`fiXE_yXd8n%bG`c0N z3idCaX7(v!jmsxg-FDx@Y?0;A+oIvFw~p&nSNOkQFr}WkD~P)|<4bK=W~C--&d_d|MFyslR>ug}$Yd zeo^*Srv6pxagBKYbbNmUcDFJ}ax3kU?dJ?X0e+Q47knl9KoPrOtY<%4{^X)Yt?$Xi z$1M*fkqfGc1?>=;I8t>VWcv&A)Js9D36l^D+Lfw@jbkn)C89h8i_&b?4a`y9TR(Sr zlV&i(?el``7K6%By^-AS)v5|eKYe6eDYm#M-y!Wk0w!F1mTKG}+oB2Mos>~qJE+o$saPRap9o7&Q- zWNy6Y4^lm;P-G*ZVqM-8eoNzqheJ1wNlarSXR#xgzBDTevoR=wlsjF5g^N@XFmgY8 zf*nj_%AK|^X1Z0Pid#bVxU2_gp;^5xUowfz7a)7x&+iFb&8m(0=BIOyat)nMg}^Wm zy#xZva`IQFU#3f`;Ir=X*KiMU^=%Wb5eHrUA&x!&0H}&{#%m_((n!Uscwt%gEKGw9 zyVhUsGK^2!Q@JF|_0*smRE5S$aMXPV6mL+;rT#)gqaS$Y@2{tKzUxa>jwDxdPWIs} zOBA>DCwn9v>G}%ns~^`^jfxoW!qj^$foOwE{6#aBRlHfpcx`EU5l(F;`D5)P-N@-u z7O|2V{ZF-TlD__&y=OQl^`)NAE^b7{Xdl() z?9%tk_5Dfpozmz2C8|U)<@XoK`uV5>o(N+rZvU!@7A_=43zyzhkQu-YEnK_^tnv9{ zZU_KUYd=dKco9vb7BlQCYCa&U{@4=<`;K=FXQLt?8w;JcM)31$piEpUP zu31y0&dt)j=r%2L_u6UMc?qTtV{lrM4*Vk1j}bnK4tbSNU<`2wS=!H}#*lJ5RLE{? zg(Sn?RO!?UvX!$zD?3Wm^=vD=ZVik4J;9lqom8q;%)Rhbm}_6QhP)o!*3NHVoc1=n zBUBz@|8>gwp|kNWFI{u-YRI&e;z^0`33ex0pM$?lCJ_o(DNRUoab_b+lVn=u-{!o_ z*QAVg&swf!?QhXuOSGOb)h~Me`_N9uU<@5I=r~a2CT-vpb5>bm_EZa5ID3|z?=a+;nhPx9)UW|c%gNquwvA?&5tdVD$7)@xh9t`FAhI=?+mQw>ht zHmz(umBPKj8a~Wp)a8wH9U!ja_!Hh|=sXf2u-}0xk{lCkSy!1EY}?EEIm>`aFocmq z&!^dvsNzcnv4jTB#?U68OZW>?c|+4j%D$M-BgEyi^`~L3ILWdg@%E|M$A||C{>l4R z&8E1nxpI=HxC+g|+~tm*fLX77*-C~e2(aI}?wKw%{A~e5%#QVNpd17C?Pc2Fih%3u z8vKu?PqC$-7LB`X#i>2K%&pz>*t(y9)U|?jQRdE120|?-^|X@vQW0;$2yM<~JUvjQjNKiq1ZgXSBo%K6~t&Bc1LF zpfVD2$P3?7(xi_sO0q5?@8_|XVl#cSn>76Opr68Ygm>+iOjnV{U5aB(2I_B;KJsq0 zOq^@v!?;buA_~6oII5tzI27w7jQ0wL5=EeiY15ZlukwY>pmFGzwuiFUpA(N*xec9{PrVeA`w(<=%)5g5ytfr&N4_3s;S zlFdUA2gbas@Y9SPuaQZ3yMg0~jbX?p3r7`bGo@j2E8%R{fZm#UoA8aeb8Y;2#)zd7 zp;2P_kJ^;)=_6wvx$#}McRD2!UuY~8Lu-Z=MWQKBsyze15_HtJPbz}g+bgu4Gv3M6 z*vX5t2&`g&w-n@T1lXy0tl#;Ee`&Uzqz?a91MN(j+;CpID}$uIZCG5k6R2Z5fiW2O zq_I7K@fK%MFJz>k0Rg6+k6J}WQKkJdn4zXK{n8dbwY0R-qu#r|O@&}u@w<1TKyZzS zOh_7)2WfFe${Qj(_XtXxoHm|0_{BFN>kGNBt;68>hFrI1EVrj+XFxieNMg~Z=IRCE z_EyZ}_+7#`-T<4DsS&8}OR=J$6kofC7Ivd;x#h(M`;0s7H1uS7rx~l?K%Fh0`T&pU zv0Afv!*Ri7iB-YrS1lZmM&}lywid%6v0qCJ7~!*rhouU{BoV=G{#@%L2**Ps*+ek4F65zmOX9 zI&bUV*p$zm^w|aelrn(lwB=r<(pYnn(viVEam?C}FS;`?t+fuQNJbSeCQY4$FkiM* zt~W3=Q@tb0iis3}O5^HzwU^Ie`sF0rrGXDTiu1$kw-1qLSX^V>H zPENW_W}I4dzGWRaXKD&RN51>%dV7>FQrKp7{u@*J>hRTP?bMt8<=DuT#Cr(p?w`u{ zRZ;ZK1yF;-yVpx4gPE6aDvxBJS3m1eOM6kef|VV(kt8;aTzxji6j}qX@e4QN3o4(P zwHxi7$(OzrJy2`DtD+uo7=9rl^+qx#t36XTcF_deA}y4h-}&s-Je~p zo1DNW;~!vNJ)J|~dh;*N-Y&XuU+MzB9*PW9KQk2kb|b7`9Hee9OKufSw8pm zF;JI4t=U^@%lNl^>Ytidp=}&ZMs{zFYeHJJv%g*@UFEB6IQ+#8liX)Bc}XR3_uVcp zP3VEq7k_2+>F-lGCQkG9i;w4~A0ra8+)9Eq>#1a6(V-E&bh}tUdCs#?VJxW)X+5nn zbsNZo#hK*RN+Dztr12Z@7kt0+{k#J9arF#Ox{Phs1js#!%#*g#g{$PSaERzb`5RT; zE06K#A6uoQK=4Mv>%FkF=_k*YQxtyt%?sDp?&+@y+0ubawdd$maW2^mIzTz9<@=K$ z%OF8gW!_S%S66e_Ad%>%l-}S=+bUc6lWtHZV5M*E~aAPrMc$t@o-2FtWZ` zD8R~zPu41wGoG&~;L<~5#G!Hr^whpOc_>324t8+uo6(@em z7c7u~?16{ryc2$i z2Vu@BT64%G&b36)j5mOjSamZtm^(0qP^(P$7~lGR%f(pO4Vnrs9Vqbwrs`P@2q}UF zZw;l~d!9gGv!VwOP=7gvARq9`yN==8XbI-f6uF_5bv6hk^`QkQp1F_1LXNKk9MN6` zWUpm9H}QNzr?Y7w+}oABs}b`#sL&kLN)Nu6*a(hhUCvATOmZ|^M3j7C!YrUH+YBxT z&;B9Kuu8t=KrqiaQQb%IshGuy~NCO0I+#qy?+x?v)({$nGgH<66-hxYnt%+)e! z;K65BqBaYzvc%&*&xG>Rrz({t6nU(VrM%`JE%&M-ByLqI-1HQsO+5&iUrU(s#mMVa zD__e^`?b>C_;%SOxlV+5i~IaAcx`QrI`?tS%4Q7yILT{$WlrFf!KmJJ$UaqLy{ zNIq!jI4+g*9Ta(|Nk$X?U!s)cQh%XjHxyCGS`BMI8%7xWorAhb^f`smX#O z_ZW7!AILiIe@0YSuI`#N1FD($28`07bvztqS|Y1Wj1(`scFod@`saAZKjZvJxHTjX zCvE*dhc&Mem5|_i75U<7H8IW}g*o}I>O(bykGs<3bjzN_oNHVVrq4**h2(gfC*tIr zZs~J_lRtq{Ou4;aaNFE>>g+fPey7UdLO*jty8Pph20SPZ6rIu~K_9dhv?oU`@b$A| zFR`Rn1=&i1=R@aPP_jag@Mw}-Va?xbzH6tghtH+qkV&2@?=uAsQC-bl5#f<1xRMCJ zT#U<)fqFK$){d#9{K}zI!KvR97v3um=B*D=tY?LR&ZPA|S@rWL<*}|?MxMjo$rVQe zgBO$cMH@_greCuMh#I4e=h-UM`nvi~|BBjH%#vGIiIE!Zi$ZFATOPkc-Ikpc~pNu_+L5M69%Toj&6?q{|~OnusS0PzZHMy|B=m zlzBJ5!t`q?448OZRF~mgC@jcAaW>+nc!7{Fq`{_Hlp?^YMT^HM4O>35sGfe#1* z7Wc>~>bIps& z3dmG28mV;wsjU`vE4TKm$kOczS1bTZ(< zq!?IyyN^`X!oQ@79i7#Y(+iDyqS6S{Y#>KGsKHSAiN8x}pF3m(FW5>867F}gj;MTA z5@fff_tz=y^TUIAtj!_Y4UFGYf*`MN&z4;(-5I=oTJ*U!ls+Vsc>Bjuxt}%6%1zB} zDiaV0YP1u1y!DbQe%HRzkG+N3|C40^t0^7}n(Skp=K96`)FLl=370`PYf3r=&$F*bu#S z#loYQ{+VZWMzIUdeR3VT~29sK8lp1%pG1v!Q(}XdJ8Nu6h zeny!e;lcOV=*Urm?^{*kzk2%LEyVkn1k$f-5I4@e2+9YkUeOG@o!t%n@*}xis@$nv(tUK6m_3aaia|iHdn0_frI87%#f#_0IcN)Dv3mt5p6(%)_A?4i$;R z_xB2MHH6B%eje*kOvTKWTOQldmtCY_(h%8Z*0o%4qoO%T*i%9Ezg=$Vt_I^vg*yXj zEppBO0QVyLG2>Fsm;@bt8n9wnH5ln-!{)60`PM_eysIe6)zzs?GNKHz7g4HmAP0Vm znbPI1+iVh@pog#+GBc}SBDZ%P;t_i z;xxQdEC3Dz0T6h^I1ySH$E$hN_pX{0Qu|>CvhCC4InnorB)lBOhFQXTs4OUA+LtkUcobP z_Dp%uqzZLwhk^$d7-bnX->ymG98iXDUa`cx;_?KA48yLZN!K>>Eam_}2!aGVp649X zKg>*y&r$7mddcSr1@%kL)xtIbSCmas&zW7 zRG=Vj$}3)8P(Ac_75%ew;4s_Ch=F6UDQDb7C!^j4D24i2s@s}ah)VeVsg z2TpB-TPiSo&!fXO&TC8l&*+{=bLR9US7E!l-dn5PVGzReLB195gNT#|Lw=Wzw8`fh>abfx^LXHNYZf(|PZd=hSG;;=~7vj#Yq%%KxFtn6O zLuQP%z|iLi)1lsf4}ACFi`l>mQP{Z;4qLxFQt}|oi$*eIruac1+aTL6vLMYF?F{+x z4$)q`H2j#2#LeR;xkA;Wr8MSp;x7)11=cFn^qANL$nkicqLzkA_ms&P&)3hwOUC6S<@4&U9i!^XnS_|0~&s>B-iIq15)Ym)GB)r37v$z9>E2s!hl&V6EE zt(6ozHhTeRdQ@5g5_ujZu;F(NI%$p49?HTkB`}S0V4O_4z`C>_?nYj>n00?+y^|nn zkEA5`M@ReY{R0Fp!iyN=TV+Y0mdgAGv*nlGqbhM%sFTjY6afdAz_iWJr|x9wvGBl7 z(U%@WWXyCTU`c~KN8agIbXn#a3&+1T7BxwU+{M3EtQ`pe`uec>T76V9Xab@#Y@JqK zSF`nb&!^bf8Ho+0LH>J#-Qr3*60aTl>|TtZ^uzd^J843Yx6O|H-s$w?aGsA;S&-c1 z*{)YR@!>Z5!M75xyxh6d&9##Yh(UleIh9*wI|iTvsFBE*wm^l4{C~R&3ZQ0p-)N`a z`RN@x{km*HO0(i7l<%4I4zMK_se)%{k8J$fyK);ox&OwQTa8l29#?%dI(QBIUByeA z&Fh98E{fjG$TMNLB+zw{_@bNFH>{o5x9mPtM1>$*@gBsFwR$vmX zbnnlK{$~Uiti@wJg^xdYek&& zHk^*qXr%bN#pmz)K>~xBl2*6G$6;$(&I?r|6|%>9uWDRvf()2AFHK)MwuQZNdP9|i z|Jr{&!MmuldvmB@tz7|dE!PU!HrsAHD(6t}?IRy2)FH6CS)Ug6*^uG8CiB+A;!QY# zHaO;ojhUu#K6!&2Uq3fq-y5V*RxN;K&i;@bscU_)oBL!grij%__V9vzP&CrsWpR0D z^v|HK-3^^Wyb;C{V@ScQWxTxTn==*3`pKIb6dL?!z0@^_Q1*m3uguuwrZ!=G%?ava zxre%YUYO?C(T)U(oE)~=QBl7_(sTfqXdN}zOjKx>fIbK=yT`D2v77^ej)?$HdXJO6=bZnnOFk6MHCf6-eFn?t@IJZc^ z%!-ew&4)MCtT~wBNpf7^2uz?&{b(`X=9LSiqzC+44*9j4YC>(?m1P;ej7;F+0*)JckBQ-<-I zV!jK$)$b?&UAgJ)l$zA8HswABQ=n_!?d?}k*OR!%+M{FGZ8QqDXl>2S!nL&i4PC`CldRrY-;g literal 0 HcmV?d00001 diff --git a/generator-web/src/main/resources/static/index.html b/generator-web/src/main/resources/static/index.html new file mode 100644 index 0000000..1e1bd09 --- /dev/null +++ b/generator-web/src/main/resources/static/index.html @@ -0,0 +1,365 @@ + + + + + + + Carbon - Admin Template + + + + + +
+ + +
+ + +
+
+
+
+
+
+
+ 54 + Total Users +
+ +
+ +
+
+
+
+ +
+
+
+
+ $32,400 + Income +
+ +
+ +
+
+
+
+ +
+
+
+
+ 900 + Downloads +
+ +
+ +
+
+
+
+ +
+
+
+
+ 32s + Time +
+ +
+ +
+
+
+
+
+ +
+
+
+
+ Total Users +
+ +
+
+ +
+ +
+
+
Total Traffic
+
12,457 Users (40%)
+
+ +
+
Banned Users
+
95,333 Users (5%)
+
+ +
+
Page Views
+
957,565 Pages (50%)
+
+ +
+
Total Downloads
+
957,565 Files (100 TB)
+
+
+
+
+
+ More Templates 模板之家 - Collect from 网页模板 +
+
+
+
+
+ + + + + + + + diff --git a/generator-web/src/main/resources/static/invoice.html b/generator-web/src/main/resources/static/invoice.html new file mode 100644 index 0000000..2c4b5d9 --- /dev/null +++ b/generator-web/src/main/resources/static/invoice.html @@ -0,0 +1,365 @@ + + + + + + + Carbon - Admin Template + + + + + +
+ + +
+ + +
+
+
+
+
+
+
+
+ +
+ +
+

Invoice #550

+

Due to: 4 Dec, 2019

+
+
+ +
+ +
+
+

Client Information

+

John Doe, Mrs Emma Downson

+

Acme Inc

+

Berlin, Germany

+

6781 45P

+
+ +
+

Payment Details

+

VAT: 1425782

+

VAT ID: 10253642

+

Payment Type: Root

+

Name: John Doe

+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IDItemDescriptionQuantityUnit CostTotal
1SoftwareLTS Versions21$321$3452
1SoftwareSupport234$6356$23423
1SoftwareSofware Collection4534$354$23434
+
+
+ +
+
+
Grand Total
+
$234,234
+
+ +
+
Discount
+
10%
+
+ +
+
Sub - Total amount
+
$32,432
+
+
+
+
+
+
+
+
+
+
+ + + + + + + + diff --git a/generator-web/src/main/resources/static/js/carbon.js b/generator-web/src/main/resources/static/js/carbon.js new file mode 100644 index 0000000..1eed5f8 --- /dev/null +++ b/generator-web/src/main/resources/static/js/carbon.js @@ -0,0 +1,54 @@ +$(document).ready(function () { + /** + * Sidebar Dropdown + */ + $('.nav-dropdown-toggle').on('click', function (e) { + e.preventDefault(); + $(this).parent().toggleClass('open'); + }); + + // open sub-menu when an item is active. + $('ul.nav').find('a.active').parent().parent().parent().addClass('open'); + + /** + * Sidebar Toggle + */ + $('.sidebar-toggle').on('click', function (e) { + e.preventDefault(); + $('body').toggleClass('sidebar-hidden'); + }); + + /** + * Mobile Sidebar Toggle + */ + $('.sidebar-mobile-toggle').on('click', function () { + $('body').toggleClass('sidebar-mobile-show'); + }); +}); + +// 提示框 +/*toast提示*/ +function msg(text, showIn) { + var $toast = $('.toast-box'); + var $mask = $('.mask-page'); + if ($toast.length != 0 || !text) { + return false; + } + + var showIn = showIn || 1000; // 显示时间 + if ($mask.length == 0) { + var mask = document.createElement('div'); + mask.className = 'mask-page'; + document.body.appendChild(mask); + } + var toast = document.createElement('div'); + toast.className = 'toast-box'; + toast.innerHTML = text; + document.body.appendChild(toast); + $mask = $(mask).show(); + $toast = $(toast).show(); + setTimeout(function () { + $mask.remove(); + $toast.remove(); + }, showIn); +}; \ No newline at end of file diff --git a/generator-web/src/main/resources/static/js/demo.js b/generator-web/src/main/resources/static/js/demo.js new file mode 100644 index 0000000..cfd491d --- /dev/null +++ b/generator-web/src/main/resources/static/js/demo.js @@ -0,0 +1,190 @@ +$(document).ready(function () { + /** + * Line Chart + */ + var lineChart = $('#line-chart'); + + if (lineChart.length > 0) { + new Chart(lineChart, { + type: 'line', + data: { + labels: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], + datasets: [{ + label: 'Users', + data: [12, 19, 3, 5, 2, 3, 20, 33, 23, 12, 33, 10], + backgroundColor: 'rgba(66, 165, 245, 0.5)', + borderColor: '#2196F3', + borderWidth: 1 + }] + }, + options: { + legend: { + display: false + }, + scales: { + yAxes: [{ + ticks: { + beginAtZero: true + } + }] + } + } + }); + } + + /** + * Bar Chart + */ + var barChart = $('#bar-chart'); + + if (barChart.length > 0) { + new Chart(barChart, { + type: 'bar', + data: { + labels: ["Red", "Blue", "Cyan", "Green", "Purple", "Orange"], + datasets: [{ + label: '# of Votes', + data: [12, 19, 3, 5, 2, 3], + backgroundColor: [ + 'rgba(244, 88, 70, 0.5)', + 'rgba(33, 150, 243, 0.5)', + 'rgba(0, 188, 212, 0.5)', + 'rgba(42, 185, 127, 0.5)', + 'rgba(156, 39, 176, 0.5)', + 'rgba(253, 178, 68, 0.5)' + ], + borderColor: [ + '#F45846', + '#2196F3', + '#00BCD4', + '#2ab97f', + '#9C27B0', + '#fdb244' + ], + borderWidth: 1 + }] + }, + options: { + legend: { + display: false + }, + scales: { + yAxes: [{ + ticks: { + beginAtZero: true + } + }] + } + } + }); + } + + /** + * Radar Chart + */ + var radarChart = $('#radar-chart'); + + if (radarChart.length > 0) { + new Chart(radarChart, { + type: 'radar', + data: { + labels: ["Red", "Blue", "Cyan", "Green", "Purple", "Orange"], + datasets: [{ + label: 'Users', + data: [100, 45, 87, 50, 77, 20], + backgroundColor: 'rgba(244, 88, 70, 0.5)', + borderColor: '#F45846', + borderWidth: 1 + }, { + label: 'Votes', + data: [23, 55, 75, 54, 95, 100], + backgroundColor: 'rgba(33, 150, 243, 0.5)', + borderColor: '#2196F3', + borderWidth: 1 + }] + } + }); + } + + /** + * Pie Chart + */ + var pieChart = $('#pie-chart'); + + if (pieChart.length > 0) { + new Chart(pieChart, { + type: 'pie', + data: { + labels: ["Red", "Blue", "Cyan", "Green", "Purple", "Orange"], + datasets: [{ + label: 'Users', + data: [100, 45, 87, 50, 77, 20], + backgroundColor: [ + 'rgba(244, 88, 70, 0.5)', + 'rgba(33, 150, 243, 0.5)', + 'rgba(0, 188, 212, 0.5)', + 'rgba(42, 185, 127, 0.5)', + 'rgba(156, 39, 176, 0.5)', + 'rgba(253, 178, 68, 0.5)' + ], + borderColor: [ + 'rgba(244, 88, 70, 0.5)', + 'rgba(33, 150, 243, 0.5)', + 'rgba(0, 188, 212, 0.5)', + 'rgba(42, 185, 127, 0.5)', + 'rgba(156, 39, 176, 0.5)', + 'rgba(253, 178, 68, 0.5)' + ], + borderWidth: 1 + }] + } + }); + } + + /** + * Widget Line Chart + */ + var wLineChart = $('.widget-line-chart'); + + wLineChart.each(function (index, canvas) { + new Chart(canvas, { + type: 'line', + data: { + labels: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], + datasets: [{ + label: 'Users', + data: [12, 19, 3, 5, 2, 3, 20, 33, 23, 12, 33, 10], + borderColor: '#fff', + borderWidth: 1, + fill: false, + }] + }, + options: { + legend: { + display: false + }, + scales: { + yAxes: [{ + ticks: { + beginAtZero: true, + display: false, + }, + gridLines: { + display: false, + drawBorder: false, + } + }], + xAxes: [{ + ticks: { + display: false, + }, + gridLines: { + display: false, + drawBorder: false, + } + }] + } + } + }); + }); +}); diff --git a/generator-web/src/main/resources/static/js/page.js b/generator-web/src/main/resources/static/js/page.js new file mode 100644 index 0000000..dbeee29 --- /dev/null +++ b/generator-web/src/main/resources/static/js/page.js @@ -0,0 +1,48 @@ +var commonFn={}; + +commonFn.setAjaxPaginator = function (paginatorSelector, count, option) { + var totals = count;//总条数 + var pageSize = option.pageSize; //每页条数 + var totalPages = 1; + if (totals != 0) { + if (totals % pageSize == 0) { + totalPages = totals / pageSize; + } else { + totalPages = Math.ceil(totals / pageSize); + } + } + if (totalPages > 1) { + //当总页数大于1时生成显示分页否则不显示分页 + commonFn.buildAjaxPaginator(paginatorSelector, $.extend(option, {totalPages: totalPages})) + }else{ + paginatorSelector.html(""); + } +} + +commonFn.buildAjaxPaginator = function (paginatorSelector, option) { + var _option = { + currentPage: 1, //当前页 + totalPages: 1, //总页数 + numberOfPages: 5, //设置控件显示的页码数 + bootstrapMajorVersion: 3,//如果是bootstrap3版本需要加此标识,并且设置包含分页内容的DOM元素为UL,如果是bootstrap2版本,则DOM包含元素是DIV + useBootstrapTooltip: false,//是否显示tip提示框 + itemTexts: function (type, page, current) {//文字翻译 + switch (type) { + case "first": + return "首页"; + case "prev": + return "上一页"; + case "next": + return "下一页"; + case "last": + return "尾页"; + case "page": + return page; + } + }, + onPageClicked: function (event, originalEvent, type, page, pageSize) { + } + }; + $.extend(_option, option); + paginatorSelector.bootstrapPaginator(_option); +} \ No newline at end of file diff --git a/generator-web/src/main/resources/static/js/templateHelper.js b/generator-web/src/main/resources/static/js/templateHelper.js new file mode 100644 index 0000000..e529485 --- /dev/null +++ b/generator-web/src/main/resources/static/js/templateHelper.js @@ -0,0 +1,37 @@ +if(typeof(template)!="undefined" && template&&template.helper){ + template.helper("dateToStringShort",dateToStringShort); + template.helper("dateToString",dateToString); +} + +//时间戳转换为时间字符串,返回的时间格式yyyy-MM-dd +function dateToStringShort(inputTime){ + if(inputTime==null || inputTime==''){ + return ''; + } + var date = new Date(inputTime); + var y = date.getFullYear(); + var m = date.getMonth() + 1; + m = m < 10 ? ('0' + m) : m; + var d = date.getDate(); + d = d < 10 ? ('0' + d) : d; + return y + '-' + m + '-' + d; +} +//返回的时间格式 yyyy-MM-dd HH:mm:ss +function dateToString(inputTime){ + if(inputTime==null || inputTime==''){ + return ''; + } + var date = new Date(inputTime); + var y = date.getFullYear(); + var m = date.getMonth() + 1; + m = m < 10 ? ('0' + m) : m; + var d = date.getDate(); + d = d < 10 ? ('0' + d) : d; + var h = date.getHours(); + h = h < 10 ? ('0' + h) : h; + var minute = date.getMinutes(); + var second = date.getSeconds(); + minute = minute < 10 ? ('0' + minute) : minute; + second = second < 10 ? ('0' + second) : second; + return y + '-' + m + '-' + d+' '+h+':'+minute+':'+second; +} diff --git a/generator-web/src/main/resources/static/layouts-fixed-header.html b/generator-web/src/main/resources/static/layouts-fixed-header.html new file mode 100644 index 0000000..7ded28b --- /dev/null +++ b/generator-web/src/main/resources/static/layouts-fixed-header.html @@ -0,0 +1,424 @@ + + + + + + + Carbon - Admin Template + + + + + +
+ + +
+ + +
+
+
+
+
+ Default Card +
+ +
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Alias architecto atque deleniti dolor dolores doloribus ducimus ea, eveniet facere hic illo illum laborum maiores nemo optio quas quis tenetur totam. +
+
+
+ +
+
+
+ Light Header +
+ +
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Alias architecto atque deleniti dolor dolores doloribus ducimus ea, eveniet facere hic illo illum laborum maiores nemo optio quas quis tenetur totam. +
+
+
+ +
+
+
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Alias architecto atque deleniti dolor dolores doloribus ducimus ea, eveniet facere hic illo illum laborum maiores nemo optio quas quis tenetur totam. +
+ + +
+
+
+ +
+
+
+
+ Card with Actions + +
+ + + + + + + +
+
+ +
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
+
+
+ +
+
+
+ Card Divded Header +
+ +
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
+
+
+ +
+
+
+ Light Card +
+ +
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
+
+
+
+ +
+
+
+
+ Primary Card +
+ +
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
+
+
+ +
+
+
+ Info Card +
+ +
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
+
+
+ +
+
+
+ Danger Card +
+ +
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
+
+
+
+ +
+
+
+
+ Success Card +
+ +
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
+
+
+ +
+
+
+ Warning Card +
+ +
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
+
+
+ +
+
+
+ Dark Card +
+ +
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
+
+
+
+
+
+
+ + + + + + + + diff --git a/generator-web/src/main/resources/static/layouts-fixed-sidebar.html b/generator-web/src/main/resources/static/layouts-fixed-sidebar.html new file mode 100644 index 0000000..8a14785 --- /dev/null +++ b/generator-web/src/main/resources/static/layouts-fixed-sidebar.html @@ -0,0 +1,424 @@ + + + + + + + Carbon - Admin Template + + + + + +
+ + +
+ + +
+
+
+
+
+ Default Card +
+ +
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Alias architecto atque deleniti dolor dolores doloribus ducimus ea, eveniet facere hic illo illum laborum maiores nemo optio quas quis tenetur totam. +
+
+
+ +
+
+
+ Light Header +
+ +
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Alias architecto atque deleniti dolor dolores doloribus ducimus ea, eveniet facere hic illo illum laborum maiores nemo optio quas quis tenetur totam. +
+
+
+ +
+
+
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Alias architecto atque deleniti dolor dolores doloribus ducimus ea, eveniet facere hic illo illum laborum maiores nemo optio quas quis tenetur totam. +
+ + +
+
+
+ +
+
+
+
+ Card with Actions + +
+ + + + + + + +
+
+ +
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
+
+
+ +
+
+
+ Card Divded Header +
+ +
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
+
+
+ +
+
+
+ Light Card +
+ +
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
+
+
+
+ +
+
+
+
+ Primary Card +
+ +
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
+
+
+ +
+
+
+ Info Card +
+ +
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
+
+
+ +
+
+
+ Danger Card +
+ +
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
+
+
+
+ +
+
+
+
+ Success Card +
+ +
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
+
+
+ +
+
+
+ Warning Card +
+ +
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
+
+
+ +
+
+
+ Dark Card +
+ +
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
+
+
+
+
+
+
+ + + + + + + + diff --git a/generator-web/src/main/resources/static/layouts-hidden-sidebar.html b/generator-web/src/main/resources/static/layouts-hidden-sidebar.html new file mode 100644 index 0000000..384c233 --- /dev/null +++ b/generator-web/src/main/resources/static/layouts-hidden-sidebar.html @@ -0,0 +1,424 @@ + + + + + + + Carbon - Admin Template + + + + + +
+ + +
+ + +
+
+
+
+
+ Default Card +
+ +
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Alias architecto atque deleniti dolor dolores doloribus ducimus ea, eveniet facere hic illo illum laborum maiores nemo optio quas quis tenetur totam. +
+
+
+ +
+
+
+ Light Header +
+ +
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Alias architecto atque deleniti dolor dolores doloribus ducimus ea, eveniet facere hic illo illum laborum maiores nemo optio quas quis tenetur totam. +
+
+
+ +
+
+
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Alias architecto atque deleniti dolor dolores doloribus ducimus ea, eveniet facere hic illo illum laborum maiores nemo optio quas quis tenetur totam. +
+ + +
+
+
+ +
+
+
+
+ Card with Actions + +
+ + + + + + + +
+
+ +
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
+
+
+ +
+
+
+ Card Divded Header +
+ +
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
+
+
+ +
+
+
+ Light Card +
+ +
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
+
+
+
+ +
+
+
+
+ Primary Card +
+ +
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
+
+
+ +
+
+
+ Info Card +
+ +
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
+
+
+ +
+
+
+ Danger Card +
+ +
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
+
+
+
+ +
+
+
+
+ Success Card +
+ +
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
+
+
+ +
+
+
+ Warning Card +
+ +
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
+
+
+ +
+
+
+ Dark Card +
+ +
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
+
+
+
+
+
+
+ + + + + + + + diff --git a/generator-web/src/main/resources/static/layouts-normal.html b/generator-web/src/main/resources/static/layouts-normal.html new file mode 100644 index 0000000..46fcb99 --- /dev/null +++ b/generator-web/src/main/resources/static/layouts-normal.html @@ -0,0 +1,424 @@ + + + + + + + Carbon - Admin Template + + + + + +
+ + +
+ + +
+
+
+
+
+ Default Card +
+ +
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Alias architecto atque deleniti dolor dolores doloribus ducimus ea, eveniet facere hic illo illum laborum maiores nemo optio quas quis tenetur totam. +
+
+
+ +
+
+
+ Light Header +
+ +
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Alias architecto atque deleniti dolor dolores doloribus ducimus ea, eveniet facere hic illo illum laborum maiores nemo optio quas quis tenetur totam. +
+
+
+ +
+
+
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Alias architecto atque deleniti dolor dolores doloribus ducimus ea, eveniet facere hic illo illum laborum maiores nemo optio quas quis tenetur totam. +
+ + +
+
+
+ +
+
+
+
+ Card with Actions + +
+ + + + + + + +
+
+ +
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
+
+
+ +
+
+
+ Card Divded Header +
+ +
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
+
+
+ +
+
+
+ Light Card +
+ +
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
+
+
+
+ +
+
+
+
+ Primary Card +
+ +
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
+
+
+ +
+
+
+ Info Card +
+ +
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
+
+
+ +
+
+
+ Danger Card +
+ +
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
+
+
+
+ +
+
+
+
+ Success Card +
+ +
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
+
+
+ +
+
+
+ Warning Card +
+ +
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
+
+
+ +
+
+
+ Dark Card +
+ +
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
+
+
+
+
+
+
+ + + + + + + + diff --git a/generator-web/src/main/resources/static/login.html b/generator-web/src/main/resources/static/login.html new file mode 100644 index 0000000..7a89dc6 --- /dev/null +++ b/generator-web/src/main/resources/static/login.html @@ -0,0 +1,62 @@ + + + + + + + Carbon - Admin Template + + + + + +
+
+
+
+
+
+ Login +
+ +
+
+ + +
+ +
+ + +
+ +
+ + +
+
+ + +
+
+
+
+
+ + + + + + + + diff --git a/generator-web/src/main/resources/static/modals.html b/generator-web/src/main/resources/static/modals.html new file mode 100644 index 0000000..7ab321c --- /dev/null +++ b/generator-web/src/main/resources/static/modals.html @@ -0,0 +1,602 @@ + + + + + + + Carbon - Admin Template + + + + + +
+ + +
+ + +
+
+
+
+
+ Modals +
+ +
+
+

Basic Modals

+ + + +
+ +
+
+

Colored Headers Modals

+ + + + + +
+ +
+
+

Full Color Modals

+ + + + + +
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/generator-web/src/main/resources/static/progress-bars.html b/generator-web/src/main/resources/static/progress-bars.html new file mode 100644 index 0000000..8d17b5f --- /dev/null +++ b/generator-web/src/main/resources/static/progress-bars.html @@ -0,0 +1,412 @@ + + + + + + + Carbon - Admin Template + + + + + +
+ + +
+ + +
+
+
+
+
+
+ Normal Progress Bars +
+ +
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+
+
+ +
+
+ Stripped Progress Bars +
+ +
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+
+
+
+
+
+ +
+
+
+
+
+ Progress Bar Sizes +
+ +
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+
+
+ +
+
+ Labels with Progress Bars +
+ +
+
+
+
+ +
+
+
+ +
+
35%
+
+ +
+
55%
+
+ +
+
25%
+
+ +
+
65%
+
+ +
+
30%
+
+
+
+
+
+
+
+
+
+ + + + + + + + diff --git a/generator-web/src/main/resources/static/register.html b/generator-web/src/main/resources/static/register.html new file mode 100644 index 0000000..cefd55e --- /dev/null +++ b/generator-web/src/main/resources/static/register.html @@ -0,0 +1,59 @@ + + + + + + + Carbon - Admin Template + + + + + +
+
+
+
+
+
+ Register +
+ +
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
+ + +
+
+
+
+
+ + + + + + + + diff --git a/generator-web/src/main/resources/static/settings.html b/generator-web/src/main/resources/static/settings.html new file mode 100644 index 0000000..a009a7d --- /dev/null +++ b/generator-web/src/main/resources/static/settings.html @@ -0,0 +1,359 @@ + + + + + + + Carbon - Admin Template + + + + + +
+ + +
+ + +
+
+
+ + +
+
+
+ Account Settings +
+ +
+
+
+
Profile Information
+
These information are visible to the public.
+
+ +
+
+
+
+ + +
+
+ +
+
+ + +
+
+
+ +
+
+
+ + +
+
+
+ +
+
+
+ + +
+
+
+
+
+ +
+ +
+
+
Access Credentials
+
Leave credentials fields empty if you don't wish to change the password.
+
+ +
+
+
+
+ + +
+
+ +
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+
+
+
+ + + + + + + + diff --git a/generator-web/src/main/resources/static/tables.html b/generator-web/src/main/resources/static/tables.html new file mode 100644 index 0000000..a92ce17 --- /dev/null +++ b/generator-web/src/main/resources/static/tables.html @@ -0,0 +1,512 @@ + + + + + + + Carbon - Admin Template + + + + + +
+ + +
+ + +
+
+
+
+
+ Normal Table +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IDNameSalesPriceDiscount
1Samsung Galaxy S831,589$8005%
2Google Pixel XL99,542$7503%
3iPhone X62,220$1,2000%
4OnePlus 5T50,000$6505%
5Google Nexus 6400$4007%
+
+
+
+
+ +
+
+
+ Striped Rows +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IDNameSalesPriceDiscount
1Samsung Galaxy S831,589$8005%
2Google Pixel XL99,542$7503%
3iPhone X62,220$1,2000%
4OnePlus 5T50,000$6505%
5Google Nexus 6400$4007%
+
+
+
+
+
+ +
+
+
+
+ Bordered Table +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IDNameSalesPriceDiscount
1Samsung Galaxy S831,589$8005%
2Google Pixel XL99,542$7503%
3iPhone X62,220$1,2000%
4OnePlus 5T50,000$6505%
5Google Nexus 6400$4007%
+
+
+
+
+ +
+
+
+ Hoverable Table +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IDNameSalesPriceDiscount
1Samsung Galaxy S831,589$8005%
2Google Pixel XL99,542$7503%
3iPhone X62,220$1,2000%
4OnePlus 5T50,000$6505%
5Google Nexus 6400$4007%
+
+
+
+
+
+
+
+
+ + + + + + + + diff --git a/generator-web/src/main/resources/static/tabs.html b/generator-web/src/main/resources/static/tabs.html new file mode 100644 index 0000000..3d26cce --- /dev/null +++ b/generator-web/src/main/resources/static/tabs.html @@ -0,0 +1,394 @@ + + + + + + + Carbon - Admin Template + + + + + +
+ + +
+ + +
+
+
+ + +
+
+ 1. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure + dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. +
+ +
+ 2. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure + dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. +
+ +
+ 3. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure + dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. +
+
+
+ +
+ + +
+
+ 1. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure + dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. +
+ +
+ 2. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure + dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. +
+ +
+ 3. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure + dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. +
+
+
+
+ +
+
+ + +
+
+ 1. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure + dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. +
+ + + +
+ 3. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure + dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. +
+
+
+ +
+ + +
+ + +
+ 2. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure + dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. +
+ +
+ 3. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure + dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. +
+
+
+
+
+
+
+ + + + + + + + diff --git a/generator-web/src/main/resources/static/vendor/bootstrap/js/bootstrap-datetimepicker.js b/generator-web/src/main/resources/static/vendor/bootstrap/js/bootstrap-datetimepicker.js new file mode 100755 index 0000000..41293e0 --- /dev/null +++ b/generator-web/src/main/resources/static/vendor/bootstrap/js/bootstrap-datetimepicker.js @@ -0,0 +1,1967 @@ +/* ========================================================= + * bootstrap-datetimepicker.js + * ========================================================= + * Copyright 2012 Stefan Petre + * + * Improvements by Andrew Rowls + * Improvements by Sébastien Malot + * Improvements by Yun Lai + * Improvements by Kenneth Henderick + * Improvements by CuGBabyBeaR + * Improvements by Christian Vaas + * + * Project URL : http://www.malot.fr/bootstrap-datetimepicker + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================= */ + +(function(factory){ + if (typeof define === 'function' && define.amd) + define(['jquery'], factory); + else if (typeof exports === 'object') + factory(require('jquery')); + else + factory(jQuery); + +}(function($, undefined){ + + // Add ECMA262-5 Array methods if not supported natively (IE8) + if (!('indexOf' in Array.prototype)) { + Array.prototype.indexOf = function (find, i) { + if (i === undefined) i = 0; + if (i < 0) i += this.length; + if (i < 0) i = 0; + for (var n = this.length; i < n; i++) { + if (i in this && this[i] === find) { + return i; + } + } + return -1; + } + } + + // Add timezone abbreviation support for ie6+, Chrome, Firefox + function timeZoneAbbreviation() { + var abbreviation, date, formattedStr, i, len, matchedStrings, ref, str; + date = (new Date()).toString(); + formattedStr = ((ref = date.split('(')[1]) != null ? ref.slice(0, -1) : 0) || date.split(' '); + if (formattedStr instanceof Array) { + matchedStrings = []; + for (var i = 0, len = formattedStr.length; i < len; i++) { + str = formattedStr[i]; + if ((abbreviation = (ref = str.match(/\b[A-Z]+\b/)) !== null) ? ref[0] : 0) { + matchedStrings.push(abbreviation); + } + } + formattedStr = matchedStrings.pop(); + } + return formattedStr; + } + + function UTCDate() { + return new Date(Date.UTC.apply(Date, arguments)); + } + + // Picker object + var Datetimepicker = function (element, options) { + var that = this; + + this.element = $(element); + + // add container for single page application + // when page switch the datetimepicker div will be removed also. + this.container = options.container || 'body'; + + this.language = options.language || this.element.data('date-language') || 'en'; + this.language = this.language in dates ? this.language : this.language.split('-')[0]; // fr-CA fallback to fr + this.language = this.language in dates ? this.language : 'en'; + this.isRTL = dates[this.language].rtl || false; + this.formatType = options.formatType || this.element.data('format-type') || 'standard'; + this.format = DPGlobal.parseFormat(options.format || this.element.data('date-format') || dates[this.language].format || DPGlobal.getDefaultFormat(this.formatType, 'input'), this.formatType); + this.isInline = false; + this.isVisible = false; + this.isInput = this.element.is('input'); + this.fontAwesome = options.fontAwesome || this.element.data('font-awesome') || false; + + this.bootcssVer = options.bootcssVer || (this.isInput ? (this.element.is('.form-control') ? 3 : 2) : ( this.bootcssVer = this.element.is('.input-group') ? 3 : 2 )); + + this.component = this.element.is('.date') ? ( this.bootcssVer === 3 ? this.element.find('.input-group-addon .glyphicon-th, .input-group-addon .glyphicon-time, .input-group-addon .glyphicon-remove, .input-group-addon .glyphicon-calendar, .input-group-addon .fa-calendar, .input-group-addon .fa-clock-o').parent() : this.element.find('.add-on .icon-th, .add-on .icon-time, .add-on .icon-calendar, .add-on .fa-calendar, .add-on .fa-clock-o').parent()) : false; + this.componentReset = this.element.is('.date') ? ( this.bootcssVer === 3 ? this.element.find('.input-group-addon .glyphicon-remove, .input-group-addon .fa-times').parent():this.element.find('.add-on .icon-remove, .add-on .fa-times').parent()) : false; + this.hasInput = this.component && this.element.find('input').length; + if (this.component && this.component.length === 0) { + this.component = false; + } + this.linkField = options.linkField || this.element.data('link-field') || false; + this.linkFormat = DPGlobal.parseFormat(options.linkFormat || this.element.data('link-format') || DPGlobal.getDefaultFormat(this.formatType, 'link'), this.formatType); + this.minuteStep = options.minuteStep || this.element.data('minute-step') || 5; + this.pickerPosition = options.pickerPosition || this.element.data('picker-position') || 'bottom-right'; + this.showMeridian = options.showMeridian || this.element.data('show-meridian') || false; + this.initialDate = options.initialDate || new Date(); + this.zIndex = options.zIndex || this.element.data('z-index') || undefined; + this.title = typeof options.title === 'undefined' ? false : options.title; + this.timezone = options.timezone || timeZoneAbbreviation(); + + this.icons = { + leftArrow: this.fontAwesome ? 'fa-arrow-left' : (this.bootcssVer === 3 ? 'glyphicon-arrow-left' : 'icon-arrow-left'), + rightArrow: this.fontAwesome ? 'fa-arrow-right' : (this.bootcssVer === 3 ? 'glyphicon-arrow-right' : 'icon-arrow-right') + } + this.icontype = this.fontAwesome ? 'fa' : 'glyphicon'; + + this._attachEvents(); + + this.clickedOutside = function (e) { + // Clicked outside the datetimepicker, hide it + if ($(e.target).closest('.datetimepicker').length === 0) { + that.hide(); + } + } + + this.formatViewType = 'datetime'; + if ('formatViewType' in options) { + this.formatViewType = options.formatViewType; + } else if ('formatViewType' in this.element.data()) { + this.formatViewType = this.element.data('formatViewType'); + } + + this.minView = 0; + if ('minView' in options) { + this.minView = options.minView; + } else if ('minView' in this.element.data()) { + this.minView = this.element.data('min-view'); + } + this.minView = DPGlobal.convertViewMode(this.minView); + + this.maxView = DPGlobal.modes.length - 1; + if ('maxView' in options) { + this.maxView = options.maxView; + } else if ('maxView' in this.element.data()) { + this.maxView = this.element.data('max-view'); + } + this.maxView = DPGlobal.convertViewMode(this.maxView); + + this.wheelViewModeNavigation = false; + if ('wheelViewModeNavigation' in options) { + this.wheelViewModeNavigation = options.wheelViewModeNavigation; + } else if ('wheelViewModeNavigation' in this.element.data()) { + this.wheelViewModeNavigation = this.element.data('view-mode-wheel-navigation'); + } + + this.wheelViewModeNavigationInverseDirection = false; + + if ('wheelViewModeNavigationInverseDirection' in options) { + this.wheelViewModeNavigationInverseDirection = options.wheelViewModeNavigationInverseDirection; + } else if ('wheelViewModeNavigationInverseDirection' in this.element.data()) { + this.wheelViewModeNavigationInverseDirection = this.element.data('view-mode-wheel-navigation-inverse-dir'); + } + + this.wheelViewModeNavigationDelay = 100; + if ('wheelViewModeNavigationDelay' in options) { + this.wheelViewModeNavigationDelay = options.wheelViewModeNavigationDelay; + } else if ('wheelViewModeNavigationDelay' in this.element.data()) { + this.wheelViewModeNavigationDelay = this.element.data('view-mode-wheel-navigation-delay'); + } + + this.startViewMode = 2; + if ('startView' in options) { + this.startViewMode = options.startView; + } else if ('startView' in this.element.data()) { + this.startViewMode = this.element.data('start-view'); + } + this.startViewMode = DPGlobal.convertViewMode(this.startViewMode); + this.viewMode = this.startViewMode; + + this.viewSelect = this.minView; + if ('viewSelect' in options) { + this.viewSelect = options.viewSelect; + } else if ('viewSelect' in this.element.data()) { + this.viewSelect = this.element.data('view-select'); + } + this.viewSelect = DPGlobal.convertViewMode(this.viewSelect); + + this.forceParse = true; + if ('forceParse' in options) { + this.forceParse = options.forceParse; + } else if ('dateForceParse' in this.element.data()) { + this.forceParse = this.element.data('date-force-parse'); + } + var template = this.bootcssVer === 3 ? DPGlobal.templateV3 : DPGlobal.template; + while (template.indexOf('{iconType}') !== -1) { + template = template.replace('{iconType}', this.icontype); + } + while (template.indexOf('{leftArrow}') !== -1) { + template = template.replace('{leftArrow}', this.icons.leftArrow); + } + while (template.indexOf('{rightArrow}') !== -1) { + template = template.replace('{rightArrow}', this.icons.rightArrow); + } + this.picker = $(template) + .appendTo(this.isInline ? this.element : this.container) // 'body') + .on({ + click: $.proxy(this.click, this), + mousedown: $.proxy(this.mousedown, this) + }); + + if (this.wheelViewModeNavigation) { + if ($.fn.mousewheel) { + this.picker.on({mousewheel: $.proxy(this.mousewheel, this)}); + } else { + console.log('Mouse Wheel event is not supported. Please include the jQuery Mouse Wheel plugin before enabling this option'); + } + } + + if (this.isInline) { + this.picker.addClass('datetimepicker-inline'); + } else { + this.picker.addClass('datetimepicker-dropdown-' + this.pickerPosition + ' dropdown-menu'); + } + if (this.isRTL) { + this.picker.addClass('datetimepicker-rtl'); + var selector = this.bootcssVer === 3 ? '.prev span, .next span' : '.prev i, .next i'; + this.picker.find(selector).toggleClass(this.icons.leftArrow + ' ' + this.icons.rightArrow); + } + + $(document).on('mousedown touchend', this.clickedOutside); + + this.autoclose = false; + if ('autoclose' in options) { + this.autoclose = options.autoclose; + } else if ('dateAutoclose' in this.element.data()) { + this.autoclose = this.element.data('date-autoclose'); + } + + this.keyboardNavigation = true; + if ('keyboardNavigation' in options) { + this.keyboardNavigation = options.keyboardNavigation; + } else if ('dateKeyboardNavigation' in this.element.data()) { + this.keyboardNavigation = this.element.data('date-keyboard-navigation'); + } + + this.todayBtn = (options.todayBtn || this.element.data('date-today-btn') || false); + this.clearBtn = (options.clearBtn || this.element.data('date-clear-btn') || false); + this.todayHighlight = (options.todayHighlight || this.element.data('date-today-highlight') || false); + + this.weekStart = 0; + if (typeof options.weekStart !== 'undefined') { + this.weekStart = options.weekStart; + } else if (typeof this.element.data('date-weekstart') !== 'undefined') { + this.weekStart = this.element.data('date-weekstart'); + } else if (typeof dates[this.language].weekStart !== 'undefined') { + this.weekStart = dates[this.language].weekStart; + } + this.weekStart = this.weekStart % 7; + this.weekEnd = ((this.weekStart + 6) % 7); + this.onRenderDay = function (date) { + var render = (options.onRenderDay || function () { return []; })(date); + if (typeof render === 'string') { + render = [render]; + } + var res = ['day']; + return res.concat((render ? render : [])); + }; + this.onRenderHour = function (date) { + var render = (options.onRenderHour || function () { return []; })(date); + var res = ['hour']; + if (typeof render === 'string') { + render = [render]; + } + return res.concat((render ? render : [])); + }; + this.onRenderMinute = function (date) { + var render = (options.onRenderMinute || function () { return []; })(date); + var res = ['minute']; + if (typeof render === 'string') { + render = [render]; + } + if (date < this.startDate || date > this.endDate) { + res.push('disabled'); + } else if (Math.floor(this.date.getUTCMinutes() / this.minuteStep) === Math.floor(date.getUTCMinutes() / this.minuteStep)) { + res.push('active'); + } + return res.concat((render ? render : [])); + }; + this.onRenderYear = function (date) { + var render = (options.onRenderYear || function () { return []; })(date); + var res = ['year']; + if (typeof render === 'string') { + render = [render]; + } + if (this.date.getUTCFullYear() === date.getUTCFullYear()) { + res.push('active'); + } + var currentYear = date.getUTCFullYear(); + var endYear = this.endDate.getUTCFullYear(); + if (date < this.startDate || currentYear > endYear) { + res.push('disabled'); + } + return res.concat((render ? render : [])); + } + this.onRenderMonth = function (date) { + var render = (options.onRenderMonth || function () { return []; })(date); + var res = ['month']; + if (typeof render === 'string') { + render = [render]; + } + return res.concat((render ? render : [])); + } + this.startDate = new Date(-8639968443048000); + this.endDate = new Date(8639968443048000); + this.datesDisabled = []; + this.daysOfWeekDisabled = []; + this.setStartDate(options.startDate || this.element.data('date-startdate')); + this.setEndDate(options.endDate || this.element.data('date-enddate')); + this.setDatesDisabled(options.datesDisabled || this.element.data('date-dates-disabled')); + this.setDaysOfWeekDisabled(options.daysOfWeekDisabled || this.element.data('date-days-of-week-disabled')); + this.setMinutesDisabled(options.minutesDisabled || this.element.data('date-minute-disabled')); + this.setHoursDisabled(options.hoursDisabled || this.element.data('date-hour-disabled')); + this.fillDow(); + this.fillMonths(); + this.update(); + this.showMode(); + + if (this.isInline) { + this.show(); + } + }; + + Datetimepicker.prototype = { + constructor: Datetimepicker, + + _events: [], + _attachEvents: function () { + this._detachEvents(); + if (this.isInput) { // single input + this._events = [ + [this.element, { + focus: $.proxy(this.show, this), + keyup: $.proxy(this.update, this), + keydown: $.proxy(this.keydown, this) + }] + ]; + } + else if (this.component && this.hasInput) { // component: input + button + this._events = [ + // For components that are not readonly, allow keyboard nav + [this.element.find('input'), { + focus: $.proxy(this.show, this), + keyup: $.proxy(this.update, this), + keydown: $.proxy(this.keydown, this) + }], + [this.component, { + click: $.proxy(this.show, this) + }] + ]; + if (this.componentReset) { + this._events.push([ + this.componentReset, + {click: $.proxy(this.reset, this)} + ]); + } + } + else if (this.element.is('div')) { // inline datetimepicker + this.isInline = true; + } + else { + this._events = [ + [this.element, { + click: $.proxy(this.show, this) + }] + ]; + } + for (var i = 0, el, ev; i < this._events.length; i++) { + el = this._events[i][0]; + ev = this._events[i][1]; + el.on(ev); + } + }, + + _detachEvents: function () { + for (var i = 0, el, ev; i < this._events.length; i++) { + el = this._events[i][0]; + ev = this._events[i][1]; + el.off(ev); + } + this._events = []; + }, + + show: function (e) { + this.picker.show(); + this.height = this.component ? this.component.outerHeight() : this.element.outerHeight(); + if (this.forceParse) { + this.update(); + } + this.place(); + $(window).on('resize', $.proxy(this.place, this)); + if (e) { + e.stopPropagation(); + e.preventDefault(); + } + this.isVisible = true; + this.element.trigger({ + type: 'show', + date: this.date + }); + }, + + hide: function () { + if (!this.isVisible) return; + if (this.isInline) return; + this.picker.hide(); + $(window).off('resize', this.place); + this.viewMode = this.startViewMode; + this.showMode(); + if (!this.isInput) { + $(document).off('mousedown', this.hide); + } + + if ( + this.forceParse && + ( + this.isInput && this.element.val() || + this.hasInput && this.element.find('input').val() + ) + ) + this.setValue(); + this.isVisible = false; + this.element.trigger({ + type: 'hide', + date: this.date + }); + }, + + remove: function () { + this._detachEvents(); + $(document).off('mousedown', this.clickedOutside); + this.picker.remove(); + delete this.picker; + delete this.element.data().datetimepicker; + }, + + getDate: function () { + var d = this.getUTCDate(); + if (d === null) { + return null; + } + return new Date(d.getTime() + (d.getTimezoneOffset() * 60000)); + }, + + getUTCDate: function () { + return this.date; + }, + + getInitialDate: function () { + return this.initialDate + }, + + setInitialDate: function (initialDate) { + this.initialDate = initialDate; + }, + + setDate: function (d) { + this.setUTCDate(new Date(d.getTime() - (d.getTimezoneOffset() * 60000))); + }, + + setUTCDate: function (d) { + if (d >= this.startDate && d <= this.endDate) { + this.date = d; + this.setValue(); + this.viewDate = this.date; + this.fill(); + } else { + this.element.trigger({ + type: 'outOfRange', + date: d, + startDate: this.startDate, + endDate: this.endDate + }); + } + }, + + setFormat: function (format) { + this.format = DPGlobal.parseFormat(format, this.formatType); + var element; + if (this.isInput) { + element = this.element; + } else if (this.component) { + element = this.element.find('input'); + } + if (element && element.val()) { + this.setValue(); + } + }, + + setValue: function () { + var formatted = this.getFormattedDate(); + if (!this.isInput) { + if (this.component) { + this.element.find('input').val(formatted); + } + this.element.data('date', formatted); + } else { + this.element.val(formatted); + } + if (this.linkField) { + $('#' + this.linkField).val(this.getFormattedDate(this.linkFormat)); + } + }, + + getFormattedDate: function (format) { + format = format || this.format; + return DPGlobal.formatDate(this.date, format, this.language, this.formatType, this.timezone); + }, + + setStartDate: function (startDate) { + this.startDate = startDate || this.startDate; + if (this.startDate.valueOf() !== 8639968443048000) { + this.startDate = DPGlobal.parseDate(this.startDate, this.format, this.language, this.formatType, this.timezone); + } + this.update(); + this.updateNavArrows(); + }, + + setEndDate: function (endDate) { + this.endDate = endDate || this.endDate; + if (this.endDate.valueOf() !== 8639968443048000) { + this.endDate = DPGlobal.parseDate(this.endDate, this.format, this.language, this.formatType, this.timezone); + } + this.update(); + this.updateNavArrows(); + }, + + setDatesDisabled: function (datesDisabled) { + this.datesDisabled = datesDisabled || []; + if (!$.isArray(this.datesDisabled)) { + this.datesDisabled = this.datesDisabled.split(/,\s*/); + } + var mThis = this; + this.datesDisabled = $.map(this.datesDisabled, function (d) { + return DPGlobal.parseDate(d, mThis.format, mThis.language, mThis.formatType, mThis.timezone).toDateString(); + }); + this.update(); + this.updateNavArrows(); + }, + + setTitle: function (selector, value) { + return this.picker.find(selector) + .find('th:eq(1)') + .text(this.title === false ? value : this.title); + }, + + setDaysOfWeekDisabled: function (daysOfWeekDisabled) { + this.daysOfWeekDisabled = daysOfWeekDisabled || []; + if (!$.isArray(this.daysOfWeekDisabled)) { + this.daysOfWeekDisabled = this.daysOfWeekDisabled.split(/,\s*/); + } + this.daysOfWeekDisabled = $.map(this.daysOfWeekDisabled, function (d) { + return parseInt(d, 10); + }); + this.update(); + this.updateNavArrows(); + }, + + setMinutesDisabled: function (minutesDisabled) { + this.minutesDisabled = minutesDisabled || []; + if (!$.isArray(this.minutesDisabled)) { + this.minutesDisabled = this.minutesDisabled.split(/,\s*/); + } + this.minutesDisabled = $.map(this.minutesDisabled, function (d) { + return parseInt(d, 10); + }); + this.update(); + this.updateNavArrows(); + }, + + setHoursDisabled: function (hoursDisabled) { + this.hoursDisabled = hoursDisabled || []; + if (!$.isArray(this.hoursDisabled)) { + this.hoursDisabled = this.hoursDisabled.split(/,\s*/); + } + this.hoursDisabled = $.map(this.hoursDisabled, function (d) { + return parseInt(d, 10); + }); + this.update(); + this.updateNavArrows(); + }, + + place: function () { + if (this.isInline) return; + + if (!this.zIndex) { + var index_highest = 0; + $('div').each(function () { + var index_current = parseInt($(this).css('zIndex'), 10); + if (index_current > index_highest) { + index_highest = index_current; + } + }); + this.zIndex = index_highest + 10; + } + + var offset, top, left, containerOffset; + if (this.container instanceof $) { + containerOffset = this.container.offset(); + } else { + containerOffset = $(this.container).offset(); + } + + if (this.component) { + offset = this.component.offset(); + left = offset.left; + if (this.pickerPosition === 'bottom-left' || this.pickerPosition === 'top-left') { + left += this.component.outerWidth() - this.picker.outerWidth(); + } + } else { + offset = this.element.offset(); + left = offset.left; + if (this.pickerPosition === 'bottom-left' || this.pickerPosition === 'top-left') { + left += this.element.outerWidth() - this.picker.outerWidth(); + } + } + + var bodyWidth = document.body.clientWidth || window.innerWidth; + if (left + 220 > bodyWidth) { + left = bodyWidth - 220; + } + + if (this.pickerPosition === 'top-left' || this.pickerPosition === 'top-right') { + top = offset.top - this.picker.outerHeight(); + } else { + top = offset.top + this.height; + } + + top = top - containerOffset.top; + left = left - containerOffset.left; + + this.picker.css({ + top: top, + left: left, + zIndex: this.zIndex + }); + }, + + hour_minute: "^([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]", + + update: function () { + var date, fromArgs = false; + if (arguments && arguments.length && (typeof arguments[0] === 'string' || arguments[0] instanceof Date)) { + date = arguments[0]; + fromArgs = true; + } else { + date = (this.isInput ? this.element.val() : this.element.find('input').val()) || this.element.data('date') || this.initialDate; + if (typeof date === 'string') { + date = date.replace(/^\s+|\s+$/g,''); + } + } + + if (!date) { + date = new Date(); + fromArgs = false; + } + + if (typeof date === "string") { + if (new RegExp(this.hour_minute).test(date) || new RegExp(this.hour_minute + ":[0-5][0-9]").test(date)) { + date = this.getDate() + } + } + + this.date = DPGlobal.parseDate(date, this.format, this.language, this.formatType, this.timezone); + + if (fromArgs) this.setValue(); + + if (this.date < this.startDate) { + this.viewDate = new Date(this.startDate); + } else if (this.date > this.endDate) { + this.viewDate = new Date(this.endDate); + } else { + this.viewDate = new Date(this.date); + } + this.fill(); + }, + + fillDow: function () { + var dowCnt = this.weekStart, + html = ''; + while (dowCnt < this.weekStart + 7) { + html += '' + dates[this.language].daysMin[(dowCnt++) % 7] + ''; + } + html += ''; + this.picker.find('.datetimepicker-days thead').append(html); + }, + + fillMonths: function () { + var html = ''; + var d = new Date(this.viewDate); + for (var i = 0; i < 12; i++) { + d.setUTCMonth(i); + var classes = this.onRenderMonth(d); + html += '' + dates[this.language].monthsShort[i] + ''; + } + this.picker.find('.datetimepicker-months td').html(html); + }, + + fill: function () { + if (!this.date || !this.viewDate) { + return; + } + var d = new Date(this.viewDate), + year = d.getUTCFullYear(), + month = d.getUTCMonth(), + dayMonth = d.getUTCDate(), + hours = d.getUTCHours(), + startYear = this.startDate.getUTCFullYear(), + startMonth = this.startDate.getUTCMonth(), + endYear = this.endDate.getUTCFullYear(), + endMonth = this.endDate.getUTCMonth() + 1, + currentDate = (new UTCDate(this.date.getUTCFullYear(), this.date.getUTCMonth(), this.date.getUTCDate())).valueOf(), + today = new Date(); + this.setTitle('.datetimepicker-days', dates[this.language].months[month] + ' ' + year) + if (this.formatViewType === 'time') { + var formatted = this.getFormattedDate(); + this.setTitle('.datetimepicker-hours', formatted); + this.setTitle('.datetimepicker-minutes', formatted); + } else { + this.setTitle('.datetimepicker-hours', dayMonth + ' ' + dates[this.language].months[month] + ' ' + year); + this.setTitle('.datetimepicker-minutes', dayMonth + ' ' + dates[this.language].months[month] + ' ' + year); + } + this.picker.find('tfoot th.today') + .text(dates[this.language].today || dates['en'].today) + .toggle(this.todayBtn !== false); + this.picker.find('tfoot th.clear') + .text(dates[this.language].clear || dates['en'].clear) + .toggle(this.clearBtn !== false); + this.updateNavArrows(); + this.fillMonths(); + var prevMonth = UTCDate(year, month - 1, 28, 0, 0, 0, 0), + day = DPGlobal.getDaysInMonth(prevMonth.getUTCFullYear(), prevMonth.getUTCMonth()); + prevMonth.setUTCDate(day); + prevMonth.setUTCDate(day - (prevMonth.getUTCDay() - this.weekStart + 7) % 7); + var nextMonth = new Date(prevMonth); + nextMonth.setUTCDate(nextMonth.getUTCDate() + 42); + nextMonth = nextMonth.valueOf(); + var html = []; + var classes; + while (prevMonth.valueOf() < nextMonth) { + if (prevMonth.getUTCDay() === this.weekStart) { + html.push(''); + } + classes = this.onRenderDay(prevMonth); + if (prevMonth.getUTCFullYear() < year || (prevMonth.getUTCFullYear() === year && prevMonth.getUTCMonth() < month)) { + classes.push('old'); + } else if (prevMonth.getUTCFullYear() > year || (prevMonth.getUTCFullYear() === year && prevMonth.getUTCMonth() > month)) { + classes.push('new'); + } + // Compare internal UTC date with local today, not UTC today + if (this.todayHighlight && + prevMonth.getUTCFullYear() === today.getFullYear() && + prevMonth.getUTCMonth() === today.getMonth() && + prevMonth.getUTCDate() === today.getDate()) { + classes.push('today'); + } + if (prevMonth.valueOf() === currentDate) { + classes.push('active'); + } + if ((prevMonth.valueOf() + 86400000) <= this.startDate || prevMonth.valueOf() > this.endDate || + $.inArray(prevMonth.getUTCDay(), this.daysOfWeekDisabled) !== -1 || + $.inArray(prevMonth.toDateString(), this.datesDisabled) !== -1) { + classes.push('disabled'); + } + html.push('' + prevMonth.getUTCDate() + ''); + if (prevMonth.getUTCDay() === this.weekEnd) { + html.push(''); + } + prevMonth.setUTCDate(prevMonth.getUTCDate() + 1); + } + this.picker.find('.datetimepicker-days tbody').empty().append(html.join('')); + + html = []; + var txt = '', meridian = '', meridianOld = ''; + var hoursDisabled = this.hoursDisabled || []; + d = new Date(this.viewDate) + for (var i = 0; i < 24; i++) { + d.setUTCHours(i); + classes = this.onRenderHour(d); + if (hoursDisabled.indexOf(i) !== -1) { + classes.push('disabled'); + } + var actual = UTCDate(year, month, dayMonth, i); + // We want the previous hour for the startDate + if ((actual.valueOf() + 3600000) <= this.startDate || actual.valueOf() > this.endDate) { + classes.push('disabled'); + } else if (hours === i) { + classes.push('active'); + } + if (this.showMeridian && dates[this.language].meridiem.length === 2) { + meridian = (i < 12 ? dates[this.language].meridiem[0] : dates[this.language].meridiem[1]); + if (meridian !== meridianOld) { + if (meridianOld !== '') { + html.push(''); + } + html.push('
' + meridian.toUpperCase() + ''); + } + meridianOld = meridian; + txt = (i % 12 ? i % 12 : 12); + if (i < 12) { + classes.push('hour_am'); + } else { + classes.push('hour_pm'); + } + html.push('' + txt + ''); + if (i === 23) { + html.push('
'); + } + } else { + txt = i + ':00'; + html.push('' + txt + ''); + } + } + this.picker.find('.datetimepicker-hours td').html(html.join('')); + + html = []; + txt = ''; + meridian = ''; + meridianOld = ''; + var minutesDisabled = this.minutesDisabled || []; + d = new Date(this.viewDate); + for (var i = 0; i < 60; i += this.minuteStep) { + if (minutesDisabled.indexOf(i) !== -1) continue; + d.setUTCMinutes(i); + d.setUTCSeconds(0); + classes = this.onRenderMinute(d); + if (this.showMeridian && dates[this.language].meridiem.length === 2) { + meridian = (hours < 12 ? dates[this.language].meridiem[0] : dates[this.language].meridiem[1]); + if (meridian !== meridianOld) { + if (meridianOld !== '') { + html.push(''); + } + html.push('
' + meridian.toUpperCase() + ''); + } + meridianOld = meridian; + txt = (hours % 12 ? hours % 12 : 12); + html.push('' + txt + ':' + (i < 10 ? '0' + i : i) + ''); + if (i === 59) { + html.push('
'); + } + } else { + txt = i + ':00'; + html.push('' + hours + ':' + (i < 10 ? '0' + i : i) + ''); + } + } + this.picker.find('.datetimepicker-minutes td').html(html.join('')); + + var currentYear = this.date.getUTCFullYear(); + var months = this.setTitle('.datetimepicker-months', year) + .end() + .find('.month').removeClass('active'); + if (currentYear === year) { + // getUTCMonths() returns 0 based, and we need to select the next one + // To cater bootstrap 2 we don't need to select the next one + months.eq(this.date.getUTCMonth()).addClass('active'); + } + if (year < startYear || year > endYear) { + months.addClass('disabled'); + } + if (year === startYear) { + months.slice(0, startMonth).addClass('disabled'); + } + if (year === endYear) { + months.slice(endMonth).addClass('disabled'); + } + + html = ''; + year = parseInt(year / 10, 10) * 10; + var yearCont = this.setTitle('.datetimepicker-years', year + '-' + (year + 9)) + .end() + .find('td'); + year -= 1; + d = new Date(this.viewDate); + for (var i = -1; i < 11; i++) { + d.setUTCFullYear(year); + classes = this.onRenderYear(d); + if (i === -1 || i === 10) { + classes.push(old); + } + html += '' + year + ''; + year += 1; + } + yearCont.html(html); + this.place(); + }, + + updateNavArrows: function () { + var d = new Date(this.viewDate), + year = d.getUTCFullYear(), + month = d.getUTCMonth(), + day = d.getUTCDate(), + hour = d.getUTCHours(); + switch (this.viewMode) { + case 0: + if (year <= this.startDate.getUTCFullYear() + && month <= this.startDate.getUTCMonth() + && day <= this.startDate.getUTCDate() + && hour <= this.startDate.getUTCHours()) { + this.picker.find('.prev').css({visibility: 'hidden'}); + } else { + this.picker.find('.prev').css({visibility: 'visible'}); + } + if (year >= this.endDate.getUTCFullYear() + && month >= this.endDate.getUTCMonth() + && day >= this.endDate.getUTCDate() + && hour >= this.endDate.getUTCHours()) { + this.picker.find('.next').css({visibility: 'hidden'}); + } else { + this.picker.find('.next').css({visibility: 'visible'}); + } + break; + case 1: + if (year <= this.startDate.getUTCFullYear() + && month <= this.startDate.getUTCMonth() + && day <= this.startDate.getUTCDate()) { + this.picker.find('.prev').css({visibility: 'hidden'}); + } else { + this.picker.find('.prev').css({visibility: 'visible'}); + } + if (year >= this.endDate.getUTCFullYear() + && month >= this.endDate.getUTCMonth() + && day >= this.endDate.getUTCDate()) { + this.picker.find('.next').css({visibility: 'hidden'}); + } else { + this.picker.find('.next').css({visibility: 'visible'}); + } + break; + case 2: + if (year <= this.startDate.getUTCFullYear() + && month <= this.startDate.getUTCMonth()) { + this.picker.find('.prev').css({visibility: 'hidden'}); + } else { + this.picker.find('.prev').css({visibility: 'visible'}); + } + if (year >= this.endDate.getUTCFullYear() + && month >= this.endDate.getUTCMonth()) { + this.picker.find('.next').css({visibility: 'hidden'}); + } else { + this.picker.find('.next').css({visibility: 'visible'}); + } + break; + case 3: + case 4: + if (year <= this.startDate.getUTCFullYear()) { + this.picker.find('.prev').css({visibility: 'hidden'}); + } else { + this.picker.find('.prev').css({visibility: 'visible'}); + } + if (year >= this.endDate.getUTCFullYear()) { + this.picker.find('.next').css({visibility: 'hidden'}); + } else { + this.picker.find('.next').css({visibility: 'visible'}); + } + break; + } + }, + + mousewheel: function (e) { + + e.preventDefault(); + e.stopPropagation(); + + if (this.wheelPause) { + return; + } + + this.wheelPause = true; + + var originalEvent = e.originalEvent; + + var delta = originalEvent.wheelDelta; + + var mode = delta > 0 ? 1 : (delta === 0) ? 0 : -1; + + if (this.wheelViewModeNavigationInverseDirection) { + mode = -mode; + } + + this.showMode(mode); + + setTimeout($.proxy(function () { + + this.wheelPause = false + + }, this), this.wheelViewModeNavigationDelay); + + }, + + click: function (e) { + e.stopPropagation(); + e.preventDefault(); + var target = $(e.target).closest('span, td, th, legend'); + if (target.is('.' + this.icontype)) { + target = $(target).parent().closest('span, td, th, legend'); + } + if (target.length === 1) { + if (target.is('.disabled')) { + this.element.trigger({ + type: 'outOfRange', + date: this.viewDate, + startDate: this.startDate, + endDate: this.endDate + }); + return; + } + switch (target[0].nodeName.toLowerCase()) { + case 'th': + switch (target[0].className) { + case 'switch': + this.showMode(1); + break; + case 'prev': + case 'next': + var dir = DPGlobal.modes[this.viewMode].navStep * (target[0].className === 'prev' ? -1 : 1); + switch (this.viewMode) { + case 0: + this.viewDate = this.moveHour(this.viewDate, dir); + break; + case 1: + this.viewDate = this.moveDate(this.viewDate, dir); + break; + case 2: + this.viewDate = this.moveMonth(this.viewDate, dir); + break; + case 3: + case 4: + this.viewDate = this.moveYear(this.viewDate, dir); + break; + } + this.fill(); + this.element.trigger({ + type: target[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 date = new Date(); + date = UTCDate(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds(), 0); + + // Respect startDate and endDate. + if (date < this.startDate) date = this.startDate; + else if (date > this.endDate) date = this.endDate; + + this.viewMode = this.startViewMode; + this.showMode(0); + this._setDate(date); + this.fill(); + if (this.autoclose) { + this.hide(); + } + break; + } + break; + case 'span': + if (!target.is('.disabled')) { + var year = this.viewDate.getUTCFullYear(), + month = this.viewDate.getUTCMonth(), + day = this.viewDate.getUTCDate(), + hours = this.viewDate.getUTCHours(), + minutes = this.viewDate.getUTCMinutes(), + seconds = this.viewDate.getUTCSeconds(); + + if (target.is('.month')) { + this.viewDate.setUTCDate(1); + month = target.parent().find('span').index(target); + day = this.viewDate.getUTCDate(); + this.viewDate.setUTCMonth(month); + this.element.trigger({ + type: 'changeMonth', + date: this.viewDate + }); + if (this.viewSelect >= 3) { + this._setDate(UTCDate(year, month, day, hours, minutes, seconds, 0)); + } + } else if (target.is('.year')) { + this.viewDate.setUTCDate(1); + year = parseInt(target.text(), 10) || 0; + this.viewDate.setUTCFullYear(year); + this.element.trigger({ + type: 'changeYear', + date: this.viewDate + }); + if (this.viewSelect >= 4) { + this._setDate(UTCDate(year, month, day, hours, minutes, seconds, 0)); + } + } else if (target.is('.hour')) { + hours = parseInt(target.text(), 10) || 0; + if (target.hasClass('hour_am') || target.hasClass('hour_pm')) { + if (hours === 12 && target.hasClass('hour_am')) { + hours = 0; + } else if (hours !== 12 && target.hasClass('hour_pm')) { + hours += 12; + } + } + this.viewDate.setUTCHours(hours); + this.element.trigger({ + type: 'changeHour', + date: this.viewDate + }); + if (this.viewSelect >= 1) { + this._setDate(UTCDate(year, month, day, hours, minutes, seconds, 0)); + } + } else if (target.is('.minute')) { + minutes = parseInt(target.text().substr(target.text().indexOf(':') + 1), 10) || 0; + this.viewDate.setUTCMinutes(minutes); + this.element.trigger({ + type: 'changeMinute', + date: this.viewDate + }); + if (this.viewSelect >= 0) { + this._setDate(UTCDate(year, month, day, hours, minutes, seconds, 0)); + } + } + if (this.viewMode !== 0) { + var oldViewMode = this.viewMode; + this.showMode(-1); + this.fill(); + if (oldViewMode === this.viewMode && this.autoclose) { + this.hide(); + } + } else { + this.fill(); + if (this.autoclose) { + this.hide(); + } + } + } + break; + case 'td': + if (target.is('.day') && !target.is('.disabled')) { + var day = parseInt(target.text(), 10) || 1; + var year = this.viewDate.getUTCFullYear(), + month = this.viewDate.getUTCMonth(), + hours = this.viewDate.getUTCHours(), + minutes = this.viewDate.getUTCMinutes(), + seconds = this.viewDate.getUTCSeconds(); + if (target.is('.old')) { + if (month === 0) { + month = 11; + year -= 1; + } else { + month -= 1; + } + } else if (target.is('.new')) { + if (month === 11) { + month = 0; + year += 1; + } else { + month += 1; + } + } + this.viewDate.setUTCFullYear(year); + this.viewDate.setUTCMonth(month, day); + this.element.trigger({ + type: 'changeDay', + date: this.viewDate + }); + if (this.viewSelect >= 2) { + this._setDate(UTCDate(year, month, day, hours, minutes, seconds, 0)); + } + } + var oldViewMode = this.viewMode; + this.showMode(-1); + this.fill(); + if (oldViewMode === this.viewMode && this.autoclose) { + this.hide(); + } + break; + } + } + }, + + _setDate: function (date, which) { + if (!which || which === 'date') + this.date = date; + if (!which || which === 'view') + this.viewDate = date; + this.fill(); + this.setValue(); + var element; + if (this.isInput) { + element = this.element; + } else if (this.component) { + element = this.element.find('input'); + } + if (element) { + element.change(); + } + this.element.trigger({ + type: 'changeDate', + date: this.getDate() + }); + if(date === null) + this.date = this.viewDate; + }, + + moveMinute: function (date, dir) { + if (!dir) return date; + var new_date = new Date(date.valueOf()); + //dir = dir > 0 ? 1 : -1; + new_date.setUTCMinutes(new_date.getUTCMinutes() + (dir * this.minuteStep)); + return new_date; + }, + + moveHour: function (date, dir) { + if (!dir) return date; + var new_date = new Date(date.valueOf()); + //dir = dir > 0 ? 1 : -1; + new_date.setUTCHours(new_date.getUTCHours() + dir); + return new_date; + }, + + moveDate: function (date, dir) { + if (!dir) return date; + var new_date = new Date(date.valueOf()); + //dir = dir > 0 ? 1 : -1; + new_date.setUTCDate(new_date.getUTCDate() + dir); + return new_date; + }, + + moveMonth: function (date, dir) { + if (!dir) return date; + var new_date = new Date(date.valueOf()), + day = new_date.getUTCDate(), + month = new_date.getUTCMonth(), + mag = Math.abs(dir), + new_month, test; + dir = dir > 0 ? 1 : -1; + if (mag === 1) { + test = dir === -1 + // If going back one month, make sure month is not current month + // (eg, Mar 31 -> Feb 31 === Feb 28, not Mar 02) + ? function () { + return new_date.getUTCMonth() === month; + } + // If going forward one month, make sure month is as expected + // (eg, Jan 31 -> Feb 31 === Feb 28, not Mar 02) + : function () { + return new_date.getUTCMonth() !== new_month; + }; + new_month = month + dir; + new_date.setUTCMonth(new_month); + // Dec -> Jan (12) or Jan -> Dec (-1) -- limit expected date to 0-11 + if (new_month < 0 || new_month > 11) + new_month = (new_month + 12) % 12; + } else { + // For magnitudes >1, move one month at a time... + for (var i = 0; i < mag; i++) + // ...which might decrease the day (eg, Jan 31 to Feb 28, etc)... + new_date = this.moveMonth(new_date, dir); + // ...then reset the day, keeping it in the new month + new_month = new_date.getUTCMonth(); + new_date.setUTCDate(day); + test = function () { + return new_month !== new_date.getUTCMonth(); + }; + } + // Common date-resetting loop -- if date is beyond end of month, make it + // end of month + while (test()) { + new_date.setUTCDate(--day); + new_date.setUTCMonth(new_month); + } + return new_date; + }, + + moveYear: function (date, dir) { + return this.moveMonth(date, dir * 12); + }, + + dateWithinRange: function (date) { + return date >= this.startDate && date <= this.endDate; + }, + + keydown: function (e) { + if (this.picker.is(':not(:visible)')) { + if (e.keyCode === 27) // allow escape to hide and re-show picker + this.show(); + return; + } + var dateChanged = false, + dir, newDate, newViewDate; + switch (e.keyCode) { + case 27: // escape + this.hide(); + e.preventDefault(); + break; + case 37: // left + case 39: // right + if (!this.keyboardNavigation) break; + dir = e.keyCode === 37 ? -1 : 1; + var viewMode = this.viewMode; + if (e.ctrlKey) { + viewMode += 2; + } else if (e.shiftKey) { + viewMode += 1; + } + if (viewMode === 4) { + newDate = this.moveYear(this.date, dir); + newViewDate = this.moveYear(this.viewDate, dir); + } else if (viewMode === 3) { + newDate = this.moveMonth(this.date, dir); + newViewDate = this.moveMonth(this.viewDate, dir); + } else if (viewMode === 2) { + newDate = this.moveDate(this.date, dir); + newViewDate = this.moveDate(this.viewDate, dir); + } else if (viewMode === 1) { + newDate = this.moveHour(this.date, dir); + newViewDate = this.moveHour(this.viewDate, dir); + } else if (viewMode === 0) { + newDate = this.moveMinute(this.date, dir); + newViewDate = this.moveMinute(this.viewDate, dir); + } + if (this.dateWithinRange(newDate)) { + this.date = newDate; + this.viewDate = newViewDate; + this.setValue(); + this.update(); + e.preventDefault(); + dateChanged = true; + } + break; + case 38: // up + case 40: // down + if (!this.keyboardNavigation) break; + dir = e.keyCode === 38 ? -1 : 1; + viewMode = this.viewMode; + if (e.ctrlKey) { + viewMode += 2; + } else if (e.shiftKey) { + viewMode += 1; + } + if (viewMode === 4) { + newDate = this.moveYear(this.date, dir); + newViewDate = this.moveYear(this.viewDate, dir); + } else if (viewMode === 3) { + newDate = this.moveMonth(this.date, dir); + newViewDate = this.moveMonth(this.viewDate, dir); + } else if (viewMode === 2) { + newDate = this.moveDate(this.date, dir * 7); + newViewDate = this.moveDate(this.viewDate, dir * 7); + } else if (viewMode === 1) { + if (this.showMeridian) { + newDate = this.moveHour(this.date, dir * 6); + newViewDate = this.moveHour(this.viewDate, dir * 6); + } else { + newDate = this.moveHour(this.date, dir * 4); + newViewDate = this.moveHour(this.viewDate, dir * 4); + } + } else if (viewMode === 0) { + newDate = this.moveMinute(this.date, dir * 4); + newViewDate = this.moveMinute(this.viewDate, dir * 4); + } + if (this.dateWithinRange(newDate)) { + this.date = newDate; + this.viewDate = newViewDate; + this.setValue(); + this.update(); + e.preventDefault(); + dateChanged = true; + } + break; + case 13: // enter + if (this.viewMode !== 0) { + var oldViewMode = this.viewMode; + this.showMode(-1); + this.fill(); + if (oldViewMode === this.viewMode && this.autoclose) { + this.hide(); + } + } else { + this.fill(); + if (this.autoclose) { + this.hide(); + } + } + e.preventDefault(); + break; + case 9: // tab + this.hide(); + break; + } + if (dateChanged) { + var element; + if (this.isInput) { + element = this.element; + } else if (this.component) { + element = this.element.find('input'); + } + if (element) { + element.change(); + } + this.element.trigger({ + type: 'changeDate', + date: this.getDate() + }); + } + }, + + showMode: function (dir) { + if (dir) { + var newViewMode = Math.max(0, Math.min(DPGlobal.modes.length - 1, this.viewMode + dir)); + if (newViewMode >= this.minView && newViewMode <= this.maxView) { + this.element.trigger({ + type: 'changeMode', + date: this.viewDate, + oldViewMode: this.viewMode, + newViewMode: newViewMode + }); + + this.viewMode = newViewMode; + } + } + /* + vitalets: fixing bug of very special conditions: + jquery 1.7.1 + webkit + show inline datetimepicker in bootstrap popover. + Method show() does not set display css correctly and datetimepicker is not shown. + Changed to .css('display', 'block') solve the problem. + See https://github.com/vitalets/x-editable/issues/37 + + In jquery 1.7.2+ everything works fine. + */ + //this.picker.find('>div').hide().filter('.datetimepicker-'+DPGlobal.modes[this.viewMode].clsName).show(); + this.picker.find('>div').hide().filter('.datetimepicker-' + DPGlobal.modes[this.viewMode].clsName).css('display', 'block'); + this.updateNavArrows(); + }, + + reset: function () { + this._setDate(null, 'date'); + }, + + convertViewModeText: function (viewMode) { + switch (viewMode) { + case 4: + return 'decade'; + case 3: + return 'year'; + case 2: + return 'month'; + case 1: + return 'day'; + case 0: + return 'hour'; + } + } + }; + + var old = $.fn.datetimepicker; + $.fn.datetimepicker = function (option) { + var args = Array.apply(null, arguments); + args.shift(); + var internal_return; + this.each(function () { + var $this = $(this), + data = $this.data('datetimepicker'), + options = typeof option === 'object' && option; + if (!data) { + $this.data('datetimepicker', (data = new Datetimepicker(this, $.extend({}, $.fn.datetimepicker.defaults, options)))); + } + if (typeof option === 'string' && typeof data[option] === 'function') { + internal_return = data[option].apply(data, args); + if (internal_return !== undefined) { + return false; + } + } + }); + if (internal_return !== undefined) + return internal_return; + else + return this; + }; + + $.fn.datetimepicker.defaults = { + }; + $.fn.datetimepicker.Constructor = Datetimepicker; + var dates = $.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 DPGlobal = { + 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 (year) { + return (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0)) + }, + getDaysInMonth: function (year, month) { + return [31, (DPGlobal.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month] + }, + getDefaultFormat: function (type, field) { + if (type === 'standard') { + if (field === 'input') + return 'yyyy-mm-dd hh:ii'; + else + return 'yyyy-mm-dd hh:ii:ss'; + } else if (type === 'php') { + if (field === 'input') + return 'Y-m-d H:i'; + else + return 'Y-m-d H:i:s'; + } else { + throw new Error('Invalid format type.'); + } + }, + validParts: function (type) { + if (type === 'standard') { + return /t|hh?|HH?|p|P|z|Z|ii?|ss?|dd?|DD?|mm?|MM?|yy(?:yy)?/g; + } else if (type === 'php') { + return /[dDjlNwzFmMnStyYaABgGhHis]/g; + } else { + throw new Error('Invalid format type.'); + } + }, + nonpunctuation: /[^ -\/:-@\[-`{-~\t\n\rTZ]+/g, + parseFormat: function (format, type) { + // IE treats \0 as a string end in inputs (truncating the value), + // so it's a bad format delimiter, anyway + var separators = format.replace(this.validParts(type), '\0').split('\0'), + parts = format.match(this.validParts(type)); + if (!separators || !separators.length || !parts || parts.length === 0) { + throw new Error('Invalid date format.'); + } + return {separators: separators, parts: parts}; + }, + parseDate: function (date, format, language, type, timezone) { + if (date instanceof Date) { + var dateUTC = new Date(date.valueOf() - date.getTimezoneOffset() * 60000); + dateUTC.setMilliseconds(0); + return dateUTC; + } + if (/^\d{4}\-\d{1,2}\-\d{1,2}$/.test(date)) { + format = this.parseFormat('yyyy-mm-dd', type); + } + if (/^\d{4}\-\d{1,2}\-\d{1,2}[T ]\d{1,2}\:\d{1,2}$/.test(date)) { + format = this.parseFormat('yyyy-mm-dd hh:ii', type); + } + if (/^\d{4}\-\d{1,2}\-\d{1,2}[T ]\d{1,2}\:\d{1,2}\:\d{1,2}[Z]{0,1}$/.test(date)) { + format = this.parseFormat('yyyy-mm-dd hh:ii:ss', type); + } + if (/^[-+]\d+[dmwy]([\s,]+[-+]\d+[dmwy])*$/.test(date)) { + var part_re = /([-+]\d+)([dmwy])/, + parts = date.match(/([-+]\d+)([dmwy])/g), + part, dir; + date = new Date(); + for (var i = 0; i < parts.length; i++) { + part = part_re.exec(parts[i]); + dir = parseInt(part[1]); + switch (part[2]) { + case 'd': + date.setUTCDate(date.getUTCDate() + dir); + break; + case 'm': + date = Datetimepicker.prototype.moveMonth.call(Datetimepicker.prototype, date, dir); + break; + case 'w': + date.setUTCDate(date.getUTCDate() + dir * 7); + break; + case 'y': + date = Datetimepicker.prototype.moveYear.call(Datetimepicker.prototype, date, dir); + break; + } + } + return UTCDate(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds(), 0); + } + var parts = date && date.toString().match(this.nonpunctuation) || [], + date = new Date(0, 0, 0, 0, 0, 0, 0), + parsed = {}, + setters_order = ['hh', 'h', 'ii', 'i', 'ss', 's', 'yyyy', 'yy', 'M', 'MM', 'm', 'mm', 'D', 'DD', 'd', 'dd', 'H', 'HH', 'p', 'P', 'z', 'Z'], + setters_map = { + hh: function (d, v) { + return d.setUTCHours(v); + }, + h: function (d, v) { + return d.setUTCHours(v); + }, + HH: function (d, v) { + return d.setUTCHours(v === 12 ? 0 : v); + }, + H: function (d, v) { + return d.setUTCHours(v === 12 ? 0 : v); + }, + ii: function (d, v) { + return d.setUTCMinutes(v); + }, + i: function (d, v) { + return d.setUTCMinutes(v); + }, + ss: function (d, v) { + return d.setUTCSeconds(v); + }, + s: function (d, v) { + return d.setUTCSeconds(v); + }, + yyyy: function (d, v) { + return d.setUTCFullYear(v); + }, + yy: function (d, v) { + return d.setUTCFullYear(2000 + v); + }, + m: function (d, v) { + v -= 1; + while (v < 0) v += 12; + v %= 12; + d.setUTCMonth(v); + while (d.getUTCMonth() !== v) + if (isNaN(d.getUTCMonth())) + return d; + else + d.setUTCDate(d.getUTCDate() - 1); + return d; + }, + d: function (d, v) { + return d.setUTCDate(v); + }, + p: function (d, v) { + return d.setUTCHours(v === 1 ? d.getUTCHours() + 12 : d.getUTCHours()); + }, + z: function () { + return timezone + } + }, + val, filtered, part; + setters_map['M'] = setters_map['MM'] = setters_map['mm'] = setters_map['m']; + setters_map['dd'] = setters_map['d']; + setters_map['P'] = setters_map['p']; + setters_map['Z'] = setters_map['z']; + date = UTCDate(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds()); + if (parts.length === format.parts.length) { + for (var i = 0, cnt = format.parts.length; i < cnt; i++) { + val = parseInt(parts[i], 10); + part = format.parts[i]; + if (isNaN(val)) { + switch (part) { + case 'MM': + filtered = $(dates[language].months).filter(function () { + var m = this.slice(0, parts[i].length), + p = parts[i].slice(0, m.length); + return m === p; + }); + val = $.inArray(filtered[0], dates[language].months) + 1; + break; + case 'M': + filtered = $(dates[language].monthsShort).filter(function () { + var m = this.slice(0, parts[i].length), + p = parts[i].slice(0, m.length); + return m.toLowerCase() === p.toLowerCase(); + }); + val = $.inArray(filtered[0], dates[language].monthsShort) + 1; + break; + case 'p': + case 'P': + val = $.inArray(parts[i].toLowerCase(), dates[language].meridiem); + break; + case 'z': + case 'Z': + timezone; + break; + + } + } + parsed[part] = val; + } + for (var i = 0, s; i < setters_order.length; i++) { + s = setters_order[i]; + if (s in parsed && !isNaN(parsed[s])) + setters_map[s](date, parsed[s]) + } + } + return date; + }, + formatDate: function (date, format, language, type, timezone) { + if (date === null) { + return ''; + } + var val; + if (type === 'standard') { + val = { + t: date.getTime(), + // year + yy: date.getUTCFullYear().toString().substring(2), + yyyy: date.getUTCFullYear(), + // month + m: date.getUTCMonth() + 1, + M: dates[language].monthsShort[date.getUTCMonth()], + MM: dates[language].months[date.getUTCMonth()], + // day + d: date.getUTCDate(), + D: dates[language].daysShort[date.getUTCDay()], + DD: dates[language].days[date.getUTCDay()], + p: (dates[language].meridiem.length === 2 ? dates[language].meridiem[date.getUTCHours() < 12 ? 0 : 1] : ''), + // hour + h: date.getUTCHours(), + // minute + i: date.getUTCMinutes(), + // second + s: date.getUTCSeconds(), + // timezone + z: timezone + }; + + if (dates[language].meridiem.length === 2) { + val.H = (val.h % 12 === 0 ? 12 : val.h % 12); + } + else { + val.H = val.h; + } + val.HH = (val.H < 10 ? '0' : '') + val.H; + val.P = val.p.toUpperCase(); + val.Z = val.z; + val.hh = (val.h < 10 ? '0' : '') + val.h; + val.ii = (val.i < 10 ? '0' : '') + val.i; + val.ss = (val.s < 10 ? '0' : '') + val.s; + val.dd = (val.d < 10 ? '0' : '') + val.d; + val.mm = (val.m < 10 ? '0' : '') + val.m; + } else if (type === 'php') { + // php format + val = { + // year + y: date.getUTCFullYear().toString().substring(2), + Y: date.getUTCFullYear(), + // month + F: dates[language].months[date.getUTCMonth()], + M: dates[language].monthsShort[date.getUTCMonth()], + n: date.getUTCMonth() + 1, + t: DPGlobal.getDaysInMonth(date.getUTCFullYear(), date.getUTCMonth()), + // day + j: date.getUTCDate(), + l: dates[language].days[date.getUTCDay()], + D: dates[language].daysShort[date.getUTCDay()], + w: date.getUTCDay(), // 0 -> 6 + N: (date.getUTCDay() === 0 ? 7 : date.getUTCDay()), // 1 -> 7 + S: (date.getUTCDate() % 10 <= dates[language].suffix.length ? dates[language].suffix[date.getUTCDate() % 10 - 1] : ''), + // hour + a: (dates[language].meridiem.length === 2 ? dates[language].meridiem[date.getUTCHours() < 12 ? 0 : 1] : ''), + g: (date.getUTCHours() % 12 === 0 ? 12 : date.getUTCHours() % 12), + G: date.getUTCHours(), + // minute + i: date.getUTCMinutes(), + // second + s: date.getUTCSeconds() + }; + val.m = (val.n < 10 ? '0' : '') + val.n; + val.d = (val.j < 10 ? '0' : '') + val.j; + val.A = val.a.toString().toUpperCase(); + val.h = (val.g < 10 ? '0' : '') + val.g; + val.H = (val.G < 10 ? '0' : '') + val.G; + val.i = (val.i < 10 ? '0' : '') + val.i; + val.s = (val.s < 10 ? '0' : '') + val.s; + } else { + throw new Error('Invalid format type.'); + } + var date = [], + seps = $.extend([], format.separators); + for (var i = 0, cnt = format.parts.length; i < cnt; i++) { + if (seps.length) { + date.push(seps.shift()); + } + date.push(val[format.parts[i]]); + } + if (seps.length) { + date.push(seps.shift()); + } + return date.join(''); + }, + convertViewMode: function (viewMode) { + switch (viewMode) { + case 4: + case 'decade': + viewMode = 4; + break; + case 3: + case 'year': + viewMode = 3; + break; + case 2: + case 'month': + viewMode = 2; + break; + case 1: + case 'day': + viewMode = 1; + break; + case 0: + case 'hour': + viewMode = 0; + break; + } + + return viewMode; + }, + headTemplate: '' + + '' + + '' + + '' + + '' + + '' + + '', + headTemplateV3: '' + + '' + + ' ' + + '' + + ' ' + + '' + + '', + contTemplate: '', + footTemplate: '' + + '' + + '' + + '' + }; + DPGlobal.template = '
' + + '
' + + '' + + DPGlobal.headTemplate + + DPGlobal.contTemplate + + DPGlobal.footTemplate + + '
' + + '
' + + '
' + + '' + + DPGlobal.headTemplate + + DPGlobal.contTemplate + + DPGlobal.footTemplate + + '
' + + '
' + + '
' + + '' + + DPGlobal.headTemplate + + '' + + DPGlobal.footTemplate + + '
' + + '
' + + '
' + + '' + + DPGlobal.headTemplate + + DPGlobal.contTemplate + + DPGlobal.footTemplate + + '
' + + '
' + + '
' + + '' + + DPGlobal.headTemplate + + DPGlobal.contTemplate + + DPGlobal.footTemplate + + '
' + + '
' + + '
'; + DPGlobal.templateV3 = '
' + + '
' + + '' + + DPGlobal.headTemplateV3 + + DPGlobal.contTemplate + + DPGlobal.footTemplate + + '
' + + '
' + + '
' + + '' + + DPGlobal.headTemplateV3 + + DPGlobal.contTemplate + + DPGlobal.footTemplate + + '
' + + '
' + + '
' + + '' + + DPGlobal.headTemplateV3 + + '' + + DPGlobal.footTemplate + + '
' + + '
' + + '
' + + '' + + DPGlobal.headTemplateV3 + + DPGlobal.contTemplate + + DPGlobal.footTemplate + + '
' + + '
' + + '
' + + '' + + DPGlobal.headTemplateV3 + + DPGlobal.contTemplate + + DPGlobal.footTemplate + + '
' + + '
' + + '
'; + $.fn.datetimepicker.DPGlobal = DPGlobal; + + /* DATETIMEPICKER NO CONFLICT + * =================== */ + + $.fn.datetimepicker.noConflict = function () { + $.fn.datetimepicker = old; + return this; + }; + + /* DATETIMEPICKER DATA-API + * ================== */ + + $(document).on( + 'focus.datetimepicker.data-api click.datetimepicker.data-api', + '[data-provide="datetimepicker"]', + function (e) { + var $this = $(this); + if ($this.data('datetimepicker')) return; + e.preventDefault(); + // component click requires us to explicitly show it + $this.datetimepicker('show'); + } + ); + $(function () { + $('[data-provide="datetimepicker-inline"]').datetimepicker(); + }); + +})); diff --git a/generator-web/src/main/resources/static/vendor/bootstrap/js/bootstrap-datetimepicker.zh-CN.js b/generator-web/src/main/resources/static/vendor/bootstrap/js/bootstrap-datetimepicker.zh-CN.js new file mode 100755 index 0000000..418fb30 --- /dev/null +++ b/generator-web/src/main/resources/static/vendor/bootstrap/js/bootstrap-datetimepicker.zh-CN.js @@ -0,0 +1,16 @@ +/** + * Simplified Chinese translation for bootstrap-datetimepicker + * Yuan Cheung + */ +;(function($){ + $.fn.datetimepicker.dates['zh-CN'] = { + days: ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"], + daysShort: ["周日", "周一", "周二", "周三", "周四", "周五", "周六", "周日"], + daysMin: ["日", "一", "二", "三", "四", "五", "六", "日"], + months: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"], + monthsShort: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"], + today: "今天", + suffix: [], + meridiem: ["上午", "下午"] + }; +}(jQuery)); diff --git a/generator-web/src/main/resources/static/vendor/bootstrap/js/bootstrap-paginator.js b/generator-web/src/main/resources/static/vendor/bootstrap/js/bootstrap-paginator.js new file mode 100644 index 0000000..4bd0cc8 --- /dev/null +++ b/generator-web/src/main/resources/static/vendor/bootstrap/js/bootstrap-paginator.js @@ -0,0 +1,659 @@ +/** + * bootstrap-paginator.js v0.5 + * -- + * Copyright 2013 Yun Lai + * -- + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +(function ($) { + + "use strict"; // jshint ;_; + + + /* Paginator PUBLIC CLASS DEFINITION + * ================================= */ + + /** + * Boostrap Paginator Constructor + * + * @param element element of the paginator + * @param options the options to config the paginator + * + * */ + var BootstrapPaginator = function (element, options) { + this.init(element, options); + }, + old = null; + + BootstrapPaginator.prototype = { + + /** + * Initialization function of the paginator, accepting an element and the options as parameters + * + * @param element element of the paginator + * @param options the options to config the paginator + * + * */ + init: function (element, options) { + + this.$element = $(element); + + var version = (options && options.bootstrapMajorVersion) ? options.bootstrapMajorVersion : $.fn.bootstrapPaginator.defaults.bootstrapMajorVersion, + id = this.$element.attr("id"); + + if (version === 2 && !this.$element.is("div")) { + + throw "in Bootstrap version 2 the pagination must be a div element. Or if you are using Bootstrap pagination 3. Please specify it in bootstrapMajorVersion in the option"; + } else if (version > 2 && !this.$element.is("ul")) { + throw "in Bootstrap version 3 the pagination root item must be an ul element." + } + + + + this.currentPage = 1; + + this.lastPage = 1; + + this.setOptions(options); + + this.initialized = true; + }, + + /** + * Update the properties of the paginator element + * + * @param options options to config the paginator + * */ + setOptions: function (options) { + + this.options = $.extend({}, (this.options || $.fn.bootstrapPaginator.defaults), options); + + this.totalPages = parseInt(this.options.totalPages, 10); //setup the total pages property. + this.numberOfPages = parseInt(this.options.numberOfPages, 10); //setup the numberOfPages to be shown + + //move the set current page after the setting of total pages. otherwise it will cause out of page exception. + if (options && typeof (options.currentPage) !== 'undefined') { + + this.setCurrentPage(options.currentPage); + } + + this.listen(); + + //render the paginator + this.render(); + + if (!this.initialized && this.lastPage !== this.currentPage) { + this.$element.trigger("page-changed", [this.lastPage, this.currentPage]); + } + + }, + + /** + * Sets up the events listeners. Currently the pageclicked and pagechanged events are linked if available. + * + * */ + listen: function () { + + this.$element.off("page-clicked"); + + this.$element.off("page-changed");// unload the events for the element + + if (typeof (this.options.onPageClicked) === "function") { + this.$element.bind("page-clicked", this.options.onPageClicked); + } + + if (typeof (this.options.onPageChanged) === "function") { + this.$element.on("page-changed", this.options.onPageChanged); + } + + this.$element.bind("page-clicked", this.onPageClicked); + }, + + + /** + * + * Destroys the paginator element, it unload the event first, then empty the content inside. + * + * */ + destroy: function () { + + this.$element.off("page-clicked"); + + this.$element.off("page-changed"); + + this.$element.removeData('bootstrapPaginator'); + + this.$element.empty(); + + }, + + /** + * Shows the page + * + * */ + show: function (page) { + + this.setCurrentPage(page); + + this.render(); + + if (this.lastPage !== this.currentPage) { + this.$element.trigger("page-changed", [this.lastPage, this.currentPage]); + } + }, + + /** + * Shows the next page + * + * */ + showNext: function () { + var pages = this.getPages(); + + if (pages.next) { + this.show(pages.next); + } + + }, + + /** + * Shows the previous page + * + * */ + showPrevious: function () { + var pages = this.getPages(); + + if (pages.prev) { + this.show(pages.prev); + } + + }, + + /** + * Shows the first page + * + * */ + showFirst: function () { + var pages = this.getPages(); + + if (pages.first) { + this.show(pages.first); + } + + }, + + /** + * Shows the last page + * + * */ + showLast: function () { + var pages = this.getPages(); + + if (pages.last) { + this.show(pages.last); + } + + }, + + /** + * Internal on page item click handler, when the page item is clicked, change the current page to the corresponding page and + * trigger the pageclick event for the listeners. + * + * + * */ + onPageItemClicked: function (event) { + + var type = event.data.type, + page = event.data.page; + + this.$element.trigger("page-clicked", [event, type, page]); + + }, + + onPageClicked: function (event, originalEvent, type, page) { + + //show the corresponding page and retrieve the newly built item related to the page clicked before for the event return + + var currentTarget = $(event.currentTarget); + + switch (type) { + case "first": + currentTarget.bootstrapPaginator("showFirst"); + break; + case "prev": + currentTarget.bootstrapPaginator("showPrevious"); + break; + case "next": + currentTarget.bootstrapPaginator("showNext"); + break; + case "last": + currentTarget.bootstrapPaginator("showLast"); + break; + case "page": + currentTarget.bootstrapPaginator("show", page); + break; + } + + }, + + /** + * Renders the paginator according to the internal properties and the settings. + * + * + * */ + render: function () { + + //fetch the container class and add them to the container + var containerClass = this.getValueFromOption(this.options.containerClass, this.$element), + size = this.options.size || "normal", + alignment = this.options.alignment || "left", + pages = this.getPages(), + listContainer = this.options.bootstrapMajorVersion === 2 ? $("
    ") : this.$element, + listContainerClass = this.options.bootstrapMajorVersion === 2 ? this.getValueFromOption(this.options.listContainerClass, listContainer) : null, + first = null, + prev = null, + next = null, + last = null, + p = null, + i = 0; + + + this.$element.prop("class", ""); + + this.$element.addClass("pagination"); + + switch (size.toLowerCase()) { + case "large": + case "small": + case "mini": + this.$element.addClass($.fn.bootstrapPaginator.sizeArray[this.options.bootstrapMajorVersion][size.toLowerCase()]); + break; + default: + break; + } + + if (this.options.bootstrapMajorVersion === 2) { + switch (alignment.toLowerCase()) { + case "center": + this.$element.addClass("pagination-centered"); + break; + case "right": + this.$element.addClass("pagination-right"); + break; + default: + break; + } + } + + + this.$element.addClass(containerClass); + + //empty the outter most container then add the listContainer inside. + this.$element.empty(); + + if (this.options.bootstrapMajorVersion === 2) { + this.$element.append(listContainer); + + listContainer.addClass(listContainerClass); + } + + //update the page element reference + this.pageRef = []; + + if (pages.first) {//if the there is first page element + first = this.buildPageItem("first", pages.first); + + if (first) { + listContainer.append(first); + } + + } + + if (pages.prev) {//if the there is previous page element + + prev = this.buildPageItem("prev", pages.prev); + + if (prev) { + listContainer.append(prev); + } + + } + + + for (i = 0; i < pages.length; i = i + 1) {//fill the numeric pages. + + p = this.buildPageItem("page", pages[i]); + + if (p) { + listContainer.append(p); + } + } + + if (pages.next) {//if there is next page + + next = this.buildPageItem("next", pages.next); + + if (next) { + listContainer.append(next); + } + } + + if (pages.last) {//if there is last page + + last = this.buildPageItem("last", pages.last); + + if (last) { + listContainer.append(last); + } + } + }, + + /** + * + * Creates a page item base on the type and page number given. + * + * @param page page number + * @param type type of the page, whether it is the first, prev, page, next, last + * + * @return Object the constructed page element + * */ + buildPageItem: function (type, page) { + + var itemContainer = $("
  • "),//creates the item container + itemContent = $(""),//creates the item content + text = "", + title = "", + itemContainerClass = this.options.itemContainerClass(type, page, this.currentPage), + itemContentClass = this.getValueFromOption(this.options.itemContentClass, type, page, this.currentPage), + tooltipOpts = null; + + + switch (type) { + + case "first": + if (!this.getValueFromOption(this.options.shouldShowPage, type, page, this.currentPage)) { return; } + text = this.options.itemTexts(type, page, this.currentPage); + title = this.options.tooltipTitles(type, page, this.currentPage); + break; + case "last": + if (!this.getValueFromOption(this.options.shouldShowPage, type, page, this.currentPage)) { return; } + text = this.options.itemTexts(type, page, this.currentPage); + title = this.options.tooltipTitles(type, page, this.currentPage); + break; + case "prev": + if (!this.getValueFromOption(this.options.shouldShowPage, type, page, this.currentPage)) { return; } + text = this.options.itemTexts(type, page, this.currentPage); + title = this.options.tooltipTitles(type, page, this.currentPage); + break; + case "next": + if (!this.getValueFromOption(this.options.shouldShowPage, type, page, this.currentPage)) { return; } + text = this.options.itemTexts(type, page, this.currentPage); + title = this.options.tooltipTitles(type, page, this.currentPage); + break; + case "page": + if (!this.getValueFromOption(this.options.shouldShowPage, type, page, this.currentPage)) { return; } + text = this.options.itemTexts(type, page, this.currentPage); + title = this.options.tooltipTitles(type, page, this.currentPage); + break; + } + + itemContainer.addClass(itemContainerClass).append(itemContent); + itemContainer.addClass("page-item"); + + itemContent.addClass(itemContentClass).html(text).on("click", null, {type: type, page: page}, $.proxy(this.onPageItemClicked, this)); + itemContent.addClass("page-link"); + + if (this.options.pageUrl) { + itemContent.attr("href", this.getValueFromOption(this.options.pageUrl, type, page, this.currentPage)); + } + + if (this.options.useBootstrapTooltip) { + tooltipOpts = $.extend({}, this.options.bootstrapTooltipOptions, {title: title}); + + itemContent.tooltip(tooltipOpts); + } else { + itemContent.attr("title", title); + } + + return itemContainer; + + }, + + setCurrentPage: function (page) { + if (page > this.totalPages || page < 1) {// if the current page is out of range, throw exception. + + throw "Page out of range"; + + } + + this.lastPage = this.currentPage; + + this.currentPage = parseInt(page, 10); + + }, + + /** + * Gets an array that represents the current status of the page object. Numeric pages can be access via array mode. length attributes describes how many numeric pages are there. First, previous, next and last page can be accessed via attributes first, prev, next and last. Current attribute marks the current page within the pages. + * + * @return object output objects that has first, prev, next, last and also the number of pages in between. + * */ + getPages: function () { + + var totalPages = this.totalPages,// get or calculate the total pages via the total records + pageStart = (this.currentPage % this.numberOfPages === 0) ? (parseInt(this.currentPage / this.numberOfPages, 10) - 1) * this.numberOfPages + 1 : parseInt(this.currentPage / this.numberOfPages, 10) * this.numberOfPages + 1,//calculates the start page. + output = [], + i = 0, + counter = 0; + + pageStart = pageStart < 1 ? 1 : pageStart;//check the range of the page start to see if its less than 1. + + for (i = pageStart, counter = 0; counter < this.numberOfPages && i <= totalPages; i = i + 1, counter = counter + 1) {//fill the pages + output.push(i); + } + + output.first = 1;//add the first when the current page leaves the 1st page. + + if (this.currentPage > 1) {// add the previous when the current page leaves the 1st page + output.prev = this.currentPage - 1; + } else { + output.prev = 1; + } + + if (this.currentPage < totalPages) {// add the next page when the current page doesn't reach the last page + output.next = this.currentPage + 1; + } else { + output.next = totalPages; + } + + output.last = totalPages;// add the last page when the current page doesn't reach the last page + + output.current = this.currentPage;//mark the current page. + + output.total = totalPages; + + output.numberOfPages = this.options.numberOfPages; + + return output; + + }, + + /** + * Gets the value from the options, this is made to handle the situation where value is the return value of a function. + * + * @return mixed value that depends on the type of parameters, if the given parameter is a function, then the evaluated result is returned. Otherwise the parameter itself will get returned. + * */ + getValueFromOption: function (value) { + + var output = null, + args = Array.prototype.slice.call(arguments, 1); + + if (typeof value === 'function') { + output = value.apply(this, args); + } else { + output = value; + } + + return output; + + } + + }; + + + /* TYPEAHEAD PLUGIN DEFINITION + * =========================== */ + + old = $.fn.bootstrapPaginator; + + $.fn.bootstrapPaginator = function (option) { + + var args = arguments, + result = null; + + $(this).each(function (index, item) { + var $this = $(item), + data = $this.data('bootstrapPaginator'), + options = (typeof option !== 'object') ? null : option; + + if (!data) { + data = new BootstrapPaginator(this, options); + + $this = $(data.$element); + + $this.data('bootstrapPaginator', data); + + return; + } + + if (typeof option === 'string') { + + if (data[option]) { + result = data[option].apply(data, Array.prototype.slice.call(args, 1)); + } else { + throw "Method " + option + " does not exist"; + } + + } else { + result = data.setOptions(option); + } + }); + + return result; + + }; + + $.fn.bootstrapPaginator.sizeArray = { + + "2": { + "large": "pagination-large", + "small": "pagination-small", + "mini": "pagination-mini" + }, + "3": { + "large": "pagination-lg", + "small": "pagination-sm", + "mini": "" + } + + }; + + $.fn.bootstrapPaginator.defaults = { + containerClass: "", + size: "normal", + alignment: "left", + bootstrapMajorVersion: 2, + listContainerClass: "", + itemContainerClass: function (type, page, current) { + return (page === current) ? "active" : ""; + }, + itemContentClass: function (type, page, current) { + return ""; + }, + currentPage: 1, + numberOfPages: 5, + totalPages: 1, + pageUrl: function (type, page, current) { + return null; + }, + onPageClicked: null, + onPageChanged: null, + useBootstrapTooltip: false, + shouldShowPage: function (type, page, current) { + + var result = true; + + switch (type) { + case "first": + result = (current !== 1); + break; + case "prev": + result = (current !== 1); + break; + case "next": + result = (current !== this.totalPages); + break; + case "last": + result = (current !== this.totalPages); + break; + case "page": + result = true; + break; + } + + return result; + + }, + itemTexts: function (type, page, current) { + switch (type) { + case "first": + return "<<"; + case "prev": + return "<"; + case "next": + return ">"; + case "last": + return ">>"; + case "page": + return page; + } + }, + tooltipTitles: function (type, page, current) { + + switch (type) { + case "first": + return "Go to first page"; + case "prev": + return "Go to previous page"; + case "next": + return "Go to next page"; + case "last": + return "Go to last page"; + case "page": + return (page === current) ? "Current page is " + page : "Go to page " + page; + } + }, + bootstrapTooltipOptions: { + animation: true, + html: true, + placement: 'top', + selector: false, + title: "", + container: false + } + }; + + $.fn.bootstrapPaginator.Constructor = BootstrapPaginator; + + + +}(window.jQuery)); \ No newline at end of file diff --git a/generator-web/src/main/resources/static/vendor/bootstrap/js/bootstrap.min.js b/generator-web/src/main/resources/static/vendor/bootstrap/js/bootstrap.min.js new file mode 100644 index 0000000..27aace3 --- /dev/null +++ b/generator-web/src/main/resources/static/vendor/bootstrap/js/bootstrap.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v4.0.0-beta.2 (https://getbootstrap.com) + * Copyright 2011-2017 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +var bootstrap=function(t,e,n){"use strict";function i(t,e){for(var n=0;n0?n:null}catch(t){return null}},reflow:function(t){return t.offsetHeight},triggerTransitionEnd:function(t){e(t).trigger(r.end)},supportsTransitionEnd:function(){return Boolean(r)},isElement:function(t){return(t[0]||t).nodeType},typeCheckConfig:function(e,n,i){for(var s in i)if(Object.prototype.hasOwnProperty.call(i,s)){var r=i[s],o=n[s],l=o&&a.isElement(o)?"element":t(o);if(!new RegExp(r).test(l))throw new Error(e.toUpperCase()+': Option "'+s+'" provided type "'+l+'" but expected type "'+r+'".')}}};return r=i(),e.fn.emulateTransitionEnd=s,a.supportsTransitionEnd()&&(e.event.special[a.TRANSITION_END]=n()),a}(),r=function(t,e,n){return e&&i(t.prototype,e),n&&i(t,n),t},o=function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e},a=function(){var t="alert",n=e.fn[t],i={CLOSE:"close.bs.alert",CLOSED:"closed.bs.alert",CLICK_DATA_API:"click.bs.alert.data-api"},o={ALERT:"alert",FADE:"fade",SHOW:"show"},a=function(){function t(t){this._element=t}var n=t.prototype;return n.close=function(t){t=t||this._element;var e=this._getRootElement(t);this._triggerCloseEvent(e).isDefaultPrevented()||this._removeElement(e)},n.dispose=function(){e.removeData(this._element,"bs.alert"),this._element=null},n._getRootElement=function(t){var n=s.getSelectorFromElement(t),i=!1;return n&&(i=e(n)[0]),i||(i=e(t).closest("."+o.ALERT)[0]),i},n._triggerCloseEvent=function(t){var n=e.Event(i.CLOSE);return e(t).trigger(n),n},n._removeElement=function(t){var n=this;e(t).removeClass(o.SHOW),s.supportsTransitionEnd()&&e(t).hasClass(o.FADE)?e(t).one(s.TRANSITION_END,function(e){return n._destroyElement(t,e)}).emulateTransitionEnd(150):this._destroyElement(t)},n._destroyElement=function(t){e(t).detach().trigger(i.CLOSED).remove()},t._jQueryInterface=function(n){return this.each(function(){var i=e(this),s=i.data("bs.alert");s||(s=new t(this),i.data("bs.alert",s)),"close"===n&&s[n](this)})},t._handleDismiss=function(t){return function(e){e&&e.preventDefault(),t.close(this)}},r(t,null,[{key:"VERSION",get:function(){return"4.0.0-beta.2"}}]),t}();return e(document).on(i.CLICK_DATA_API,{DISMISS:'[data-dismiss="alert"]'}.DISMISS,a._handleDismiss(new a)),e.fn[t]=a._jQueryInterface,e.fn[t].Constructor=a,e.fn[t].noConflict=function(){return e.fn[t]=n,a._jQueryInterface},a}(),l=function(){var t="button",n=e.fn[t],i={ACTIVE:"active",BUTTON:"btn",FOCUS:"focus"},s={DATA_TOGGLE_CARROT:'[data-toggle^="button"]',DATA_TOGGLE:'[data-toggle="buttons"]',INPUT:"input",ACTIVE:".active",BUTTON:".btn"},o={CLICK_DATA_API:"click.bs.button.data-api",FOCUS_BLUR_DATA_API:"focus.bs.button.data-api blur.bs.button.data-api"},a=function(){function t(t){this._element=t}var n=t.prototype;return n.toggle=function(){var t=!0,n=!0,r=e(this._element).closest(s.DATA_TOGGLE)[0];if(r){var o=e(this._element).find(s.INPUT)[0];if(o){if("radio"===o.type)if(o.checked&&e(this._element).hasClass(i.ACTIVE))t=!1;else{var a=e(r).find(s.ACTIVE)[0];a&&e(a).removeClass(i.ACTIVE)}if(t){if(o.hasAttribute("disabled")||r.hasAttribute("disabled")||o.classList.contains("disabled")||r.classList.contains("disabled"))return;o.checked=!e(this._element).hasClass(i.ACTIVE),e(o).trigger("change")}o.focus(),n=!1}}n&&this._element.setAttribute("aria-pressed",!e(this._element).hasClass(i.ACTIVE)),t&&e(this._element).toggleClass(i.ACTIVE)},n.dispose=function(){e.removeData(this._element,"bs.button"),this._element=null},t._jQueryInterface=function(n){return this.each(function(){var i=e(this).data("bs.button");i||(i=new t(this),e(this).data("bs.button",i)),"toggle"===n&&i[n]()})},r(t,null,[{key:"VERSION",get:function(){return"4.0.0-beta.2"}}]),t}();return e(document).on(o.CLICK_DATA_API,s.DATA_TOGGLE_CARROT,function(t){t.preventDefault();var n=t.target;e(n).hasClass(i.BUTTON)||(n=e(n).closest(s.BUTTON)),a._jQueryInterface.call(e(n),"toggle")}).on(o.FOCUS_BLUR_DATA_API,s.DATA_TOGGLE_CARROT,function(t){var n=e(t.target).closest(s.BUTTON)[0];e(n).toggleClass(i.FOCUS,/^focus(in)?$/.test(t.type))}),e.fn[t]=a._jQueryInterface,e.fn[t].Constructor=a,e.fn[t].noConflict=function(){return e.fn[t]=n,a._jQueryInterface},a}(),h=function(){var t="carousel",n="bs.carousel",i="."+n,o=e.fn[t],a={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0},l={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean"},h={NEXT:"next",PREV:"prev",LEFT:"left",RIGHT:"right"},c={SLIDE:"slide"+i,SLID:"slid"+i,KEYDOWN:"keydown"+i,MOUSEENTER:"mouseenter"+i,MOUSELEAVE:"mouseleave"+i,TOUCHEND:"touchend"+i,LOAD_DATA_API:"load.bs.carousel.data-api",CLICK_DATA_API:"click.bs.carousel.data-api"},u={CAROUSEL:"carousel",ACTIVE:"active",SLIDE:"slide",RIGHT:"carousel-item-right",LEFT:"carousel-item-left",NEXT:"carousel-item-next",PREV:"carousel-item-prev",ITEM:"carousel-item"},d={ACTIVE:".active",ACTIVE_ITEM:".active.carousel-item",ITEM:".carousel-item",NEXT_PREV:".carousel-item-next, .carousel-item-prev",INDICATORS:".carousel-indicators",DATA_SLIDE:"[data-slide], [data-slide-to]",DATA_RIDE:'[data-ride="carousel"]'},f=function(){function o(t,n){this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this._config=this._getConfig(n),this._element=e(t)[0],this._indicatorsElement=e(this._element).find(d.INDICATORS)[0],this._addEventListeners()}var f=o.prototype;return f.next=function(){this._isSliding||this._slide(h.NEXT)},f.nextWhenVisible=function(){!document.hidden&&e(this._element).is(":visible")&&"hidden"!==e(this._element).css("visibility")&&this.next()},f.prev=function(){this._isSliding||this._slide(h.PREV)},f.pause=function(t){t||(this._isPaused=!0),e(this._element).find(d.NEXT_PREV)[0]&&s.supportsTransitionEnd()&&(s.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},f.cycle=function(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},f.to=function(t){var n=this;this._activeElement=e(this._element).find(d.ACTIVE_ITEM)[0];var i=this._getItemIndex(this._activeElement);if(!(t>this._items.length-1||t<0))if(this._isSliding)e(this._element).one(c.SLID,function(){return n.to(t)});else{if(i===t)return this.pause(),void this.cycle();var s=t>i?h.NEXT:h.PREV;this._slide(s,this._items[t])}},f.dispose=function(){e(this._element).off(i),e.removeData(this._element,n),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},f._getConfig=function(n){return n=e.extend({},a,n),s.typeCheckConfig(t,n,l),n},f._addEventListeners=function(){var t=this;this._config.keyboard&&e(this._element).on(c.KEYDOWN,function(e){return t._keydown(e)}),"hover"===this._config.pause&&(e(this._element).on(c.MOUSEENTER,function(e){return t.pause(e)}).on(c.MOUSELEAVE,function(e){return t.cycle(e)}),"ontouchstart"in document.documentElement&&e(this._element).on(c.TOUCHEND,function(){t.pause(),t.touchTimeout&&clearTimeout(t.touchTimeout),t.touchTimeout=setTimeout(function(e){return t.cycle(e)},500+t._config.interval)}))},f._keydown=function(t){if(!/input|textarea/i.test(t.target.tagName))switch(t.which){case 37:t.preventDefault(),this.prev();break;case 39:t.preventDefault(),this.next();break;default:return}},f._getItemIndex=function(t){return this._items=e.makeArray(e(t).parent().find(d.ITEM)),this._items.indexOf(t)},f._getItemByDirection=function(t,e){var n=t===h.NEXT,i=t===h.PREV,s=this._getItemIndex(e),r=this._items.length-1;if((i&&0===s||n&&s===r)&&!this._config.wrap)return e;var o=(s+(t===h.PREV?-1:1))%this._items.length;return-1===o?this._items[this._items.length-1]:this._items[o]},f._triggerSlideEvent=function(t,n){var i=this._getItemIndex(t),s=this._getItemIndex(e(this._element).find(d.ACTIVE_ITEM)[0]),r=e.Event(c.SLIDE,{relatedTarget:t,direction:n,from:s,to:i});return e(this._element).trigger(r),r},f._setActiveIndicatorElement=function(t){if(this._indicatorsElement){e(this._indicatorsElement).find(d.ACTIVE).removeClass(u.ACTIVE);var n=this._indicatorsElement.children[this._getItemIndex(t)];n&&e(n).addClass(u.ACTIVE)}},f._slide=function(t,n){var i,r,o,a=this,l=e(this._element).find(d.ACTIVE_ITEM)[0],f=this._getItemIndex(l),_=n||l&&this._getItemByDirection(t,l),g=this._getItemIndex(_),m=Boolean(this._interval);if(t===h.NEXT?(i=u.LEFT,r=u.NEXT,o=h.LEFT):(i=u.RIGHT,r=u.PREV,o=h.RIGHT),_&&e(_).hasClass(u.ACTIVE))this._isSliding=!1;else if(!this._triggerSlideEvent(_,o).isDefaultPrevented()&&l&&_){this._isSliding=!0,m&&this.pause(),this._setActiveIndicatorElement(_);var p=e.Event(c.SLID,{relatedTarget:_,direction:o,from:f,to:g});s.supportsTransitionEnd()&&e(this._element).hasClass(u.SLIDE)?(e(_).addClass(r),s.reflow(_),e(l).addClass(i),e(_).addClass(i),e(l).one(s.TRANSITION_END,function(){e(_).removeClass(i+" "+r).addClass(u.ACTIVE),e(l).removeClass(u.ACTIVE+" "+r+" "+i),a._isSliding=!1,setTimeout(function(){return e(a._element).trigger(p)},0)}).emulateTransitionEnd(600)):(e(l).removeClass(u.ACTIVE),e(_).addClass(u.ACTIVE),this._isSliding=!1,e(this._element).trigger(p)),m&&this.cycle()}},o._jQueryInterface=function(t){return this.each(function(){var i=e(this).data(n),s=e.extend({},a,e(this).data());"object"==typeof t&&e.extend(s,t);var r="string"==typeof t?t:s.slide;if(i||(i=new o(this,s),e(this).data(n,i)),"number"==typeof t)i.to(t);else if("string"==typeof r){if("undefined"==typeof i[r])throw new Error('No method named "'+r+'"');i[r]()}else s.interval&&(i.pause(),i.cycle())})},o._dataApiClickHandler=function(t){var i=s.getSelectorFromElement(this);if(i){var r=e(i)[0];if(r&&e(r).hasClass(u.CAROUSEL)){var a=e.extend({},e(r).data(),e(this).data()),l=this.getAttribute("data-slide-to");l&&(a.interval=!1),o._jQueryInterface.call(e(r),a),l&&e(r).data(n).to(l),t.preventDefault()}}},r(o,null,[{key:"VERSION",get:function(){return"4.0.0-beta.2"}},{key:"Default",get:function(){return a}}]),o}();return e(document).on(c.CLICK_DATA_API,d.DATA_SLIDE,f._dataApiClickHandler),e(window).on(c.LOAD_DATA_API,function(){e(d.DATA_RIDE).each(function(){var t=e(this);f._jQueryInterface.call(t,t.data())})}),e.fn[t]=f._jQueryInterface,e.fn[t].Constructor=f,e.fn[t].noConflict=function(){return e.fn[t]=o,f._jQueryInterface},f}(),c=function(){var t="collapse",n="bs.collapse",i=e.fn[t],o={toggle:!0,parent:""},a={toggle:"boolean",parent:"(string|element)"},l={SHOW:"show.bs.collapse",SHOWN:"shown.bs.collapse",HIDE:"hide.bs.collapse",HIDDEN:"hidden.bs.collapse",CLICK_DATA_API:"click.bs.collapse.data-api"},h={SHOW:"show",COLLAPSE:"collapse",COLLAPSING:"collapsing",COLLAPSED:"collapsed"},c={WIDTH:"width",HEIGHT:"height"},u={ACTIVES:".show, .collapsing",DATA_TOGGLE:'[data-toggle="collapse"]'},d=function(){function i(t,n){this._isTransitioning=!1,this._element=t,this._config=this._getConfig(n),this._triggerArray=e.makeArray(e('[data-toggle="collapse"][href="#'+t.id+'"],[data-toggle="collapse"][data-target="#'+t.id+'"]'));for(var i=e(u.DATA_TOGGLE),r=0;r0&&this._triggerArray.push(o)}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}var d=i.prototype;return d.toggle=function(){e(this._element).hasClass(h.SHOW)?this.hide():this.show()},d.show=function(){var t=this;if(!this._isTransitioning&&!e(this._element).hasClass(h.SHOW)){var r,o;if(this._parent&&((r=e.makeArray(e(this._parent).children().children(u.ACTIVES))).length||(r=null)),!(r&&(o=e(r).data(n))&&o._isTransitioning)){var a=e.Event(l.SHOW);if(e(this._element).trigger(a),!a.isDefaultPrevented()){r&&(i._jQueryInterface.call(e(r),"hide"),o||e(r).data(n,null));var c=this._getDimension();e(this._element).removeClass(h.COLLAPSE).addClass(h.COLLAPSING),this._element.style[c]=0,this._triggerArray.length&&e(this._triggerArray).removeClass(h.COLLAPSED).attr("aria-expanded",!0),this.setTransitioning(!0);var d=function(){e(t._element).removeClass(h.COLLAPSING).addClass(h.COLLAPSE).addClass(h.SHOW),t._element.style[c]="",t.setTransitioning(!1),e(t._element).trigger(l.SHOWN)};if(s.supportsTransitionEnd()){var f="scroll"+(c[0].toUpperCase()+c.slice(1));e(this._element).one(s.TRANSITION_END,d).emulateTransitionEnd(600),this._element.style[c]=this._element[f]+"px"}else d()}}}},d.hide=function(){var t=this;if(!this._isTransitioning&&e(this._element).hasClass(h.SHOW)){var n=e.Event(l.HIDE);if(e(this._element).trigger(n),!n.isDefaultPrevented()){var i=this._getDimension();if(this._element.style[i]=this._element.getBoundingClientRect()[i]+"px",s.reflow(this._element),e(this._element).addClass(h.COLLAPSING).removeClass(h.COLLAPSE).removeClass(h.SHOW),this._triggerArray.length)for(var r=0;r0},g._getPopperConfig=function(){var t=this,n={};"function"==typeof this._config.offset?n.fn=function(n){return n.offsets=e.extend({},n.offsets,t._config.offset(n.offsets)||{}),n}:n.offset=this._config.offset;var i={placement:this._getPlacement(),modifiers:{offset:n,flip:{enabled:this._config.flip}}};return this._inNavbar&&(i.modifiers.applyStyle={enabled:!this._inNavbar}),i},a._jQueryInterface=function(t){return this.each(function(){var n=e(this).data(i),s="object"==typeof t?t:null;if(n||(n=new a(this,s),e(this).data(i,n)),"string"==typeof t){if("undefined"==typeof n[t])throw new Error('No method named "'+t+'"');n[t]()}})},a._clearMenus=function(t){if(!t||3!==t.which&&("keyup"!==t.type||9===t.which))for(var n=e.makeArray(e(u.DATA_TOGGLE)),s=0;s0&&r--,40===t.which&&rdocument.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},u._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},u._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=t.left+t.right
    ',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip"},u={SHOW:"show",OUT:"out"},d={HIDE:"hide"+i,HIDDEN:"hidden"+i,SHOW:"show"+i,SHOWN:"shown"+i,INSERTED:"inserted"+i,CLICK:"click"+i,FOCUSIN:"focusin"+i,FOCUSOUT:"focusout"+i,MOUSEENTER:"mouseenter"+i,MOUSELEAVE:"mouseleave"+i},f={FADE:"fade",SHOW:"show"},_={TOOLTIP:".tooltip",TOOLTIP_INNER:".tooltip-inner",ARROW:".arrow"},g={HOVER:"hover",FOCUS:"focus",CLICK:"click",MANUAL:"manual"},m=function(){function o(t,e){this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var m=o.prototype;return m.enable=function(){this._isEnabled=!0},m.disable=function(){this._isEnabled=!1},m.toggleEnabled=function(){this._isEnabled=!this._isEnabled},m.toggle=function(t){if(this._isEnabled)if(t){var n=this.constructor.DATA_KEY,i=e(t.currentTarget).data(n);i||(i=new this.constructor(t.currentTarget,this._getDelegateConfig()),e(t.currentTarget).data(n,i)),i._activeTrigger.click=!i._activeTrigger.click,i._isWithActiveTrigger()?i._enter(null,i):i._leave(null,i)}else{if(e(this.getTipElement()).hasClass(f.SHOW))return void this._leave(null,this);this._enter(null,this)}},m.dispose=function(){clearTimeout(this._timeout),e.removeData(this.element,this.constructor.DATA_KEY),e(this.element).off(this.constructor.EVENT_KEY),e(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&e(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,null!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},m.show=function(){var t=this;if("none"===e(this.element).css("display"))throw new Error("Please use show on visible elements");var i=e.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){e(this.element).trigger(i);var r=e.contains(this.element.ownerDocument.documentElement,this.element);if(i.isDefaultPrevented()||!r)return;var a=this.getTipElement(),l=s.getUID(this.constructor.NAME);a.setAttribute("id",l),this.element.setAttribute("aria-describedby",l),this.setContent(),this.config.animation&&e(a).addClass(f.FADE);var h="function"==typeof this.config.placement?this.config.placement.call(this,a,this.element):this.config.placement,c=this._getAttachment(h);this.addAttachmentClass(c);var d=!1===this.config.container?document.body:e(this.config.container);e(a).data(this.constructor.DATA_KEY,this),e.contains(this.element.ownerDocument.documentElement,this.tip)||e(a).appendTo(d),e(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new n(this.element,a,{placement:c,modifiers:{offset:{offset:this.config.offset},flip:{behavior:this.config.fallbackPlacement},arrow:{element:_.ARROW}},onCreate:function(e){e.originalPlacement!==e.placement&&t._handlePopperPlacementChange(e)},onUpdate:function(e){t._handlePopperPlacementChange(e)}}),e(a).addClass(f.SHOW),"ontouchstart"in document.documentElement&&e("body").children().on("mouseover",null,e.noop);var g=function(){t.config.animation&&t._fixTransition();var n=t._hoverState;t._hoverState=null,e(t.element).trigger(t.constructor.Event.SHOWN),n===u.OUT&&t._leave(null,t)};s.supportsTransitionEnd()&&e(this.tip).hasClass(f.FADE)?e(this.tip).one(s.TRANSITION_END,g).emulateTransitionEnd(o._TRANSITION_DURATION):g()}},m.hide=function(t){var n=this,i=this.getTipElement(),r=e.Event(this.constructor.Event.HIDE),o=function(){n._hoverState!==u.SHOW&&i.parentNode&&i.parentNode.removeChild(i),n._cleanTipClass(),n.element.removeAttribute("aria-describedby"),e(n.element).trigger(n.constructor.Event.HIDDEN),null!==n._popper&&n._popper.destroy(),t&&t()};e(this.element).trigger(r),r.isDefaultPrevented()||(e(i).removeClass(f.SHOW),"ontouchstart"in document.documentElement&&e("body").children().off("mouseover",null,e.noop),this._activeTrigger[g.CLICK]=!1,this._activeTrigger[g.FOCUS]=!1,this._activeTrigger[g.HOVER]=!1,s.supportsTransitionEnd()&&e(this.tip).hasClass(f.FADE)?e(i).one(s.TRANSITION_END,o).emulateTransitionEnd(150):o(),this._hoverState="")},m.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},m.isWithContent=function(){return Boolean(this.getTitle())},m.addAttachmentClass=function(t){e(this.getTipElement()).addClass("bs-tooltip-"+t)},m.getTipElement=function(){return this.tip=this.tip||e(this.config.template)[0],this.tip},m.setContent=function(){var t=e(this.getTipElement());this.setElementContent(t.find(_.TOOLTIP_INNER),this.getTitle()),t.removeClass(f.FADE+" "+f.SHOW)},m.setElementContent=function(t,n){var i=this.config.html;"object"==typeof n&&(n.nodeType||n.jquery)?i?e(n).parent().is(t)||t.empty().append(n):t.text(e(n).text()):t[i?"html":"text"](n)},m.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},m._getAttachment=function(t){return h[t.toUpperCase()]},m._setListeners=function(){var t=this;this.config.trigger.split(" ").forEach(function(n){if("click"===n)e(t.element).on(t.constructor.Event.CLICK,t.config.selector,function(e){return t.toggle(e)});else if(n!==g.MANUAL){var i=n===g.HOVER?t.constructor.Event.MOUSEENTER:t.constructor.Event.FOCUSIN,s=n===g.HOVER?t.constructor.Event.MOUSELEAVE:t.constructor.Event.FOCUSOUT;e(t.element).on(i,t.config.selector,function(e){return t._enter(e)}).on(s,t.config.selector,function(e){return t._leave(e)})}e(t.element).closest(".modal").on("hide.bs.modal",function(){return t.hide()})}),this.config.selector?this.config=e.extend({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},m._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},m._enter=function(t,n){var i=this.constructor.DATA_KEY;(n=n||e(t.currentTarget).data(i))||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),e(t.currentTarget).data(i,n)),t&&(n._activeTrigger["focusin"===t.type?g.FOCUS:g.HOVER]=!0),e(n.getTipElement()).hasClass(f.SHOW)||n._hoverState===u.SHOW?n._hoverState=u.SHOW:(clearTimeout(n._timeout),n._hoverState=u.SHOW,n.config.delay&&n.config.delay.show?n._timeout=setTimeout(function(){n._hoverState===u.SHOW&&n.show()},n.config.delay.show):n.show())},m._leave=function(t,n){var i=this.constructor.DATA_KEY;(n=n||e(t.currentTarget).data(i))||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),e(t.currentTarget).data(i,n)),t&&(n._activeTrigger["focusout"===t.type?g.FOCUS:g.HOVER]=!1),n._isWithActiveTrigger()||(clearTimeout(n._timeout),n._hoverState=u.OUT,n.config.delay&&n.config.delay.hide?n._timeout=setTimeout(function(){n._hoverState===u.OUT&&n.hide()},n.config.delay.hide):n.hide())},m._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},m._getConfig=function(n){return"number"==typeof(n=e.extend({},this.constructor.Default,e(this.element).data(),n)).delay&&(n.delay={show:n.delay,hide:n.delay}),"number"==typeof n.title&&(n.title=n.title.toString()),"number"==typeof n.content&&(n.content=n.content.toString()),s.typeCheckConfig(t,n,this.constructor.DefaultType),n},m._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},m._cleanTipClass=function(){var t=e(this.getTipElement()),n=t.attr("class").match(a);null!==n&&n.length>0&&t.removeClass(n.join(""))},m._handlePopperPlacementChange=function(t){this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},m._fixTransition=function(){var t=this.getTipElement(),n=this.config.animation;null===t.getAttribute("x-placement")&&(e(t).removeClass(f.FADE),this.config.animation=!1,this.hide(),this.show(),this.config.animation=n)},o._jQueryInterface=function(t){return this.each(function(){var n=e(this).data("bs.tooltip"),i="object"==typeof t&&t;if((n||!/dispose|hide/.test(t))&&(n||(n=new o(this,i),e(this).data("bs.tooltip",n)),"string"==typeof t)){if("undefined"==typeof n[t])throw new Error('No method named "'+t+'"');n[t]()}})},r(o,null,[{key:"VERSION",get:function(){return"4.0.0-beta.2"}},{key:"Default",get:function(){return c}},{key:"NAME",get:function(){return t}},{key:"DATA_KEY",get:function(){return"bs.tooltip"}},{key:"Event",get:function(){return d}},{key:"EVENT_KEY",get:function(){return i}},{key:"DefaultType",get:function(){return l}}]),o}();return e.fn[t]=m._jQueryInterface,e.fn[t].Constructor=m,e.fn[t].noConflict=function(){return e.fn[t]=o,m._jQueryInterface},m}(),_=function(){var t="popover",n=".bs.popover",i=e.fn[t],s=new RegExp("(^|\\s)bs-popover\\S+","g"),a=e.extend({},f.Default,{placement:"right",trigger:"click",content:"",template:''}),l=e.extend({},f.DefaultType,{content:"(string|element|function)"}),h={FADE:"fade",SHOW:"show"},c={TITLE:".popover-header",CONTENT:".popover-body"},u={HIDE:"hide"+n,HIDDEN:"hidden"+n,SHOW:"show"+n,SHOWN:"shown"+n,INSERTED:"inserted"+n,CLICK:"click"+n,FOCUSIN:"focusin"+n,FOCUSOUT:"focusout"+n,MOUSEENTER:"mouseenter"+n,MOUSELEAVE:"mouseleave"+n},d=function(i){function d(){return i.apply(this,arguments)||this}o(d,i);var f=d.prototype;return f.isWithContent=function(){return this.getTitle()||this._getContent()},f.addAttachmentClass=function(t){e(this.getTipElement()).addClass("bs-popover-"+t)},f.getTipElement=function(){return this.tip=this.tip||e(this.config.template)[0],this.tip},f.setContent=function(){var t=e(this.getTipElement());this.setElementContent(t.find(c.TITLE),this.getTitle()),this.setElementContent(t.find(c.CONTENT),this._getContent()),t.removeClass(h.FADE+" "+h.SHOW)},f._getContent=function(){return this.element.getAttribute("data-content")||("function"==typeof this.config.content?this.config.content.call(this.element):this.config.content)},f._cleanTipClass=function(){var t=e(this.getTipElement()),n=t.attr("class").match(s);null!==n&&n.length>0&&t.removeClass(n.join(""))},d._jQueryInterface=function(t){return this.each(function(){var n=e(this).data("bs.popover"),i="object"==typeof t?t:null;if((n||!/destroy|hide/.test(t))&&(n||(n=new d(this,i),e(this).data("bs.popover",n)),"string"==typeof t)){if("undefined"==typeof n[t])throw new Error('No method named "'+t+'"');n[t]()}})},r(d,null,[{key:"VERSION",get:function(){return"4.0.0-beta.2"}},{key:"Default",get:function(){return a}},{key:"NAME",get:function(){return t}},{key:"DATA_KEY",get:function(){return"bs.popover"}},{key:"Event",get:function(){return u}},{key:"EVENT_KEY",get:function(){return n}},{key:"DefaultType",get:function(){return l}}]),d}(f);return e.fn[t]=d._jQueryInterface,e.fn[t].Constructor=d,e.fn[t].noConflict=function(){return e.fn[t]=i,d._jQueryInterface},d}(),g=function(){var t="scrollspy",n=e.fn[t],i={offset:10,method:"auto",target:""},o={offset:"number",method:"string",target:"(string|element)"},a={ACTIVATE:"activate.bs.scrollspy",SCROLL:"scroll.bs.scrollspy",LOAD_DATA_API:"load.bs.scrollspy.data-api"},l={DROPDOWN_ITEM:"dropdown-item",DROPDOWN_MENU:"dropdown-menu",ACTIVE:"active"},h={DATA_SPY:'[data-spy="scroll"]',ACTIVE:".active",NAV_LIST_GROUP:".nav, .list-group",NAV_LINKS:".nav-link",NAV_ITEMS:".nav-item",LIST_ITEMS:".list-group-item",DROPDOWN:".dropdown",DROPDOWN_ITEMS:".dropdown-item",DROPDOWN_TOGGLE:".dropdown-toggle"},c={OFFSET:"offset",POSITION:"position"},u=function(){function n(t,n){var i=this;this._element=t,this._scrollElement="BODY"===t.tagName?window:t,this._config=this._getConfig(n),this._selector=this._config.target+" "+h.NAV_LINKS+","+this._config.target+" "+h.LIST_ITEMS+","+this._config.target+" "+h.DROPDOWN_ITEMS,this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,e(this._scrollElement).on(a.SCROLL,function(t){return i._process(t)}),this.refresh(),this._process()}var u=n.prototype;return u.refresh=function(){var t=this,n=this._scrollElement!==this._scrollElement.window?c.POSITION:c.OFFSET,i="auto"===this._config.method?n:this._config.method,r=i===c.POSITION?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),e.makeArray(e(this._selector)).map(function(t){var n,o=s.getSelectorFromElement(t);if(o&&(n=e(o)[0]),n){var a=n.getBoundingClientRect();if(a.width||a.height)return[e(n)[i]().top+r,o]}return null}).filter(function(t){return t}).sort(function(t,e){return t[0]-e[0]}).forEach(function(e){t._offsets.push(e[0]),t._targets.push(e[1])})},u.dispose=function(){e.removeData(this._element,"bs.scrollspy"),e(this._scrollElement).off(".bs.scrollspy"),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},u._getConfig=function(n){if("string"!=typeof(n=e.extend({},i,n)).target){var r=e(n.target).attr("id");r||(r=s.getUID(t),e(n.target).attr("id",r)),n.target="#"+r}return s.typeCheckConfig(t,n,o),n},u._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},u._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},u._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},u._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=n){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&t0)return this._activeTarget=null,void this._clear();for(var s=this._offsets.length;s--;)this._activeTarget!==this._targets[s]&&t>=this._offsets[s]&&("undefined"==typeof this._offsets[s+1]||t li > .active",DATA_TOGGLE:'[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',DROPDOWN_TOGGLE:".dropdown-toggle",DROPDOWN_ACTIVE_CHILD:"> .dropdown-menu .active"},a=function(){function t(t){this._element=t}var a=t.prototype;return a.show=function(){var t=this;if(!(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&e(this._element).hasClass(i.ACTIVE)||e(this._element).hasClass(i.DISABLED))){var r,a,l=e(this._element).closest(o.NAV_LIST_GROUP)[0],h=s.getSelectorFromElement(this._element);if(l){var c="UL"===l.nodeName?o.ACTIVE_UL:o.ACTIVE;a=e.makeArray(e(l).find(c)),a=a[a.length-1]}var u=e.Event(n.HIDE,{relatedTarget:this._element}),d=e.Event(n.SHOW,{relatedTarget:a});if(a&&e(a).trigger(u),e(this._element).trigger(d),!d.isDefaultPrevented()&&!u.isDefaultPrevented()){h&&(r=e(h)[0]),this._activate(this._element,l);var f=function(){var i=e.Event(n.HIDDEN,{relatedTarget:t._element}),s=e.Event(n.SHOWN,{relatedTarget:a});e(a).trigger(i),e(t._element).trigger(s)};r?this._activate(r,r.parentNode,f):f()}}},a.dispose=function(){e.removeData(this._element,"bs.tab"),this._element=null},a._activate=function(t,n,r){var a,l=this,h=(a="UL"===n.nodeName?e(n).find(o.ACTIVE_UL):e(n).children(o.ACTIVE))[0],c=r&&s.supportsTransitionEnd()&&h&&e(h).hasClass(i.FADE),u=function(){return l._transitionComplete(t,h,c,r)};h&&c?e(h).one(s.TRANSITION_END,u).emulateTransitionEnd(150):u(),h&&e(h).removeClass(i.SHOW)},a._transitionComplete=function(t,n,r,a){if(n){e(n).removeClass(i.ACTIVE);var l=e(n.parentNode).find(o.DROPDOWN_ACTIVE_CHILD)[0];l&&e(l).removeClass(i.ACTIVE),"tab"===n.getAttribute("role")&&n.setAttribute("aria-selected",!1)}if(e(t).addClass(i.ACTIVE),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!0),r?(s.reflow(t),e(t).addClass(i.SHOW)):e(t).removeClass(i.FADE),t.parentNode&&e(t.parentNode).hasClass(i.DROPDOWN_MENU)){var h=e(t).closest(o.DROPDOWN)[0];h&&e(h).find(o.DROPDOWN_TOGGLE).addClass(i.ACTIVE),t.setAttribute("aria-expanded",!0)}a&&a()},t._jQueryInterface=function(n){return this.each(function(){var i=e(this),s=i.data("bs.tab");if(s||(s=new t(this),i.data("bs.tab",s)),"string"==typeof n){if("undefined"==typeof s[n])throw new Error('No method named "'+n+'"');s[n]()}})},r(t,null,[{key:"VERSION",get:function(){return"4.0.0-beta.2"}}]),t}();return e(document).on(n.CLICK_DATA_API,o.DATA_TOGGLE,function(t){t.preventDefault(),a._jQueryInterface.call(e(this),"show")}),e.fn.tab=a._jQueryInterface,e.fn.tab.Constructor=a,e.fn.tab.noConflict=function(){return e.fn.tab=t,a._jQueryInterface},a}();return function(){if("undefined"==typeof e)throw new Error("Bootstrap's JavaScript requires jQuery. jQuery must be included before Bootstrap's JavaScript.");var t=e.fn.jquery.split(" ")[0].split(".");if(t[0]<2&&t[1]<9||1===t[0]&&9===t[1]&&t[2]<1||t[0]>=4)throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}(),t.Util=s,t.Alert=a,t.Button=l,t.Carousel=h,t.Collapse=c,t.Dropdown=u,t.Modal=d,t.Popover=_,t.Scrollspy=g,t.Tab=m,t.Tooltip=f,t}({},$,Popper); +//# sourceMappingURL=bootstrap.min.js.map \ No newline at end of file diff --git a/generator-web/src/main/resources/static/vendor/chart.js/chart.js b/generator-web/src/main/resources/static/vendor/chart.js/chart.js new file mode 100644 index 0000000..0825ec7 --- /dev/null +++ b/generator-web/src/main/resources/static/vendor/chart.js/chart.js @@ -0,0 +1,14145 @@ +/*! + * Chart.js + * http://chartjs.org/ + * Version: 2.7.1 + * + * Copyright 2017 Nick Downie + * Released under the MIT license + * https://github.com/chartjs/Chart.js/blob/master/LICENSE.md + */ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.Chart = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o lum2) { + return (lum1 + 0.05) / (lum2 + 0.05); + } + return (lum2 + 0.05) / (lum1 + 0.05); + }, + + level: function (color2) { + var contrastRatio = this.contrast(color2); + if (contrastRatio >= 7.1) { + return 'AAA'; + } + + return (contrastRatio >= 4.5) ? 'AA' : ''; + }, + + dark: function () { + // YIQ equation from http://24ways.org/2010/calculating-color-contrast + var rgb = this.values.rgb; + var yiq = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000; + return yiq < 128; + }, + + light: function () { + return !this.dark(); + }, + + negate: function () { + var rgb = []; + for (var i = 0; i < 3; i++) { + rgb[i] = 255 - this.values.rgb[i]; + } + this.setValues('rgb', rgb); + return this; + }, + + lighten: function (ratio) { + var hsl = this.values.hsl; + hsl[2] += hsl[2] * ratio; + this.setValues('hsl', hsl); + return this; + }, + + darken: function (ratio) { + var hsl = this.values.hsl; + hsl[2] -= hsl[2] * ratio; + this.setValues('hsl', hsl); + return this; + }, + + saturate: function (ratio) { + var hsl = this.values.hsl; + hsl[1] += hsl[1] * ratio; + this.setValues('hsl', hsl); + return this; + }, + + desaturate: function (ratio) { + var hsl = this.values.hsl; + hsl[1] -= hsl[1] * ratio; + this.setValues('hsl', hsl); + return this; + }, + + whiten: function (ratio) { + var hwb = this.values.hwb; + hwb[1] += hwb[1] * ratio; + this.setValues('hwb', hwb); + return this; + }, + + blacken: function (ratio) { + var hwb = this.values.hwb; + hwb[2] += hwb[2] * ratio; + this.setValues('hwb', hwb); + return this; + }, + + greyscale: function () { + var rgb = this.values.rgb; + // http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale + var val = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11; + this.setValues('rgb', [val, val, val]); + return this; + }, + + clearer: function (ratio) { + var alpha = this.values.alpha; + this.setValues('alpha', alpha - (alpha * ratio)); + return this; + }, + + opaquer: function (ratio) { + var alpha = this.values.alpha; + this.setValues('alpha', alpha + (alpha * ratio)); + return this; + }, + + rotate: function (degrees) { + var hsl = this.values.hsl; + var hue = (hsl[0] + degrees) % 360; + hsl[0] = hue < 0 ? 360 + hue : hue; + this.setValues('hsl', hsl); + return this; + }, + + /** + * Ported from sass implementation in C + * https://github.com/sass/libsass/blob/0e6b4a2850092356aa3ece07c6b249f0221caced/functions.cpp#L209 + */ + mix: function (mixinColor, weight) { + var color1 = this; + var color2 = mixinColor; + var p = weight === undefined ? 0.5 : weight; + + var w = 2 * p - 1; + var a = color1.alpha() - color2.alpha(); + + var w1 = (((w * a === -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0; + var w2 = 1 - w1; + + return this + .rgb( + w1 * color1.red() + w2 * color2.red(), + w1 * color1.green() + w2 * color2.green(), + w1 * color1.blue() + w2 * color2.blue() + ) + .alpha(color1.alpha() * p + color2.alpha() * (1 - p)); + }, + + toJSON: function () { + return this.rgb(); + }, + + clone: function () { + // NOTE(SB): using node-clone creates a dependency to Buffer when using browserify, + // making the final build way to big to embed in Chart.js. So let's do it manually, + // assuming that values to clone are 1 dimension arrays containing only numbers, + // except 'alpha' which is a number. + var result = new Color(); + var source = this.values; + var target = result.values; + var value, type; + + for (var prop in source) { + if (source.hasOwnProperty(prop)) { + value = source[prop]; + type = ({}).toString.call(value); + if (type === '[object Array]') { + target[prop] = value.slice(0); + } else if (type === '[object Number]') { + target[prop] = value; + } else { + console.error('unexpected color value:', value); + } + } + } + + return result; + } +}; + +Color.prototype.spaces = { + rgb: ['red', 'green', 'blue'], + hsl: ['hue', 'saturation', 'lightness'], + hsv: ['hue', 'saturation', 'value'], + hwb: ['hue', 'whiteness', 'blackness'], + cmyk: ['cyan', 'magenta', 'yellow', 'black'] +}; + +Color.prototype.maxes = { + rgb: [255, 255, 255], + hsl: [360, 100, 100], + hsv: [360, 100, 100], + hwb: [360, 100, 100], + cmyk: [100, 100, 100, 100] +}; + +Color.prototype.getValues = function (space) { + var values = this.values; + var vals = {}; + + for (var i = 0; i < space.length; i++) { + vals[space.charAt(i)] = values[space][i]; + } + + if (values.alpha !== 1) { + vals.a = values.alpha; + } + + // {r: 255, g: 255, b: 255, a: 0.4} + return vals; +}; + +Color.prototype.setValues = function (space, vals) { + var values = this.values; + var spaces = this.spaces; + var maxes = this.maxes; + var alpha = 1; + var i; + + this.valid = true; + + if (space === 'alpha') { + alpha = vals; + } else if (vals.length) { + // [10, 10, 10] + values[space] = vals.slice(0, space.length); + alpha = vals[space.length]; + } else if (vals[space.charAt(0)] !== undefined) { + // {r: 10, g: 10, b: 10} + for (i = 0; i < space.length; i++) { + values[space][i] = vals[space.charAt(i)]; + } + + alpha = vals.a; + } else if (vals[spaces[space][0]] !== undefined) { + // {red: 10, green: 10, blue: 10} + var chans = spaces[space]; + + for (i = 0; i < space.length; i++) { + values[space][i] = vals[chans[i]]; + } + + alpha = vals.alpha; + } + + values.alpha = Math.max(0, Math.min(1, (alpha === undefined ? values.alpha : alpha))); + + if (space === 'alpha') { + return false; + } + + var capped; + + // cap values of the space prior converting all values + for (i = 0; i < space.length; i++) { + capped = Math.max(0, Math.min(maxes[space][i], values[space][i])); + values[space][i] = Math.round(capped); + } + + // convert to all the other color spaces + for (var sname in spaces) { + if (sname !== space) { + values[sname] = convert[space][sname](values[space]); + } + } + + return true; +}; + +Color.prototype.setSpace = function (space, args) { + var vals = args[0]; + + if (vals === undefined) { + // color.rgb() + return this.getValues(space); + } + + // color.rgb(10, 10, 10) + if (typeof vals === 'number') { + vals = Array.prototype.slice.call(args); + } + + this.setValues(space, vals); + return this; +}; + +Color.prototype.setChannel = function (space, index, val) { + var svalues = this.values[space]; + if (val === undefined) { + // color.red() + return svalues[index]; + } else if (val === svalues[index]) { + // color.red(color.red()) + return this; + } + + // color.red(100) + svalues[index] = val; + this.setValues(space, svalues); + + return this; +}; + +if (typeof window !== 'undefined') { + window.Color = Color; +} + +module.exports = Color; + +},{"2":2,"5":5}],4:[function(require,module,exports){ +/* MIT license */ + +module.exports = { + rgb2hsl: rgb2hsl, + rgb2hsv: rgb2hsv, + rgb2hwb: rgb2hwb, + rgb2cmyk: rgb2cmyk, + rgb2keyword: rgb2keyword, + rgb2xyz: rgb2xyz, + rgb2lab: rgb2lab, + rgb2lch: rgb2lch, + + hsl2rgb: hsl2rgb, + hsl2hsv: hsl2hsv, + hsl2hwb: hsl2hwb, + hsl2cmyk: hsl2cmyk, + hsl2keyword: hsl2keyword, + + hsv2rgb: hsv2rgb, + hsv2hsl: hsv2hsl, + hsv2hwb: hsv2hwb, + hsv2cmyk: hsv2cmyk, + hsv2keyword: hsv2keyword, + + hwb2rgb: hwb2rgb, + hwb2hsl: hwb2hsl, + hwb2hsv: hwb2hsv, + hwb2cmyk: hwb2cmyk, + hwb2keyword: hwb2keyword, + + cmyk2rgb: cmyk2rgb, + cmyk2hsl: cmyk2hsl, + cmyk2hsv: cmyk2hsv, + cmyk2hwb: cmyk2hwb, + cmyk2keyword: cmyk2keyword, + + keyword2rgb: keyword2rgb, + keyword2hsl: keyword2hsl, + keyword2hsv: keyword2hsv, + keyword2hwb: keyword2hwb, + keyword2cmyk: keyword2cmyk, + keyword2lab: keyword2lab, + keyword2xyz: keyword2xyz, + + xyz2rgb: xyz2rgb, + xyz2lab: xyz2lab, + xyz2lch: xyz2lch, + + lab2xyz: lab2xyz, + lab2rgb: lab2rgb, + lab2lch: lab2lch, + + lch2lab: lch2lab, + lch2xyz: lch2xyz, + lch2rgb: lch2rgb +} + + +function rgb2hsl(rgb) { + var r = rgb[0]/255, + g = rgb[1]/255, + b = rgb[2]/255, + min = Math.min(r, g, b), + max = Math.max(r, g, b), + delta = max - min, + h, s, l; + + if (max == min) + h = 0; + else if (r == max) + h = (g - b) / delta; + else if (g == max) + h = 2 + (b - r) / delta; + else if (b == max) + h = 4 + (r - g)/ delta; + + h = Math.min(h * 60, 360); + + if (h < 0) + h += 360; + + l = (min + max) / 2; + + if (max == min) + s = 0; + else if (l <= 0.5) + s = delta / (max + min); + else + s = delta / (2 - max - min); + + return [h, s * 100, l * 100]; +} + +function rgb2hsv(rgb) { + var r = rgb[0], + g = rgb[1], + b = rgb[2], + min = Math.min(r, g, b), + max = Math.max(r, g, b), + delta = max - min, + h, s, v; + + if (max == 0) + s = 0; + else + s = (delta/max * 1000)/10; + + if (max == min) + h = 0; + else if (r == max) + h = (g - b) / delta; + else if (g == max) + h = 2 + (b - r) / delta; + else if (b == max) + h = 4 + (r - g) / delta; + + h = Math.min(h * 60, 360); + + if (h < 0) + h += 360; + + v = ((max / 255) * 1000) / 10; + + return [h, s, v]; +} + +function rgb2hwb(rgb) { + var r = rgb[0], + g = rgb[1], + b = rgb[2], + h = rgb2hsl(rgb)[0], + w = 1/255 * Math.min(r, Math.min(g, b)), + b = 1 - 1/255 * Math.max(r, Math.max(g, b)); + + return [h, w * 100, b * 100]; +} + +function rgb2cmyk(rgb) { + var r = rgb[0] / 255, + g = rgb[1] / 255, + b = rgb[2] / 255, + c, m, y, k; + + k = Math.min(1 - r, 1 - g, 1 - b); + c = (1 - r - k) / (1 - k) || 0; + m = (1 - g - k) / (1 - k) || 0; + y = (1 - b - k) / (1 - k) || 0; + return [c * 100, m * 100, y * 100, k * 100]; +} + +function rgb2keyword(rgb) { + return reverseKeywords[JSON.stringify(rgb)]; +} + +function rgb2xyz(rgb) { + var r = rgb[0] / 255, + g = rgb[1] / 255, + b = rgb[2] / 255; + + // assume sRGB + r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92); + g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92); + b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92); + + var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805); + var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722); + var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505); + + return [x * 100, y *100, z * 100]; +} + +function rgb2lab(rgb) { + var xyz = rgb2xyz(rgb), + x = xyz[0], + y = xyz[1], + z = xyz[2], + l, a, b; + + x /= 95.047; + y /= 100; + z /= 108.883; + + x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116); + y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116); + z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116); + + l = (116 * y) - 16; + a = 500 * (x - y); + b = 200 * (y - z); + + return [l, a, b]; +} + +function rgb2lch(args) { + return lab2lch(rgb2lab(args)); +} + +function hsl2rgb(hsl) { + var h = hsl[0] / 360, + s = hsl[1] / 100, + l = hsl[2] / 100, + t1, t2, t3, rgb, val; + + if (s == 0) { + val = l * 255; + return [val, val, val]; + } + + if (l < 0.5) + t2 = l * (1 + s); + else + t2 = l + s - l * s; + t1 = 2 * l - t2; + + rgb = [0, 0, 0]; + for (var i = 0; i < 3; i++) { + t3 = h + 1 / 3 * - (i - 1); + t3 < 0 && t3++; + t3 > 1 && t3--; + + if (6 * t3 < 1) + val = t1 + (t2 - t1) * 6 * t3; + else if (2 * t3 < 1) + val = t2; + else if (3 * t3 < 2) + val = t1 + (t2 - t1) * (2 / 3 - t3) * 6; + else + val = t1; + + rgb[i] = val * 255; + } + + return rgb; +} + +function hsl2hsv(hsl) { + var h = hsl[0], + s = hsl[1] / 100, + l = hsl[2] / 100, + sv, v; + + if(l === 0) { + // no need to do calc on black + // also avoids divide by 0 error + return [0, 0, 0]; + } + + l *= 2; + s *= (l <= 1) ? l : 2 - l; + v = (l + s) / 2; + sv = (2 * s) / (l + s); + return [h, sv * 100, v * 100]; +} + +function hsl2hwb(args) { + return rgb2hwb(hsl2rgb(args)); +} + +function hsl2cmyk(args) { + return rgb2cmyk(hsl2rgb(args)); +} + +function hsl2keyword(args) { + return rgb2keyword(hsl2rgb(args)); +} + + +function hsv2rgb(hsv) { + var h = hsv[0] / 60, + s = hsv[1] / 100, + v = hsv[2] / 100, + hi = Math.floor(h) % 6; + + var f = h - Math.floor(h), + p = 255 * v * (1 - s), + q = 255 * v * (1 - (s * f)), + t = 255 * v * (1 - (s * (1 - f))), + v = 255 * v; + + switch(hi) { + case 0: + return [v, t, p]; + case 1: + return [q, v, p]; + case 2: + return [p, v, t]; + case 3: + return [p, q, v]; + case 4: + return [t, p, v]; + case 5: + return [v, p, q]; + } +} + +function hsv2hsl(hsv) { + var h = hsv[0], + s = hsv[1] / 100, + v = hsv[2] / 100, + sl, l; + + l = (2 - s) * v; + sl = s * v; + sl /= (l <= 1) ? l : 2 - l; + sl = sl || 0; + l /= 2; + return [h, sl * 100, l * 100]; +} + +function hsv2hwb(args) { + return rgb2hwb(hsv2rgb(args)) +} + +function hsv2cmyk(args) { + return rgb2cmyk(hsv2rgb(args)); +} + +function hsv2keyword(args) { + return rgb2keyword(hsv2rgb(args)); +} + +// http://dev.w3.org/csswg/css-color/#hwb-to-rgb +function hwb2rgb(hwb) { + var h = hwb[0] / 360, + wh = hwb[1] / 100, + bl = hwb[2] / 100, + ratio = wh + bl, + i, v, f, n; + + // wh + bl cant be > 1 + if (ratio > 1) { + wh /= ratio; + bl /= ratio; + } + + i = Math.floor(6 * h); + v = 1 - bl; + f = 6 * h - i; + if ((i & 0x01) != 0) { + f = 1 - f; + } + n = wh + f * (v - wh); // linear interpolation + + switch (i) { + default: + case 6: + case 0: r = v; g = n; b = wh; break; + case 1: r = n; g = v; b = wh; break; + case 2: r = wh; g = v; b = n; break; + case 3: r = wh; g = n; b = v; break; + case 4: r = n; g = wh; b = v; break; + case 5: r = v; g = wh; b = n; break; + } + + return [r * 255, g * 255, b * 255]; +} + +function hwb2hsl(args) { + return rgb2hsl(hwb2rgb(args)); +} + +function hwb2hsv(args) { + return rgb2hsv(hwb2rgb(args)); +} + +function hwb2cmyk(args) { + return rgb2cmyk(hwb2rgb(args)); +} + +function hwb2keyword(args) { + return rgb2keyword(hwb2rgb(args)); +} + +function cmyk2rgb(cmyk) { + var c = cmyk[0] / 100, + m = cmyk[1] / 100, + y = cmyk[2] / 100, + k = cmyk[3] / 100, + r, g, b; + + r = 1 - Math.min(1, c * (1 - k) + k); + g = 1 - Math.min(1, m * (1 - k) + k); + b = 1 - Math.min(1, y * (1 - k) + k); + return [r * 255, g * 255, b * 255]; +} + +function cmyk2hsl(args) { + return rgb2hsl(cmyk2rgb(args)); +} + +function cmyk2hsv(args) { + return rgb2hsv(cmyk2rgb(args)); +} + +function cmyk2hwb(args) { + return rgb2hwb(cmyk2rgb(args)); +} + +function cmyk2keyword(args) { + return rgb2keyword(cmyk2rgb(args)); +} + + +function xyz2rgb(xyz) { + var x = xyz[0] / 100, + y = xyz[1] / 100, + z = xyz[2] / 100, + r, g, b; + + r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986); + g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415); + b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570); + + // assume sRGB + r = r > 0.0031308 ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055) + : r = (r * 12.92); + + g = g > 0.0031308 ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055) + : g = (g * 12.92); + + b = b > 0.0031308 ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055) + : b = (b * 12.92); + + r = Math.min(Math.max(0, r), 1); + g = Math.min(Math.max(0, g), 1); + b = Math.min(Math.max(0, b), 1); + + return [r * 255, g * 255, b * 255]; +} + +function xyz2lab(xyz) { + var x = xyz[0], + y = xyz[1], + z = xyz[2], + l, a, b; + + x /= 95.047; + y /= 100; + z /= 108.883; + + x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116); + y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116); + z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116); + + l = (116 * y) - 16; + a = 500 * (x - y); + b = 200 * (y - z); + + return [l, a, b]; +} + +function xyz2lch(args) { + return lab2lch(xyz2lab(args)); +} + +function lab2xyz(lab) { + var l = lab[0], + a = lab[1], + b = lab[2], + x, y, z, y2; + + if (l <= 8) { + y = (l * 100) / 903.3; + y2 = (7.787 * (y / 100)) + (16 / 116); + } else { + y = 100 * Math.pow((l + 16) / 116, 3); + y2 = Math.pow(y / 100, 1/3); + } + + x = x / 95.047 <= 0.008856 ? x = (95.047 * ((a / 500) + y2 - (16 / 116))) / 7.787 : 95.047 * Math.pow((a / 500) + y2, 3); + + z = z / 108.883 <= 0.008859 ? z = (108.883 * (y2 - (b / 200) - (16 / 116))) / 7.787 : 108.883 * Math.pow(y2 - (b / 200), 3); + + return [x, y, z]; +} + +function lab2lch(lab) { + var l = lab[0], + a = lab[1], + b = lab[2], + hr, h, c; + + hr = Math.atan2(b, a); + h = hr * 360 / 2 / Math.PI; + if (h < 0) { + h += 360; + } + c = Math.sqrt(a * a + b * b); + return [l, c, h]; +} + +function lab2rgb(args) { + return xyz2rgb(lab2xyz(args)); +} + +function lch2lab(lch) { + var l = lch[0], + c = lch[1], + h = lch[2], + a, b, hr; + + hr = h / 360 * 2 * Math.PI; + a = c * Math.cos(hr); + b = c * Math.sin(hr); + return [l, a, b]; +} + +function lch2xyz(args) { + return lab2xyz(lch2lab(args)); +} + +function lch2rgb(args) { + return lab2rgb(lch2lab(args)); +} + +function keyword2rgb(keyword) { + return cssKeywords[keyword]; +} + +function keyword2hsl(args) { + return rgb2hsl(keyword2rgb(args)); +} + +function keyword2hsv(args) { + return rgb2hsv(keyword2rgb(args)); +} + +function keyword2hwb(args) { + return rgb2hwb(keyword2rgb(args)); +} + +function keyword2cmyk(args) { + return rgb2cmyk(keyword2rgb(args)); +} + +function keyword2lab(args) { + return rgb2lab(keyword2rgb(args)); +} + +function keyword2xyz(args) { + return rgb2xyz(keyword2rgb(args)); +} + +var cssKeywords = { + aliceblue: [240,248,255], + antiquewhite: [250,235,215], + aqua: [0,255,255], + aquamarine: [127,255,212], + azure: [240,255,255], + beige: [245,245,220], + bisque: [255,228,196], + black: [0,0,0], + blanchedalmond: [255,235,205], + blue: [0,0,255], + blueviolet: [138,43,226], + brown: [165,42,42], + burlywood: [222,184,135], + cadetblue: [95,158,160], + chartreuse: [127,255,0], + chocolate: [210,105,30], + coral: [255,127,80], + cornflowerblue: [100,149,237], + cornsilk: [255,248,220], + crimson: [220,20,60], + cyan: [0,255,255], + darkblue: [0,0,139], + darkcyan: [0,139,139], + darkgoldenrod: [184,134,11], + darkgray: [169,169,169], + darkgreen: [0,100,0], + darkgrey: [169,169,169], + 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], + darkseagreen: [143,188,143], + darkslateblue: [72,61,139], + darkslategray: [47,79,79], + darkslategrey: [47,79,79], + darkturquoise: [0,206,209], + darkviolet: [148,0,211], + deeppink: [255,20,147], + deepskyblue: [0,191,255], + dimgray: [105,105,105], + dimgrey: [105,105,105], + dodgerblue: [30,144,255], + firebrick: [178,34,34], + floralwhite: [255,250,240], + forestgreen: [34,139,34], + fuchsia: [255,0,255], + gainsboro: [220,220,220], + ghostwhite: [248,248,255], + gold: [255,215,0], + goldenrod: [218,165,32], + gray: [128,128,128], + green: [0,128,0], + greenyellow: [173,255,47], + grey: [128,128,128], + honeydew: [240,255,240], + hotpink: [255,105,180], + indianred: [205,92,92], + indigo: [75,0,130], + ivory: [255,255,240], + khaki: [240,230,140], + lavender: [230,230,250], + lavenderblush: [255,240,245], + lawngreen: [124,252,0], + lemonchiffon: [255,250,205], + lightblue: [173,216,230], + lightcoral: [240,128,128], + lightcyan: [224,255,255], + lightgoldenrodyellow: [250,250,210], + lightgray: [211,211,211], + lightgreen: [144,238,144], + lightgrey: [211,211,211], + lightpink: [255,182,193], + lightsalmon: [255,160,122], + lightseagreen: [32,178,170], + lightskyblue: [135,206,250], + lightslategray: [119,136,153], + lightslategrey: [119,136,153], + lightsteelblue: [176,196,222], + lightyellow: [255,255,224], + lime: [0,255,0], + limegreen: [50,205,50], + linen: [250,240,230], + magenta: [255,0,255], + maroon: [128,0,0], + mediumaquamarine: [102,205,170], + mediumblue: [0,0,205], + mediumorchid: [186,85,211], + mediumpurple: [147,112,219], + mediumseagreen: [60,179,113], + mediumslateblue: [123,104,238], + mediumspringgreen: [0,250,154], + mediumturquoise: [72,209,204], + mediumvioletred: [199,21,133], + midnightblue: [25,25,112], + mintcream: [245,255,250], + mistyrose: [255,228,225], + moccasin: [255,228,181], + navajowhite: [255,222,173], + navy: [0,0,128], + oldlace: [253,245,230], + olive: [128,128,0], + olivedrab: [107,142,35], + orange: [255,165,0], + orangered: [255,69,0], + orchid: [218,112,214], + palegoldenrod: [238,232,170], + palegreen: [152,251,152], + paleturquoise: [175,238,238], + palevioletred: [219,112,147], + papayawhip: [255,239,213], + peachpuff: [255,218,185], + peru: [205,133,63], + pink: [255,192,203], + plum: [221,160,221], + powderblue: [176,224,230], + purple: [128,0,128], + rebeccapurple: [102, 51, 153], + red: [255,0,0], + rosybrown: [188,143,143], + royalblue: [65,105,225], + saddlebrown: [139,69,19], + salmon: [250,128,114], + sandybrown: [244,164,96], + seagreen: [46,139,87], + seashell: [255,245,238], + sienna: [160,82,45], + silver: [192,192,192], + skyblue: [135,206,235], + slateblue: [106,90,205], + slategray: [112,128,144], + slategrey: [112,128,144], + snow: [255,250,250], + springgreen: [0,255,127], + steelblue: [70,130,180], + tan: [210,180,140], + teal: [0,128,128], + thistle: [216,191,216], + tomato: [255,99,71], + turquoise: [64,224,208], + violet: [238,130,238], + wheat: [245,222,179], + white: [255,255,255], + whitesmoke: [245,245,245], + yellow: [255,255,0], + yellowgreen: [154,205,50] +}; + +var reverseKeywords = {}; +for (var key in cssKeywords) { + reverseKeywords[JSON.stringify(cssKeywords[key])] = key; +} + +},{}],5:[function(require,module,exports){ +var conversions = require(4); + +var convert = function() { + return new Converter(); +} + +for (var func in conversions) { + // export Raw versions + convert[func + "Raw"] = (function(func) { + // accept array or plain args + return function(arg) { + if (typeof arg == "number") + arg = Array.prototype.slice.call(arguments); + return conversions[func](arg); + } + })(func); + + var pair = /(\w+)2(\w+)/.exec(func), + from = pair[1], + to = pair[2]; + + // export rgb2hsl and ["rgb"]["hsl"] + convert[from] = convert[from] || {}; + + convert[from][to] = convert[func] = (function(func) { + return function(arg) { + if (typeof arg == "number") + arg = Array.prototype.slice.call(arguments); + + var val = conversions[func](arg); + if (typeof val == "string" || val === undefined) + return val; // keyword + + for (var i = 0; i < val.length; i++) + val[i] = Math.round(val[i]); + return val; + } + })(func); +} + + +/* Converter does lazy conversion and caching */ +var Converter = function() { + this.convs = {}; +}; + +/* Either get the values for a space or + set the values for a space, depending on args */ +Converter.prototype.routeSpace = function(space, args) { + var values = args[0]; + if (values === undefined) { + // color.rgb() + return this.getValues(space); + } + // color.rgb(10, 10, 10) + if (typeof values == "number") { + values = Array.prototype.slice.call(args); + } + + return this.setValues(space, values); +}; + +/* Set the values for a space, invalidating cache */ +Converter.prototype.setValues = function(space, values) { + this.space = space; + this.convs = {}; + this.convs[space] = values; + return this; +}; + +/* Get the values for a space. If there's already + a conversion for the space, fetch it, otherwise + compute it */ +Converter.prototype.getValues = function(space) { + var vals = this.convs[space]; + if (!vals) { + var fspace = this.space, + from = this.convs[fspace]; + vals = convert[fspace][space](from); + + this.convs[space] = vals; + } + return vals; +}; + +["rgb", "hsl", "hsv", "cmyk", "keyword"].forEach(function(space) { + Converter.prototype[space] = function(vals) { + return this.routeSpace(space, arguments); + } +}); + +module.exports = convert; +},{"4":4}],6:[function(require,module,exports){ +'use strict' + +module.exports = { + "aliceblue": [240, 248, 255], + "antiquewhite": [250, 235, 215], + "aqua": [0, 255, 255], + "aquamarine": [127, 255, 212], + "azure": [240, 255, 255], + "beige": [245, 245, 220], + "bisque": [255, 228, 196], + "black": [0, 0, 0], + "blanchedalmond": [255, 235, 205], + "blue": [0, 0, 255], + "blueviolet": [138, 43, 226], + "brown": [165, 42, 42], + "burlywood": [222, 184, 135], + "cadetblue": [95, 158, 160], + "chartreuse": [127, 255, 0], + "chocolate": [210, 105, 30], + "coral": [255, 127, 80], + "cornflowerblue": [100, 149, 237], + "cornsilk": [255, 248, 220], + "crimson": [220, 20, 60], + "cyan": [0, 255, 255], + "darkblue": [0, 0, 139], + "darkcyan": [0, 139, 139], + "darkgoldenrod": [184, 134, 11], + "darkgray": [169, 169, 169], + "darkgreen": [0, 100, 0], + "darkgrey": [169, 169, 169], + "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], + "darkseagreen": [143, 188, 143], + "darkslateblue": [72, 61, 139], + "darkslategray": [47, 79, 79], + "darkslategrey": [47, 79, 79], + "darkturquoise": [0, 206, 209], + "darkviolet": [148, 0, 211], + "deeppink": [255, 20, 147], + "deepskyblue": [0, 191, 255], + "dimgray": [105, 105, 105], + "dimgrey": [105, 105, 105], + "dodgerblue": [30, 144, 255], + "firebrick": [178, 34, 34], + "floralwhite": [255, 250, 240], + "forestgreen": [34, 139, 34], + "fuchsia": [255, 0, 255], + "gainsboro": [220, 220, 220], + "ghostwhite": [248, 248, 255], + "gold": [255, 215, 0], + "goldenrod": [218, 165, 32], + "gray": [128, 128, 128], + "green": [0, 128, 0], + "greenyellow": [173, 255, 47], + "grey": [128, 128, 128], + "honeydew": [240, 255, 240], + "hotpink": [255, 105, 180], + "indianred": [205, 92, 92], + "indigo": [75, 0, 130], + "ivory": [255, 255, 240], + "khaki": [240, 230, 140], + "lavender": [230, 230, 250], + "lavenderblush": [255, 240, 245], + "lawngreen": [124, 252, 0], + "lemonchiffon": [255, 250, 205], + "lightblue": [173, 216, 230], + "lightcoral": [240, 128, 128], + "lightcyan": [224, 255, 255], + "lightgoldenrodyellow": [250, 250, 210], + "lightgray": [211, 211, 211], + "lightgreen": [144, 238, 144], + "lightgrey": [211, 211, 211], + "lightpink": [255, 182, 193], + "lightsalmon": [255, 160, 122], + "lightseagreen": [32, 178, 170], + "lightskyblue": [135, 206, 250], + "lightslategray": [119, 136, 153], + "lightslategrey": [119, 136, 153], + "lightsteelblue": [176, 196, 222], + "lightyellow": [255, 255, 224], + "lime": [0, 255, 0], + "limegreen": [50, 205, 50], + "linen": [250, 240, 230], + "magenta": [255, 0, 255], + "maroon": [128, 0, 0], + "mediumaquamarine": [102, 205, 170], + "mediumblue": [0, 0, 205], + "mediumorchid": [186, 85, 211], + "mediumpurple": [147, 112, 219], + "mediumseagreen": [60, 179, 113], + "mediumslateblue": [123, 104, 238], + "mediumspringgreen": [0, 250, 154], + "mediumturquoise": [72, 209, 204], + "mediumvioletred": [199, 21, 133], + "midnightblue": [25, 25, 112], + "mintcream": [245, 255, 250], + "mistyrose": [255, 228, 225], + "moccasin": [255, 228, 181], + "navajowhite": [255, 222, 173], + "navy": [0, 0, 128], + "oldlace": [253, 245, 230], + "olive": [128, 128, 0], + "olivedrab": [107, 142, 35], + "orange": [255, 165, 0], + "orangered": [255, 69, 0], + "orchid": [218, 112, 214], + "palegoldenrod": [238, 232, 170], + "palegreen": [152, 251, 152], + "paleturquoise": [175, 238, 238], + "palevioletred": [219, 112, 147], + "papayawhip": [255, 239, 213], + "peachpuff": [255, 218, 185], + "peru": [205, 133, 63], + "pink": [255, 192, 203], + "plum": [221, 160, 221], + "powderblue": [176, 224, 230], + "purple": [128, 0, 128], + "rebeccapurple": [102, 51, 153], + "red": [255, 0, 0], + "rosybrown": [188, 143, 143], + "royalblue": [65, 105, 225], + "saddlebrown": [139, 69, 19], + "salmon": [250, 128, 114], + "sandybrown": [244, 164, 96], + "seagreen": [46, 139, 87], + "seashell": [255, 245, 238], + "sienna": [160, 82, 45], + "silver": [192, 192, 192], + "skyblue": [135, 206, 235], + "slateblue": [106, 90, 205], + "slategray": [112, 128, 144], + "slategrey": [112, 128, 144], + "snow": [255, 250, 250], + "springgreen": [0, 255, 127], + "steelblue": [70, 130, 180], + "tan": [210, 180, 140], + "teal": [0, 128, 128], + "thistle": [216, 191, 216], + "tomato": [255, 99, 71], + "turquoise": [64, 224, 208], + "violet": [238, 130, 238], + "wheat": [245, 222, 179], + "white": [255, 255, 255], + "whitesmoke": [245, 245, 245], + "yellow": [255, 255, 0], + "yellowgreen": [154, 205, 50] +}; + +},{}],7:[function(require,module,exports){ +/** + * @namespace Chart + */ +var Chart = require(29)(); + +Chart.helpers = require(45); + +// @todo dispatch these helpers into appropriated helpers/helpers.* file and write unit tests! +require(27)(Chart); + +Chart.defaults = require(25); +Chart.Element = require(26); +Chart.elements = require(40); +Chart.Interaction = require(28); +Chart.platform = require(48); + +require(31)(Chart); +require(22)(Chart); +require(23)(Chart); +require(24)(Chart); +require(30)(Chart); +require(33)(Chart); +require(32)(Chart); +require(35)(Chart); + +require(54)(Chart); +require(52)(Chart); +require(53)(Chart); +require(55)(Chart); +require(56)(Chart); +require(57)(Chart); + +// Controllers must be loaded after elements +// See Chart.core.datasetController.dataElementType +require(15)(Chart); +require(16)(Chart); +require(17)(Chart); +require(18)(Chart); +require(19)(Chart); +require(20)(Chart); +require(21)(Chart); + +require(8)(Chart); +require(9)(Chart); +require(10)(Chart); +require(11)(Chart); +require(12)(Chart); +require(13)(Chart); +require(14)(Chart); + +// Loading built-it plugins +var plugins = []; + +plugins.push( + require(49)(Chart), + require(50)(Chart), + require(51)(Chart) +); + +Chart.plugins.register(plugins); + +Chart.platform.initialize(); + +module.exports = Chart; +if (typeof window !== 'undefined') { + window.Chart = Chart; +} + +// DEPRECATIONS + +/** + * Provided for backward compatibility, use Chart.helpers.canvas instead. + * @namespace Chart.canvasHelpers + * @deprecated since version 2.6.0 + * @todo remove at version 3 + * @private + */ +Chart.canvasHelpers = Chart.helpers.canvas; + +},{"10":10,"11":11,"12":12,"13":13,"14":14,"15":15,"16":16,"17":17,"18":18,"19":19,"20":20,"21":21,"22":22,"23":23,"24":24,"25":25,"26":26,"27":27,"28":28,"29":29,"30":30,"31":31,"32":32,"33":33,"35":35,"40":40,"45":45,"48":48,"49":49,"50":50,"51":51,"52":52,"53":53,"54":54,"55":55,"56":56,"57":57,"8":8,"9":9}],8:[function(require,module,exports){ +'use strict'; + +module.exports = function(Chart) { + + Chart.Bar = function(context, config) { + config.type = 'bar'; + + return new Chart(context, config); + }; + +}; + +},{}],9:[function(require,module,exports){ +'use strict'; + +module.exports = function(Chart) { + + Chart.Bubble = function(context, config) { + config.type = 'bubble'; + return new Chart(context, config); + }; + +}; + +},{}],10:[function(require,module,exports){ +'use strict'; + +module.exports = function(Chart) { + + Chart.Doughnut = function(context, config) { + config.type = 'doughnut'; + + return new Chart(context, config); + }; + +}; + +},{}],11:[function(require,module,exports){ +'use strict'; + +module.exports = function(Chart) { + + Chart.Line = function(context, config) { + config.type = 'line'; + + return new Chart(context, config); + }; + +}; + +},{}],12:[function(require,module,exports){ +'use strict'; + +module.exports = function(Chart) { + + Chart.PolarArea = function(context, config) { + config.type = 'polarArea'; + + return new Chart(context, config); + }; + +}; + +},{}],13:[function(require,module,exports){ +'use strict'; + +module.exports = function(Chart) { + + Chart.Radar = function(context, config) { + config.type = 'radar'; + + return new Chart(context, config); + }; + +}; + +},{}],14:[function(require,module,exports){ +'use strict'; + +module.exports = function(Chart) { + Chart.Scatter = function(context, config) { + config.type = 'scatter'; + return new Chart(context, config); + }; +}; + +},{}],15:[function(require,module,exports){ +'use strict'; + +var defaults = require(25); +var elements = require(40); +var helpers = require(45); + +defaults._set('bar', { + hover: { + mode: 'label' + }, + + scales: { + xAxes: [{ + type: 'category', + + // Specific to Bar Controller + categoryPercentage: 0.8, + barPercentage: 0.9, + + // offset settings + offset: true, + + // grid line settings + gridLines: { + offsetGridLines: true + } + }], + + yAxes: [{ + type: 'linear' + }] + } +}); + +defaults._set('horizontalBar', { + hover: { + mode: 'index', + axis: 'y' + }, + + scales: { + xAxes: [{ + type: 'linear', + position: 'bottom' + }], + + yAxes: [{ + position: 'left', + type: 'category', + + // Specific to Horizontal Bar Controller + categoryPercentage: 0.8, + barPercentage: 0.9, + + // offset settings + offset: true, + + // grid line settings + gridLines: { + offsetGridLines: true + } + }] + }, + + elements: { + rectangle: { + borderSkipped: 'left' + } + }, + + tooltips: { + callbacks: { + title: function(item, data) { + // Pick first xLabel for now + var title = ''; + + if (item.length > 0) { + if (item[0].yLabel) { + title = item[0].yLabel; + } else if (data.labels.length > 0 && item[0].index < data.labels.length) { + title = data.labels[item[0].index]; + } + } + + return title; + }, + + label: function(item, data) { + var datasetLabel = data.datasets[item.datasetIndex].label || ''; + return datasetLabel + ': ' + item.xLabel; + } + }, + mode: 'index', + axis: 'y' + } +}); + +module.exports = function(Chart) { + + Chart.controllers.bar = Chart.DatasetController.extend({ + + dataElementType: elements.Rectangle, + + initialize: function() { + var me = this; + var meta; + + Chart.DatasetController.prototype.initialize.apply(me, arguments); + + meta = me.getMeta(); + meta.stack = me.getDataset().stack; + meta.bar = true; + }, + + update: function(reset) { + var me = this; + var rects = me.getMeta().data; + var i, ilen; + + me._ruler = me.getRuler(); + + for (i = 0, ilen = rects.length; i < ilen; ++i) { + me.updateElement(rects[i], i, reset); + } + }, + + updateElement: function(rectangle, index, reset) { + var me = this; + var chart = me.chart; + var meta = me.getMeta(); + var dataset = me.getDataset(); + var custom = rectangle.custom || {}; + var rectangleOptions = chart.options.elements.rectangle; + + rectangle._xScale = me.getScaleForId(meta.xAxisID); + rectangle._yScale = me.getScaleForId(meta.yAxisID); + rectangle._datasetIndex = me.index; + rectangle._index = index; + + rectangle._model = { + datasetLabel: dataset.label, + label: chart.data.labels[index], + borderSkipped: custom.borderSkipped ? custom.borderSkipped : rectangleOptions.borderSkipped, + backgroundColor: custom.backgroundColor ? custom.backgroundColor : helpers.valueAtIndexOrDefault(dataset.backgroundColor, index, rectangleOptions.backgroundColor), + borderColor: custom.borderColor ? custom.borderColor : helpers.valueAtIndexOrDefault(dataset.borderColor, index, rectangleOptions.borderColor), + borderWidth: custom.borderWidth ? custom.borderWidth : helpers.valueAtIndexOrDefault(dataset.borderWidth, index, rectangleOptions.borderWidth) + }; + + me.updateElementGeometry(rectangle, index, reset); + + rectangle.pivot(); + }, + + /** + * @private + */ + updateElementGeometry: function(rectangle, index, reset) { + var me = this; + var model = rectangle._model; + var vscale = me.getValueScale(); + var base = vscale.getBasePixel(); + var horizontal = vscale.isHorizontal(); + var ruler = me._ruler || me.getRuler(); + var vpixels = me.calculateBarValuePixels(me.index, index); + var ipixels = me.calculateBarIndexPixels(me.index, index, ruler); + + model.horizontal = horizontal; + model.base = reset ? base : vpixels.base; + model.x = horizontal ? reset ? base : vpixels.head : ipixels.center; + model.y = horizontal ? ipixels.center : reset ? base : vpixels.head; + model.height = horizontal ? ipixels.size : undefined; + model.width = horizontal ? undefined : ipixels.size; + }, + + /** + * @private + */ + getValueScaleId: function() { + return this.getMeta().yAxisID; + }, + + /** + * @private + */ + getIndexScaleId: function() { + return this.getMeta().xAxisID; + }, + + /** + * @private + */ + getValueScale: function() { + return this.getScaleForId(this.getValueScaleId()); + }, + + /** + * @private + */ + getIndexScale: function() { + return this.getScaleForId(this.getIndexScaleId()); + }, + + /** + * Returns the effective number of stacks based on groups and bar visibility. + * @private + */ + getStackCount: function(last) { + var me = this; + var chart = me.chart; + var scale = me.getIndexScale(); + var stacked = scale.options.stacked; + var ilen = last === undefined ? chart.data.datasets.length : last + 1; + var stacks = []; + var i, meta; + + for (i = 0; i < ilen; ++i) { + meta = chart.getDatasetMeta(i); + if (meta.bar && chart.isDatasetVisible(i) && + (stacked === false || + (stacked === true && stacks.indexOf(meta.stack) === -1) || + (stacked === undefined && (meta.stack === undefined || stacks.indexOf(meta.stack) === -1)))) { + stacks.push(meta.stack); + } + } + + return stacks.length; + }, + + /** + * Returns the stack index for the given dataset based on groups and bar visibility. + * @private + */ + getStackIndex: function(datasetIndex) { + return this.getStackCount(datasetIndex) - 1; + }, + + /** + * @private + */ + getRuler: function() { + var me = this; + var scale = me.getIndexScale(); + var stackCount = me.getStackCount(); + var datasetIndex = me.index; + var pixels = []; + var isHorizontal = scale.isHorizontal(); + var start = isHorizontal ? scale.left : scale.top; + var end = start + (isHorizontal ? scale.width : scale.height); + var i, ilen; + + for (i = 0, ilen = me.getMeta().data.length; i < ilen; ++i) { + pixels.push(scale.getPixelForValue(null, i, datasetIndex)); + } + + return { + pixels: pixels, + start: start, + end: end, + stackCount: stackCount, + scale: scale + }; + }, + + /** + * Note: pixel values are not clamped to the scale area. + * @private + */ + calculateBarValuePixels: function(datasetIndex, index) { + var me = this; + var chart = me.chart; + var meta = me.getMeta(); + var scale = me.getValueScale(); + var datasets = chart.data.datasets; + var value = scale.getRightValue(datasets[datasetIndex].data[index]); + var stacked = scale.options.stacked; + var stack = meta.stack; + var start = 0; + var i, imeta, ivalue, base, head, size; + + if (stacked || (stacked === undefined && stack !== undefined)) { + for (i = 0; i < datasetIndex; ++i) { + imeta = chart.getDatasetMeta(i); + + if (imeta.bar && + imeta.stack === stack && + imeta.controller.getValueScaleId() === scale.id && + chart.isDatasetVisible(i)) { + + ivalue = scale.getRightValue(datasets[i].data[index]); + if ((value < 0 && ivalue < 0) || (value >= 0 && ivalue > 0)) { + start += ivalue; + } + } + } + } + + base = scale.getPixelForValue(start); + head = scale.getPixelForValue(start + value); + size = (head - base) / 2; + + return { + size: size, + base: base, + head: head, + center: head + size / 2 + }; + }, + + /** + * @private + */ + calculateBarIndexPixels: function(datasetIndex, index, ruler) { + var me = this; + var options = ruler.scale.options; + var stackIndex = me.getStackIndex(datasetIndex); + var pixels = ruler.pixels; + var base = pixels[index]; + var length = pixels.length; + var start = ruler.start; + var end = ruler.end; + var leftSampleSize, rightSampleSize, leftCategorySize, rightCategorySize, fullBarSize, size; + + if (length === 1) { + leftSampleSize = base > start ? base - start : end - base; + rightSampleSize = base < end ? end - base : base - start; + } else { + if (index > 0) { + leftSampleSize = (base - pixels[index - 1]) / 2; + if (index === length - 1) { + rightSampleSize = leftSampleSize; + } + } + if (index < length - 1) { + rightSampleSize = (pixels[index + 1] - base) / 2; + if (index === 0) { + leftSampleSize = rightSampleSize; + } + } + } + + leftCategorySize = leftSampleSize * options.categoryPercentage; + rightCategorySize = rightSampleSize * options.categoryPercentage; + fullBarSize = (leftCategorySize + rightCategorySize) / ruler.stackCount; + size = fullBarSize * options.barPercentage; + + size = Math.min( + helpers.valueOrDefault(options.barThickness, size), + helpers.valueOrDefault(options.maxBarThickness, Infinity)); + + base -= leftCategorySize; + base += fullBarSize * stackIndex; + base += (fullBarSize - size) / 2; + + return { + size: size, + base: base, + head: base + size, + center: base + size / 2 + }; + }, + + draw: function() { + var me = this; + var chart = me.chart; + var scale = me.getValueScale(); + var rects = me.getMeta().data; + var dataset = me.getDataset(); + var ilen = rects.length; + var i = 0; + + helpers.canvas.clipArea(chart.ctx, chart.chartArea); + + for (; i < ilen; ++i) { + if (!isNaN(scale.getRightValue(dataset.data[i]))) { + rects[i].draw(); + } + } + + helpers.canvas.unclipArea(chart.ctx); + }, + + setHoverStyle: function(rectangle) { + var dataset = this.chart.data.datasets[rectangle._datasetIndex]; + var index = rectangle._index; + var custom = rectangle.custom || {}; + var model = rectangle._model; + + model.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : helpers.valueAtIndexOrDefault(dataset.hoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor)); + model.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : helpers.valueAtIndexOrDefault(dataset.hoverBorderColor, index, helpers.getHoverColor(model.borderColor)); + model.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : helpers.valueAtIndexOrDefault(dataset.hoverBorderWidth, index, model.borderWidth); + }, + + removeHoverStyle: function(rectangle) { + var dataset = this.chart.data.datasets[rectangle._datasetIndex]; + var index = rectangle._index; + var custom = rectangle.custom || {}; + var model = rectangle._model; + var rectangleElementOptions = this.chart.options.elements.rectangle; + + model.backgroundColor = custom.backgroundColor ? custom.backgroundColor : helpers.valueAtIndexOrDefault(dataset.backgroundColor, index, rectangleElementOptions.backgroundColor); + model.borderColor = custom.borderColor ? custom.borderColor : helpers.valueAtIndexOrDefault(dataset.borderColor, index, rectangleElementOptions.borderColor); + model.borderWidth = custom.borderWidth ? custom.borderWidth : helpers.valueAtIndexOrDefault(dataset.borderWidth, index, rectangleElementOptions.borderWidth); + } + }); + + Chart.controllers.horizontalBar = Chart.controllers.bar.extend({ + /** + * @private + */ + getValueScaleId: function() { + return this.getMeta().xAxisID; + }, + + /** + * @private + */ + getIndexScaleId: function() { + return this.getMeta().yAxisID; + } + }); +}; + +},{"25":25,"40":40,"45":45}],16:[function(require,module,exports){ +'use strict'; + +var defaults = require(25); +var elements = require(40); +var helpers = require(45); + +defaults._set('bubble', { + hover: { + mode: 'single' + }, + + scales: { + xAxes: [{ + type: 'linear', // bubble should probably use a linear scale by default + position: 'bottom', + id: 'x-axis-0' // need an ID so datasets can reference the scale + }], + yAxes: [{ + type: 'linear', + position: 'left', + id: 'y-axis-0' + }] + }, + + tooltips: { + callbacks: { + title: function() { + // Title doesn't make sense for scatter since we format the data as a point + return ''; + }, + label: function(item, data) { + var datasetLabel = data.datasets[item.datasetIndex].label || ''; + var dataPoint = data.datasets[item.datasetIndex].data[item.index]; + return datasetLabel + ': (' + item.xLabel + ', ' + item.yLabel + ', ' + dataPoint.r + ')'; + } + } + } +}); + + +module.exports = function(Chart) { + + Chart.controllers.bubble = Chart.DatasetController.extend({ + /** + * @protected + */ + dataElementType: elements.Point, + + /** + * @protected + */ + update: function(reset) { + var me = this; + var meta = me.getMeta(); + var points = meta.data; + + // Update Points + helpers.each(points, function(point, index) { + me.updateElement(point, index, reset); + }); + }, + + /** + * @protected + */ + updateElement: function(point, index, reset) { + var me = this; + var meta = me.getMeta(); + var custom = point.custom || {}; + var xScale = me.getScaleForId(meta.xAxisID); + var yScale = me.getScaleForId(meta.yAxisID); + var options = me._resolveElementOptions(point, index); + var data = me.getDataset().data[index]; + var dsIndex = me.index; + + var x = reset ? xScale.getPixelForDecimal(0.5) : xScale.getPixelForValue(typeof data === 'object' ? data : NaN, index, dsIndex); + var y = reset ? yScale.getBasePixel() : yScale.getPixelForValue(data, index, dsIndex); + + point._xScale = xScale; + point._yScale = yScale; + point._options = options; + point._datasetIndex = dsIndex; + point._index = index; + point._model = { + backgroundColor: options.backgroundColor, + borderColor: options.borderColor, + borderWidth: options.borderWidth, + hitRadius: options.hitRadius, + pointStyle: options.pointStyle, + radius: reset ? 0 : options.radius, + skip: custom.skip || isNaN(x) || isNaN(y), + x: x, + y: y, + }; + + point.pivot(); + }, + + /** + * @protected + */ + setHoverStyle: function(point) { + var model = point._model; + var options = point._options; + + model.backgroundColor = helpers.valueOrDefault(options.hoverBackgroundColor, helpers.getHoverColor(options.backgroundColor)); + model.borderColor = helpers.valueOrDefault(options.hoverBorderColor, helpers.getHoverColor(options.borderColor)); + model.borderWidth = helpers.valueOrDefault(options.hoverBorderWidth, options.borderWidth); + model.radius = options.radius + options.hoverRadius; + }, + + /** + * @protected + */ + removeHoverStyle: function(point) { + var model = point._model; + var options = point._options; + + model.backgroundColor = options.backgroundColor; + model.borderColor = options.borderColor; + model.borderWidth = options.borderWidth; + model.radius = options.radius; + }, + + /** + * @private + */ + _resolveElementOptions: function(point, index) { + var me = this; + var chart = me.chart; + var datasets = chart.data.datasets; + var dataset = datasets[me.index]; + var custom = point.custom || {}; + var options = chart.options.elements.point; + var resolve = helpers.options.resolve; + var data = dataset.data[index]; + var values = {}; + var i, ilen, key; + + // Scriptable options + var context = { + chart: chart, + dataIndex: index, + dataset: dataset, + datasetIndex: me.index + }; + + var keys = [ + 'backgroundColor', + 'borderColor', + 'borderWidth', + 'hoverBackgroundColor', + 'hoverBorderColor', + 'hoverBorderWidth', + 'hoverRadius', + 'hitRadius', + 'pointStyle' + ]; + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve([ + custom[key], + dataset[key], + options[key] + ], context, index); + } + + // Custom radius resolution + values.radius = resolve([ + custom.radius, + data ? data.r : undefined, + dataset.radius, + options.radius + ], context, index); + + return values; + } + }); +}; + +},{"25":25,"40":40,"45":45}],17:[function(require,module,exports){ +'use strict'; + +var defaults = require(25); +var elements = require(40); +var helpers = require(45); + +defaults._set('doughnut', { + animation: { + // Boolean - Whether we animate the rotation of the Doughnut + animateRotate: true, + // Boolean - Whether we animate scaling the Doughnut from the centre + animateScale: false + }, + hover: { + mode: 'single' + }, + legendCallback: function(chart) { + var text = []; + text.push('
      '); + + var data = chart.data; + var datasets = data.datasets; + var labels = data.labels; + + if (datasets.length) { + for (var i = 0; i < datasets[0].data.length; ++i) { + text.push('
    • '); + if (labels[i]) { + text.push(labels[i]); + } + text.push('
    • '); + } + } + + text.push('
    '); + return text.join(''); + }, + legend: { + labels: { + generateLabels: function(chart) { + var data = chart.data; + if (data.labels.length && data.datasets.length) { + return data.labels.map(function(label, i) { + var meta = chart.getDatasetMeta(0); + var ds = data.datasets[0]; + var arc = meta.data[i]; + var custom = arc && arc.custom || {}; + var valueAtIndexOrDefault = helpers.valueAtIndexOrDefault; + var arcOpts = chart.options.elements.arc; + var fill = custom.backgroundColor ? custom.backgroundColor : valueAtIndexOrDefault(ds.backgroundColor, i, arcOpts.backgroundColor); + var stroke = custom.borderColor ? custom.borderColor : valueAtIndexOrDefault(ds.borderColor, i, arcOpts.borderColor); + var bw = custom.borderWidth ? custom.borderWidth : valueAtIndexOrDefault(ds.borderWidth, i, arcOpts.borderWidth); + + return { + text: label, + fillStyle: fill, + strokeStyle: stroke, + lineWidth: bw, + hidden: isNaN(ds.data[i]) || meta.data[i].hidden, + + // Extra data used for toggling the correct item + index: i + }; + }); + } + return []; + } + }, + + onClick: function(e, legendItem) { + var index = legendItem.index; + var chart = this.chart; + var i, ilen, meta; + + for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) { + meta = chart.getDatasetMeta(i); + // toggle visibility of index if exists + if (meta.data[index]) { + meta.data[index].hidden = !meta.data[index].hidden; + } + } + + chart.update(); + } + }, + + // The percentage of the chart that we cut out of the middle. + cutoutPercentage: 50, + + // The rotation of the chart, where the first data arc begins. + rotation: Math.PI * -0.5, + + // The total circumference of the chart. + circumference: Math.PI * 2.0, + + // Need to override these to give a nice default + tooltips: { + callbacks: { + title: function() { + return ''; + }, + label: function(tooltipItem, data) { + var dataLabel = data.labels[tooltipItem.index]; + var value = ': ' + data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index]; + + if (helpers.isArray(dataLabel)) { + // show value on first line of multiline label + // need to clone because we are changing the value + dataLabel = dataLabel.slice(); + dataLabel[0] += value; + } else { + dataLabel += value; + } + + return dataLabel; + } + } + } +}); + +defaults._set('pie', helpers.clone(defaults.doughnut)); +defaults._set('pie', { + cutoutPercentage: 0 +}); + +module.exports = function(Chart) { + + Chart.controllers.doughnut = Chart.controllers.pie = Chart.DatasetController.extend({ + + dataElementType: elements.Arc, + + linkScales: helpers.noop, + + // Get index of the dataset in relation to the visible datasets. This allows determining the inner and outer radius correctly + getRingIndex: function(datasetIndex) { + var ringIndex = 0; + + for (var j = 0; j < datasetIndex; ++j) { + if (this.chart.isDatasetVisible(j)) { + ++ringIndex; + } + } + + return ringIndex; + }, + + update: function(reset) { + var me = this; + var chart = me.chart; + var chartArea = chart.chartArea; + var opts = chart.options; + var arcOpts = opts.elements.arc; + var availableWidth = chartArea.right - chartArea.left - arcOpts.borderWidth; + var availableHeight = chartArea.bottom - chartArea.top - arcOpts.borderWidth; + var minSize = Math.min(availableWidth, availableHeight); + var offset = {x: 0, y: 0}; + var meta = me.getMeta(); + var cutoutPercentage = opts.cutoutPercentage; + var circumference = opts.circumference; + + // If the chart's circumference isn't a full circle, calculate minSize as a ratio of the width/height of the arc + if (circumference < Math.PI * 2.0) { + var startAngle = opts.rotation % (Math.PI * 2.0); + startAngle += Math.PI * 2.0 * (startAngle >= Math.PI ? -1 : startAngle < -Math.PI ? 1 : 0); + var endAngle = startAngle + circumference; + var start = {x: Math.cos(startAngle), y: Math.sin(startAngle)}; + var end = {x: Math.cos(endAngle), y: Math.sin(endAngle)}; + var contains0 = (startAngle <= 0 && endAngle >= 0) || (startAngle <= Math.PI * 2.0 && Math.PI * 2.0 <= endAngle); + var contains90 = (startAngle <= Math.PI * 0.5 && Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 2.5 && Math.PI * 2.5 <= endAngle); + var contains180 = (startAngle <= -Math.PI && -Math.PI <= endAngle) || (startAngle <= Math.PI && Math.PI <= endAngle); + var contains270 = (startAngle <= -Math.PI * 0.5 && -Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 1.5 && Math.PI * 1.5 <= endAngle); + var cutout = cutoutPercentage / 100.0; + var min = {x: contains180 ? -1 : Math.min(start.x * (start.x < 0 ? 1 : cutout), end.x * (end.x < 0 ? 1 : cutout)), y: contains270 ? -1 : Math.min(start.y * (start.y < 0 ? 1 : cutout), end.y * (end.y < 0 ? 1 : cutout))}; + var max = {x: contains0 ? 1 : Math.max(start.x * (start.x > 0 ? 1 : cutout), end.x * (end.x > 0 ? 1 : cutout)), y: contains90 ? 1 : Math.max(start.y * (start.y > 0 ? 1 : cutout), end.y * (end.y > 0 ? 1 : cutout))}; + var size = {width: (max.x - min.x) * 0.5, height: (max.y - min.y) * 0.5}; + minSize = Math.min(availableWidth / size.width, availableHeight / size.height); + offset = {x: (max.x + min.x) * -0.5, y: (max.y + min.y) * -0.5}; + } + + chart.borderWidth = me.getMaxBorderWidth(meta.data); + chart.outerRadius = Math.max((minSize - chart.borderWidth) / 2, 0); + chart.innerRadius = Math.max(cutoutPercentage ? (chart.outerRadius / 100) * (cutoutPercentage) : 0, 0); + chart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount(); + chart.offsetX = offset.x * chart.outerRadius; + chart.offsetY = offset.y * chart.outerRadius; + + meta.total = me.calculateTotal(); + + me.outerRadius = chart.outerRadius - (chart.radiusLength * me.getRingIndex(me.index)); + me.innerRadius = Math.max(me.outerRadius - chart.radiusLength, 0); + + helpers.each(meta.data, function(arc, index) { + me.updateElement(arc, index, reset); + }); + }, + + updateElement: function(arc, index, reset) { + var me = this; + var chart = me.chart; + var chartArea = chart.chartArea; + var opts = chart.options; + var animationOpts = opts.animation; + var centerX = (chartArea.left + chartArea.right) / 2; + var centerY = (chartArea.top + chartArea.bottom) / 2; + var startAngle = opts.rotation; // non reset case handled later + var endAngle = opts.rotation; // non reset case handled later + var dataset = me.getDataset(); + var circumference = reset && animationOpts.animateRotate ? 0 : arc.hidden ? 0 : me.calculateCircumference(dataset.data[index]) * (opts.circumference / (2.0 * Math.PI)); + var innerRadius = reset && animationOpts.animateScale ? 0 : me.innerRadius; + var outerRadius = reset && animationOpts.animateScale ? 0 : me.outerRadius; + var valueAtIndexOrDefault = helpers.valueAtIndexOrDefault; + + helpers.extend(arc, { + // Utility + _datasetIndex: me.index, + _index: index, + + // Desired view properties + _model: { + x: centerX + chart.offsetX, + y: centerY + chart.offsetY, + startAngle: startAngle, + endAngle: endAngle, + circumference: circumference, + outerRadius: outerRadius, + innerRadius: innerRadius, + label: valueAtIndexOrDefault(dataset.label, index, chart.data.labels[index]) + } + }); + + var model = arc._model; + // Resets the visual styles + this.removeHoverStyle(arc); + + // Set correct angles if not resetting + if (!reset || !animationOpts.animateRotate) { + if (index === 0) { + model.startAngle = opts.rotation; + } else { + model.startAngle = me.getMeta().data[index - 1]._model.endAngle; + } + + model.endAngle = model.startAngle + model.circumference; + } + + arc.pivot(); + }, + + removeHoverStyle: function(arc) { + Chart.DatasetController.prototype.removeHoverStyle.call(this, arc, this.chart.options.elements.arc); + }, + + calculateTotal: function() { + var dataset = this.getDataset(); + var meta = this.getMeta(); + var total = 0; + var value; + + helpers.each(meta.data, function(element, index) { + value = dataset.data[index]; + if (!isNaN(value) && !element.hidden) { + total += Math.abs(value); + } + }); + + /* if (total === 0) { + total = NaN; + }*/ + + return total; + }, + + calculateCircumference: function(value) { + var total = this.getMeta().total; + if (total > 0 && !isNaN(value)) { + return (Math.PI * 2.0) * (value / total); + } + return 0; + }, + + // gets the max border or hover width to properly scale pie charts + getMaxBorderWidth: function(arcs) { + var max = 0; + var index = this.index; + var length = arcs.length; + var borderWidth; + var hoverWidth; + + for (var i = 0; i < length; i++) { + borderWidth = arcs[i]._model ? arcs[i]._model.borderWidth : 0; + hoverWidth = arcs[i]._chart ? arcs[i]._chart.config.data.datasets[index].hoverBorderWidth : 0; + + max = borderWidth > max ? borderWidth : max; + max = hoverWidth > max ? hoverWidth : max; + } + return max; + } + }); +}; + +},{"25":25,"40":40,"45":45}],18:[function(require,module,exports){ +'use strict'; + +var defaults = require(25); +var elements = require(40); +var helpers = require(45); + +defaults._set('line', { + showLines: true, + spanGaps: false, + + hover: { + mode: 'label' + }, + + scales: { + xAxes: [{ + type: 'category', + id: 'x-axis-0' + }], + yAxes: [{ + type: 'linear', + id: 'y-axis-0' + }] + } +}); + +module.exports = function(Chart) { + + function lineEnabled(dataset, options) { + return helpers.valueOrDefault(dataset.showLine, options.showLines); + } + + Chart.controllers.line = Chart.DatasetController.extend({ + + datasetElementType: elements.Line, + + dataElementType: elements.Point, + + update: function(reset) { + var me = this; + var meta = me.getMeta(); + var line = meta.dataset; + var points = meta.data || []; + var options = me.chart.options; + var lineElementOptions = options.elements.line; + var scale = me.getScaleForId(meta.yAxisID); + var i, ilen, custom; + var dataset = me.getDataset(); + var showLine = lineEnabled(dataset, options); + + // Update Line + if (showLine) { + custom = line.custom || {}; + + // Compatibility: If the properties are defined with only the old name, use those values + if ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) { + dataset.lineTension = dataset.tension; + } + + // Utility + line._scale = scale; + line._datasetIndex = me.index; + // Data + line._children = points; + // Model + line._model = { + // Appearance + // The default behavior of lines is to break at null values, according + // to https://github.com/chartjs/Chart.js/issues/2435#issuecomment-216718158 + // This option gives lines the ability to span gaps + spanGaps: dataset.spanGaps ? dataset.spanGaps : options.spanGaps, + tension: custom.tension ? custom.tension : helpers.valueOrDefault(dataset.lineTension, lineElementOptions.tension), + backgroundColor: custom.backgroundColor ? custom.backgroundColor : (dataset.backgroundColor || lineElementOptions.backgroundColor), + borderWidth: custom.borderWidth ? custom.borderWidth : (dataset.borderWidth || lineElementOptions.borderWidth), + borderColor: custom.borderColor ? custom.borderColor : (dataset.borderColor || lineElementOptions.borderColor), + borderCapStyle: custom.borderCapStyle ? custom.borderCapStyle : (dataset.borderCapStyle || lineElementOptions.borderCapStyle), + borderDash: custom.borderDash ? custom.borderDash : (dataset.borderDash || lineElementOptions.borderDash), + borderDashOffset: custom.borderDashOffset ? custom.borderDashOffset : (dataset.borderDashOffset || lineElementOptions.borderDashOffset), + borderJoinStyle: custom.borderJoinStyle ? custom.borderJoinStyle : (dataset.borderJoinStyle || lineElementOptions.borderJoinStyle), + fill: custom.fill ? custom.fill : (dataset.fill !== undefined ? dataset.fill : lineElementOptions.fill), + steppedLine: custom.steppedLine ? custom.steppedLine : helpers.valueOrDefault(dataset.steppedLine, lineElementOptions.stepped), + cubicInterpolationMode: custom.cubicInterpolationMode ? custom.cubicInterpolationMode : helpers.valueOrDefault(dataset.cubicInterpolationMode, lineElementOptions.cubicInterpolationMode), + }; + + line.pivot(); + } + + // Update Points + for (i = 0, ilen = points.length; i < ilen; ++i) { + me.updateElement(points[i], i, reset); + } + + if (showLine && line._model.tension !== 0) { + me.updateBezierControlPoints(); + } + + // Now pivot the point for animation + for (i = 0, ilen = points.length; i < ilen; ++i) { + points[i].pivot(); + } + }, + + getPointBackgroundColor: function(point, index) { + var backgroundColor = this.chart.options.elements.point.backgroundColor; + var dataset = this.getDataset(); + var custom = point.custom || {}; + + if (custom.backgroundColor) { + backgroundColor = custom.backgroundColor; + } else if (dataset.pointBackgroundColor) { + backgroundColor = helpers.valueAtIndexOrDefault(dataset.pointBackgroundColor, index, backgroundColor); + } else if (dataset.backgroundColor) { + backgroundColor = dataset.backgroundColor; + } + + return backgroundColor; + }, + + getPointBorderColor: function(point, index) { + var borderColor = this.chart.options.elements.point.borderColor; + var dataset = this.getDataset(); + var custom = point.custom || {}; + + if (custom.borderColor) { + borderColor = custom.borderColor; + } else if (dataset.pointBorderColor) { + borderColor = helpers.valueAtIndexOrDefault(dataset.pointBorderColor, index, borderColor); + } else if (dataset.borderColor) { + borderColor = dataset.borderColor; + } + + return borderColor; + }, + + getPointBorderWidth: function(point, index) { + var borderWidth = this.chart.options.elements.point.borderWidth; + var dataset = this.getDataset(); + var custom = point.custom || {}; + + if (!isNaN(custom.borderWidth)) { + borderWidth = custom.borderWidth; + } else if (!isNaN(dataset.pointBorderWidth) || helpers.isArray(dataset.pointBorderWidth)) { + borderWidth = helpers.valueAtIndexOrDefault(dataset.pointBorderWidth, index, borderWidth); + } else if (!isNaN(dataset.borderWidth)) { + borderWidth = dataset.borderWidth; + } + + return borderWidth; + }, + + updateElement: function(point, index, reset) { + var me = this; + var meta = me.getMeta(); + var custom = point.custom || {}; + var dataset = me.getDataset(); + var datasetIndex = me.index; + var value = dataset.data[index]; + var yScale = me.getScaleForId(meta.yAxisID); + var xScale = me.getScaleForId(meta.xAxisID); + var pointOptions = me.chart.options.elements.point; + var x, y; + + // Compatibility: If the properties are defined with only the old name, use those values + if ((dataset.radius !== undefined) && (dataset.pointRadius === undefined)) { + dataset.pointRadius = dataset.radius; + } + if ((dataset.hitRadius !== undefined) && (dataset.pointHitRadius === undefined)) { + dataset.pointHitRadius = dataset.hitRadius; + } + + x = xScale.getPixelForValue(typeof value === 'object' ? value : NaN, index, datasetIndex); + y = reset ? yScale.getBasePixel() : me.calculatePointY(value, index, datasetIndex); + + // Utility + point._xScale = xScale; + point._yScale = yScale; + point._datasetIndex = datasetIndex; + point._index = index; + + // Desired view properties + point._model = { + x: x, + y: y, + skip: custom.skip || isNaN(x) || isNaN(y), + // Appearance + radius: custom.radius || helpers.valueAtIndexOrDefault(dataset.pointRadius, index, pointOptions.radius), + pointStyle: custom.pointStyle || helpers.valueAtIndexOrDefault(dataset.pointStyle, index, pointOptions.pointStyle), + backgroundColor: me.getPointBackgroundColor(point, index), + borderColor: me.getPointBorderColor(point, index), + borderWidth: me.getPointBorderWidth(point, index), + tension: meta.dataset._model ? meta.dataset._model.tension : 0, + steppedLine: meta.dataset._model ? meta.dataset._model.steppedLine : false, + // Tooltip + hitRadius: custom.hitRadius || helpers.valueAtIndexOrDefault(dataset.pointHitRadius, index, pointOptions.hitRadius) + }; + }, + + calculatePointY: function(value, index, datasetIndex) { + var me = this; + var chart = me.chart; + var meta = me.getMeta(); + var yScale = me.getScaleForId(meta.yAxisID); + var sumPos = 0; + var sumNeg = 0; + var i, ds, dsMeta; + + if (yScale.options.stacked) { + for (i = 0; i < datasetIndex; i++) { + ds = chart.data.datasets[i]; + dsMeta = chart.getDatasetMeta(i); + if (dsMeta.type === 'line' && dsMeta.yAxisID === yScale.id && chart.isDatasetVisible(i)) { + var stackedRightValue = Number(yScale.getRightValue(ds.data[index])); + if (stackedRightValue < 0) { + sumNeg += stackedRightValue || 0; + } else { + sumPos += stackedRightValue || 0; + } + } + } + + var rightValue = Number(yScale.getRightValue(value)); + if (rightValue < 0) { + return yScale.getPixelForValue(sumNeg + rightValue); + } + return yScale.getPixelForValue(sumPos + rightValue); + } + + return yScale.getPixelForValue(value); + }, + + updateBezierControlPoints: function() { + var me = this; + var meta = me.getMeta(); + var area = me.chart.chartArea; + var points = (meta.data || []); + var i, ilen, point, model, controlPoints; + + // Only consider points that are drawn in case the spanGaps option is used + if (meta.dataset._model.spanGaps) { + points = points.filter(function(pt) { + return !pt._model.skip; + }); + } + + function capControlPoint(pt, min, max) { + return Math.max(Math.min(pt, max), min); + } + + if (meta.dataset._model.cubicInterpolationMode === 'monotone') { + helpers.splineCurveMonotone(points); + } else { + for (i = 0, ilen = points.length; i < ilen; ++i) { + point = points[i]; + model = point._model; + controlPoints = helpers.splineCurve( + helpers.previousItem(points, i)._model, + model, + helpers.nextItem(points, i)._model, + meta.dataset._model.tension + ); + model.controlPointPreviousX = controlPoints.previous.x; + model.controlPointPreviousY = controlPoints.previous.y; + model.controlPointNextX = controlPoints.next.x; + model.controlPointNextY = controlPoints.next.y; + } + } + + if (me.chart.options.elements.line.capBezierPoints) { + for (i = 0, ilen = points.length; i < ilen; ++i) { + model = points[i]._model; + model.controlPointPreviousX = capControlPoint(model.controlPointPreviousX, area.left, area.right); + model.controlPointPreviousY = capControlPoint(model.controlPointPreviousY, area.top, area.bottom); + model.controlPointNextX = capControlPoint(model.controlPointNextX, area.left, area.right); + model.controlPointNextY = capControlPoint(model.controlPointNextY, area.top, area.bottom); + } + } + }, + + draw: function() { + var me = this; + var chart = me.chart; + var meta = me.getMeta(); + var points = meta.data || []; + var area = chart.chartArea; + var ilen = points.length; + var i = 0; + + helpers.canvas.clipArea(chart.ctx, area); + + if (lineEnabled(me.getDataset(), chart.options)) { + meta.dataset.draw(); + } + + helpers.canvas.unclipArea(chart.ctx); + + // Draw the points + for (; i < ilen; ++i) { + points[i].draw(area); + } + }, + + setHoverStyle: function(point) { + // Point + var dataset = this.chart.data.datasets[point._datasetIndex]; + var index = point._index; + var custom = point.custom || {}; + var model = point._model; + + model.radius = custom.hoverRadius || helpers.valueAtIndexOrDefault(dataset.pointHoverRadius, index, this.chart.options.elements.point.hoverRadius); + model.backgroundColor = custom.hoverBackgroundColor || helpers.valueAtIndexOrDefault(dataset.pointHoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor)); + model.borderColor = custom.hoverBorderColor || helpers.valueAtIndexOrDefault(dataset.pointHoverBorderColor, index, helpers.getHoverColor(model.borderColor)); + model.borderWidth = custom.hoverBorderWidth || helpers.valueAtIndexOrDefault(dataset.pointHoverBorderWidth, index, model.borderWidth); + }, + + removeHoverStyle: function(point) { + var me = this; + var dataset = me.chart.data.datasets[point._datasetIndex]; + var index = point._index; + var custom = point.custom || {}; + var model = point._model; + + // Compatibility: If the properties are defined with only the old name, use those values + if ((dataset.radius !== undefined) && (dataset.pointRadius === undefined)) { + dataset.pointRadius = dataset.radius; + } + + model.radius = custom.radius || helpers.valueAtIndexOrDefault(dataset.pointRadius, index, me.chart.options.elements.point.radius); + model.backgroundColor = me.getPointBackgroundColor(point, index); + model.borderColor = me.getPointBorderColor(point, index); + model.borderWidth = me.getPointBorderWidth(point, index); + } + }); +}; + +},{"25":25,"40":40,"45":45}],19:[function(require,module,exports){ +'use strict'; + +var defaults = require(25); +var elements = require(40); +var helpers = require(45); + +defaults._set('polarArea', { + scale: { + type: 'radialLinear', + angleLines: { + display: false + }, + gridLines: { + circular: true + }, + pointLabels: { + display: false + }, + ticks: { + beginAtZero: true + } + }, + + // Boolean - Whether to animate the rotation of the chart + animation: { + animateRotate: true, + animateScale: true + }, + + startAngle: -0.5 * Math.PI, + legendCallback: function(chart) { + var text = []; + text.push('
      '); + + var data = chart.data; + var datasets = data.datasets; + var labels = data.labels; + + if (datasets.length) { + for (var i = 0; i < datasets[0].data.length; ++i) { + text.push('
    • '); + if (labels[i]) { + text.push(labels[i]); + } + text.push('
    • '); + } + } + + text.push('
    '); + return text.join(''); + }, + legend: { + labels: { + generateLabels: function(chart) { + var data = chart.data; + if (data.labels.length && data.datasets.length) { + return data.labels.map(function(label, i) { + var meta = chart.getDatasetMeta(0); + var ds = data.datasets[0]; + var arc = meta.data[i]; + var custom = arc.custom || {}; + var valueAtIndexOrDefault = helpers.valueAtIndexOrDefault; + var arcOpts = chart.options.elements.arc; + var fill = custom.backgroundColor ? custom.backgroundColor : valueAtIndexOrDefault(ds.backgroundColor, i, arcOpts.backgroundColor); + var stroke = custom.borderColor ? custom.borderColor : valueAtIndexOrDefault(ds.borderColor, i, arcOpts.borderColor); + var bw = custom.borderWidth ? custom.borderWidth : valueAtIndexOrDefault(ds.borderWidth, i, arcOpts.borderWidth); + + return { + text: label, + fillStyle: fill, + strokeStyle: stroke, + lineWidth: bw, + hidden: isNaN(ds.data[i]) || meta.data[i].hidden, + + // Extra data used for toggling the correct item + index: i + }; + }); + } + return []; + } + }, + + onClick: function(e, legendItem) { + var index = legendItem.index; + var chart = this.chart; + var i, ilen, meta; + + for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) { + meta = chart.getDatasetMeta(i); + meta.data[index].hidden = !meta.data[index].hidden; + } + + chart.update(); + } + }, + + // Need to override these to give a nice default + tooltips: { + callbacks: { + title: function() { + return ''; + }, + label: function(item, data) { + return data.labels[item.index] + ': ' + item.yLabel; + } + } + } +}); + +module.exports = function(Chart) { + + Chart.controllers.polarArea = Chart.DatasetController.extend({ + + dataElementType: elements.Arc, + + linkScales: helpers.noop, + + update: function(reset) { + var me = this; + var chart = me.chart; + var chartArea = chart.chartArea; + var meta = me.getMeta(); + var opts = chart.options; + var arcOpts = opts.elements.arc; + var minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top); + chart.outerRadius = Math.max((minSize - arcOpts.borderWidth / 2) / 2, 0); + chart.innerRadius = Math.max(opts.cutoutPercentage ? (chart.outerRadius / 100) * (opts.cutoutPercentage) : 1, 0); + chart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount(); + + me.outerRadius = chart.outerRadius - (chart.radiusLength * me.index); + me.innerRadius = me.outerRadius - chart.radiusLength; + + meta.count = me.countVisibleElements(); + + helpers.each(meta.data, function(arc, index) { + me.updateElement(arc, index, reset); + }); + }, + + updateElement: function(arc, index, reset) { + var me = this; + var chart = me.chart; + var dataset = me.getDataset(); + var opts = chart.options; + var animationOpts = opts.animation; + var scale = chart.scale; + var labels = chart.data.labels; + + var circumference = me.calculateCircumference(dataset.data[index]); + var centerX = scale.xCenter; + var centerY = scale.yCenter; + + // If there is NaN data before us, we need to calculate the starting angle correctly. + // We could be way more efficient here, but its unlikely that the polar area chart will have a lot of data + var visibleCount = 0; + var meta = me.getMeta(); + for (var i = 0; i < index; ++i) { + if (!isNaN(dataset.data[i]) && !meta.data[i].hidden) { + ++visibleCount; + } + } + + // var negHalfPI = -0.5 * Math.PI; + var datasetStartAngle = opts.startAngle; + var distance = arc.hidden ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]); + var startAngle = datasetStartAngle + (circumference * visibleCount); + var endAngle = startAngle + (arc.hidden ? 0 : circumference); + + var resetRadius = animationOpts.animateScale ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]); + + helpers.extend(arc, { + // Utility + _datasetIndex: me.index, + _index: index, + _scale: scale, + + // Desired view properties + _model: { + x: centerX, + y: centerY, + innerRadius: 0, + outerRadius: reset ? resetRadius : distance, + startAngle: reset && animationOpts.animateRotate ? datasetStartAngle : startAngle, + endAngle: reset && animationOpts.animateRotate ? datasetStartAngle : endAngle, + label: helpers.valueAtIndexOrDefault(labels, index, labels[index]) + } + }); + + // Apply border and fill style + me.removeHoverStyle(arc); + + arc.pivot(); + }, + + removeHoverStyle: function(arc) { + Chart.DatasetController.prototype.removeHoverStyle.call(this, arc, this.chart.options.elements.arc); + }, + + countVisibleElements: function() { + var dataset = this.getDataset(); + var meta = this.getMeta(); + var count = 0; + + helpers.each(meta.data, function(element, index) { + if (!isNaN(dataset.data[index]) && !element.hidden) { + count++; + } + }); + + return count; + }, + + calculateCircumference: function(value) { + var count = this.getMeta().count; + if (count > 0 && !isNaN(value)) { + return (2 * Math.PI) / count; + } + return 0; + } + }); +}; + +},{"25":25,"40":40,"45":45}],20:[function(require,module,exports){ +'use strict'; + +var defaults = require(25); +var elements = require(40); +var helpers = require(45); + +defaults._set('radar', { + scale: { + type: 'radialLinear' + }, + elements: { + line: { + tension: 0 // no bezier in radar + } + } +}); + +module.exports = function(Chart) { + + Chart.controllers.radar = Chart.DatasetController.extend({ + + datasetElementType: elements.Line, + + dataElementType: elements.Point, + + linkScales: helpers.noop, + + update: function(reset) { + var me = this; + var meta = me.getMeta(); + var line = meta.dataset; + var points = meta.data; + var custom = line.custom || {}; + var dataset = me.getDataset(); + var lineElementOptions = me.chart.options.elements.line; + var scale = me.chart.scale; + + // Compatibility: If the properties are defined with only the old name, use those values + if ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) { + dataset.lineTension = dataset.tension; + } + + helpers.extend(meta.dataset, { + // Utility + _datasetIndex: me.index, + _scale: scale, + // Data + _children: points, + _loop: true, + // Model + _model: { + // Appearance + tension: custom.tension ? custom.tension : helpers.valueOrDefault(dataset.lineTension, lineElementOptions.tension), + backgroundColor: custom.backgroundColor ? custom.backgroundColor : (dataset.backgroundColor || lineElementOptions.backgroundColor), + borderWidth: custom.borderWidth ? custom.borderWidth : (dataset.borderWidth || lineElementOptions.borderWidth), + borderColor: custom.borderColor ? custom.borderColor : (dataset.borderColor || lineElementOptions.borderColor), + fill: custom.fill ? custom.fill : (dataset.fill !== undefined ? dataset.fill : lineElementOptions.fill), + borderCapStyle: custom.borderCapStyle ? custom.borderCapStyle : (dataset.borderCapStyle || lineElementOptions.borderCapStyle), + borderDash: custom.borderDash ? custom.borderDash : (dataset.borderDash || lineElementOptions.borderDash), + borderDashOffset: custom.borderDashOffset ? custom.borderDashOffset : (dataset.borderDashOffset || lineElementOptions.borderDashOffset), + borderJoinStyle: custom.borderJoinStyle ? custom.borderJoinStyle : (dataset.borderJoinStyle || lineElementOptions.borderJoinStyle), + } + }); + + meta.dataset.pivot(); + + // Update Points + helpers.each(points, function(point, index) { + me.updateElement(point, index, reset); + }, me); + + // Update bezier control points + me.updateBezierControlPoints(); + }, + updateElement: function(point, index, reset) { + var me = this; + var custom = point.custom || {}; + var dataset = me.getDataset(); + var scale = me.chart.scale; + var pointElementOptions = me.chart.options.elements.point; + var pointPosition = scale.getPointPositionForValue(index, dataset.data[index]); + + // Compatibility: If the properties are defined with only the old name, use those values + if ((dataset.radius !== undefined) && (dataset.pointRadius === undefined)) { + dataset.pointRadius = dataset.radius; + } + if ((dataset.hitRadius !== undefined) && (dataset.pointHitRadius === undefined)) { + dataset.pointHitRadius = dataset.hitRadius; + } + + helpers.extend(point, { + // Utility + _datasetIndex: me.index, + _index: index, + _scale: scale, + + // Desired view properties + _model: { + x: reset ? scale.xCenter : pointPosition.x, // value not used in dataset scale, but we want a consistent API between scales + y: reset ? scale.yCenter : pointPosition.y, + + // Appearance + tension: custom.tension ? custom.tension : helpers.valueOrDefault(dataset.lineTension, me.chart.options.elements.line.tension), + radius: custom.radius ? custom.radius : helpers.valueAtIndexOrDefault(dataset.pointRadius, index, pointElementOptions.radius), + backgroundColor: custom.backgroundColor ? custom.backgroundColor : helpers.valueAtIndexOrDefault(dataset.pointBackgroundColor, index, pointElementOptions.backgroundColor), + borderColor: custom.borderColor ? custom.borderColor : helpers.valueAtIndexOrDefault(dataset.pointBorderColor, index, pointElementOptions.borderColor), + borderWidth: custom.borderWidth ? custom.borderWidth : helpers.valueAtIndexOrDefault(dataset.pointBorderWidth, index, pointElementOptions.borderWidth), + pointStyle: custom.pointStyle ? custom.pointStyle : helpers.valueAtIndexOrDefault(dataset.pointStyle, index, pointElementOptions.pointStyle), + + // Tooltip + hitRadius: custom.hitRadius ? custom.hitRadius : helpers.valueAtIndexOrDefault(dataset.pointHitRadius, index, pointElementOptions.hitRadius) + } + }); + + point._model.skip = custom.skip ? custom.skip : (isNaN(point._model.x) || isNaN(point._model.y)); + }, + updateBezierControlPoints: function() { + var chartArea = this.chart.chartArea; + var meta = this.getMeta(); + + helpers.each(meta.data, function(point, index) { + var model = point._model; + var controlPoints = helpers.splineCurve( + helpers.previousItem(meta.data, index, true)._model, + model, + helpers.nextItem(meta.data, index, true)._model, + model.tension + ); + + // Prevent the bezier going outside of the bounds of the graph + model.controlPointPreviousX = Math.max(Math.min(controlPoints.previous.x, chartArea.right), chartArea.left); + model.controlPointPreviousY = Math.max(Math.min(controlPoints.previous.y, chartArea.bottom), chartArea.top); + + model.controlPointNextX = Math.max(Math.min(controlPoints.next.x, chartArea.right), chartArea.left); + model.controlPointNextY = Math.max(Math.min(controlPoints.next.y, chartArea.bottom), chartArea.top); + + // Now pivot the point for animation + point.pivot(); + }); + }, + + setHoverStyle: function(point) { + // Point + var dataset = this.chart.data.datasets[point._datasetIndex]; + var custom = point.custom || {}; + var index = point._index; + var model = point._model; + + model.radius = custom.hoverRadius ? custom.hoverRadius : helpers.valueAtIndexOrDefault(dataset.pointHoverRadius, index, this.chart.options.elements.point.hoverRadius); + model.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : helpers.valueAtIndexOrDefault(dataset.pointHoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor)); + model.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : helpers.valueAtIndexOrDefault(dataset.pointHoverBorderColor, index, helpers.getHoverColor(model.borderColor)); + model.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : helpers.valueAtIndexOrDefault(dataset.pointHoverBorderWidth, index, model.borderWidth); + }, + + removeHoverStyle: function(point) { + var dataset = this.chart.data.datasets[point._datasetIndex]; + var custom = point.custom || {}; + var index = point._index; + var model = point._model; + var pointElementOptions = this.chart.options.elements.point; + + model.radius = custom.radius ? custom.radius : helpers.valueAtIndexOrDefault(dataset.pointRadius, index, pointElementOptions.radius); + model.backgroundColor = custom.backgroundColor ? custom.backgroundColor : helpers.valueAtIndexOrDefault(dataset.pointBackgroundColor, index, pointElementOptions.backgroundColor); + model.borderColor = custom.borderColor ? custom.borderColor : helpers.valueAtIndexOrDefault(dataset.pointBorderColor, index, pointElementOptions.borderColor); + model.borderWidth = custom.borderWidth ? custom.borderWidth : helpers.valueAtIndexOrDefault(dataset.pointBorderWidth, index, pointElementOptions.borderWidth); + } + }); +}; + +},{"25":25,"40":40,"45":45}],21:[function(require,module,exports){ +'use strict'; + +var defaults = require(25); + +defaults._set('scatter', { + hover: { + mode: 'single' + }, + + scales: { + xAxes: [{ + id: 'x-axis-1', // need an ID so datasets can reference the scale + type: 'linear', // scatter should not use a category axis + position: 'bottom' + }], + yAxes: [{ + id: 'y-axis-1', + type: 'linear', + position: 'left' + }] + }, + + showLines: false, + + tooltips: { + callbacks: { + title: function() { + return ''; // doesn't make sense for scatter since data are formatted as a point + }, + label: function(item) { + return '(' + item.xLabel + ', ' + item.yLabel + ')'; + } + } + } +}); + +module.exports = function(Chart) { + + // Scatter charts use line controllers + Chart.controllers.scatter = Chart.controllers.line; + +}; + +},{"25":25}],22:[function(require,module,exports){ +/* global window: false */ +'use strict'; + +var defaults = require(25); +var Element = require(26); +var helpers = require(45); + +defaults._set('global', { + animation: { + duration: 1000, + easing: 'easeOutQuart', + onProgress: helpers.noop, + onComplete: helpers.noop + } +}); + +module.exports = function(Chart) { + + Chart.Animation = Element.extend({ + chart: null, // the animation associated chart instance + currentStep: 0, // the current animation step + numSteps: 60, // default number of steps + easing: '', // the easing to use for this animation + render: null, // render function used by the animation service + + onAnimationProgress: null, // user specified callback to fire on each step of the animation + onAnimationComplete: null, // user specified callback to fire when the animation finishes + }); + + Chart.animationService = { + frameDuration: 17, + animations: [], + dropFrames: 0, + request: null, + + /** + * @param {Chart} chart - The chart to animate. + * @param {Chart.Animation} animation - The animation that we will animate. + * @param {Number} duration - The animation duration in ms. + * @param {Boolean} lazy - if true, the chart is not marked as animating to enable more responsive interactions + */ + addAnimation: function(chart, animation, duration, lazy) { + var animations = this.animations; + var i, ilen; + + animation.chart = chart; + + if (!lazy) { + chart.animating = true; + } + + for (i = 0, ilen = animations.length; i < ilen; ++i) { + if (animations[i].chart === chart) { + animations[i] = animation; + return; + } + } + + animations.push(animation); + + // If there are no animations queued, manually kickstart a digest, for lack of a better word + if (animations.length === 1) { + this.requestAnimationFrame(); + } + }, + + cancelAnimation: function(chart) { + var index = helpers.findIndex(this.animations, function(animation) { + return animation.chart === chart; + }); + + if (index !== -1) { + this.animations.splice(index, 1); + chart.animating = false; + } + }, + + requestAnimationFrame: function() { + var me = this; + if (me.request === null) { + // Skip animation frame requests until the active one is executed. + // This can happen when processing mouse events, e.g. 'mousemove' + // and 'mouseout' events will trigger multiple renders. + me.request = helpers.requestAnimFrame.call(window, function() { + me.request = null; + me.startDigest(); + }); + } + }, + + /** + * @private + */ + startDigest: function() { + var me = this; + var startTime = Date.now(); + var framesToDrop = 0; + + if (me.dropFrames > 1) { + framesToDrop = Math.floor(me.dropFrames); + me.dropFrames = me.dropFrames % 1; + } + + me.advance(1 + framesToDrop); + + var endTime = Date.now(); + + me.dropFrames += (endTime - startTime) / me.frameDuration; + + // Do we have more stuff to animate? + if (me.animations.length > 0) { + me.requestAnimationFrame(); + } + }, + + /** + * @private + */ + advance: function(count) { + var animations = this.animations; + var animation, chart; + var i = 0; + + while (i < animations.length) { + animation = animations[i]; + chart = animation.chart; + + animation.currentStep = (animation.currentStep || 0) + count; + animation.currentStep = Math.min(animation.currentStep, animation.numSteps); + + helpers.callback(animation.render, [chart, animation], chart); + helpers.callback(animation.onAnimationProgress, [animation], chart); + + if (animation.currentStep >= animation.numSteps) { + helpers.callback(animation.onAnimationComplete, [animation], chart); + chart.animating = false; + animations.splice(i, 1); + } else { + ++i; + } + } + } + }; + + /** + * Provided for backward compatibility, use Chart.Animation instead + * @prop Chart.Animation#animationObject + * @deprecated since version 2.6.0 + * @todo remove at version 3 + */ + Object.defineProperty(Chart.Animation.prototype, 'animationObject', { + get: function() { + return this; + } + }); + + /** + * Provided for backward compatibility, use Chart.Animation#chart instead + * @prop Chart.Animation#chartInstance + * @deprecated since version 2.6.0 + * @todo remove at version 3 + */ + Object.defineProperty(Chart.Animation.prototype, 'chartInstance', { + get: function() { + return this.chart; + }, + set: function(value) { + this.chart = value; + } + }); + +}; + +},{"25":25,"26":26,"45":45}],23:[function(require,module,exports){ +'use strict'; + +var defaults = require(25); +var helpers = require(45); +var Interaction = require(28); +var platform = require(48); + +module.exports = function(Chart) { + var plugins = Chart.plugins; + + // Create a dictionary of chart types, to allow for extension of existing types + Chart.types = {}; + + // Store a reference to each instance - allowing us to globally resize chart instances on window resize. + // Destroy method on the chart will remove the instance of the chart from this reference. + Chart.instances = {}; + + // Controllers available for dataset visualization eg. bar, line, slice, etc. + Chart.controllers = {}; + + /** + * Initializes the given config with global and chart default values. + */ + function initConfig(config) { + config = config || {}; + + // Do NOT use configMerge() for the data object because this method merges arrays + // and so would change references to labels and datasets, preventing data updates. + var data = config.data = config.data || {}; + data.datasets = data.datasets || []; + data.labels = data.labels || []; + + config.options = helpers.configMerge( + defaults.global, + defaults[config.type], + config.options || {}); + + return config; + } + + /** + * Updates the config of the chart + * @param chart {Chart} chart to update the options for + */ + function updateConfig(chart) { + var newOptions = chart.options; + + // Update Scale(s) with options + if (newOptions.scale) { + chart.scale.options = newOptions.scale; + } else if (newOptions.scales) { + newOptions.scales.xAxes.concat(newOptions.scales.yAxes).forEach(function(scaleOptions) { + chart.scales[scaleOptions.id].options = scaleOptions; + }); + } + + // Tooltip + chart.tooltip._options = newOptions.tooltips; + } + + function positionIsHorizontal(position) { + return position === 'top' || position === 'bottom'; + } + + helpers.extend(Chart.prototype, /** @lends Chart */ { + /** + * @private + */ + construct: function(item, config) { + var me = this; + + config = initConfig(config); + + var context = platform.acquireContext(item, config); + var canvas = context && context.canvas; + var height = canvas && canvas.height; + var width = canvas && canvas.width; + + me.id = helpers.uid(); + me.ctx = context; + me.canvas = canvas; + me.config = config; + me.width = width; + me.height = height; + me.aspectRatio = height ? width / height : null; + me.options = config.options; + me._bufferedRender = false; + + /** + * Provided for backward compatibility, Chart and Chart.Controller have been merged, + * the "instance" still need to be defined since it might be called from plugins. + * @prop Chart#chart + * @deprecated since version 2.6.0 + * @todo remove at version 3 + * @private + */ + me.chart = me; + me.controller = me; // chart.chart.controller #inception + + // Add the chart instance to the global namespace + Chart.instances[me.id] = me; + + // Define alias to the config data: `chart.data === chart.config.data` + Object.defineProperty(me, 'data', { + get: function() { + return me.config.data; + }, + set: function(value) { + me.config.data = value; + } + }); + + if (!context || !canvas) { + // The given item is not a compatible context2d element, let's return before finalizing + // the chart initialization but after setting basic chart / controller properties that + // can help to figure out that the chart is not valid (e.g chart.canvas !== null); + // https://github.com/chartjs/Chart.js/issues/2807 + console.error("Failed to create chart: can't acquire context from the given item"); + return; + } + + me.initialize(); + me.update(); + }, + + /** + * @private + */ + initialize: function() { + var me = this; + + // Before init plugin notification + plugins.notify(me, 'beforeInit'); + + helpers.retinaScale(me, me.options.devicePixelRatio); + + me.bindEvents(); + + if (me.options.responsive) { + // Initial resize before chart draws (must be silent to preserve initial animations). + me.resize(true); + } + + // Make sure scales have IDs and are built before we build any controllers. + me.ensureScalesHaveIDs(); + me.buildScales(); + me.initToolTip(); + + // After init plugin notification + plugins.notify(me, 'afterInit'); + + return me; + }, + + clear: function() { + helpers.canvas.clear(this); + return this; + }, + + stop: function() { + // Stops any current animation loop occurring + Chart.animationService.cancelAnimation(this); + return this; + }, + + resize: function(silent) { + var me = this; + var options = me.options; + var canvas = me.canvas; + var aspectRatio = (options.maintainAspectRatio && me.aspectRatio) || null; + + // the canvas render width and height will be casted to integers so make sure that + // the canvas display style uses the same integer values to avoid blurring effect. + + // Set to 0 instead of canvas.size because the size defaults to 300x150 if the element is collased + var newWidth = Math.max(0, Math.floor(helpers.getMaximumWidth(canvas))); + var newHeight = Math.max(0, Math.floor(aspectRatio ? newWidth / aspectRatio : helpers.getMaximumHeight(canvas))); + + if (me.width === newWidth && me.height === newHeight) { + return; + } + + canvas.width = me.width = newWidth; + canvas.height = me.height = newHeight; + canvas.style.width = newWidth + 'px'; + canvas.style.height = newHeight + 'px'; + + helpers.retinaScale(me, options.devicePixelRatio); + + if (!silent) { + // Notify any plugins about the resize + var newSize = {width: newWidth, height: newHeight}; + plugins.notify(me, 'resize', [newSize]); + + // Notify of resize + if (me.options.onResize) { + me.options.onResize(me, newSize); + } + + me.stop(); + me.update(me.options.responsiveAnimationDuration); + } + }, + + ensureScalesHaveIDs: function() { + var options = this.options; + var scalesOptions = options.scales || {}; + var scaleOptions = options.scale; + + helpers.each(scalesOptions.xAxes, function(xAxisOptions, index) { + xAxisOptions.id = xAxisOptions.id || ('x-axis-' + index); + }); + + helpers.each(scalesOptions.yAxes, function(yAxisOptions, index) { + yAxisOptions.id = yAxisOptions.id || ('y-axis-' + index); + }); + + if (scaleOptions) { + scaleOptions.id = scaleOptions.id || 'scale'; + } + }, + + /** + * Builds a map of scale ID to scale object for future lookup. + */ + buildScales: function() { + var me = this; + var options = me.options; + var scales = me.scales = {}; + var items = []; + + if (options.scales) { + items = items.concat( + (options.scales.xAxes || []).map(function(xAxisOptions) { + return {options: xAxisOptions, dtype: 'category', dposition: 'bottom'}; + }), + (options.scales.yAxes || []).map(function(yAxisOptions) { + return {options: yAxisOptions, dtype: 'linear', dposition: 'left'}; + }) + ); + } + + if (options.scale) { + items.push({ + options: options.scale, + dtype: 'radialLinear', + isDefault: true, + dposition: 'chartArea' + }); + } + + helpers.each(items, function(item) { + var scaleOptions = item.options; + var scaleType = helpers.valueOrDefault(scaleOptions.type, item.dtype); + var scaleClass = Chart.scaleService.getScaleConstructor(scaleType); + if (!scaleClass) { + return; + } + + if (positionIsHorizontal(scaleOptions.position) !== positionIsHorizontal(item.dposition)) { + scaleOptions.position = item.dposition; + } + + var scale = new scaleClass({ + id: scaleOptions.id, + options: scaleOptions, + ctx: me.ctx, + chart: me + }); + + scales[scale.id] = scale; + scale.mergeTicksOptions(); + + // TODO(SB): I think we should be able to remove this custom case (options.scale) + // and consider it as a regular scale part of the "scales"" map only! This would + // make the logic easier and remove some useless? custom code. + if (item.isDefault) { + me.scale = scale; + } + }); + + Chart.scaleService.addScalesToLayout(this); + }, + + buildOrUpdateControllers: function() { + var me = this; + var types = []; + var newControllers = []; + + helpers.each(me.data.datasets, function(dataset, datasetIndex) { + var meta = me.getDatasetMeta(datasetIndex); + var type = dataset.type || me.config.type; + + if (meta.type && meta.type !== type) { + me.destroyDatasetMeta(datasetIndex); + meta = me.getDatasetMeta(datasetIndex); + } + meta.type = type; + + types.push(meta.type); + + if (meta.controller) { + meta.controller.updateIndex(datasetIndex); + } else { + var ControllerClass = Chart.controllers[meta.type]; + if (ControllerClass === undefined) { + throw new Error('"' + meta.type + '" is not a chart type.'); + } + + meta.controller = new ControllerClass(me, datasetIndex); + newControllers.push(meta.controller); + } + }, me); + + return newControllers; + }, + + /** + * Reset the elements of all datasets + * @private + */ + resetElements: function() { + var me = this; + helpers.each(me.data.datasets, function(dataset, datasetIndex) { + me.getDatasetMeta(datasetIndex).controller.reset(); + }, me); + }, + + /** + * Resets the chart back to it's state before the initial animation + */ + reset: function() { + this.resetElements(); + this.tooltip.initialize(); + }, + + update: function(config) { + var me = this; + + if (!config || typeof config !== 'object') { + // backwards compatibility + config = { + duration: config, + lazy: arguments[1] + }; + } + + updateConfig(me); + + if (plugins.notify(me, 'beforeUpdate') === false) { + return; + } + + // In case the entire data object changed + me.tooltip._data = me.data; + + // Make sure dataset controllers are updated and new controllers are reset + var newControllers = me.buildOrUpdateControllers(); + + // Make sure all dataset controllers have correct meta data counts + helpers.each(me.data.datasets, function(dataset, datasetIndex) { + me.getDatasetMeta(datasetIndex).controller.buildOrUpdateElements(); + }, me); + + me.updateLayout(); + + // Can only reset the new controllers after the scales have been updated + helpers.each(newControllers, function(controller) { + controller.reset(); + }); + + me.updateDatasets(); + + // Need to reset tooltip in case it is displayed with elements that are removed + // after update. + me.tooltip.initialize(); + + // Last active contains items that were previously in the tooltip. + // When we reset the tooltip, we need to clear it + me.lastActive = []; + + // Do this before render so that any plugins that need final scale updates can use it + plugins.notify(me, 'afterUpdate'); + + if (me._bufferedRender) { + me._bufferedRequest = { + duration: config.duration, + easing: config.easing, + lazy: config.lazy + }; + } else { + me.render(config); + } + }, + + /** + * Updates the chart layout unless a plugin returns `false` to the `beforeLayout` + * hook, in which case, plugins will not be called on `afterLayout`. + * @private + */ + updateLayout: function() { + var me = this; + + if (plugins.notify(me, 'beforeLayout') === false) { + return; + } + + Chart.layoutService.update(this, this.width, this.height); + + /** + * Provided for backward compatibility, use `afterLayout` instead. + * @method IPlugin#afterScaleUpdate + * @deprecated since version 2.5.0 + * @todo remove at version 3 + * @private + */ + plugins.notify(me, 'afterScaleUpdate'); + plugins.notify(me, 'afterLayout'); + }, + + /** + * Updates all datasets unless a plugin returns `false` to the `beforeDatasetsUpdate` + * hook, in which case, plugins will not be called on `afterDatasetsUpdate`. + * @private + */ + updateDatasets: function() { + var me = this; + + if (plugins.notify(me, 'beforeDatasetsUpdate') === false) { + return; + } + + for (var i = 0, ilen = me.data.datasets.length; i < ilen; ++i) { + me.updateDataset(i); + } + + plugins.notify(me, 'afterDatasetsUpdate'); + }, + + /** + * Updates dataset at index unless a plugin returns `false` to the `beforeDatasetUpdate` + * hook, in which case, plugins will not be called on `afterDatasetUpdate`. + * @private + */ + updateDataset: function(index) { + var me = this; + var meta = me.getDatasetMeta(index); + var args = { + meta: meta, + index: index + }; + + if (plugins.notify(me, 'beforeDatasetUpdate', [args]) === false) { + return; + } + + meta.controller.update(); + + plugins.notify(me, 'afterDatasetUpdate', [args]); + }, + + render: function(config) { + var me = this; + + if (!config || typeof config !== 'object') { + // backwards compatibility + config = { + duration: config, + lazy: arguments[1] + }; + } + + var duration = config.duration; + var lazy = config.lazy; + + if (plugins.notify(me, 'beforeRender') === false) { + return; + } + + var animationOptions = me.options.animation; + var onComplete = function(animation) { + plugins.notify(me, 'afterRender'); + helpers.callback(animationOptions && animationOptions.onComplete, [animation], me); + }; + + if (animationOptions && ((typeof duration !== 'undefined' && duration !== 0) || (typeof duration === 'undefined' && animationOptions.duration !== 0))) { + var animation = new Chart.Animation({ + numSteps: (duration || animationOptions.duration) / 16.66, // 60 fps + easing: config.easing || animationOptions.easing, + + render: function(chart, animationObject) { + var easingFunction = helpers.easing.effects[animationObject.easing]; + var currentStep = animationObject.currentStep; + var stepDecimal = currentStep / animationObject.numSteps; + + chart.draw(easingFunction(stepDecimal), stepDecimal, currentStep); + }, + + onAnimationProgress: animationOptions.onProgress, + onAnimationComplete: onComplete + }); + + Chart.animationService.addAnimation(me, animation, duration, lazy); + } else { + me.draw(); + + // See https://github.com/chartjs/Chart.js/issues/3781 + onComplete(new Chart.Animation({numSteps: 0, chart: me})); + } + + return me; + }, + + draw: function(easingValue) { + var me = this; + + me.clear(); + + if (helpers.isNullOrUndef(easingValue)) { + easingValue = 1; + } + + me.transition(easingValue); + + if (plugins.notify(me, 'beforeDraw', [easingValue]) === false) { + return; + } + + // Draw all the scales + helpers.each(me.boxes, function(box) { + box.draw(me.chartArea); + }, me); + + if (me.scale) { + me.scale.draw(); + } + + me.drawDatasets(easingValue); + me._drawTooltip(easingValue); + + plugins.notify(me, 'afterDraw', [easingValue]); + }, + + /** + * @private + */ + transition: function(easingValue) { + var me = this; + + for (var i = 0, ilen = (me.data.datasets || []).length; i < ilen; ++i) { + if (me.isDatasetVisible(i)) { + me.getDatasetMeta(i).controller.transition(easingValue); + } + } + + me.tooltip.transition(easingValue); + }, + + /** + * Draws all datasets unless a plugin returns `false` to the `beforeDatasetsDraw` + * hook, in which case, plugins will not be called on `afterDatasetsDraw`. + * @private + */ + drawDatasets: function(easingValue) { + var me = this; + + if (plugins.notify(me, 'beforeDatasetsDraw', [easingValue]) === false) { + return; + } + + // Draw datasets reversed to support proper line stacking + for (var i = (me.data.datasets || []).length - 1; i >= 0; --i) { + if (me.isDatasetVisible(i)) { + me.drawDataset(i, easingValue); + } + } + + plugins.notify(me, 'afterDatasetsDraw', [easingValue]); + }, + + /** + * Draws dataset at index unless a plugin returns `false` to the `beforeDatasetDraw` + * hook, in which case, plugins will not be called on `afterDatasetDraw`. + * @private + */ + drawDataset: function(index, easingValue) { + var me = this; + var meta = me.getDatasetMeta(index); + var args = { + meta: meta, + index: index, + easingValue: easingValue + }; + + if (plugins.notify(me, 'beforeDatasetDraw', [args]) === false) { + return; + } + + meta.controller.draw(easingValue); + + plugins.notify(me, 'afterDatasetDraw', [args]); + }, + + /** + * Draws tooltip unless a plugin returns `false` to the `beforeTooltipDraw` + * hook, in which case, plugins will not be called on `afterTooltipDraw`. + * @private + */ + _drawTooltip: function(easingValue) { + var me = this; + var tooltip = me.tooltip; + var args = { + tooltip: tooltip, + easingValue: easingValue + }; + + if (plugins.notify(me, 'beforeTooltipDraw', [args]) === false) { + return; + } + + tooltip.draw(); + + plugins.notify(me, 'afterTooltipDraw', [args]); + }, + + // Get the single element that was clicked on + // @return : An object containing the dataset index and element index of the matching element. Also contains the rectangle that was draw + getElementAtEvent: function(e) { + return Interaction.modes.single(this, e); + }, + + getElementsAtEvent: function(e) { + return Interaction.modes.label(this, e, {intersect: true}); + }, + + getElementsAtXAxis: function(e) { + return Interaction.modes['x-axis'](this, e, {intersect: true}); + }, + + getElementsAtEventForMode: function(e, mode, options) { + var method = Interaction.modes[mode]; + if (typeof method === 'function') { + return method(this, e, options); + } + + return []; + }, + + getDatasetAtEvent: function(e) { + return Interaction.modes.dataset(this, e, {intersect: true}); + }, + + getDatasetMeta: function(datasetIndex) { + var me = this; + var dataset = me.data.datasets[datasetIndex]; + if (!dataset._meta) { + dataset._meta = {}; + } + + var meta = dataset._meta[me.id]; + if (!meta) { + meta = dataset._meta[me.id] = { + type: null, + data: [], + dataset: null, + controller: null, + hidden: null, // See isDatasetVisible() comment + xAxisID: null, + yAxisID: null + }; + } + + return meta; + }, + + getVisibleDatasetCount: function() { + var count = 0; + for (var i = 0, ilen = this.data.datasets.length; i < ilen; ++i) { + if (this.isDatasetVisible(i)) { + count++; + } + } + return count; + }, + + isDatasetVisible: function(datasetIndex) { + var meta = this.getDatasetMeta(datasetIndex); + + // meta.hidden is a per chart dataset hidden flag override with 3 states: if true or false, + // the dataset.hidden value is ignored, else if null, the dataset hidden state is returned. + return typeof meta.hidden === 'boolean' ? !meta.hidden : !this.data.datasets[datasetIndex].hidden; + }, + + generateLegend: function() { + return this.options.legendCallback(this); + }, + + /** + * @private + */ + destroyDatasetMeta: function(datasetIndex) { + var id = this.id; + var dataset = this.data.datasets[datasetIndex]; + var meta = dataset._meta && dataset._meta[id]; + + if (meta) { + meta.controller.destroy(); + delete dataset._meta[id]; + } + }, + + destroy: function() { + var me = this; + var canvas = me.canvas; + var i, ilen; + + me.stop(); + + // dataset controllers need to cleanup associated data + for (i = 0, ilen = me.data.datasets.length; i < ilen; ++i) { + me.destroyDatasetMeta(i); + } + + if (canvas) { + me.unbindEvents(); + helpers.canvas.clear(me); + platform.releaseContext(me.ctx); + me.canvas = null; + me.ctx = null; + } + + plugins.notify(me, 'destroy'); + + delete Chart.instances[me.id]; + }, + + toBase64Image: function() { + return this.canvas.toDataURL.apply(this.canvas, arguments); + }, + + initToolTip: function() { + var me = this; + me.tooltip = new Chart.Tooltip({ + _chart: me, + _chartInstance: me, // deprecated, backward compatibility + _data: me.data, + _options: me.options.tooltips + }, me); + }, + + /** + * @private + */ + bindEvents: function() { + var me = this; + var listeners = me._listeners = {}; + var listener = function() { + me.eventHandler.apply(me, arguments); + }; + + helpers.each(me.options.events, function(type) { + platform.addEventListener(me, type, listener); + listeners[type] = listener; + }); + + // Elements used to detect size change should not be injected for non responsive charts. + // See https://github.com/chartjs/Chart.js/issues/2210 + if (me.options.responsive) { + listener = function() { + me.resize(); + }; + + platform.addEventListener(me, 'resize', listener); + listeners.resize = listener; + } + }, + + /** + * @private + */ + unbindEvents: function() { + var me = this; + var listeners = me._listeners; + if (!listeners) { + return; + } + + delete me._listeners; + helpers.each(listeners, function(listener, type) { + platform.removeEventListener(me, type, listener); + }); + }, + + updateHoverStyle: function(elements, mode, enabled) { + var method = enabled ? 'setHoverStyle' : 'removeHoverStyle'; + var element, i, ilen; + + for (i = 0, ilen = elements.length; i < ilen; ++i) { + element = elements[i]; + if (element) { + this.getDatasetMeta(element._datasetIndex).controller[method](element); + } + } + }, + + /** + * @private + */ + eventHandler: function(e) { + var me = this; + var tooltip = me.tooltip; + + if (plugins.notify(me, 'beforeEvent', [e]) === false) { + return; + } + + // Buffer any update calls so that renders do not occur + me._bufferedRender = true; + me._bufferedRequest = null; + + var changed = me.handleEvent(e); + changed |= tooltip && tooltip.handleEvent(e); + + plugins.notify(me, 'afterEvent', [e]); + + var bufferedRequest = me._bufferedRequest; + if (bufferedRequest) { + // If we have an update that was triggered, we need to do a normal render + me.render(bufferedRequest); + } else if (changed && !me.animating) { + // If entering, leaving, or changing elements, animate the change via pivot + me.stop(); + + // We only need to render at this point. Updating will cause scales to be + // recomputed generating flicker & using more memory than necessary. + me.render(me.options.hover.animationDuration, true); + } + + me._bufferedRender = false; + me._bufferedRequest = null; + + return me; + }, + + /** + * Handle an event + * @private + * @param {IEvent} event the event to handle + * @return {Boolean} true if the chart needs to re-render + */ + handleEvent: function(e) { + var me = this; + var options = me.options || {}; + var hoverOptions = options.hover; + var changed = false; + + me.lastActive = me.lastActive || []; + + // Find Active Elements for hover and tooltips + if (e.type === 'mouseout') { + me.active = []; + } else { + me.active = me.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions); + } + + // Invoke onHover hook + // Need to call with native event here to not break backwards compatibility + helpers.callback(options.onHover || options.hover.onHover, [e.native, me.active], me); + + if (e.type === 'mouseup' || e.type === 'click') { + if (options.onClick) { + // Use e.native here for backwards compatibility + options.onClick.call(me, e.native, me.active); + } + } + + // Remove styling for last active (even if it may still be active) + if (me.lastActive.length) { + me.updateHoverStyle(me.lastActive, hoverOptions.mode, false); + } + + // Built in hover styling + if (me.active.length && hoverOptions.mode) { + me.updateHoverStyle(me.active, hoverOptions.mode, true); + } + + changed = !helpers.arrayEquals(me.active, me.lastActive); + + // Remember Last Actives + me.lastActive = me.active; + + return changed; + } + }); + + /** + * Provided for backward compatibility, use Chart instead. + * @class Chart.Controller + * @deprecated since version 2.6.0 + * @todo remove at version 3 + * @private + */ + Chart.Controller = Chart; +}; + +},{"25":25,"28":28,"45":45,"48":48}],24:[function(require,module,exports){ +'use strict'; + +var helpers = require(45); + +module.exports = function(Chart) { + + var arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift']; + + /** + * Hooks the array methods that add or remove values ('push', pop', 'shift', 'splice', + * 'unshift') and notify the listener AFTER the array has been altered. Listeners are + * called on the 'onData*' callbacks (e.g. onDataPush, etc.) with same arguments. + */ + function listenArrayEvents(array, listener) { + if (array._chartjs) { + array._chartjs.listeners.push(listener); + return; + } + + Object.defineProperty(array, '_chartjs', { + configurable: true, + enumerable: false, + value: { + listeners: [listener] + } + }); + + arrayEvents.forEach(function(key) { + var method = 'onData' + key.charAt(0).toUpperCase() + key.slice(1); + var base = array[key]; + + Object.defineProperty(array, key, { + configurable: true, + enumerable: false, + value: function() { + var args = Array.prototype.slice.call(arguments); + var res = base.apply(this, args); + + helpers.each(array._chartjs.listeners, function(object) { + if (typeof object[method] === 'function') { + object[method].apply(object, args); + } + }); + + return res; + } + }); + }); + } + + /** + * Removes the given array event listener and cleanup extra attached properties (such as + * the _chartjs stub and overridden methods) if array doesn't have any more listeners. + */ + function unlistenArrayEvents(array, listener) { + var stub = array._chartjs; + if (!stub) { + return; + } + + var listeners = stub.listeners; + var index = listeners.indexOf(listener); + if (index !== -1) { + listeners.splice(index, 1); + } + + if (listeners.length > 0) { + return; + } + + arrayEvents.forEach(function(key) { + delete array[key]; + }); + + delete array._chartjs; + } + + // Base class for all dataset controllers (line, bar, etc) + Chart.DatasetController = function(chart, datasetIndex) { + this.initialize(chart, datasetIndex); + }; + + helpers.extend(Chart.DatasetController.prototype, { + + /** + * Element type used to generate a meta dataset (e.g. Chart.element.Line). + * @type {Chart.core.element} + */ + datasetElementType: null, + + /** + * Element type used to generate a meta data (e.g. Chart.element.Point). + * @type {Chart.core.element} + */ + dataElementType: null, + + initialize: function(chart, datasetIndex) { + var me = this; + me.chart = chart; + me.index = datasetIndex; + me.linkScales(); + me.addElements(); + }, + + updateIndex: function(datasetIndex) { + this.index = datasetIndex; + }, + + linkScales: function() { + var me = this; + var meta = me.getMeta(); + var dataset = me.getDataset(); + + if (meta.xAxisID === null) { + meta.xAxisID = dataset.xAxisID || me.chart.options.scales.xAxes[0].id; + } + if (meta.yAxisID === null) { + meta.yAxisID = dataset.yAxisID || me.chart.options.scales.yAxes[0].id; + } + }, + + getDataset: function() { + return this.chart.data.datasets[this.index]; + }, + + getMeta: function() { + return this.chart.getDatasetMeta(this.index); + }, + + getScaleForId: function(scaleID) { + return this.chart.scales[scaleID]; + }, + + reset: function() { + this.update(true); + }, + + /** + * @private + */ + destroy: function() { + if (this._data) { + unlistenArrayEvents(this._data, this); + } + }, + + createMetaDataset: function() { + var me = this; + var type = me.datasetElementType; + return type && new type({ + _chart: me.chart, + _datasetIndex: me.index + }); + }, + + createMetaData: function(index) { + var me = this; + var type = me.dataElementType; + return type && new type({ + _chart: me.chart, + _datasetIndex: me.index, + _index: index + }); + }, + + addElements: function() { + var me = this; + var meta = me.getMeta(); + var data = me.getDataset().data || []; + var metaData = meta.data; + var i, ilen; + + for (i = 0, ilen = data.length; i < ilen; ++i) { + metaData[i] = metaData[i] || me.createMetaData(i); + } + + meta.dataset = meta.dataset || me.createMetaDataset(); + }, + + addElementAndReset: function(index) { + var element = this.createMetaData(index); + this.getMeta().data.splice(index, 0, element); + this.updateElement(element, index, true); + }, + + buildOrUpdateElements: function() { + var me = this; + var dataset = me.getDataset(); + var data = dataset.data || (dataset.data = []); + + // In order to correctly handle data addition/deletion animation (an thus simulate + // real-time charts), we need to monitor these data modifications and synchronize + // the internal meta data accordingly. + if (me._data !== data) { + if (me._data) { + // This case happens when the user replaced the data array instance. + unlistenArrayEvents(me._data, me); + } + + listenArrayEvents(data, me); + me._data = data; + } + + // Re-sync meta data in case the user replaced the data array or if we missed + // any updates and so make sure that we handle number of datapoints changing. + me.resyncElements(); + }, + + update: helpers.noop, + + transition: function(easingValue) { + var meta = this.getMeta(); + var elements = meta.data || []; + var ilen = elements.length; + var i = 0; + + for (; i < ilen; ++i) { + elements[i].transition(easingValue); + } + + if (meta.dataset) { + meta.dataset.transition(easingValue); + } + }, + + draw: function() { + var meta = this.getMeta(); + var elements = meta.data || []; + var ilen = elements.length; + var i = 0; + + if (meta.dataset) { + meta.dataset.draw(); + } + + for (; i < ilen; ++i) { + elements[i].draw(); + } + }, + + removeHoverStyle: function(element, elementOpts) { + var dataset = this.chart.data.datasets[element._datasetIndex]; + var index = element._index; + var custom = element.custom || {}; + var valueOrDefault = helpers.valueAtIndexOrDefault; + var model = element._model; + + model.backgroundColor = custom.backgroundColor ? custom.backgroundColor : valueOrDefault(dataset.backgroundColor, index, elementOpts.backgroundColor); + model.borderColor = custom.borderColor ? custom.borderColor : valueOrDefault(dataset.borderColor, index, elementOpts.borderColor); + model.borderWidth = custom.borderWidth ? custom.borderWidth : valueOrDefault(dataset.borderWidth, index, elementOpts.borderWidth); + }, + + setHoverStyle: function(element) { + var dataset = this.chart.data.datasets[element._datasetIndex]; + var index = element._index; + var custom = element.custom || {}; + var valueOrDefault = helpers.valueAtIndexOrDefault; + var getHoverColor = helpers.getHoverColor; + var model = element._model; + + model.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : valueOrDefault(dataset.hoverBackgroundColor, index, getHoverColor(model.backgroundColor)); + model.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : valueOrDefault(dataset.hoverBorderColor, index, getHoverColor(model.borderColor)); + model.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : valueOrDefault(dataset.hoverBorderWidth, index, model.borderWidth); + }, + + /** + * @private + */ + resyncElements: function() { + var me = this; + var meta = me.getMeta(); + var data = me.getDataset().data; + var numMeta = meta.data.length; + var numData = data.length; + + if (numData < numMeta) { + meta.data.splice(numData, numMeta - numData); + } else if (numData > numMeta) { + me.insertElements(numMeta, numData - numMeta); + } + }, + + /** + * @private + */ + insertElements: function(start, count) { + for (var i = 0; i < count; ++i) { + this.addElementAndReset(start + i); + } + }, + + /** + * @private + */ + onDataPush: function() { + this.insertElements(this.getDataset().data.length - 1, arguments.length); + }, + + /** + * @private + */ + onDataPop: function() { + this.getMeta().data.pop(); + }, + + /** + * @private + */ + onDataShift: function() { + this.getMeta().data.shift(); + }, + + /** + * @private + */ + onDataSplice: function(start, count) { + this.getMeta().data.splice(start, count); + this.insertElements(start, arguments.length - 2); + }, + + /** + * @private + */ + onDataUnshift: function() { + this.insertElements(0, arguments.length); + } + }); + + Chart.DatasetController.extend = helpers.inherits; +}; + +},{"45":45}],25:[function(require,module,exports){ +'use strict'; + +var helpers = require(45); + +module.exports = { + /** + * @private + */ + _set: function(scope, values) { + return helpers.merge(this[scope] || (this[scope] = {}), values); + } +}; + +},{"45":45}],26:[function(require,module,exports){ +'use strict'; + +var color = require(3); +var helpers = require(45); + +function interpolate(start, view, model, ease) { + var keys = Object.keys(model); + var i, ilen, key, actual, origin, target, type, c0, c1; + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + + target = model[key]; + + // if a value is added to the model after pivot() has been called, the view + // doesn't contain it, so let's initialize the view to the target value. + if (!view.hasOwnProperty(key)) { + view[key] = target; + } + + actual = view[key]; + + if (actual === target || key[0] === '_') { + continue; + } + + if (!start.hasOwnProperty(key)) { + start[key] = actual; + } + + origin = start[key]; + + type = typeof target; + + if (type === typeof origin) { + if (type === 'string') { + c0 = color(origin); + if (c0.valid) { + c1 = color(target); + if (c1.valid) { + view[key] = c1.mix(c0, ease).rgbString(); + continue; + } + } + } else if (type === 'number' && isFinite(origin) && isFinite(target)) { + view[key] = origin + (target - origin) * ease; + continue; + } + } + + view[key] = target; + } +} + +var Element = function(configuration) { + helpers.extend(this, configuration); + this.initialize.apply(this, arguments); +}; + +helpers.extend(Element.prototype, { + + initialize: function() { + this.hidden = false; + }, + + pivot: function() { + var me = this; + if (!me._view) { + me._view = helpers.clone(me._model); + } + me._start = {}; + return me; + }, + + transition: function(ease) { + var me = this; + var model = me._model; + var start = me._start; + var view = me._view; + + // No animation -> No Transition + if (!model || ease === 1) { + me._view = model; + me._start = null; + return me; + } + + if (!view) { + view = me._view = {}; + } + + if (!start) { + start = me._start = {}; + } + + interpolate(start, view, model, ease); + + return me; + }, + + tooltipPosition: function() { + return { + x: this._model.x, + y: this._model.y + }; + }, + + hasValue: function() { + return helpers.isNumber(this._model.x) && helpers.isNumber(this._model.y); + } +}); + +Element.extend = helpers.inherits; + +module.exports = Element; + +},{"3":3,"45":45}],27:[function(require,module,exports){ +/* global window: false */ +/* global document: false */ +'use strict'; + +var color = require(3); +var defaults = require(25); +var helpers = require(45); + +module.exports = function(Chart) { + + // -- Basic js utility methods + + helpers.configMerge = function(/* objects ... */) { + return helpers.merge(helpers.clone(arguments[0]), [].slice.call(arguments, 1), { + merger: function(key, target, source, options) { + var tval = target[key] || {}; + var sval = source[key]; + + if (key === 'scales') { + // scale config merging is complex. Add our own function here for that + target[key] = helpers.scaleMerge(tval, sval); + } else if (key === 'scale') { + // used in polar area & radar charts since there is only one scale + target[key] = helpers.merge(tval, [Chart.scaleService.getScaleDefaults(sval.type), sval]); + } else { + helpers._merger(key, target, source, options); + } + } + }); + }; + + helpers.scaleMerge = function(/* objects ... */) { + return helpers.merge(helpers.clone(arguments[0]), [].slice.call(arguments, 1), { + merger: function(key, target, source, options) { + if (key === 'xAxes' || key === 'yAxes') { + var slen = source[key].length; + var i, type, scale; + + if (!target[key]) { + target[key] = []; + } + + for (i = 0; i < slen; ++i) { + scale = source[key][i]; + type = helpers.valueOrDefault(scale.type, key === 'xAxes' ? 'category' : 'linear'); + + if (i >= target[key].length) { + target[key].push({}); + } + + if (!target[key][i].type || (scale.type && scale.type !== target[key][i].type)) { + // new/untyped scale or type changed: let's apply the new defaults + // then merge source scale to correctly overwrite the defaults. + helpers.merge(target[key][i], [Chart.scaleService.getScaleDefaults(type), scale]); + } else { + // scales type are the same + helpers.merge(target[key][i], scale); + } + } + } else { + helpers._merger(key, target, source, options); + } + } + }); + }; + + helpers.where = function(collection, filterCallback) { + if (helpers.isArray(collection) && Array.prototype.filter) { + return collection.filter(filterCallback); + } + var filtered = []; + + helpers.each(collection, function(item) { + if (filterCallback(item)) { + filtered.push(item); + } + }); + + return filtered; + }; + helpers.findIndex = Array.prototype.findIndex ? + function(array, callback, scope) { + return array.findIndex(callback, scope); + } : + function(array, callback, scope) { + scope = scope === undefined ? array : scope; + for (var i = 0, ilen = array.length; i < ilen; ++i) { + if (callback.call(scope, array[i], i, array)) { + return i; + } + } + return -1; + }; + helpers.findNextWhere = function(arrayToSearch, filterCallback, startIndex) { + // Default to start of the array + if (helpers.isNullOrUndef(startIndex)) { + startIndex = -1; + } + for (var i = startIndex + 1; i < arrayToSearch.length; i++) { + var currentItem = arrayToSearch[i]; + if (filterCallback(currentItem)) { + return currentItem; + } + } + }; + helpers.findPreviousWhere = function(arrayToSearch, filterCallback, startIndex) { + // Default to end of the array + if (helpers.isNullOrUndef(startIndex)) { + startIndex = arrayToSearch.length; + } + for (var i = startIndex - 1; i >= 0; i--) { + var currentItem = arrayToSearch[i]; + if (filterCallback(currentItem)) { + return currentItem; + } + } + }; + + // -- Math methods + helpers.isNumber = function(n) { + return !isNaN(parseFloat(n)) && isFinite(n); + }; + helpers.almostEquals = function(x, y, epsilon) { + return Math.abs(x - y) < epsilon; + }; + helpers.almostWhole = function(x, epsilon) { + var rounded = Math.round(x); + return (((rounded - epsilon) < x) && ((rounded + epsilon) > x)); + }; + helpers.max = function(array) { + return array.reduce(function(max, value) { + if (!isNaN(value)) { + return Math.max(max, value); + } + return max; + }, Number.NEGATIVE_INFINITY); + }; + helpers.min = function(array) { + return array.reduce(function(min, value) { + if (!isNaN(value)) { + return Math.min(min, value); + } + return min; + }, Number.POSITIVE_INFINITY); + }; + helpers.sign = Math.sign ? + function(x) { + return Math.sign(x); + } : + function(x) { + x = +x; // convert to a number + if (x === 0 || isNaN(x)) { + return x; + } + return x > 0 ? 1 : -1; + }; + helpers.log10 = Math.log10 ? + function(x) { + return Math.log10(x); + } : + function(x) { + return Math.log(x) / Math.LN10; + }; + helpers.toRadians = function(degrees) { + return degrees * (Math.PI / 180); + }; + helpers.toDegrees = function(radians) { + return radians * (180 / Math.PI); + }; + // Gets the angle from vertical upright to the point about a centre. + helpers.getAngleFromPoint = function(centrePoint, anglePoint) { + var distanceFromXCenter = anglePoint.x - centrePoint.x; + var distanceFromYCenter = anglePoint.y - centrePoint.y; + var radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter); + + var angle = Math.atan2(distanceFromYCenter, distanceFromXCenter); + + if (angle < (-0.5 * Math.PI)) { + angle += 2.0 * Math.PI; // make sure the returned angle is in the range of (-PI/2, 3PI/2] + } + + return { + angle: angle, + distance: radialDistanceFromCenter + }; + }; + helpers.distanceBetweenPoints = function(pt1, pt2) { + return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2)); + }; + helpers.aliasPixel = function(pixelWidth) { + return (pixelWidth % 2 === 0) ? 0 : 0.5; + }; + helpers.splineCurve = function(firstPoint, middlePoint, afterPoint, t) { + // Props to Rob Spencer at scaled innovation for his post on splining between points + // http://scaledinnovation.com/analytics/splines/aboutSplines.html + + // This function must also respect "skipped" points + + var previous = firstPoint.skip ? middlePoint : firstPoint; + var current = middlePoint; + var next = afterPoint.skip ? middlePoint : afterPoint; + + var d01 = Math.sqrt(Math.pow(current.x - previous.x, 2) + Math.pow(current.y - previous.y, 2)); + var d12 = Math.sqrt(Math.pow(next.x - current.x, 2) + Math.pow(next.y - current.y, 2)); + + var s01 = d01 / (d01 + d12); + var s12 = d12 / (d01 + d12); + + // If all points are the same, s01 & s02 will be inf + s01 = isNaN(s01) ? 0 : s01; + s12 = isNaN(s12) ? 0 : s12; + + var fa = t * s01; // scaling factor for triangle Ta + var fb = t * s12; + + return { + previous: { + x: current.x - fa * (next.x - previous.x), + y: current.y - fa * (next.y - previous.y) + }, + next: { + x: current.x + fb * (next.x - previous.x), + y: current.y + fb * (next.y - previous.y) + } + }; + }; + helpers.EPSILON = Number.EPSILON || 1e-14; + helpers.splineCurveMonotone = function(points) { + // This function calculates Bézier control points in a similar way than |splineCurve|, + // but preserves monotonicity of the provided data and ensures no local extremums are added + // between the dataset discrete points due to the interpolation. + // See : https://en.wikipedia.org/wiki/Monotone_cubic_interpolation + + var pointsWithTangents = (points || []).map(function(point) { + return { + model: point._model, + deltaK: 0, + mK: 0 + }; + }); + + // Calculate slopes (deltaK) and initialize tangents (mK) + var pointsLen = pointsWithTangents.length; + var i, pointBefore, pointCurrent, pointAfter; + for (i = 0; i < pointsLen; ++i) { + pointCurrent = pointsWithTangents[i]; + if (pointCurrent.model.skip) { + continue; + } + + pointBefore = i > 0 ? pointsWithTangents[i - 1] : null; + pointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null; + if (pointAfter && !pointAfter.model.skip) { + var slopeDeltaX = (pointAfter.model.x - pointCurrent.model.x); + + // In the case of two points that appear at the same x pixel, slopeDeltaX is 0 + pointCurrent.deltaK = slopeDeltaX !== 0 ? (pointAfter.model.y - pointCurrent.model.y) / slopeDeltaX : 0; + } + + if (!pointBefore || pointBefore.model.skip) { + pointCurrent.mK = pointCurrent.deltaK; + } else if (!pointAfter || pointAfter.model.skip) { + pointCurrent.mK = pointBefore.deltaK; + } else if (this.sign(pointBefore.deltaK) !== this.sign(pointCurrent.deltaK)) { + pointCurrent.mK = 0; + } else { + pointCurrent.mK = (pointBefore.deltaK + pointCurrent.deltaK) / 2; + } + } + + // Adjust tangents to ensure monotonic properties + var alphaK, betaK, tauK, squaredMagnitude; + for (i = 0; i < pointsLen - 1; ++i) { + pointCurrent = pointsWithTangents[i]; + pointAfter = pointsWithTangents[i + 1]; + if (pointCurrent.model.skip || pointAfter.model.skip) { + continue; + } + + if (helpers.almostEquals(pointCurrent.deltaK, 0, this.EPSILON)) { + pointCurrent.mK = pointAfter.mK = 0; + continue; + } + + alphaK = pointCurrent.mK / pointCurrent.deltaK; + betaK = pointAfter.mK / pointCurrent.deltaK; + squaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2); + if (squaredMagnitude <= 9) { + continue; + } + + tauK = 3 / Math.sqrt(squaredMagnitude); + pointCurrent.mK = alphaK * tauK * pointCurrent.deltaK; + pointAfter.mK = betaK * tauK * pointCurrent.deltaK; + } + + // Compute control points + var deltaX; + for (i = 0; i < pointsLen; ++i) { + pointCurrent = pointsWithTangents[i]; + if (pointCurrent.model.skip) { + continue; + } + + pointBefore = i > 0 ? pointsWithTangents[i - 1] : null; + pointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null; + if (pointBefore && !pointBefore.model.skip) { + deltaX = (pointCurrent.model.x - pointBefore.model.x) / 3; + pointCurrent.model.controlPointPreviousX = pointCurrent.model.x - deltaX; + pointCurrent.model.controlPointPreviousY = pointCurrent.model.y - deltaX * pointCurrent.mK; + } + if (pointAfter && !pointAfter.model.skip) { + deltaX = (pointAfter.model.x - pointCurrent.model.x) / 3; + pointCurrent.model.controlPointNextX = pointCurrent.model.x + deltaX; + pointCurrent.model.controlPointNextY = pointCurrent.model.y + deltaX * pointCurrent.mK; + } + } + }; + helpers.nextItem = function(collection, index, loop) { + if (loop) { + return index >= collection.length - 1 ? collection[0] : collection[index + 1]; + } + return index >= collection.length - 1 ? collection[collection.length - 1] : collection[index + 1]; + }; + helpers.previousItem = function(collection, index, loop) { + if (loop) { + return index <= 0 ? collection[collection.length - 1] : collection[index - 1]; + } + return index <= 0 ? collection[0] : collection[index - 1]; + }; + // Implementation of the nice number algorithm used in determining where axis labels will go + helpers.niceNum = function(range, round) { + var exponent = Math.floor(helpers.log10(range)); + var fraction = range / Math.pow(10, exponent); + var niceFraction; + + if (round) { + if (fraction < 1.5) { + niceFraction = 1; + } else if (fraction < 3) { + niceFraction = 2; + } else if (fraction < 7) { + niceFraction = 5; + } else { + niceFraction = 10; + } + } else if (fraction <= 1.0) { + niceFraction = 1; + } else if (fraction <= 2) { + niceFraction = 2; + } else if (fraction <= 5) { + niceFraction = 5; + } else { + niceFraction = 10; + } + + return niceFraction * Math.pow(10, exponent); + }; + // Request animation polyfill - http://www.paulirish.com/2011/requestanimationframe-for-smart-animating/ + helpers.requestAnimFrame = (function() { + if (typeof window === 'undefined') { + return function(callback) { + callback(); + }; + } + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + window.oRequestAnimationFrame || + window.msRequestAnimationFrame || + function(callback) { + return window.setTimeout(callback, 1000 / 60); + }; + }()); + // -- DOM methods + helpers.getRelativePosition = function(evt, chart) { + var mouseX, mouseY; + var e = evt.originalEvent || evt; + var canvas = evt.currentTarget || evt.srcElement; + var boundingRect = canvas.getBoundingClientRect(); + + var touches = e.touches; + if (touches && touches.length > 0) { + mouseX = touches[0].clientX; + mouseY = touches[0].clientY; + + } else { + mouseX = e.clientX; + mouseY = e.clientY; + } + + // Scale mouse coordinates into canvas coordinates + // by following the pattern laid out by 'jerryj' in the comments of + // http://www.html5canvastutorials.com/advanced/html5-canvas-mouse-coordinates/ + var paddingLeft = parseFloat(helpers.getStyle(canvas, 'padding-left')); + var paddingTop = parseFloat(helpers.getStyle(canvas, 'padding-top')); + var paddingRight = parseFloat(helpers.getStyle(canvas, 'padding-right')); + var paddingBottom = parseFloat(helpers.getStyle(canvas, 'padding-bottom')); + var width = boundingRect.right - boundingRect.left - paddingLeft - paddingRight; + var height = boundingRect.bottom - boundingRect.top - paddingTop - paddingBottom; + + // We divide by the current device pixel ratio, because the canvas is scaled up by that amount in each direction. However + // the backend model is in unscaled coordinates. Since we are going to deal with our model coordinates, we go back here + mouseX = Math.round((mouseX - boundingRect.left - paddingLeft) / (width) * canvas.width / chart.currentDevicePixelRatio); + mouseY = Math.round((mouseY - boundingRect.top - paddingTop) / (height) * canvas.height / chart.currentDevicePixelRatio); + + return { + x: mouseX, + y: mouseY + }; + + }; + + // Private helper function to convert max-width/max-height values that may be percentages into a number + function parseMaxStyle(styleValue, node, parentProperty) { + var valueInPixels; + if (typeof styleValue === 'string') { + valueInPixels = parseInt(styleValue, 10); + + if (styleValue.indexOf('%') !== -1) { + // percentage * size in dimension + valueInPixels = valueInPixels / 100 * node.parentNode[parentProperty]; + } + } else { + valueInPixels = styleValue; + } + + return valueInPixels; + } + + /** + * Returns if the given value contains an effective constraint. + * @private + */ + function isConstrainedValue(value) { + return value !== undefined && value !== null && value !== 'none'; + } + + // Private helper to get a constraint dimension + // @param domNode : the node to check the constraint on + // @param maxStyle : the style that defines the maximum for the direction we are using (maxWidth / maxHeight) + // @param percentageProperty : property of parent to use when calculating width as a percentage + // @see http://www.nathanaeljones.com/blog/2013/reading-max-width-cross-browser + function getConstraintDimension(domNode, maxStyle, percentageProperty) { + var view = document.defaultView; + var parentNode = domNode.parentNode; + var constrainedNode = view.getComputedStyle(domNode)[maxStyle]; + var constrainedContainer = view.getComputedStyle(parentNode)[maxStyle]; + var hasCNode = isConstrainedValue(constrainedNode); + var hasCContainer = isConstrainedValue(constrainedContainer); + var infinity = Number.POSITIVE_INFINITY; + + if (hasCNode || hasCContainer) { + return Math.min( + hasCNode ? parseMaxStyle(constrainedNode, domNode, percentageProperty) : infinity, + hasCContainer ? parseMaxStyle(constrainedContainer, parentNode, percentageProperty) : infinity); + } + + return 'none'; + } + // returns Number or undefined if no constraint + helpers.getConstraintWidth = function(domNode) { + return getConstraintDimension(domNode, 'max-width', 'clientWidth'); + }; + // returns Number or undefined if no constraint + helpers.getConstraintHeight = function(domNode) { + return getConstraintDimension(domNode, 'max-height', 'clientHeight'); + }; + helpers.getMaximumWidth = function(domNode) { + var container = domNode.parentNode; + if (!container) { + return domNode.clientWidth; + } + + var paddingLeft = parseInt(helpers.getStyle(container, 'padding-left'), 10); + var paddingRight = parseInt(helpers.getStyle(container, 'padding-right'), 10); + var w = container.clientWidth - paddingLeft - paddingRight; + var cw = helpers.getConstraintWidth(domNode); + return isNaN(cw) ? w : Math.min(w, cw); + }; + helpers.getMaximumHeight = function(domNode) { + var container = domNode.parentNode; + if (!container) { + return domNode.clientHeight; + } + + var paddingTop = parseInt(helpers.getStyle(container, 'padding-top'), 10); + var paddingBottom = parseInt(helpers.getStyle(container, 'padding-bottom'), 10); + var h = container.clientHeight - paddingTop - paddingBottom; + var ch = helpers.getConstraintHeight(domNode); + return isNaN(ch) ? h : Math.min(h, ch); + }; + helpers.getStyle = function(el, property) { + return el.currentStyle ? + el.currentStyle[property] : + document.defaultView.getComputedStyle(el, null).getPropertyValue(property); + }; + helpers.retinaScale = function(chart, forceRatio) { + var pixelRatio = chart.currentDevicePixelRatio = forceRatio || window.devicePixelRatio || 1; + if (pixelRatio === 1) { + return; + } + + var canvas = chart.canvas; + var height = chart.height; + var width = chart.width; + + canvas.height = height * pixelRatio; + canvas.width = width * pixelRatio; + chart.ctx.scale(pixelRatio, pixelRatio); + + // If no style has been set on the canvas, the render size is used as display size, + // making the chart visually bigger, so let's enforce it to the "correct" values. + // See https://github.com/chartjs/Chart.js/issues/3575 + canvas.style.height = height + 'px'; + canvas.style.width = width + 'px'; + }; + // -- Canvas methods + helpers.fontString = function(pixelSize, fontStyle, fontFamily) { + return fontStyle + ' ' + pixelSize + 'px ' + fontFamily; + }; + helpers.longestText = function(ctx, font, arrayOfThings, cache) { + cache = cache || {}; + var data = cache.data = cache.data || {}; + var gc = cache.garbageCollect = cache.garbageCollect || []; + + if (cache.font !== font) { + data = cache.data = {}; + gc = cache.garbageCollect = []; + cache.font = font; + } + + ctx.font = font; + var longest = 0; + helpers.each(arrayOfThings, function(thing) { + // Undefined strings and arrays should not be measured + if (thing !== undefined && thing !== null && helpers.isArray(thing) !== true) { + longest = helpers.measureText(ctx, data, gc, longest, thing); + } else if (helpers.isArray(thing)) { + // if it is an array lets measure each element + // to do maybe simplify this function a bit so we can do this more recursively? + helpers.each(thing, function(nestedThing) { + // Undefined strings and arrays should not be measured + if (nestedThing !== undefined && nestedThing !== null && !helpers.isArray(nestedThing)) { + longest = helpers.measureText(ctx, data, gc, longest, nestedThing); + } + }); + } + }); + + var gcLen = gc.length / 2; + if (gcLen > arrayOfThings.length) { + for (var i = 0; i < gcLen; i++) { + delete data[gc[i]]; + } + gc.splice(0, gcLen); + } + return longest; + }; + helpers.measureText = function(ctx, data, gc, longest, string) { + var textWidth = data[string]; + if (!textWidth) { + textWidth = data[string] = ctx.measureText(string).width; + gc.push(string); + } + if (textWidth > longest) { + longest = textWidth; + } + return longest; + }; + helpers.numberOfLabelLines = function(arrayOfThings) { + var numberOfLines = 1; + helpers.each(arrayOfThings, function(thing) { + if (helpers.isArray(thing)) { + if (thing.length > numberOfLines) { + numberOfLines = thing.length; + } + } + }); + return numberOfLines; + }; + + helpers.color = !color ? + function(value) { + console.error('Color.js not found!'); + return value; + } : + function(value) { + /* global CanvasGradient */ + if (value instanceof CanvasGradient) { + value = defaults.global.defaultColor; + } + + return color(value); + }; + + helpers.getHoverColor = function(colorValue) { + /* global CanvasPattern */ + return (colorValue instanceof CanvasPattern) ? + colorValue : + helpers.color(colorValue).saturate(0.5).darken(0.1).rgbString(); + }; +}; + +},{"25":25,"3":3,"45":45}],28:[function(require,module,exports){ +'use strict'; + +var helpers = require(45); + +/** + * Helper function to get relative position for an event + * @param {Event|IEvent} event - The event to get the position for + * @param {Chart} chart - The chart + * @returns {Point} the event position + */ +function getRelativePosition(e, chart) { + if (e.native) { + return { + x: e.x, + y: e.y + }; + } + + return helpers.getRelativePosition(e, chart); +} + +/** + * Helper function to traverse all of the visible elements in the chart + * @param chart {chart} the chart + * @param handler {Function} the callback to execute for each visible item + */ +function parseVisibleItems(chart, handler) { + var datasets = chart.data.datasets; + var meta, i, j, ilen, jlen; + + for (i = 0, ilen = datasets.length; i < ilen; ++i) { + if (!chart.isDatasetVisible(i)) { + continue; + } + + meta = chart.getDatasetMeta(i); + for (j = 0, jlen = meta.data.length; j < jlen; ++j) { + var element = meta.data[j]; + if (!element._view.skip) { + handler(element); + } + } + } +} + +/** + * Helper function to get the items that intersect the event position + * @param items {ChartElement[]} elements to filter + * @param position {Point} the point to be nearest to + * @return {ChartElement[]} the nearest items + */ +function getIntersectItems(chart, position) { + var elements = []; + + parseVisibleItems(chart, function(element) { + if (element.inRange(position.x, position.y)) { + elements.push(element); + } + }); + + return elements; +} + +/** + * Helper function to get the items nearest to the event position considering all visible items in teh chart + * @param chart {Chart} the chart to look at elements from + * @param position {Point} the point to be nearest to + * @param intersect {Boolean} if true, only consider items that intersect the position + * @param distanceMetric {Function} function to provide the distance between points + * @return {ChartElement[]} the nearest items + */ +function getNearestItems(chart, position, intersect, distanceMetric) { + var minDistance = Number.POSITIVE_INFINITY; + var nearestItems = []; + + parseVisibleItems(chart, function(element) { + if (intersect && !element.inRange(position.x, position.y)) { + return; + } + + var center = element.getCenterPoint(); + var distance = distanceMetric(position, center); + + if (distance < minDistance) { + nearestItems = [element]; + minDistance = distance; + } else if (distance === minDistance) { + // Can have multiple items at the same distance in which case we sort by size + nearestItems.push(element); + } + }); + + return nearestItems; +} + +/** + * Get a distance metric function for two points based on the + * axis mode setting + * @param {String} axis the axis mode. x|y|xy + */ +function getDistanceMetricForAxis(axis) { + var useX = axis.indexOf('x') !== -1; + var useY = axis.indexOf('y') !== -1; + + return function(pt1, pt2) { + var deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0; + var deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0; + return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2)); + }; +} + +function indexMode(chart, e, options) { + var position = getRelativePosition(e, chart); + // Default axis for index mode is 'x' to match old behaviour + options.axis = options.axis || 'x'; + var distanceMetric = getDistanceMetricForAxis(options.axis); + var items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric); + var elements = []; + + if (!items.length) { + return []; + } + + chart.data.datasets.forEach(function(dataset, datasetIndex) { + if (chart.isDatasetVisible(datasetIndex)) { + var meta = chart.getDatasetMeta(datasetIndex); + var element = meta.data[items[0]._index]; + + // don't count items that are skipped (null data) + if (element && !element._view.skip) { + elements.push(element); + } + } + }); + + return elements; +} + +/** + * @interface IInteractionOptions + */ +/** + * If true, only consider items that intersect the point + * @name IInterfaceOptions#boolean + * @type Boolean + */ + +/** + * Contains interaction related functions + * @namespace Chart.Interaction + */ +module.exports = { + // Helper function for different modes + modes: { + single: function(chart, e) { + var position = getRelativePosition(e, chart); + var elements = []; + + parseVisibleItems(chart, function(element) { + if (element.inRange(position.x, position.y)) { + elements.push(element); + return elements; + } + }); + + return elements.slice(0, 1); + }, + + /** + * @function Chart.Interaction.modes.label + * @deprecated since version 2.4.0 + * @todo remove at version 3 + * @private + */ + label: indexMode, + + /** + * Returns items at the same index. If the options.intersect parameter is true, we only return items if we intersect something + * If the options.intersect mode is false, we find the nearest item and return the items at the same index as that item + * @function Chart.Interaction.modes.index + * @since v2.4.0 + * @param chart {chart} the chart we are returning items from + * @param e {Event} the event we are find things at + * @param options {IInteractionOptions} options to use during interaction + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + index: indexMode, + + /** + * Returns items in the same dataset. If the options.intersect parameter is true, we only return items if we intersect something + * If the options.intersect is false, we find the nearest item and return the items in that dataset + * @function Chart.Interaction.modes.dataset + * @param chart {chart} the chart we are returning items from + * @param e {Event} the event we are find things at + * @param options {IInteractionOptions} options to use during interaction + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + dataset: function(chart, e, options) { + var position = getRelativePosition(e, chart); + options.axis = options.axis || 'xy'; + var distanceMetric = getDistanceMetricForAxis(options.axis); + var items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric); + + if (items.length > 0) { + items = chart.getDatasetMeta(items[0]._datasetIndex).data; + } + + return items; + }, + + /** + * @function Chart.Interaction.modes.x-axis + * @deprecated since version 2.4.0. Use index mode and intersect == true + * @todo remove at version 3 + * @private + */ + 'x-axis': function(chart, e) { + return indexMode(chart, e, {intersect: false}); + }, + + /** + * Point mode returns all elements that hit test based on the event position + * of the event + * @function Chart.Interaction.modes.intersect + * @param chart {chart} the chart we are returning items from + * @param e {Event} the event we are find things at + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + point: function(chart, e) { + var position = getRelativePosition(e, chart); + return getIntersectItems(chart, position); + }, + + /** + * nearest mode returns the element closest to the point + * @function Chart.Interaction.modes.intersect + * @param chart {chart} the chart we are returning items from + * @param e {Event} the event we are find things at + * @param options {IInteractionOptions} options to use + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + nearest: function(chart, e, options) { + var position = getRelativePosition(e, chart); + options.axis = options.axis || 'xy'; + var distanceMetric = getDistanceMetricForAxis(options.axis); + var nearestItems = getNearestItems(chart, position, options.intersect, distanceMetric); + + // We have multiple items at the same distance from the event. Now sort by smallest + if (nearestItems.length > 1) { + nearestItems.sort(function(a, b) { + var sizeA = a.getArea(); + var sizeB = b.getArea(); + var ret = sizeA - sizeB; + + if (ret === 0) { + // if equal sort by dataset index + ret = a._datasetIndex - b._datasetIndex; + } + + return ret; + }); + } + + // Return only 1 item + return nearestItems.slice(0, 1); + }, + + /** + * x mode returns the elements that hit-test at the current x coordinate + * @function Chart.Interaction.modes.x + * @param chart {chart} the chart we are returning items from + * @param e {Event} the event we are find things at + * @param options {IInteractionOptions} options to use + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + x: function(chart, e, options) { + var position = getRelativePosition(e, chart); + var items = []; + var intersectsItem = false; + + parseVisibleItems(chart, function(element) { + if (element.inXRange(position.x)) { + items.push(element); + } + + if (element.inRange(position.x, position.y)) { + intersectsItem = true; + } + }); + + // If we want to trigger on an intersect and we don't have any items + // that intersect the position, return nothing + if (options.intersect && !intersectsItem) { + items = []; + } + return items; + }, + + /** + * y mode returns the elements that hit-test at the current y coordinate + * @function Chart.Interaction.modes.y + * @param chart {chart} the chart we are returning items from + * @param e {Event} the event we are find things at + * @param options {IInteractionOptions} options to use + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + y: function(chart, e, options) { + var position = getRelativePosition(e, chart); + var items = []; + var intersectsItem = false; + + parseVisibleItems(chart, function(element) { + if (element.inYRange(position.y)) { + items.push(element); + } + + if (element.inRange(position.x, position.y)) { + intersectsItem = true; + } + }); + + // If we want to trigger on an intersect and we don't have any items + // that intersect the position, return nothing + if (options.intersect && !intersectsItem) { + items = []; + } + return items; + } + } +}; + +},{"45":45}],29:[function(require,module,exports){ +'use strict'; + +var defaults = require(25); + +defaults._set('global', { + responsive: true, + responsiveAnimationDuration: 0, + maintainAspectRatio: true, + events: ['mousemove', 'mouseout', 'click', 'touchstart', 'touchmove'], + hover: { + onHover: null, + mode: 'nearest', + intersect: true, + animationDuration: 400 + }, + onClick: null, + defaultColor: 'rgba(0,0,0,0.1)', + defaultFontColor: '#666', + defaultFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif", + defaultFontSize: 12, + defaultFontStyle: 'normal', + showLines: true, + + // Element defaults defined in element extensions + elements: {}, + + // Layout options such as padding + layout: { + padding: { + top: 0, + right: 0, + bottom: 0, + left: 0 + } + } +}); + +module.exports = function() { + + // Occupy the global variable of Chart, and create a simple base class + var Chart = function(item, config) { + this.construct(item, config); + return this; + }; + + Chart.Chart = Chart; + + return Chart; +}; + +},{"25":25}],30:[function(require,module,exports){ +'use strict'; + +var helpers = require(45); + +module.exports = function(Chart) { + + function filterByPosition(array, position) { + return helpers.where(array, function(v) { + return v.position === position; + }); + } + + function sortByWeight(array, reverse) { + array.forEach(function(v, i) { + v._tmpIndex_ = i; + return v; + }); + array.sort(function(a, b) { + var v0 = reverse ? b : a; + var v1 = reverse ? a : b; + return v0.weight === v1.weight ? + v0._tmpIndex_ - v1._tmpIndex_ : + v0.weight - v1.weight; + }); + array.forEach(function(v) { + delete v._tmpIndex_; + }); + } + + /** + * @interface ILayoutItem + * @prop {String} position - The position of the item in the chart layout. Possible values are + * 'left', 'top', 'right', 'bottom', and 'chartArea' + * @prop {Number} weight - The weight used to sort the item. Higher weights are further away from the chart area + * @prop {Boolean} fullWidth - if true, and the item is horizontal, then push vertical boxes down + * @prop {Function} isHorizontal - returns true if the layout item is horizontal (ie. top or bottom) + * @prop {Function} update - Takes two parameters: width and height. Returns size of item + * @prop {Function} getPadding - Returns an object with padding on the edges + * @prop {Number} width - Width of item. Must be valid after update() + * @prop {Number} height - Height of item. Must be valid after update() + * @prop {Number} left - Left edge of the item. Set by layout system and cannot be used in update + * @prop {Number} top - Top edge of the item. Set by layout system and cannot be used in update + * @prop {Number} right - Right edge of the item. Set by layout system and cannot be used in update + * @prop {Number} bottom - Bottom edge of the item. Set by layout system and cannot be used in update + */ + + // The layout service is very self explanatory. It's responsible for the layout within a chart. + // Scales, Legends and Plugins all rely on the layout service and can easily register to be placed anywhere they need + // It is this service's responsibility of carrying out that layout. + Chart.layoutService = { + defaults: {}, + + /** + * Register a box to a chart. + * A box is simply a reference to an object that requires layout. eg. Scales, Legend, Title. + * @param {Chart} chart - the chart to use + * @param {ILayoutItem} item - the item to add to be layed out + */ + addBox: function(chart, item) { + if (!chart.boxes) { + chart.boxes = []; + } + + // initialize item with default values + item.fullWidth = item.fullWidth || false; + item.position = item.position || 'top'; + item.weight = item.weight || 0; + + chart.boxes.push(item); + }, + + /** + * Remove a layoutItem from a chart + * @param {Chart} chart - the chart to remove the box from + * @param {Object} layoutItem - the item to remove from the layout + */ + removeBox: function(chart, layoutItem) { + var index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1; + if (index !== -1) { + chart.boxes.splice(index, 1); + } + }, + + /** + * Sets (or updates) options on the given `item`. + * @param {Chart} chart - the chart in which the item lives (or will be added to) + * @param {Object} item - the item to configure with the given options + * @param {Object} options - the new item options. + */ + configure: function(chart, item, options) { + var props = ['fullWidth', 'position', 'weight']; + var ilen = props.length; + var i = 0; + var prop; + + for (; i < ilen; ++i) { + prop = props[i]; + if (options.hasOwnProperty(prop)) { + item[prop] = options[prop]; + } + } + }, + + /** + * Fits boxes of the given chart into the given size by having each box measure itself + * then running a fitting algorithm + * @param {Chart} chart - the chart + * @param {Number} width - the width to fit into + * @param {Number} height - the height to fit into + */ + update: function(chart, width, height) { + if (!chart) { + return; + } + + var layoutOptions = chart.options.layout || {}; + var padding = helpers.options.toPadding(layoutOptions.padding); + var leftPadding = padding.left; + var rightPadding = padding.right; + var topPadding = padding.top; + var bottomPadding = padding.bottom; + + var leftBoxes = filterByPosition(chart.boxes, 'left'); + var rightBoxes = filterByPosition(chart.boxes, 'right'); + var topBoxes = filterByPosition(chart.boxes, 'top'); + var bottomBoxes = filterByPosition(chart.boxes, 'bottom'); + var chartAreaBoxes = filterByPosition(chart.boxes, 'chartArea'); + + // Sort boxes by weight. A higher weight is further away from the chart area + sortByWeight(leftBoxes, true); + sortByWeight(rightBoxes, false); + sortByWeight(topBoxes, true); + sortByWeight(bottomBoxes, false); + + // Essentially we now have any number of boxes on each of the 4 sides. + // Our canvas looks like the following. + // The areas L1 and L2 are the left axes. R1 is the right axis, T1 is the top axis and + // B1 is the bottom axis + // There are also 4 quadrant-like locations (left to right instead of clockwise) reserved for chart overlays + // These locations are single-box locations only, when trying to register a chartArea location that is already taken, + // an error will be thrown. + // + // |----------------------------------------------------| + // | T1 (Full Width) | + // |----------------------------------------------------| + // | | | T2 | | + // | |----|-------------------------------------|----| + // | | | C1 | | C2 | | + // | | |----| |----| | + // | | | | | + // | L1 | L2 | ChartArea (C0) | R1 | + // | | | | | + // | | |----| |----| | + // | | | C3 | | C4 | | + // | |----|-------------------------------------|----| + // | | | B1 | | + // |----------------------------------------------------| + // | B2 (Full Width) | + // |----------------------------------------------------| + // + // What we do to find the best sizing, we do the following + // 1. Determine the minimum size of the chart area. + // 2. Split the remaining width equally between each vertical axis + // 3. Split the remaining height equally between each horizontal axis + // 4. Give each layout the maximum size it can be. The layout will return it's minimum size + // 5. Adjust the sizes of each axis based on it's minimum reported size. + // 6. Refit each axis + // 7. Position each axis in the final location + // 8. Tell the chart the final location of the chart area + // 9. Tell any axes that overlay the chart area the positions of the chart area + + // Step 1 + var chartWidth = width - leftPadding - rightPadding; + var chartHeight = height - topPadding - bottomPadding; + var chartAreaWidth = chartWidth / 2; // min 50% + var chartAreaHeight = chartHeight / 2; // min 50% + + // Step 2 + var verticalBoxWidth = (width - chartAreaWidth) / (leftBoxes.length + rightBoxes.length); + + // Step 3 + var horizontalBoxHeight = (height - chartAreaHeight) / (topBoxes.length + bottomBoxes.length); + + // Step 4 + var maxChartAreaWidth = chartWidth; + var maxChartAreaHeight = chartHeight; + var minBoxSizes = []; + + function getMinimumBoxSize(box) { + var minSize; + var isHorizontal = box.isHorizontal(); + + if (isHorizontal) { + minSize = box.update(box.fullWidth ? chartWidth : maxChartAreaWidth, horizontalBoxHeight); + maxChartAreaHeight -= minSize.height; + } else { + minSize = box.update(verticalBoxWidth, chartAreaHeight); + maxChartAreaWidth -= minSize.width; + } + + minBoxSizes.push({ + horizontal: isHorizontal, + minSize: minSize, + box: box, + }); + } + + helpers.each(leftBoxes.concat(rightBoxes, topBoxes, bottomBoxes), getMinimumBoxSize); + + // If a horizontal box has padding, we move the left boxes over to avoid ugly charts (see issue #2478) + var maxHorizontalLeftPadding = 0; + var maxHorizontalRightPadding = 0; + var maxVerticalTopPadding = 0; + var maxVerticalBottomPadding = 0; + + helpers.each(topBoxes.concat(bottomBoxes), function(horizontalBox) { + if (horizontalBox.getPadding) { + var boxPadding = horizontalBox.getPadding(); + maxHorizontalLeftPadding = Math.max(maxHorizontalLeftPadding, boxPadding.left); + maxHorizontalRightPadding = Math.max(maxHorizontalRightPadding, boxPadding.right); + } + }); + + helpers.each(leftBoxes.concat(rightBoxes), function(verticalBox) { + if (verticalBox.getPadding) { + var boxPadding = verticalBox.getPadding(); + maxVerticalTopPadding = Math.max(maxVerticalTopPadding, boxPadding.top); + maxVerticalBottomPadding = Math.max(maxVerticalBottomPadding, boxPadding.bottom); + } + }); + + // At this point, maxChartAreaHeight and maxChartAreaWidth are the size the chart area could + // be if the axes are drawn at their minimum sizes. + // Steps 5 & 6 + var totalLeftBoxesWidth = leftPadding; + var totalRightBoxesWidth = rightPadding; + var totalTopBoxesHeight = topPadding; + var totalBottomBoxesHeight = bottomPadding; + + // Function to fit a box + function fitBox(box) { + var minBoxSize = helpers.findNextWhere(minBoxSizes, function(minBox) { + return minBox.box === box; + }); + + if (minBoxSize) { + if (box.isHorizontal()) { + var scaleMargin = { + left: Math.max(totalLeftBoxesWidth, maxHorizontalLeftPadding), + right: Math.max(totalRightBoxesWidth, maxHorizontalRightPadding), + top: 0, + bottom: 0 + }; + + // Don't use min size here because of label rotation. When the labels are rotated, their rotation highly depends + // on the margin. Sometimes they need to increase in size slightly + box.update(box.fullWidth ? chartWidth : maxChartAreaWidth, chartHeight / 2, scaleMargin); + } else { + box.update(minBoxSize.minSize.width, maxChartAreaHeight); + } + } + } + + // Update, and calculate the left and right margins for the horizontal boxes + helpers.each(leftBoxes.concat(rightBoxes), fitBox); + + helpers.each(leftBoxes, function(box) { + totalLeftBoxesWidth += box.width; + }); + + helpers.each(rightBoxes, function(box) { + totalRightBoxesWidth += box.width; + }); + + // Set the Left and Right margins for the horizontal boxes + helpers.each(topBoxes.concat(bottomBoxes), fitBox); + + // Figure out how much margin is on the top and bottom of the vertical boxes + helpers.each(topBoxes, function(box) { + totalTopBoxesHeight += box.height; + }); + + helpers.each(bottomBoxes, function(box) { + totalBottomBoxesHeight += box.height; + }); + + function finalFitVerticalBox(box) { + var minBoxSize = helpers.findNextWhere(minBoxSizes, function(minSize) { + return minSize.box === box; + }); + + var scaleMargin = { + left: 0, + right: 0, + top: totalTopBoxesHeight, + bottom: totalBottomBoxesHeight + }; + + if (minBoxSize) { + box.update(minBoxSize.minSize.width, maxChartAreaHeight, scaleMargin); + } + } + + // Let the left layout know the final margin + helpers.each(leftBoxes.concat(rightBoxes), finalFitVerticalBox); + + // Recalculate because the size of each layout might have changed slightly due to the margins (label rotation for instance) + totalLeftBoxesWidth = leftPadding; + totalRightBoxesWidth = rightPadding; + totalTopBoxesHeight = topPadding; + totalBottomBoxesHeight = bottomPadding; + + helpers.each(leftBoxes, function(box) { + totalLeftBoxesWidth += box.width; + }); + + helpers.each(rightBoxes, function(box) { + totalRightBoxesWidth += box.width; + }); + + helpers.each(topBoxes, function(box) { + totalTopBoxesHeight += box.height; + }); + helpers.each(bottomBoxes, function(box) { + totalBottomBoxesHeight += box.height; + }); + + // We may be adding some padding to account for rotated x axis labels + var leftPaddingAddition = Math.max(maxHorizontalLeftPadding - totalLeftBoxesWidth, 0); + totalLeftBoxesWidth += leftPaddingAddition; + totalRightBoxesWidth += Math.max(maxHorizontalRightPadding - totalRightBoxesWidth, 0); + + var topPaddingAddition = Math.max(maxVerticalTopPadding - totalTopBoxesHeight, 0); + totalTopBoxesHeight += topPaddingAddition; + totalBottomBoxesHeight += Math.max(maxVerticalBottomPadding - totalBottomBoxesHeight, 0); + + // Figure out if our chart area changed. This would occur if the dataset layout label rotation + // changed due to the application of the margins in step 6. Since we can only get bigger, this is safe to do + // without calling `fit` again + var newMaxChartAreaHeight = height - totalTopBoxesHeight - totalBottomBoxesHeight; + var newMaxChartAreaWidth = width - totalLeftBoxesWidth - totalRightBoxesWidth; + + if (newMaxChartAreaWidth !== maxChartAreaWidth || newMaxChartAreaHeight !== maxChartAreaHeight) { + helpers.each(leftBoxes, function(box) { + box.height = newMaxChartAreaHeight; + }); + + helpers.each(rightBoxes, function(box) { + box.height = newMaxChartAreaHeight; + }); + + helpers.each(topBoxes, function(box) { + if (!box.fullWidth) { + box.width = newMaxChartAreaWidth; + } + }); + + helpers.each(bottomBoxes, function(box) { + if (!box.fullWidth) { + box.width = newMaxChartAreaWidth; + } + }); + + maxChartAreaHeight = newMaxChartAreaHeight; + maxChartAreaWidth = newMaxChartAreaWidth; + } + + // Step 7 - Position the boxes + var left = leftPadding + leftPaddingAddition; + var top = topPadding + topPaddingAddition; + + function placeBox(box) { + if (box.isHorizontal()) { + box.left = box.fullWidth ? leftPadding : totalLeftBoxesWidth; + box.right = box.fullWidth ? width - rightPadding : totalLeftBoxesWidth + maxChartAreaWidth; + box.top = top; + box.bottom = top + box.height; + + // Move to next point + top = box.bottom; + + } else { + + box.left = left; + box.right = left + box.width; + box.top = totalTopBoxesHeight; + box.bottom = totalTopBoxesHeight + maxChartAreaHeight; + + // Move to next point + left = box.right; + } + } + + helpers.each(leftBoxes.concat(topBoxes), placeBox); + + // Account for chart width and height + left += maxChartAreaWidth; + top += maxChartAreaHeight; + + helpers.each(rightBoxes, placeBox); + helpers.each(bottomBoxes, placeBox); + + // Step 8 + chart.chartArea = { + left: totalLeftBoxesWidth, + top: totalTopBoxesHeight, + right: totalLeftBoxesWidth + maxChartAreaWidth, + bottom: totalTopBoxesHeight + maxChartAreaHeight + }; + + // Step 9 + helpers.each(chartAreaBoxes, function(box) { + box.left = chart.chartArea.left; + box.top = chart.chartArea.top; + box.right = chart.chartArea.right; + box.bottom = chart.chartArea.bottom; + + box.update(maxChartAreaWidth, maxChartAreaHeight); + }); + } + }; +}; + +},{"45":45}],31:[function(require,module,exports){ +'use strict'; + +var defaults = require(25); +var Element = require(26); +var helpers = require(45); + +defaults._set('global', { + plugins: {} +}); + +module.exports = function(Chart) { + + /** + * The plugin service singleton + * @namespace Chart.plugins + * @since 2.1.0 + */ + Chart.plugins = { + /** + * Globally registered plugins. + * @private + */ + _plugins: [], + + /** + * This identifier is used to invalidate the descriptors cache attached to each chart + * when a global plugin is registered or unregistered. In this case, the cache ID is + * incremented and descriptors are regenerated during following API calls. + * @private + */ + _cacheId: 0, + + /** + * Registers the given plugin(s) if not already registered. + * @param {Array|Object} plugins plugin instance(s). + */ + register: function(plugins) { + var p = this._plugins; + ([]).concat(plugins).forEach(function(plugin) { + if (p.indexOf(plugin) === -1) { + p.push(plugin); + } + }); + + this._cacheId++; + }, + + /** + * Unregisters the given plugin(s) only if registered. + * @param {Array|Object} plugins plugin instance(s). + */ + unregister: function(plugins) { + var p = this._plugins; + ([]).concat(plugins).forEach(function(plugin) { + var idx = p.indexOf(plugin); + if (idx !== -1) { + p.splice(idx, 1); + } + }); + + this._cacheId++; + }, + + /** + * Remove all registered plugins. + * @since 2.1.5 + */ + clear: function() { + this._plugins = []; + this._cacheId++; + }, + + /** + * Returns the number of registered plugins? + * @returns {Number} + * @since 2.1.5 + */ + count: function() { + return this._plugins.length; + }, + + /** + * Returns all registered plugin instances. + * @returns {Array} array of plugin objects. + * @since 2.1.5 + */ + getAll: function() { + return this._plugins; + }, + + /** + * Calls enabled plugins for `chart` on the specified hook and with the given args. + * This method immediately returns as soon as a plugin explicitly returns false. The + * returned value can be used, for instance, to interrupt the current action. + * @param {Object} chart - The chart instance for which plugins should be called. + * @param {String} hook - The name of the plugin method to call (e.g. 'beforeUpdate'). + * @param {Array} [args] - Extra arguments to apply to the hook call. + * @returns {Boolean} false if any of the plugins return false, else returns true. + */ + notify: function(chart, hook, args) { + var descriptors = this.descriptors(chart); + var ilen = descriptors.length; + var i, descriptor, plugin, params, method; + + for (i = 0; i < ilen; ++i) { + descriptor = descriptors[i]; + plugin = descriptor.plugin; + method = plugin[hook]; + if (typeof method === 'function') { + params = [chart].concat(args || []); + params.push(descriptor.options); + if (method.apply(plugin, params) === false) { + return false; + } + } + } + + return true; + }, + + /** + * Returns descriptors of enabled plugins for the given chart. + * @returns {Array} [{ plugin, options }] + * @private + */ + descriptors: function(chart) { + var cache = chart._plugins || (chart._plugins = {}); + if (cache.id === this._cacheId) { + return cache.descriptors; + } + + var plugins = []; + var descriptors = []; + var config = (chart && chart.config) || {}; + var options = (config.options && config.options.plugins) || {}; + + this._plugins.concat(config.plugins || []).forEach(function(plugin) { + var idx = plugins.indexOf(plugin); + if (idx !== -1) { + return; + } + + var id = plugin.id; + var opts = options[id]; + if (opts === false) { + return; + } + + if (opts === true) { + opts = helpers.clone(defaults.global.plugins[id]); + } + + plugins.push(plugin); + descriptors.push({ + plugin: plugin, + options: opts || {} + }); + }); + + cache.descriptors = descriptors; + cache.id = this._cacheId; + return descriptors; + } + }; + + /** + * Plugin extension hooks. + * @interface IPlugin + * @since 2.1.0 + */ + /** + * @method IPlugin#beforeInit + * @desc Called before initializing `chart`. + * @param {Chart.Controller} chart - The chart instance. + * @param {Object} options - The plugin options. + */ + /** + * @method IPlugin#afterInit + * @desc Called after `chart` has been initialized and before the first update. + * @param {Chart.Controller} chart - The chart instance. + * @param {Object} options - The plugin options. + */ + /** + * @method IPlugin#beforeUpdate + * @desc Called before updating `chart`. If any plugin returns `false`, the update + * is cancelled (and thus subsequent render(s)) until another `update` is triggered. + * @param {Chart.Controller} chart - The chart instance. + * @param {Object} options - The plugin options. + * @returns {Boolean} `false` to cancel the chart update. + */ + /** + * @method IPlugin#afterUpdate + * @desc Called after `chart` has been updated and before rendering. Note that this + * hook will not be called if the chart update has been previously cancelled. + * @param {Chart.Controller} chart - The chart instance. + * @param {Object} options - The plugin options. + */ + /** + * @method IPlugin#beforeDatasetsUpdate + * @desc Called before updating the `chart` datasets. If any plugin returns `false`, + * the datasets update is cancelled until another `update` is triggered. + * @param {Chart.Controller} chart - The chart instance. + * @param {Object} options - The plugin options. + * @returns {Boolean} false to cancel the datasets update. + * @since version 2.1.5 + */ + /** + * @method IPlugin#afterDatasetsUpdate + * @desc Called after the `chart` datasets have been updated. Note that this hook + * will not be called if the datasets update has been previously cancelled. + * @param {Chart.Controller} chart - The chart instance. + * @param {Object} options - The plugin options. + * @since version 2.1.5 + */ + /** + * @method IPlugin#beforeDatasetUpdate + * @desc Called before updating the `chart` dataset at the given `args.index`. If any plugin + * returns `false`, the datasets update is cancelled until another `update` is triggered. + * @param {Chart} chart - The chart instance. + * @param {Object} args - The call arguments. + * @param {Number} args.index - The dataset index. + * @param {Object} args.meta - The dataset metadata. + * @param {Object} options - The plugin options. + * @returns {Boolean} `false` to cancel the chart datasets drawing. + */ + /** + * @method IPlugin#afterDatasetUpdate + * @desc Called after the `chart` datasets at the given `args.index` has been updated. Note + * that this hook will not be called if the datasets update has been previously cancelled. + * @param {Chart} chart - The chart instance. + * @param {Object} args - The call arguments. + * @param {Number} args.index - The dataset index. + * @param {Object} args.meta - The dataset metadata. + * @param {Object} options - The plugin options. + */ + /** + * @method IPlugin#beforeLayout + * @desc Called before laying out `chart`. If any plugin returns `false`, + * the layout update is cancelled until another `update` is triggered. + * @param {Chart.Controller} chart - The chart instance. + * @param {Object} options - The plugin options. + * @returns {Boolean} `false` to cancel the chart layout. + */ + /** + * @method IPlugin#afterLayout + * @desc Called after the `chart` has been layed out. Note that this hook will not + * be called if the layout update has been previously cancelled. + * @param {Chart.Controller} chart - The chart instance. + * @param {Object} options - The plugin options. + */ + /** + * @method IPlugin#beforeRender + * @desc Called before rendering `chart`. If any plugin returns `false`, + * the rendering is cancelled until another `render` is triggered. + * @param {Chart.Controller} chart - The chart instance. + * @param {Object} options - The plugin options. + * @returns {Boolean} `false` to cancel the chart rendering. + */ + /** + * @method IPlugin#afterRender + * @desc Called after the `chart` has been fully rendered (and animation completed). Note + * that this hook will not be called if the rendering has been previously cancelled. + * @param {Chart.Controller} chart - The chart instance. + * @param {Object} options - The plugin options. + */ + /** + * @method IPlugin#beforeDraw + * @desc Called before drawing `chart` at every animation frame specified by the given + * easing value. If any plugin returns `false`, the frame drawing is cancelled until + * another `render` is triggered. + * @param {Chart.Controller} chart - The chart instance. + * @param {Number} easingValue - The current animation value, between 0.0 and 1.0. + * @param {Object} options - The plugin options. + * @returns {Boolean} `false` to cancel the chart drawing. + */ + /** + * @method IPlugin#afterDraw + * @desc Called after the `chart` has been drawn for the specific easing value. Note + * that this hook will not be called if the drawing has been previously cancelled. + * @param {Chart.Controller} chart - The chart instance. + * @param {Number} easingValue - The current animation value, between 0.0 and 1.0. + * @param {Object} options - The plugin options. + */ + /** + * @method IPlugin#beforeDatasetsDraw + * @desc Called before drawing the `chart` datasets. If any plugin returns `false`, + * the datasets drawing is cancelled until another `render` is triggered. + * @param {Chart.Controller} chart - The chart instance. + * @param {Number} easingValue - The current animation value, between 0.0 and 1.0. + * @param {Object} options - The plugin options. + * @returns {Boolean} `false` to cancel the chart datasets drawing. + */ + /** + * @method IPlugin#afterDatasetsDraw + * @desc Called after the `chart` datasets have been drawn. Note that this hook + * will not be called if the datasets drawing has been previously cancelled. + * @param {Chart.Controller} chart - The chart instance. + * @param {Number} easingValue - The current animation value, between 0.0 and 1.0. + * @param {Object} options - The plugin options. + */ + /** + * @method IPlugin#beforeDatasetDraw + * @desc Called before drawing the `chart` dataset at the given `args.index` (datasets + * are drawn in the reverse order). If any plugin returns `false`, the datasets drawing + * is cancelled until another `render` is triggered. + * @param {Chart} chart - The chart instance. + * @param {Object} args - The call arguments. + * @param {Number} args.index - The dataset index. + * @param {Object} args.meta - The dataset metadata. + * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0. + * @param {Object} options - The plugin options. + * @returns {Boolean} `false` to cancel the chart datasets drawing. + */ + /** + * @method IPlugin#afterDatasetDraw + * @desc Called after the `chart` datasets at the given `args.index` have been drawn + * (datasets are drawn in the reverse order). Note that this hook will not be called + * if the datasets drawing has been previously cancelled. + * @param {Chart} chart - The chart instance. + * @param {Object} args - The call arguments. + * @param {Number} args.index - The dataset index. + * @param {Object} args.meta - The dataset metadata. + * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0. + * @param {Object} options - The plugin options. + */ + /** + * @method IPlugin#beforeTooltipDraw + * @desc Called before drawing the `tooltip`. If any plugin returns `false`, + * the tooltip drawing is cancelled until another `render` is triggered. + * @param {Chart} chart - The chart instance. + * @param {Object} args - The call arguments. + * @param {Object} args.tooltip - The tooltip. + * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0. + * @param {Object} options - The plugin options. + * @returns {Boolean} `false` to cancel the chart tooltip drawing. + */ + /** + * @method IPlugin#afterTooltipDraw + * @desc Called after drawing the `tooltip`. Note that this hook will not + * be called if the tooltip drawing has been previously cancelled. + * @param {Chart} chart - The chart instance. + * @param {Object} args - The call arguments. + * @param {Object} args.tooltip - The tooltip. + * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0. + * @param {Object} options - The plugin options. + */ + /** + * @method IPlugin#beforeEvent + * @desc Called before processing the specified `event`. If any plugin returns `false`, + * the event will be discarded. + * @param {Chart.Controller} chart - The chart instance. + * @param {IEvent} event - The event object. + * @param {Object} options - The plugin options. + */ + /** + * @method IPlugin#afterEvent + * @desc Called after the `event` has been consumed. Note that this hook + * will not be called if the `event` has been previously discarded. + * @param {Chart.Controller} chart - The chart instance. + * @param {IEvent} event - The event object. + * @param {Object} options - The plugin options. + */ + /** + * @method IPlugin#resize + * @desc Called after the chart as been resized. + * @param {Chart.Controller} chart - The chart instance. + * @param {Number} size - The new canvas display size (eq. canvas.style width & height). + * @param {Object} options - The plugin options. + */ + /** + * @method IPlugin#destroy + * @desc Called after the chart as been destroyed. + * @param {Chart.Controller} chart - The chart instance. + * @param {Object} options - The plugin options. + */ + + /** + * Provided for backward compatibility, use Chart.plugins instead + * @namespace Chart.pluginService + * @deprecated since version 2.1.5 + * @todo remove at version 3 + * @private + */ + Chart.pluginService = Chart.plugins; + + /** + * Provided for backward compatibility, inheriting from Chart.PlugingBase has no + * effect, instead simply create/register plugins via plain JavaScript objects. + * @interface Chart.PluginBase + * @deprecated since version 2.5.0 + * @todo remove at version 3 + * @private + */ + Chart.PluginBase = Element.extend({}); +}; + +},{"25":25,"26":26,"45":45}],32:[function(require,module,exports){ +'use strict'; + +var defaults = require(25); +var Element = require(26); +var helpers = require(45); +var Ticks = require(34); + +defaults._set('scale', { + display: true, + position: 'left', + offset: false, + + // grid line settings + gridLines: { + display: true, + color: 'rgba(0, 0, 0, 0.1)', + lineWidth: 1, + drawBorder: true, + drawOnChartArea: true, + drawTicks: true, + tickMarkLength: 10, + zeroLineWidth: 1, + zeroLineColor: 'rgba(0,0,0,0.25)', + zeroLineBorderDash: [], + zeroLineBorderDashOffset: 0.0, + offsetGridLines: false, + borderDash: [], + borderDashOffset: 0.0 + }, + + // scale label + scaleLabel: { + // display property + display: false, + + // actual label + labelString: '', + + // line height + lineHeight: 1.2, + + // top/bottom padding + padding: { + top: 4, + bottom: 4 + } + }, + + // label settings + ticks: { + beginAtZero: false, + minRotation: 0, + maxRotation: 50, + mirror: false, + padding: 0, + reverse: false, + display: true, + autoSkip: true, + autoSkipPadding: 0, + labelOffset: 0, + // We pass through arrays to be rendered as multiline labels, we convert Others to strings here. + callback: Ticks.formatters.values, + minor: {}, + major: {} + } +}); + +function labelsFromTicks(ticks) { + var labels = []; + var i, ilen; + + for (i = 0, ilen = ticks.length; i < ilen; ++i) { + labels.push(ticks[i].label); + } + + return labels; +} + +function getLineValue(scale, index, offsetGridLines) { + var lineValue = scale.getPixelForTick(index); + + if (offsetGridLines) { + if (index === 0) { + lineValue -= (scale.getPixelForTick(1) - lineValue) / 2; + } else { + lineValue -= (lineValue - scale.getPixelForTick(index - 1)) / 2; + } + } + return lineValue; +} + +module.exports = function(Chart) { + + function computeTextSize(context, tick, font) { + return helpers.isArray(tick) ? + helpers.longestText(context, font, tick) : + context.measureText(tick).width; + } + + function parseFontOptions(options) { + var valueOrDefault = helpers.valueOrDefault; + var globalDefaults = defaults.global; + var size = valueOrDefault(options.fontSize, globalDefaults.defaultFontSize); + var style = valueOrDefault(options.fontStyle, globalDefaults.defaultFontStyle); + var family = valueOrDefault(options.fontFamily, globalDefaults.defaultFontFamily); + + return { + size: size, + style: style, + family: family, + font: helpers.fontString(size, style, family) + }; + } + + function parseLineHeight(options) { + return helpers.options.toLineHeight( + helpers.valueOrDefault(options.lineHeight, 1.2), + helpers.valueOrDefault(options.fontSize, defaults.global.defaultFontSize)); + } + + Chart.Scale = Element.extend({ + /** + * Get the padding needed for the scale + * @method getPadding + * @private + * @returns {Padding} the necessary padding + */ + getPadding: function() { + var me = this; + return { + left: me.paddingLeft || 0, + top: me.paddingTop || 0, + right: me.paddingRight || 0, + bottom: me.paddingBottom || 0 + }; + }, + + /** + * Returns the scale tick objects ({label, major}) + * @since 2.7 + */ + getTicks: function() { + return this._ticks; + }, + + // These methods are ordered by lifecyle. Utilities then follow. + // Any function defined here is inherited by all scale types. + // Any function can be extended by the scale type + + mergeTicksOptions: function() { + var ticks = this.options.ticks; + if (ticks.minor === false) { + ticks.minor = { + display: false + }; + } + if (ticks.major === false) { + ticks.major = { + display: false + }; + } + for (var key in ticks) { + if (key !== 'major' && key !== 'minor') { + if (typeof ticks.minor[key] === 'undefined') { + ticks.minor[key] = ticks[key]; + } + if (typeof ticks.major[key] === 'undefined') { + ticks.major[key] = ticks[key]; + } + } + } + }, + beforeUpdate: function() { + helpers.callback(this.options.beforeUpdate, [this]); + }, + update: function(maxWidth, maxHeight, margins) { + var me = this; + var i, ilen, labels, label, ticks, tick; + + // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;) + me.beforeUpdate(); + + // Absorb the master measurements + me.maxWidth = maxWidth; + me.maxHeight = maxHeight; + me.margins = helpers.extend({ + left: 0, + right: 0, + top: 0, + bottom: 0 + }, margins); + me.longestTextCache = me.longestTextCache || {}; + + // Dimensions + me.beforeSetDimensions(); + me.setDimensions(); + me.afterSetDimensions(); + + // Data min/max + me.beforeDataLimits(); + me.determineDataLimits(); + me.afterDataLimits(); + + // Ticks - `this.ticks` is now DEPRECATED! + // Internal ticks are now stored as objects in the PRIVATE `this._ticks` member + // and must not be accessed directly from outside this class. `this.ticks` being + // around for long time and not marked as private, we can't change its structure + // without unexpected breaking changes. If you need to access the scale ticks, + // use scale.getTicks() instead. + + me.beforeBuildTicks(); + + // New implementations should return an array of objects but for BACKWARD COMPAT, + // we still support no return (`this.ticks` internally set by calling this method). + ticks = me.buildTicks() || []; + + me.afterBuildTicks(); + + me.beforeTickToLabelConversion(); + + // New implementations should return the formatted tick labels but for BACKWARD + // COMPAT, we still support no return (`this.ticks` internally changed by calling + // this method and supposed to contain only string values). + labels = me.convertTicksToLabels(ticks) || me.ticks; + + me.afterTickToLabelConversion(); + + me.ticks = labels; // BACKWARD COMPATIBILITY + + // IMPORTANT: from this point, we consider that `this.ticks` will NEVER change! + + // BACKWARD COMPAT: synchronize `_ticks` with labels (so potentially `this.ticks`) + for (i = 0, ilen = labels.length; i < ilen; ++i) { + label = labels[i]; + tick = ticks[i]; + if (!tick) { + ticks.push(tick = { + label: label, + major: false + }); + } else { + tick.label = label; + } + } + + me._ticks = ticks; + + // Tick Rotation + me.beforeCalculateTickRotation(); + me.calculateTickRotation(); + me.afterCalculateTickRotation(); + // Fit + me.beforeFit(); + me.fit(); + me.afterFit(); + // + me.afterUpdate(); + + return me.minSize; + + }, + afterUpdate: function() { + helpers.callback(this.options.afterUpdate, [this]); + }, + + // + + beforeSetDimensions: function() { + helpers.callback(this.options.beforeSetDimensions, [this]); + }, + setDimensions: function() { + var me = this; + // Set the unconstrained dimension before label rotation + if (me.isHorizontal()) { + // Reset position before calculating rotation + me.width = me.maxWidth; + me.left = 0; + me.right = me.width; + } else { + me.height = me.maxHeight; + + // Reset position before calculating rotation + me.top = 0; + me.bottom = me.height; + } + + // Reset padding + me.paddingLeft = 0; + me.paddingTop = 0; + me.paddingRight = 0; + me.paddingBottom = 0; + }, + afterSetDimensions: function() { + helpers.callback(this.options.afterSetDimensions, [this]); + }, + + // Data limits + beforeDataLimits: function() { + helpers.callback(this.options.beforeDataLimits, [this]); + }, + determineDataLimits: helpers.noop, + afterDataLimits: function() { + helpers.callback(this.options.afterDataLimits, [this]); + }, + + // + beforeBuildTicks: function() { + helpers.callback(this.options.beforeBuildTicks, [this]); + }, + buildTicks: helpers.noop, + afterBuildTicks: function() { + helpers.callback(this.options.afterBuildTicks, [this]); + }, + + beforeTickToLabelConversion: function() { + helpers.callback(this.options.beforeTickToLabelConversion, [this]); + }, + convertTicksToLabels: function() { + var me = this; + // Convert ticks to strings + var tickOpts = me.options.ticks; + me.ticks = me.ticks.map(tickOpts.userCallback || tickOpts.callback, this); + }, + afterTickToLabelConversion: function() { + helpers.callback(this.options.afterTickToLabelConversion, [this]); + }, + + // + + beforeCalculateTickRotation: function() { + helpers.callback(this.options.beforeCalculateTickRotation, [this]); + }, + calculateTickRotation: function() { + var me = this; + var context = me.ctx; + var tickOpts = me.options.ticks; + var labels = labelsFromTicks(me._ticks); + + // Get the width of each grid by calculating the difference + // between x offsets between 0 and 1. + var tickFont = parseFontOptions(tickOpts); + context.font = tickFont.font; + + var labelRotation = tickOpts.minRotation || 0; + + if (labels.length && me.options.display && me.isHorizontal()) { + var originalLabelWidth = helpers.longestText(context, tickFont.font, labels, me.longestTextCache); + var labelWidth = originalLabelWidth; + var cosRotation, sinRotation; + + // Allow 3 pixels x2 padding either side for label readability + var tickWidth = me.getPixelForTick(1) - me.getPixelForTick(0) - 6; + + // Max label rotation can be set or default to 90 - also act as a loop counter + while (labelWidth > tickWidth && labelRotation < tickOpts.maxRotation) { + var angleRadians = helpers.toRadians(labelRotation); + cosRotation = Math.cos(angleRadians); + sinRotation = Math.sin(angleRadians); + + if (sinRotation * originalLabelWidth > me.maxHeight) { + // go back one step + labelRotation--; + break; + } + + labelRotation++; + labelWidth = cosRotation * originalLabelWidth; + } + } + + me.labelRotation = labelRotation; + }, + afterCalculateTickRotation: function() { + helpers.callback(this.options.afterCalculateTickRotation, [this]); + }, + + // + + beforeFit: function() { + helpers.callback(this.options.beforeFit, [this]); + }, + fit: function() { + var me = this; + // Reset + var minSize = me.minSize = { + width: 0, + height: 0 + }; + + var labels = labelsFromTicks(me._ticks); + + var opts = me.options; + var tickOpts = opts.ticks; + var scaleLabelOpts = opts.scaleLabel; + var gridLineOpts = opts.gridLines; + var display = opts.display; + var isHorizontal = me.isHorizontal(); + + var tickFont = parseFontOptions(tickOpts); + var tickMarkLength = opts.gridLines.tickMarkLength; + + // Width + if (isHorizontal) { + // subtract the margins to line up with the chartArea if we are a full width scale + minSize.width = me.isFullWidth() ? me.maxWidth - me.margins.left - me.margins.right : me.maxWidth; + } else { + minSize.width = display && gridLineOpts.drawTicks ? tickMarkLength : 0; + } + + // height + if (isHorizontal) { + minSize.height = display && gridLineOpts.drawTicks ? tickMarkLength : 0; + } else { + minSize.height = me.maxHeight; // fill all the height + } + + // Are we showing a title for the scale? + if (scaleLabelOpts.display && display) { + var scaleLabelLineHeight = parseLineHeight(scaleLabelOpts); + var scaleLabelPadding = helpers.options.toPadding(scaleLabelOpts.padding); + var deltaHeight = scaleLabelLineHeight + scaleLabelPadding.height; + + if (isHorizontal) { + minSize.height += deltaHeight; + } else { + minSize.width += deltaHeight; + } + } + + // Don't bother fitting the ticks if we are not showing them + if (tickOpts.display && display) { + var largestTextWidth = helpers.longestText(me.ctx, tickFont.font, labels, me.longestTextCache); + var tallestLabelHeightInLines = helpers.numberOfLabelLines(labels); + var lineSpace = tickFont.size * 0.5; + var tickPadding = me.options.ticks.padding; + + if (isHorizontal) { + // A horizontal axis is more constrained by the height. + me.longestLabelWidth = largestTextWidth; + + var angleRadians = helpers.toRadians(me.labelRotation); + var cosRotation = Math.cos(angleRadians); + var sinRotation = Math.sin(angleRadians); + + // TODO - improve this calculation + var labelHeight = (sinRotation * largestTextWidth) + + (tickFont.size * tallestLabelHeightInLines) + + (lineSpace * (tallestLabelHeightInLines - 1)) + + lineSpace; // padding + + minSize.height = Math.min(me.maxHeight, minSize.height + labelHeight + tickPadding); + + me.ctx.font = tickFont.font; + var firstLabelWidth = computeTextSize(me.ctx, labels[0], tickFont.font); + var lastLabelWidth = computeTextSize(me.ctx, labels[labels.length - 1], tickFont.font); + + // Ensure that our ticks are always inside the canvas. When rotated, ticks are right aligned + // which means that the right padding is dominated by the font height + if (me.labelRotation !== 0) { + me.paddingLeft = opts.position === 'bottom' ? (cosRotation * firstLabelWidth) + 3 : (cosRotation * lineSpace) + 3; // add 3 px to move away from canvas edges + me.paddingRight = opts.position === 'bottom' ? (cosRotation * lineSpace) + 3 : (cosRotation * lastLabelWidth) + 3; + } else { + me.paddingLeft = firstLabelWidth / 2 + 3; // add 3 px to move away from canvas edges + me.paddingRight = lastLabelWidth / 2 + 3; + } + } else { + // A vertical axis is more constrained by the width. Labels are the + // dominant factor here, so get that length first and account for padding + if (tickOpts.mirror) { + largestTextWidth = 0; + } else { + // use lineSpace for consistency with horizontal axis + // tickPadding is not implemented for horizontal + largestTextWidth += tickPadding + lineSpace; + } + + minSize.width = Math.min(me.maxWidth, minSize.width + largestTextWidth); + + me.paddingTop = tickFont.size / 2; + me.paddingBottom = tickFont.size / 2; + } + } + + me.handleMargins(); + + me.width = minSize.width; + me.height = minSize.height; + }, + + /** + * Handle margins and padding interactions + * @private + */ + handleMargins: function() { + var me = this; + if (me.margins) { + me.paddingLeft = Math.max(me.paddingLeft - me.margins.left, 0); + me.paddingTop = Math.max(me.paddingTop - me.margins.top, 0); + me.paddingRight = Math.max(me.paddingRight - me.margins.right, 0); + me.paddingBottom = Math.max(me.paddingBottom - me.margins.bottom, 0); + } + }, + + afterFit: function() { + helpers.callback(this.options.afterFit, [this]); + }, + + // Shared Methods + isHorizontal: function() { + return this.options.position === 'top' || this.options.position === 'bottom'; + }, + isFullWidth: function() { + return (this.options.fullWidth); + }, + + // Get the correct value. NaN bad inputs, If the value type is object get the x or y based on whether we are horizontal or not + getRightValue: function(rawValue) { + // Null and undefined values first + if (helpers.isNullOrUndef(rawValue)) { + return NaN; + } + // isNaN(object) returns true, so make sure NaN is checking for a number; Discard Infinite values + if (typeof rawValue === 'number' && !isFinite(rawValue)) { + return NaN; + } + // If it is in fact an object, dive in one more level + if (rawValue) { + if (this.isHorizontal()) { + if (rawValue.x !== undefined) { + return this.getRightValue(rawValue.x); + } + } else if (rawValue.y !== undefined) { + return this.getRightValue(rawValue.y); + } + } + + // Value is good, return it + return rawValue; + }, + + /** + * Used to get the value to display in the tooltip for the data at the given index + * @param index + * @param datasetIndex + */ + getLabelForIndex: helpers.noop, + + /** + * Returns the location of the given data point. Value can either be an index or a numerical value + * The coordinate (0, 0) is at the upper-left corner of the canvas + * @param value + * @param index + * @param datasetIndex + */ + getPixelForValue: helpers.noop, + + /** + * Used to get the data value from a given pixel. This is the inverse of getPixelForValue + * The coordinate (0, 0) is at the upper-left corner of the canvas + * @param pixel + */ + getValueForPixel: helpers.noop, + + /** + * Returns the location of the tick at the given index + * The coordinate (0, 0) is at the upper-left corner of the canvas + */ + getPixelForTick: function(index) { + var me = this; + var offset = me.options.offset; + if (me.isHorizontal()) { + var innerWidth = me.width - (me.paddingLeft + me.paddingRight); + var tickWidth = innerWidth / Math.max((me._ticks.length - (offset ? 0 : 1)), 1); + var pixel = (tickWidth * index) + me.paddingLeft; + + if (offset) { + pixel += tickWidth / 2; + } + + var finalVal = me.left + Math.round(pixel); + finalVal += me.isFullWidth() ? me.margins.left : 0; + return finalVal; + } + var innerHeight = me.height - (me.paddingTop + me.paddingBottom); + return me.top + (index * (innerHeight / (me._ticks.length - 1))); + }, + + /** + * Utility for getting the pixel location of a percentage of scale + * The coordinate (0, 0) is at the upper-left corner of the canvas + */ + getPixelForDecimal: function(decimal) { + var me = this; + if (me.isHorizontal()) { + var innerWidth = me.width - (me.paddingLeft + me.paddingRight); + var valueOffset = (innerWidth * decimal) + me.paddingLeft; + + var finalVal = me.left + Math.round(valueOffset); + finalVal += me.isFullWidth() ? me.margins.left : 0; + return finalVal; + } + return me.top + (decimal * me.height); + }, + + /** + * Returns the pixel for the minimum chart value + * The coordinate (0, 0) is at the upper-left corner of the canvas + */ + getBasePixel: function() { + return this.getPixelForValue(this.getBaseValue()); + }, + + getBaseValue: function() { + var me = this; + var min = me.min; + var max = me.max; + + return me.beginAtZero ? 0 : + min < 0 && max < 0 ? max : + min > 0 && max > 0 ? min : + 0; + }, + + /** + * Returns a subset of ticks to be plotted to avoid overlapping labels. + * @private + */ + _autoSkip: function(ticks) { + var skipRatio; + var me = this; + var isHorizontal = me.isHorizontal(); + var optionTicks = me.options.ticks.minor; + var tickCount = ticks.length; + var labelRotationRadians = helpers.toRadians(me.labelRotation); + var cosRotation = Math.cos(labelRotationRadians); + var longestRotatedLabel = me.longestLabelWidth * cosRotation; + var result = []; + var i, tick, shouldSkip; + + // figure out the maximum number of gridlines to show + var maxTicks; + if (optionTicks.maxTicksLimit) { + maxTicks = optionTicks.maxTicksLimit; + } + + if (isHorizontal) { + skipRatio = false; + + if ((longestRotatedLabel + optionTicks.autoSkipPadding) * tickCount > (me.width - (me.paddingLeft + me.paddingRight))) { + skipRatio = 1 + Math.floor(((longestRotatedLabel + optionTicks.autoSkipPadding) * tickCount) / (me.width - (me.paddingLeft + me.paddingRight))); + } + + // if they defined a max number of optionTicks, + // increase skipRatio until that number is met + if (maxTicks && tickCount > maxTicks) { + skipRatio = Math.max(skipRatio, Math.floor(tickCount / maxTicks)); + } + } + + for (i = 0; i < tickCount; i++) { + tick = ticks[i]; + + // Since we always show the last tick,we need may need to hide the last shown one before + shouldSkip = (skipRatio > 1 && i % skipRatio > 0) || (i % skipRatio === 0 && i + skipRatio >= tickCount); + if (shouldSkip && i !== tickCount - 1) { + // leave tick in place but make sure it's not displayed (#4635) + delete tick.label; + } + result.push(tick); + } + return result; + }, + + // Actually draw the scale on the canvas + // @param {rectangle} chartArea : the area of the chart to draw full grid lines on + draw: function(chartArea) { + var me = this; + var options = me.options; + if (!options.display) { + return; + } + + var context = me.ctx; + var globalDefaults = defaults.global; + var optionTicks = options.ticks.minor; + var optionMajorTicks = options.ticks.major || optionTicks; + var gridLines = options.gridLines; + var scaleLabel = options.scaleLabel; + + var isRotated = me.labelRotation !== 0; + var isHorizontal = me.isHorizontal(); + + var ticks = optionTicks.autoSkip ? me._autoSkip(me.getTicks()) : me.getTicks(); + var tickFontColor = helpers.valueOrDefault(optionTicks.fontColor, globalDefaults.defaultFontColor); + var tickFont = parseFontOptions(optionTicks); + var majorTickFontColor = helpers.valueOrDefault(optionMajorTicks.fontColor, globalDefaults.defaultFontColor); + var majorTickFont = parseFontOptions(optionMajorTicks); + + var tl = gridLines.drawTicks ? gridLines.tickMarkLength : 0; + + var scaleLabelFontColor = helpers.valueOrDefault(scaleLabel.fontColor, globalDefaults.defaultFontColor); + var scaleLabelFont = parseFontOptions(scaleLabel); + var scaleLabelPadding = helpers.options.toPadding(scaleLabel.padding); + var labelRotationRadians = helpers.toRadians(me.labelRotation); + + var itemsToDraw = []; + + var xTickStart = options.position === 'right' ? me.left : me.right - tl; + var xTickEnd = options.position === 'right' ? me.left + tl : me.right; + var yTickStart = options.position === 'bottom' ? me.top : me.bottom - tl; + var yTickEnd = options.position === 'bottom' ? me.top + tl : me.bottom; + + helpers.each(ticks, function(tick, index) { + // autoskipper skipped this tick (#4635) + if (helpers.isNullOrUndef(tick.label)) { + return; + } + + var label = tick.label; + var lineWidth, lineColor, borderDash, borderDashOffset; + if (index === me.zeroLineIndex && options.offset === gridLines.offsetGridLines) { + // Draw the first index specially + lineWidth = gridLines.zeroLineWidth; + lineColor = gridLines.zeroLineColor; + borderDash = gridLines.zeroLineBorderDash; + borderDashOffset = gridLines.zeroLineBorderDashOffset; + } else { + lineWidth = helpers.valueAtIndexOrDefault(gridLines.lineWidth, index); + lineColor = helpers.valueAtIndexOrDefault(gridLines.color, index); + borderDash = helpers.valueOrDefault(gridLines.borderDash, globalDefaults.borderDash); + borderDashOffset = helpers.valueOrDefault(gridLines.borderDashOffset, globalDefaults.borderDashOffset); + } + + // Common properties + var tx1, ty1, tx2, ty2, x1, y1, x2, y2, labelX, labelY; + var textAlign = 'middle'; + var textBaseline = 'middle'; + var tickPadding = optionTicks.padding; + + if (isHorizontal) { + var labelYOffset = tl + tickPadding; + + if (options.position === 'bottom') { + // bottom + textBaseline = !isRotated ? 'top' : 'middle'; + textAlign = !isRotated ? 'center' : 'right'; + labelY = me.top + labelYOffset; + } else { + // top + textBaseline = !isRotated ? 'bottom' : 'middle'; + textAlign = !isRotated ? 'center' : 'left'; + labelY = me.bottom - labelYOffset; + } + + var xLineValue = getLineValue(me, index, gridLines.offsetGridLines && ticks.length > 1); + if (xLineValue < me.left) { + lineColor = 'rgba(0,0,0,0)'; + } + xLineValue += helpers.aliasPixel(lineWidth); + + labelX = me.getPixelForTick(index) + optionTicks.labelOffset; // x values for optionTicks (need to consider offsetLabel option) + + tx1 = tx2 = x1 = x2 = xLineValue; + ty1 = yTickStart; + ty2 = yTickEnd; + y1 = chartArea.top; + y2 = chartArea.bottom; + } else { + var isLeft = options.position === 'left'; + var labelXOffset; + + if (optionTicks.mirror) { + textAlign = isLeft ? 'left' : 'right'; + labelXOffset = tickPadding; + } else { + textAlign = isLeft ? 'right' : 'left'; + labelXOffset = tl + tickPadding; + } + + labelX = isLeft ? me.right - labelXOffset : me.left + labelXOffset; + + var yLineValue = getLineValue(me, index, gridLines.offsetGridLines && ticks.length > 1); + if (yLineValue < me.top) { + lineColor = 'rgba(0,0,0,0)'; + } + yLineValue += helpers.aliasPixel(lineWidth); + + labelY = me.getPixelForTick(index) + optionTicks.labelOffset; + + tx1 = xTickStart; + tx2 = xTickEnd; + x1 = chartArea.left; + x2 = chartArea.right; + ty1 = ty2 = y1 = y2 = yLineValue; + } + + itemsToDraw.push({ + tx1: tx1, + ty1: ty1, + tx2: tx2, + ty2: ty2, + x1: x1, + y1: y1, + x2: x2, + y2: y2, + labelX: labelX, + labelY: labelY, + glWidth: lineWidth, + glColor: lineColor, + glBorderDash: borderDash, + glBorderDashOffset: borderDashOffset, + rotation: -1 * labelRotationRadians, + label: label, + major: tick.major, + textBaseline: textBaseline, + textAlign: textAlign + }); + }); + + // Draw all of the tick labels, tick marks, and grid lines at the correct places + helpers.each(itemsToDraw, function(itemToDraw) { + if (gridLines.display) { + context.save(); + context.lineWidth = itemToDraw.glWidth; + context.strokeStyle = itemToDraw.glColor; + if (context.setLineDash) { + context.setLineDash(itemToDraw.glBorderDash); + context.lineDashOffset = itemToDraw.glBorderDashOffset; + } + + context.beginPath(); + + if (gridLines.drawTicks) { + context.moveTo(itemToDraw.tx1, itemToDraw.ty1); + context.lineTo(itemToDraw.tx2, itemToDraw.ty2); + } + + if (gridLines.drawOnChartArea) { + context.moveTo(itemToDraw.x1, itemToDraw.y1); + context.lineTo(itemToDraw.x2, itemToDraw.y2); + } + + context.stroke(); + context.restore(); + } + + if (optionTicks.display) { + // Make sure we draw text in the correct color and font + context.save(); + context.translate(itemToDraw.labelX, itemToDraw.labelY); + context.rotate(itemToDraw.rotation); + context.font = itemToDraw.major ? majorTickFont.font : tickFont.font; + context.fillStyle = itemToDraw.major ? majorTickFontColor : tickFontColor; + context.textBaseline = itemToDraw.textBaseline; + context.textAlign = itemToDraw.textAlign; + + var label = itemToDraw.label; + if (helpers.isArray(label)) { + for (var i = 0, y = 0; i < label.length; ++i) { + // We just make sure the multiline element is a string here.. + context.fillText('' + label[i], 0, y); + // apply same lineSpacing as calculated @ L#320 + y += (tickFont.size * 1.5); + } + } else { + context.fillText(label, 0, 0); + } + context.restore(); + } + }); + + if (scaleLabel.display) { + // Draw the scale label + var scaleLabelX; + var scaleLabelY; + var rotation = 0; + var halfLineHeight = parseLineHeight(scaleLabel) / 2; + + if (isHorizontal) { + scaleLabelX = me.left + ((me.right - me.left) / 2); // midpoint of the width + scaleLabelY = options.position === 'bottom' + ? me.bottom - halfLineHeight - scaleLabelPadding.bottom + : me.top + halfLineHeight + scaleLabelPadding.top; + } else { + var isLeft = options.position === 'left'; + scaleLabelX = isLeft + ? me.left + halfLineHeight + scaleLabelPadding.top + : me.right - halfLineHeight - scaleLabelPadding.top; + scaleLabelY = me.top + ((me.bottom - me.top) / 2); + rotation = isLeft ? -0.5 * Math.PI : 0.5 * Math.PI; + } + + context.save(); + context.translate(scaleLabelX, scaleLabelY); + context.rotate(rotation); + context.textAlign = 'center'; + context.textBaseline = 'middle'; + context.fillStyle = scaleLabelFontColor; // render in correct colour + context.font = scaleLabelFont.font; + context.fillText(scaleLabel.labelString, 0, 0); + context.restore(); + } + + if (gridLines.drawBorder) { + // Draw the line at the edge of the axis + context.lineWidth = helpers.valueAtIndexOrDefault(gridLines.lineWidth, 0); + context.strokeStyle = helpers.valueAtIndexOrDefault(gridLines.color, 0); + var x1 = me.left; + var x2 = me.right; + var y1 = me.top; + var y2 = me.bottom; + + var aliasPixel = helpers.aliasPixel(context.lineWidth); + if (isHorizontal) { + y1 = y2 = options.position === 'top' ? me.bottom : me.top; + y1 += aliasPixel; + y2 += aliasPixel; + } else { + x1 = x2 = options.position === 'left' ? me.right : me.left; + x1 += aliasPixel; + x2 += aliasPixel; + } + + context.beginPath(); + context.moveTo(x1, y1); + context.lineTo(x2, y2); + context.stroke(); + } + } + }); +}; + +},{"25":25,"26":26,"34":34,"45":45}],33:[function(require,module,exports){ +'use strict'; + +var defaults = require(25); +var helpers = require(45); + +module.exports = function(Chart) { + + Chart.scaleService = { + // Scale registration object. Extensions can register new scale types (such as log or DB scales) and then + // use the new chart options to grab the correct scale + constructors: {}, + // Use a registration function so that we can move to an ES6 map when we no longer need to support + // old browsers + + // Scale config defaults + defaults: {}, + registerScaleType: function(type, scaleConstructor, scaleDefaults) { + this.constructors[type] = scaleConstructor; + this.defaults[type] = helpers.clone(scaleDefaults); + }, + getScaleConstructor: function(type) { + return this.constructors.hasOwnProperty(type) ? this.constructors[type] : undefined; + }, + getScaleDefaults: function(type) { + // Return the scale defaults merged with the global settings so that we always use the latest ones + return this.defaults.hasOwnProperty(type) ? helpers.merge({}, [defaults.scale, this.defaults[type]]) : {}; + }, + updateScaleDefaults: function(type, additions) { + var me = this; + if (me.defaults.hasOwnProperty(type)) { + me.defaults[type] = helpers.extend(me.defaults[type], additions); + } + }, + addScalesToLayout: function(chart) { + // Adds each scale to the chart.boxes array to be sized accordingly + helpers.each(chart.scales, function(scale) { + // Set ILayoutItem parameters for backwards compatibility + scale.fullWidth = scale.options.fullWidth; + scale.position = scale.options.position; + scale.weight = scale.options.weight; + Chart.layoutService.addBox(chart, scale); + }); + } + }; +}; + +},{"25":25,"45":45}],34:[function(require,module,exports){ +'use strict'; + +var helpers = require(45); + +/** + * Namespace to hold static tick generation functions + * @namespace Chart.Ticks + */ +module.exports = { + /** + * Namespace to hold generators for different types of ticks + * @namespace Chart.Ticks.generators + */ + generators: { + /** + * Interface for the options provided to the numeric tick generator + * @interface INumericTickGenerationOptions + */ + /** + * The maximum number of ticks to display + * @name INumericTickGenerationOptions#maxTicks + * @type Number + */ + /** + * The distance between each tick. + * @name INumericTickGenerationOptions#stepSize + * @type Number + * @optional + */ + /** + * Forced minimum for the ticks. If not specified, the minimum of the data range is used to calculate the tick minimum + * @name INumericTickGenerationOptions#min + * @type Number + * @optional + */ + /** + * The maximum value of the ticks. If not specified, the maximum of the data range is used to calculate the tick maximum + * @name INumericTickGenerationOptions#max + * @type Number + * @optional + */ + + /** + * Generate a set of linear ticks + * @method Chart.Ticks.generators.linear + * @param generationOptions {INumericTickGenerationOptions} the options used to generate the ticks + * @param dataRange {IRange} the range of the data + * @returns {Array} array of tick values + */ + linear: function(generationOptions, dataRange) { + var ticks = []; + // To get a "nice" value for the tick spacing, we will use the appropriately named + // "nice number" algorithm. See http://stackoverflow.com/questions/8506881/nice-label-algorithm-for-charts-with-minimum-ticks + // for details. + + var spacing; + if (generationOptions.stepSize && generationOptions.stepSize > 0) { + spacing = generationOptions.stepSize; + } else { + var niceRange = helpers.niceNum(dataRange.max - dataRange.min, false); + spacing = helpers.niceNum(niceRange / (generationOptions.maxTicks - 1), true); + } + var niceMin = Math.floor(dataRange.min / spacing) * spacing; + var niceMax = Math.ceil(dataRange.max / spacing) * spacing; + + // If min, max and stepSize is set and they make an evenly spaced scale use it. + if (generationOptions.min && generationOptions.max && generationOptions.stepSize) { + // If very close to our whole number, use it. + if (helpers.almostWhole((generationOptions.max - generationOptions.min) / generationOptions.stepSize, spacing / 1000)) { + niceMin = generationOptions.min; + niceMax = generationOptions.max; + } + } + + var numSpaces = (niceMax - niceMin) / spacing; + // If very close to our rounded value, use it. + if (helpers.almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) { + numSpaces = Math.round(numSpaces); + } else { + numSpaces = Math.ceil(numSpaces); + } + + // Put the values into the ticks array + ticks.push(generationOptions.min !== undefined ? generationOptions.min : niceMin); + for (var j = 1; j < numSpaces; ++j) { + ticks.push(niceMin + (j * spacing)); + } + ticks.push(generationOptions.max !== undefined ? generationOptions.max : niceMax); + + return ticks; + }, + + /** + * Generate a set of logarithmic ticks + * @method Chart.Ticks.generators.logarithmic + * @param generationOptions {INumericTickGenerationOptions} the options used to generate the ticks + * @param dataRange {IRange} the range of the data + * @returns {Array} array of tick values + */ + logarithmic: function(generationOptions, dataRange) { + var ticks = []; + var valueOrDefault = helpers.valueOrDefault; + + // Figure out what the max number of ticks we can support it is based on the size of + // the axis area. For now, we say that the minimum tick spacing in pixels must be 50 + // We also limit the maximum number of ticks to 11 which gives a nice 10 squares on + // the graph + var tickVal = valueOrDefault(generationOptions.min, Math.pow(10, Math.floor(helpers.log10(dataRange.min)))); + + var endExp = Math.floor(helpers.log10(dataRange.max)); + var endSignificand = Math.ceil(dataRange.max / Math.pow(10, endExp)); + var exp, significand; + + if (tickVal === 0) { + exp = Math.floor(helpers.log10(dataRange.minNotZero)); + significand = Math.floor(dataRange.minNotZero / Math.pow(10, exp)); + + ticks.push(tickVal); + tickVal = significand * Math.pow(10, exp); + } else { + exp = Math.floor(helpers.log10(tickVal)); + significand = Math.floor(tickVal / Math.pow(10, exp)); + } + + do { + ticks.push(tickVal); + + ++significand; + if (significand === 10) { + significand = 1; + ++exp; + } + + tickVal = significand * Math.pow(10, exp); + } while (exp < endExp || (exp === endExp && significand < endSignificand)); + + var lastTick = valueOrDefault(generationOptions.max, tickVal); + ticks.push(lastTick); + + return ticks; + } + }, + + /** + * Namespace to hold formatters for different types of ticks + * @namespace Chart.Ticks.formatters + */ + formatters: { + /** + * Formatter for value labels + * @method Chart.Ticks.formatters.values + * @param value the value to display + * @return {String|Array} the label to display + */ + values: function(value) { + return helpers.isArray(value) ? value : '' + value; + }, + + /** + * Formatter for linear numeric ticks + * @method Chart.Ticks.formatters.linear + * @param tickValue {Number} the value to be formatted + * @param index {Number} the position of the tickValue parameter in the ticks array + * @param ticks {Array} the list of ticks being converted + * @return {String} string representation of the tickValue parameter + */ + linear: function(tickValue, index, ticks) { + // If we have lots of ticks, don't use the ones + var delta = ticks.length > 3 ? ticks[2] - ticks[1] : ticks[1] - ticks[0]; + + // If we have a number like 2.5 as the delta, figure out how many decimal places we need + if (Math.abs(delta) > 1) { + if (tickValue !== Math.floor(tickValue)) { + // not an integer + delta = tickValue - Math.floor(tickValue); + } + } + + var logDelta = helpers.log10(Math.abs(delta)); + var tickString = ''; + + if (tickValue !== 0) { + var numDecimal = -1 * Math.floor(logDelta); + numDecimal = Math.max(Math.min(numDecimal, 20), 0); // toFixed has a max of 20 decimal places + tickString = tickValue.toFixed(numDecimal); + } else { + tickString = '0'; // never show decimal places for 0 + } + + return tickString; + }, + + logarithmic: function(tickValue, index, ticks) { + var remain = tickValue / (Math.pow(10, Math.floor(helpers.log10(tickValue)))); + + if (tickValue === 0) { + return '0'; + } else if (remain === 1 || remain === 2 || remain === 5 || index === 0 || index === ticks.length - 1) { + return tickValue.toExponential(); + } + return ''; + } + } +}; + +},{"45":45}],35:[function(require,module,exports){ +'use strict'; + +var defaults = require(25); +var Element = require(26); +var helpers = require(45); + +defaults._set('global', { + tooltips: { + enabled: true, + custom: null, + mode: 'nearest', + position: 'average', + intersect: true, + backgroundColor: 'rgba(0,0,0,0.8)', + titleFontStyle: 'bold', + titleSpacing: 2, + titleMarginBottom: 6, + titleFontColor: '#fff', + titleAlign: 'left', + bodySpacing: 2, + bodyFontColor: '#fff', + bodyAlign: 'left', + footerFontStyle: 'bold', + footerSpacing: 2, + footerMarginTop: 6, + footerFontColor: '#fff', + footerAlign: 'left', + yPadding: 6, + xPadding: 6, + caretPadding: 2, + caretSize: 5, + cornerRadius: 6, + multiKeyBackground: '#fff', + displayColors: true, + borderColor: 'rgba(0,0,0,0)', + borderWidth: 0, + callbacks: { + // Args are: (tooltipItems, data) + beforeTitle: helpers.noop, + title: function(tooltipItems, data) { + // Pick first xLabel for now + var title = ''; + var labels = data.labels; + var labelCount = labels ? labels.length : 0; + + if (tooltipItems.length > 0) { + var item = tooltipItems[0]; + + if (item.xLabel) { + title = item.xLabel; + } else if (labelCount > 0 && item.index < labelCount) { + title = labels[item.index]; + } + } + + return title; + }, + afterTitle: helpers.noop, + + // Args are: (tooltipItems, data) + beforeBody: helpers.noop, + + // Args are: (tooltipItem, data) + beforeLabel: helpers.noop, + label: function(tooltipItem, data) { + var label = data.datasets[tooltipItem.datasetIndex].label || ''; + + if (label) { + label += ': '; + } + label += tooltipItem.yLabel; + return label; + }, + labelColor: function(tooltipItem, chart) { + var meta = chart.getDatasetMeta(tooltipItem.datasetIndex); + var activeElement = meta.data[tooltipItem.index]; + var view = activeElement._view; + return { + borderColor: view.borderColor, + backgroundColor: view.backgroundColor + }; + }, + labelTextColor: function() { + return this._options.bodyFontColor; + }, + afterLabel: helpers.noop, + + // Args are: (tooltipItems, data) + afterBody: helpers.noop, + + // Args are: (tooltipItems, data) + beforeFooter: helpers.noop, + footer: helpers.noop, + afterFooter: helpers.noop + } + } +}); + +module.exports = function(Chart) { + + /** + * Helper method to merge the opacity into a color + */ + function mergeOpacity(colorString, opacity) { + var color = helpers.color(colorString); + return color.alpha(opacity * color.alpha()).rgbaString(); + } + + // Helper to push or concat based on if the 2nd parameter is an array or not + function pushOrConcat(base, toPush) { + if (toPush) { + if (helpers.isArray(toPush)) { + // base = base.concat(toPush); + Array.prototype.push.apply(base, toPush); + } else { + base.push(toPush); + } + } + + return base; + } + + // Private helper to create a tooltip item model + // @param element : the chart element (point, arc, bar) to create the tooltip item for + // @return : new tooltip item + function createTooltipItem(element) { + var xScale = element._xScale; + var yScale = element._yScale || element._scale; // handle radar || polarArea charts + var index = element._index; + var datasetIndex = element._datasetIndex; + + return { + xLabel: xScale ? xScale.getLabelForIndex(index, datasetIndex) : '', + yLabel: yScale ? yScale.getLabelForIndex(index, datasetIndex) : '', + index: index, + datasetIndex: datasetIndex, + x: element._model.x, + y: element._model.y + }; + } + + /** + * Helper to get the reset model for the tooltip + * @param tooltipOpts {Object} the tooltip options + */ + function getBaseModel(tooltipOpts) { + var globalDefaults = defaults.global; + var valueOrDefault = helpers.valueOrDefault; + + return { + // Positioning + xPadding: tooltipOpts.xPadding, + yPadding: tooltipOpts.yPadding, + xAlign: tooltipOpts.xAlign, + yAlign: tooltipOpts.yAlign, + + // Body + bodyFontColor: tooltipOpts.bodyFontColor, + _bodyFontFamily: valueOrDefault(tooltipOpts.bodyFontFamily, globalDefaults.defaultFontFamily), + _bodyFontStyle: valueOrDefault(tooltipOpts.bodyFontStyle, globalDefaults.defaultFontStyle), + _bodyAlign: tooltipOpts.bodyAlign, + bodyFontSize: valueOrDefault(tooltipOpts.bodyFontSize, globalDefaults.defaultFontSize), + bodySpacing: tooltipOpts.bodySpacing, + + // Title + titleFontColor: tooltipOpts.titleFontColor, + _titleFontFamily: valueOrDefault(tooltipOpts.titleFontFamily, globalDefaults.defaultFontFamily), + _titleFontStyle: valueOrDefault(tooltipOpts.titleFontStyle, globalDefaults.defaultFontStyle), + titleFontSize: valueOrDefault(tooltipOpts.titleFontSize, globalDefaults.defaultFontSize), + _titleAlign: tooltipOpts.titleAlign, + titleSpacing: tooltipOpts.titleSpacing, + titleMarginBottom: tooltipOpts.titleMarginBottom, + + // Footer + footerFontColor: tooltipOpts.footerFontColor, + _footerFontFamily: valueOrDefault(tooltipOpts.footerFontFamily, globalDefaults.defaultFontFamily), + _footerFontStyle: valueOrDefault(tooltipOpts.footerFontStyle, globalDefaults.defaultFontStyle), + footerFontSize: valueOrDefault(tooltipOpts.footerFontSize, globalDefaults.defaultFontSize), + _footerAlign: tooltipOpts.footerAlign, + footerSpacing: tooltipOpts.footerSpacing, + footerMarginTop: tooltipOpts.footerMarginTop, + + // Appearance + caretSize: tooltipOpts.caretSize, + cornerRadius: tooltipOpts.cornerRadius, + backgroundColor: tooltipOpts.backgroundColor, + opacity: 0, + legendColorBackground: tooltipOpts.multiKeyBackground, + displayColors: tooltipOpts.displayColors, + borderColor: tooltipOpts.borderColor, + borderWidth: tooltipOpts.borderWidth + }; + } + + /** + * Get the size of the tooltip + */ + function getTooltipSize(tooltip, model) { + var ctx = tooltip._chart.ctx; + + var height = model.yPadding * 2; // Tooltip Padding + var width = 0; + + // Count of all lines in the body + var body = model.body; + var combinedBodyLength = body.reduce(function(count, bodyItem) { + return count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length; + }, 0); + combinedBodyLength += model.beforeBody.length + model.afterBody.length; + + var titleLineCount = model.title.length; + var footerLineCount = model.footer.length; + var titleFontSize = model.titleFontSize; + var bodyFontSize = model.bodyFontSize; + var footerFontSize = model.footerFontSize; + + height += titleLineCount * titleFontSize; // Title Lines + height += titleLineCount ? (titleLineCount - 1) * model.titleSpacing : 0; // Title Line Spacing + height += titleLineCount ? model.titleMarginBottom : 0; // Title's bottom Margin + height += combinedBodyLength * bodyFontSize; // Body Lines + height += combinedBodyLength ? (combinedBodyLength - 1) * model.bodySpacing : 0; // Body Line Spacing + height += footerLineCount ? model.footerMarginTop : 0; // Footer Margin + height += footerLineCount * (footerFontSize); // Footer Lines + height += footerLineCount ? (footerLineCount - 1) * model.footerSpacing : 0; // Footer Line Spacing + + // Title width + var widthPadding = 0; + var maxLineWidth = function(line) { + width = Math.max(width, ctx.measureText(line).width + widthPadding); + }; + + ctx.font = helpers.fontString(titleFontSize, model._titleFontStyle, model._titleFontFamily); + helpers.each(model.title, maxLineWidth); + + // Body width + ctx.font = helpers.fontString(bodyFontSize, model._bodyFontStyle, model._bodyFontFamily); + helpers.each(model.beforeBody.concat(model.afterBody), maxLineWidth); + + // Body lines may include some extra width due to the color box + widthPadding = model.displayColors ? (bodyFontSize + 2) : 0; + helpers.each(body, function(bodyItem) { + helpers.each(bodyItem.before, maxLineWidth); + helpers.each(bodyItem.lines, maxLineWidth); + helpers.each(bodyItem.after, maxLineWidth); + }); + + // Reset back to 0 + widthPadding = 0; + + // Footer width + ctx.font = helpers.fontString(footerFontSize, model._footerFontStyle, model._footerFontFamily); + helpers.each(model.footer, maxLineWidth); + + // Add padding + width += 2 * model.xPadding; + + return { + width: width, + height: height + }; + } + + /** + * Helper to get the alignment of a tooltip given the size + */ + function determineAlignment(tooltip, size) { + var model = tooltip._model; + var chart = tooltip._chart; + var chartArea = tooltip._chart.chartArea; + var xAlign = 'center'; + var yAlign = 'center'; + + if (model.y < size.height) { + yAlign = 'top'; + } else if (model.y > (chart.height - size.height)) { + yAlign = 'bottom'; + } + + var lf, rf; // functions to determine left, right alignment + var olf, orf; // functions to determine if left/right alignment causes tooltip to go outside chart + var yf; // function to get the y alignment if the tooltip goes outside of the left or right edges + var midX = (chartArea.left + chartArea.right) / 2; + var midY = (chartArea.top + chartArea.bottom) / 2; + + if (yAlign === 'center') { + lf = function(x) { + return x <= midX; + }; + rf = function(x) { + return x > midX; + }; + } else { + lf = function(x) { + return x <= (size.width / 2); + }; + rf = function(x) { + return x >= (chart.width - (size.width / 2)); + }; + } + + olf = function(x) { + return x + size.width > chart.width; + }; + orf = function(x) { + return x - size.width < 0; + }; + yf = function(y) { + return y <= midY ? 'top' : 'bottom'; + }; + + if (lf(model.x)) { + xAlign = 'left'; + + // Is tooltip too wide and goes over the right side of the chart.? + if (olf(model.x)) { + xAlign = 'center'; + yAlign = yf(model.y); + } + } else if (rf(model.x)) { + xAlign = 'right'; + + // Is tooltip too wide and goes outside left edge of canvas? + if (orf(model.x)) { + xAlign = 'center'; + yAlign = yf(model.y); + } + } + + var opts = tooltip._options; + return { + xAlign: opts.xAlign ? opts.xAlign : xAlign, + yAlign: opts.yAlign ? opts.yAlign : yAlign + }; + } + + /** + * @Helper to get the location a tooltip needs to be placed at given the initial position (via the vm) and the size and alignment + */ + function getBackgroundPoint(vm, size, alignment) { + // Background Position + var x = vm.x; + var y = vm.y; + + var caretSize = vm.caretSize; + var caretPadding = vm.caretPadding; + var cornerRadius = vm.cornerRadius; + var xAlign = alignment.xAlign; + var yAlign = alignment.yAlign; + var paddingAndSize = caretSize + caretPadding; + var radiusAndPadding = cornerRadius + caretPadding; + + if (xAlign === 'right') { + x -= size.width; + } else if (xAlign === 'center') { + x -= (size.width / 2); + } + + if (yAlign === 'top') { + y += paddingAndSize; + } else if (yAlign === 'bottom') { + y -= size.height + paddingAndSize; + } else { + y -= (size.height / 2); + } + + if (yAlign === 'center') { + if (xAlign === 'left') { + x += paddingAndSize; + } else if (xAlign === 'right') { + x -= paddingAndSize; + } + } else if (xAlign === 'left') { + x -= radiusAndPadding; + } else if (xAlign === 'right') { + x += radiusAndPadding; + } + + return { + x: x, + y: y + }; + } + + Chart.Tooltip = Element.extend({ + initialize: function() { + this._model = getBaseModel(this._options); + this._lastActive = []; + }, + + // Get the title + // Args are: (tooltipItem, data) + getTitle: function() { + var me = this; + var opts = me._options; + var callbacks = opts.callbacks; + + var beforeTitle = callbacks.beforeTitle.apply(me, arguments); + var title = callbacks.title.apply(me, arguments); + var afterTitle = callbacks.afterTitle.apply(me, arguments); + + var lines = []; + lines = pushOrConcat(lines, beforeTitle); + lines = pushOrConcat(lines, title); + lines = pushOrConcat(lines, afterTitle); + + return lines; + }, + + // Args are: (tooltipItem, data) + getBeforeBody: function() { + var lines = this._options.callbacks.beforeBody.apply(this, arguments); + return helpers.isArray(lines) ? lines : lines !== undefined ? [lines] : []; + }, + + // Args are: (tooltipItem, data) + getBody: function(tooltipItems, data) { + var me = this; + var callbacks = me._options.callbacks; + var bodyItems = []; + + helpers.each(tooltipItems, function(tooltipItem) { + var bodyItem = { + before: [], + lines: [], + after: [] + }; + pushOrConcat(bodyItem.before, callbacks.beforeLabel.call(me, tooltipItem, data)); + pushOrConcat(bodyItem.lines, callbacks.label.call(me, tooltipItem, data)); + pushOrConcat(bodyItem.after, callbacks.afterLabel.call(me, tooltipItem, data)); + + bodyItems.push(bodyItem); + }); + + return bodyItems; + }, + + // Args are: (tooltipItem, data) + getAfterBody: function() { + var lines = this._options.callbacks.afterBody.apply(this, arguments); + return helpers.isArray(lines) ? lines : lines !== undefined ? [lines] : []; + }, + + // Get the footer and beforeFooter and afterFooter lines + // Args are: (tooltipItem, data) + getFooter: function() { + var me = this; + var callbacks = me._options.callbacks; + + var beforeFooter = callbacks.beforeFooter.apply(me, arguments); + var footer = callbacks.footer.apply(me, arguments); + var afterFooter = callbacks.afterFooter.apply(me, arguments); + + var lines = []; + lines = pushOrConcat(lines, beforeFooter); + lines = pushOrConcat(lines, footer); + lines = pushOrConcat(lines, afterFooter); + + return lines; + }, + + update: function(changed) { + var me = this; + var opts = me._options; + + // Need to regenerate the model because its faster than using extend and it is necessary due to the optimization in Chart.Element.transition + // that does _view = _model if ease === 1. This causes the 2nd tooltip update to set properties in both the view and model at the same time + // which breaks any animations. + var existingModel = me._model; + var model = me._model = getBaseModel(opts); + var active = me._active; + + var data = me._data; + + // In the case where active.length === 0 we need to keep these at existing values for good animations + var alignment = { + xAlign: existingModel.xAlign, + yAlign: existingModel.yAlign + }; + var backgroundPoint = { + x: existingModel.x, + y: existingModel.y + }; + var tooltipSize = { + width: existingModel.width, + height: existingModel.height + }; + var tooltipPosition = { + x: existingModel.caretX, + y: existingModel.caretY + }; + + var i, len; + + if (active.length) { + model.opacity = 1; + + var labelColors = []; + var labelTextColors = []; + tooltipPosition = Chart.Tooltip.positioners[opts.position].call(me, active, me._eventPosition); + + var tooltipItems = []; + for (i = 0, len = active.length; i < len; ++i) { + tooltipItems.push(createTooltipItem(active[i])); + } + + // If the user provided a filter function, use it to modify the tooltip items + if (opts.filter) { + tooltipItems = tooltipItems.filter(function(a) { + return opts.filter(a, data); + }); + } + + // If the user provided a sorting function, use it to modify the tooltip items + if (opts.itemSort) { + tooltipItems = tooltipItems.sort(function(a, b) { + return opts.itemSort(a, b, data); + }); + } + + // Determine colors for boxes + helpers.each(tooltipItems, function(tooltipItem) { + labelColors.push(opts.callbacks.labelColor.call(me, tooltipItem, me._chart)); + labelTextColors.push(opts.callbacks.labelTextColor.call(me, tooltipItem, me._chart)); + }); + + + // Build the Text Lines + model.title = me.getTitle(tooltipItems, data); + model.beforeBody = me.getBeforeBody(tooltipItems, data); + model.body = me.getBody(tooltipItems, data); + model.afterBody = me.getAfterBody(tooltipItems, data); + model.footer = me.getFooter(tooltipItems, data); + + // Initial positioning and colors + model.x = Math.round(tooltipPosition.x); + model.y = Math.round(tooltipPosition.y); + model.caretPadding = opts.caretPadding; + model.labelColors = labelColors; + model.labelTextColors = labelTextColors; + + // data points + model.dataPoints = tooltipItems; + + // We need to determine alignment of the tooltip + tooltipSize = getTooltipSize(this, model); + alignment = determineAlignment(this, tooltipSize); + // Final Size and Position + backgroundPoint = getBackgroundPoint(model, tooltipSize, alignment); + } else { + model.opacity = 0; + } + + model.xAlign = alignment.xAlign; + model.yAlign = alignment.yAlign; + model.x = backgroundPoint.x; + model.y = backgroundPoint.y; + model.width = tooltipSize.width; + model.height = tooltipSize.height; + + // Point where the caret on the tooltip points to + model.caretX = tooltipPosition.x; + model.caretY = tooltipPosition.y; + + me._model = model; + + if (changed && opts.custom) { + opts.custom.call(me, model); + } + + return me; + }, + drawCaret: function(tooltipPoint, size) { + var ctx = this._chart.ctx; + var vm = this._view; + var caretPosition = this.getCaretPosition(tooltipPoint, size, vm); + + ctx.lineTo(caretPosition.x1, caretPosition.y1); + ctx.lineTo(caretPosition.x2, caretPosition.y2); + ctx.lineTo(caretPosition.x3, caretPosition.y3); + }, + getCaretPosition: function(tooltipPoint, size, vm) { + var x1, x2, x3, y1, y2, y3; + var caretSize = vm.caretSize; + var cornerRadius = vm.cornerRadius; + var xAlign = vm.xAlign; + var yAlign = vm.yAlign; + var ptX = tooltipPoint.x; + var ptY = tooltipPoint.y; + var width = size.width; + var height = size.height; + + if (yAlign === 'center') { + y2 = ptY + (height / 2); + + if (xAlign === 'left') { + x1 = ptX; + x2 = x1 - caretSize; + x3 = x1; + + y1 = y2 + caretSize; + y3 = y2 - caretSize; + } else { + x1 = ptX + width; + x2 = x1 + caretSize; + x3 = x1; + + y1 = y2 - caretSize; + y3 = y2 + caretSize; + } + } else { + if (xAlign === 'left') { + x2 = ptX + cornerRadius + (caretSize); + x1 = x2 - caretSize; + x3 = x2 + caretSize; + } else if (xAlign === 'right') { + x2 = ptX + width - cornerRadius - caretSize; + x1 = x2 - caretSize; + x3 = x2 + caretSize; + } else { + x2 = ptX + (width / 2); + x1 = x2 - caretSize; + x3 = x2 + caretSize; + } + if (yAlign === 'top') { + y1 = ptY; + y2 = y1 - caretSize; + y3 = y1; + } else { + y1 = ptY + height; + y2 = y1 + caretSize; + y3 = y1; + // invert drawing order + var tmp = x3; + x3 = x1; + x1 = tmp; + } + } + return {x1: x1, x2: x2, x3: x3, y1: y1, y2: y2, y3: y3}; + }, + drawTitle: function(pt, vm, ctx, opacity) { + var title = vm.title; + + if (title.length) { + ctx.textAlign = vm._titleAlign; + ctx.textBaseline = 'top'; + + var titleFontSize = vm.titleFontSize; + var titleSpacing = vm.titleSpacing; + + ctx.fillStyle = mergeOpacity(vm.titleFontColor, opacity); + ctx.font = helpers.fontString(titleFontSize, vm._titleFontStyle, vm._titleFontFamily); + + var i, len; + for (i = 0, len = title.length; i < len; ++i) { + ctx.fillText(title[i], pt.x, pt.y); + pt.y += titleFontSize + titleSpacing; // Line Height and spacing + + if (i + 1 === title.length) { + pt.y += vm.titleMarginBottom - titleSpacing; // If Last, add margin, remove spacing + } + } + } + }, + drawBody: function(pt, vm, ctx, opacity) { + var bodyFontSize = vm.bodyFontSize; + var bodySpacing = vm.bodySpacing; + var body = vm.body; + + ctx.textAlign = vm._bodyAlign; + ctx.textBaseline = 'top'; + ctx.font = helpers.fontString(bodyFontSize, vm._bodyFontStyle, vm._bodyFontFamily); + + // Before Body + var xLinePadding = 0; + var fillLineOfText = function(line) { + ctx.fillText(line, pt.x + xLinePadding, pt.y); + pt.y += bodyFontSize + bodySpacing; + }; + + // Before body lines + ctx.fillStyle = mergeOpacity(vm.bodyFontColor, opacity); + helpers.each(vm.beforeBody, fillLineOfText); + + var drawColorBoxes = vm.displayColors; + xLinePadding = drawColorBoxes ? (bodyFontSize + 2) : 0; + + // Draw body lines now + helpers.each(body, function(bodyItem, i) { + var textColor = mergeOpacity(vm.labelTextColors[i], opacity); + ctx.fillStyle = textColor; + helpers.each(bodyItem.before, fillLineOfText); + + helpers.each(bodyItem.lines, function(line) { + // Draw Legend-like boxes if needed + if (drawColorBoxes) { + // Fill a white rect so that colours merge nicely if the opacity is < 1 + ctx.fillStyle = mergeOpacity(vm.legendColorBackground, opacity); + ctx.fillRect(pt.x, pt.y, bodyFontSize, bodyFontSize); + + // Border + ctx.lineWidth = 1; + ctx.strokeStyle = mergeOpacity(vm.labelColors[i].borderColor, opacity); + ctx.strokeRect(pt.x, pt.y, bodyFontSize, bodyFontSize); + + // Inner square + ctx.fillStyle = mergeOpacity(vm.labelColors[i].backgroundColor, opacity); + ctx.fillRect(pt.x + 1, pt.y + 1, bodyFontSize - 2, bodyFontSize - 2); + ctx.fillStyle = textColor; + } + + fillLineOfText(line); + }); + + helpers.each(bodyItem.after, fillLineOfText); + }); + + // Reset back to 0 for after body + xLinePadding = 0; + + // After body lines + helpers.each(vm.afterBody, fillLineOfText); + pt.y -= bodySpacing; // Remove last body spacing + }, + drawFooter: function(pt, vm, ctx, opacity) { + var footer = vm.footer; + + if (footer.length) { + pt.y += vm.footerMarginTop; + + ctx.textAlign = vm._footerAlign; + ctx.textBaseline = 'top'; + + ctx.fillStyle = mergeOpacity(vm.footerFontColor, opacity); + ctx.font = helpers.fontString(vm.footerFontSize, vm._footerFontStyle, vm._footerFontFamily); + + helpers.each(footer, function(line) { + ctx.fillText(line, pt.x, pt.y); + pt.y += vm.footerFontSize + vm.footerSpacing; + }); + } + }, + drawBackground: function(pt, vm, ctx, tooltipSize, opacity) { + ctx.fillStyle = mergeOpacity(vm.backgroundColor, opacity); + ctx.strokeStyle = mergeOpacity(vm.borderColor, opacity); + ctx.lineWidth = vm.borderWidth; + var xAlign = vm.xAlign; + var yAlign = vm.yAlign; + var x = pt.x; + var y = pt.y; + var width = tooltipSize.width; + var height = tooltipSize.height; + var radius = vm.cornerRadius; + + ctx.beginPath(); + ctx.moveTo(x + radius, y); + if (yAlign === 'top') { + this.drawCaret(pt, tooltipSize); + } + ctx.lineTo(x + width - radius, y); + ctx.quadraticCurveTo(x + width, y, x + width, y + radius); + if (yAlign === 'center' && xAlign === 'right') { + this.drawCaret(pt, tooltipSize); + } + ctx.lineTo(x + width, y + height - radius); + ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height); + if (yAlign === 'bottom') { + this.drawCaret(pt, tooltipSize); + } + ctx.lineTo(x + radius, y + height); + ctx.quadraticCurveTo(x, y + height, x, y + height - radius); + if (yAlign === 'center' && xAlign === 'left') { + this.drawCaret(pt, tooltipSize); + } + ctx.lineTo(x, y + radius); + ctx.quadraticCurveTo(x, y, x + radius, y); + ctx.closePath(); + + ctx.fill(); + + if (vm.borderWidth > 0) { + ctx.stroke(); + } + }, + draw: function() { + var ctx = this._chart.ctx; + var vm = this._view; + + if (vm.opacity === 0) { + return; + } + + var tooltipSize = { + width: vm.width, + height: vm.height + }; + var pt = { + x: vm.x, + y: vm.y + }; + + // IE11/Edge does not like very small opacities, so snap to 0 + var opacity = Math.abs(vm.opacity < 1e-3) ? 0 : vm.opacity; + + // Truthy/falsey value for empty tooltip + var hasTooltipContent = vm.title.length || vm.beforeBody.length || vm.body.length || vm.afterBody.length || vm.footer.length; + + if (this._options.enabled && hasTooltipContent) { + // Draw Background + this.drawBackground(pt, vm, ctx, tooltipSize, opacity); + + // Draw Title, Body, and Footer + pt.x += vm.xPadding; + pt.y += vm.yPadding; + + // Titles + this.drawTitle(pt, vm, ctx, opacity); + + // Body + this.drawBody(pt, vm, ctx, opacity); + + // Footer + this.drawFooter(pt, vm, ctx, opacity); + } + }, + + /** + * Handle an event + * @private + * @param {IEvent} event - The event to handle + * @returns {Boolean} true if the tooltip changed + */ + handleEvent: function(e) { + var me = this; + var options = me._options; + var changed = false; + + me._lastActive = me._lastActive || []; + + // Find Active Elements for tooltips + if (e.type === 'mouseout') { + me._active = []; + } else { + me._active = me._chart.getElementsAtEventForMode(e, options.mode, options); + } + + // Remember Last Actives + changed = !helpers.arrayEquals(me._active, me._lastActive); + + // If tooltip didn't change, do not handle the target event + if (!changed) { + return false; + } + + me._lastActive = me._active; + + if (options.enabled || options.custom) { + me._eventPosition = { + x: e.x, + y: e.y + }; + + var model = me._model; + me.update(true); + me.pivot(); + + // See if our tooltip position changed + changed |= (model.x !== me._model.x) || (model.y !== me._model.y); + } + + return changed; + } + }); + + /** + * @namespace Chart.Tooltip.positioners + */ + Chart.Tooltip.positioners = { + /** + * Average mode places the tooltip at the average position of the elements shown + * @function Chart.Tooltip.positioners.average + * @param elements {ChartElement[]} the elements being displayed in the tooltip + * @returns {Point} tooltip position + */ + average: function(elements) { + if (!elements.length) { + return false; + } + + var i, len; + var x = 0; + var y = 0; + var count = 0; + + for (i = 0, len = elements.length; i < len; ++i) { + var el = elements[i]; + if (el && el.hasValue()) { + var pos = el.tooltipPosition(); + x += pos.x; + y += pos.y; + ++count; + } + } + + return { + x: Math.round(x / count), + y: Math.round(y / count) + }; + }, + + /** + * Gets the tooltip position nearest of the item nearest to the event position + * @function Chart.Tooltip.positioners.nearest + * @param elements {Chart.Element[]} the tooltip elements + * @param eventPosition {Point} the position of the event in canvas coordinates + * @returns {Point} the tooltip position + */ + nearest: function(elements, eventPosition) { + var x = eventPosition.x; + var y = eventPosition.y; + var minDistance = Number.POSITIVE_INFINITY; + var i, len, nearestElement; + + for (i = 0, len = elements.length; i < len; ++i) { + var el = elements[i]; + if (el && el.hasValue()) { + var center = el.getCenterPoint(); + var d = helpers.distanceBetweenPoints(eventPosition, center); + + if (d < minDistance) { + minDistance = d; + nearestElement = el; + } + } + } + + if (nearestElement) { + var tp = nearestElement.tooltipPosition(); + x = tp.x; + y = tp.y; + } + + return { + x: x, + y: y + }; + } + }; +}; + +},{"25":25,"26":26,"45":45}],36:[function(require,module,exports){ +'use strict'; + +var defaults = require(25); +var Element = require(26); +var helpers = require(45); + +defaults._set('global', { + elements: { + arc: { + backgroundColor: defaults.global.defaultColor, + borderColor: '#fff', + borderWidth: 2 + } + } +}); + +module.exports = Element.extend({ + inLabelRange: function(mouseX) { + var vm = this._view; + + if (vm) { + return (Math.pow(mouseX - vm.x, 2) < Math.pow(vm.radius + vm.hoverRadius, 2)); + } + return false; + }, + + inRange: function(chartX, chartY) { + var vm = this._view; + + if (vm) { + var pointRelativePosition = helpers.getAngleFromPoint(vm, {x: chartX, y: chartY}); + var angle = pointRelativePosition.angle; + var distance = pointRelativePosition.distance; + + // Sanitise angle range + var startAngle = vm.startAngle; + var endAngle = vm.endAngle; + while (endAngle < startAngle) { + endAngle += 2.0 * Math.PI; + } + while (angle > endAngle) { + angle -= 2.0 * Math.PI; + } + while (angle < startAngle) { + angle += 2.0 * Math.PI; + } + + // Check if within the range of the open/close angle + var betweenAngles = (angle >= startAngle && angle <= endAngle); + var withinRadius = (distance >= vm.innerRadius && distance <= vm.outerRadius); + + return (betweenAngles && withinRadius); + } + return false; + }, + + getCenterPoint: function() { + var vm = this._view; + var halfAngle = (vm.startAngle + vm.endAngle) / 2; + var halfRadius = (vm.innerRadius + vm.outerRadius) / 2; + return { + x: vm.x + Math.cos(halfAngle) * halfRadius, + y: vm.y + Math.sin(halfAngle) * halfRadius + }; + }, + + getArea: function() { + var vm = this._view; + return Math.PI * ((vm.endAngle - vm.startAngle) / (2 * Math.PI)) * (Math.pow(vm.outerRadius, 2) - Math.pow(vm.innerRadius, 2)); + }, + + tooltipPosition: function() { + var vm = this._view; + var centreAngle = vm.startAngle + ((vm.endAngle - vm.startAngle) / 2); + var rangeFromCentre = (vm.outerRadius - vm.innerRadius) / 2 + vm.innerRadius; + + return { + x: vm.x + (Math.cos(centreAngle) * rangeFromCentre), + y: vm.y + (Math.sin(centreAngle) * rangeFromCentre) + }; + }, + + draw: function() { + var ctx = this._chart.ctx; + var vm = this._view; + var sA = vm.startAngle; + var eA = vm.endAngle; + + ctx.beginPath(); + + ctx.arc(vm.x, vm.y, vm.outerRadius, sA, eA); + ctx.arc(vm.x, vm.y, vm.innerRadius, eA, sA, true); + + ctx.closePath(); + ctx.strokeStyle = vm.borderColor; + ctx.lineWidth = vm.borderWidth; + + ctx.fillStyle = vm.backgroundColor; + + ctx.fill(); + ctx.lineJoin = 'bevel'; + + if (vm.borderWidth) { + ctx.stroke(); + } + } +}); + +},{"25":25,"26":26,"45":45}],37:[function(require,module,exports){ +'use strict'; + +var defaults = require(25); +var Element = require(26); +var helpers = require(45); + +var globalDefaults = defaults.global; + +defaults._set('global', { + elements: { + line: { + tension: 0.4, + backgroundColor: globalDefaults.defaultColor, + borderWidth: 3, + borderColor: globalDefaults.defaultColor, + borderCapStyle: 'butt', + borderDash: [], + borderDashOffset: 0.0, + borderJoinStyle: 'miter', + capBezierPoints: true, + fill: true, // do we fill in the area between the line and its base axis + } + } +}); + +module.exports = Element.extend({ + draw: function() { + var me = this; + var vm = me._view; + var ctx = me._chart.ctx; + var spanGaps = vm.spanGaps; + var points = me._children.slice(); // clone array + var globalOptionLineElements = globalDefaults.elements.line; + var lastDrawnIndex = -1; + var index, current, previous, currentVM; + + // If we are looping, adding the first point again + if (me._loop && points.length) { + points.push(points[0]); + } + + ctx.save(); + + // Stroke Line Options + ctx.lineCap = vm.borderCapStyle || globalOptionLineElements.borderCapStyle; + + // IE 9 and 10 do not support line dash + if (ctx.setLineDash) { + ctx.setLineDash(vm.borderDash || globalOptionLineElements.borderDash); + } + + ctx.lineDashOffset = vm.borderDashOffset || globalOptionLineElements.borderDashOffset; + ctx.lineJoin = vm.borderJoinStyle || globalOptionLineElements.borderJoinStyle; + ctx.lineWidth = vm.borderWidth || globalOptionLineElements.borderWidth; + ctx.strokeStyle = vm.borderColor || globalDefaults.defaultColor; + + // Stroke Line + ctx.beginPath(); + lastDrawnIndex = -1; + + for (index = 0; index < points.length; ++index) { + current = points[index]; + previous = helpers.previousItem(points, index); + currentVM = current._view; + + // First point moves to it's starting position no matter what + if (index === 0) { + if (!currentVM.skip) { + ctx.moveTo(currentVM.x, currentVM.y); + lastDrawnIndex = index; + } + } else { + previous = lastDrawnIndex === -1 ? previous : points[lastDrawnIndex]; + + if (!currentVM.skip) { + if ((lastDrawnIndex !== (index - 1) && !spanGaps) || lastDrawnIndex === -1) { + // There was a gap and this is the first point after the gap + ctx.moveTo(currentVM.x, currentVM.y); + } else { + // Line to next point + helpers.canvas.lineTo(ctx, previous._view, current._view); + } + lastDrawnIndex = index; + } + } + } + + ctx.stroke(); + ctx.restore(); + } +}); + +},{"25":25,"26":26,"45":45}],38:[function(require,module,exports){ +'use strict'; + +var defaults = require(25); +var Element = require(26); +var helpers = require(45); + +var defaultColor = defaults.global.defaultColor; + +defaults._set('global', { + elements: { + point: { + radius: 3, + pointStyle: 'circle', + backgroundColor: defaultColor, + borderColor: defaultColor, + borderWidth: 1, + // Hover + hitRadius: 1, + hoverRadius: 4, + hoverBorderWidth: 1 + } + } +}); + +function xRange(mouseX) { + var vm = this._view; + return vm ? (Math.pow(mouseX - vm.x, 2) < Math.pow(vm.radius + vm.hitRadius, 2)) : false; +} + +function yRange(mouseY) { + var vm = this._view; + return vm ? (Math.pow(mouseY - vm.y, 2) < Math.pow(vm.radius + vm.hitRadius, 2)) : false; +} + +module.exports = Element.extend({ + inRange: function(mouseX, mouseY) { + var vm = this._view; + return vm ? ((Math.pow(mouseX - vm.x, 2) + Math.pow(mouseY - vm.y, 2)) < Math.pow(vm.hitRadius + vm.radius, 2)) : false; + }, + + inLabelRange: xRange, + inXRange: xRange, + inYRange: yRange, + + getCenterPoint: function() { + var vm = this._view; + return { + x: vm.x, + y: vm.y + }; + }, + + getArea: function() { + return Math.PI * Math.pow(this._view.radius, 2); + }, + + tooltipPosition: function() { + var vm = this._view; + return { + x: vm.x, + y: vm.y, + padding: vm.radius + vm.borderWidth + }; + }, + + draw: function(chartArea) { + var vm = this._view; + var model = this._model; + var ctx = this._chart.ctx; + var pointStyle = vm.pointStyle; + var radius = vm.radius; + var x = vm.x; + var y = vm.y; + var color = helpers.color; + var errMargin = 1.01; // 1.01 is margin for Accumulated error. (Especially Edge, IE.) + var ratio = 0; + + if (vm.skip) { + return; + } + + ctx.strokeStyle = vm.borderColor || defaultColor; + ctx.lineWidth = helpers.valueOrDefault(vm.borderWidth, defaults.global.elements.point.borderWidth); + ctx.fillStyle = vm.backgroundColor || defaultColor; + + // Cliping for Points. + // going out from inner charArea? + if ((chartArea !== undefined) && ((model.x < chartArea.left) || (chartArea.right * errMargin < model.x) || (model.y < chartArea.top) || (chartArea.bottom * errMargin < model.y))) { + // Point fade out + if (model.x < chartArea.left) { + ratio = (x - model.x) / (chartArea.left - model.x); + } else if (chartArea.right * errMargin < model.x) { + ratio = (model.x - x) / (model.x - chartArea.right); + } else if (model.y < chartArea.top) { + ratio = (y - model.y) / (chartArea.top - model.y); + } else if (chartArea.bottom * errMargin < model.y) { + ratio = (model.y - y) / (model.y - chartArea.bottom); + } + ratio = Math.round(ratio * 100) / 100; + ctx.strokeStyle = color(ctx.strokeStyle).alpha(ratio).rgbString(); + ctx.fillStyle = color(ctx.fillStyle).alpha(ratio).rgbString(); + } + + helpers.canvas.drawPoint(ctx, pointStyle, radius, x, y); + } +}); + +},{"25":25,"26":26,"45":45}],39:[function(require,module,exports){ +'use strict'; + +var defaults = require(25); +var Element = require(26); + +defaults._set('global', { + elements: { + rectangle: { + backgroundColor: defaults.global.defaultColor, + borderColor: defaults.global.defaultColor, + borderSkipped: 'bottom', + borderWidth: 0 + } + } +}); + +function isVertical(bar) { + return bar._view.width !== undefined; +} + +/** + * Helper function to get the bounds of the bar regardless of the orientation + * @param bar {Chart.Element.Rectangle} the bar + * @return {Bounds} bounds of the bar + * @private + */ +function getBarBounds(bar) { + var vm = bar._view; + var x1, x2, y1, y2; + + if (isVertical(bar)) { + // vertical + var halfWidth = vm.width / 2; + x1 = vm.x - halfWidth; + x2 = vm.x + halfWidth; + y1 = Math.min(vm.y, vm.base); + y2 = Math.max(vm.y, vm.base); + } else { + // horizontal bar + var halfHeight = vm.height / 2; + x1 = Math.min(vm.x, vm.base); + x2 = Math.max(vm.x, vm.base); + y1 = vm.y - halfHeight; + y2 = vm.y + halfHeight; + } + + return { + left: x1, + top: y1, + right: x2, + bottom: y2 + }; +} + +module.exports = Element.extend({ + draw: function() { + var ctx = this._chart.ctx; + var vm = this._view; + var left, right, top, bottom, signX, signY, borderSkipped; + var borderWidth = vm.borderWidth; + + if (!vm.horizontal) { + // bar + left = vm.x - vm.width / 2; + right = vm.x + vm.width / 2; + top = vm.y; + bottom = vm.base; + signX = 1; + signY = bottom > top ? 1 : -1; + borderSkipped = vm.borderSkipped || 'bottom'; + } else { + // horizontal bar + left = vm.base; + right = vm.x; + top = vm.y - vm.height / 2; + bottom = vm.y + vm.height / 2; + signX = right > left ? 1 : -1; + signY = 1; + borderSkipped = vm.borderSkipped || 'left'; + } + + // Canvas doesn't allow us to stroke inside the width so we can + // adjust the sizes to fit if we're setting a stroke on the line + if (borderWidth) { + // borderWidth shold be less than bar width and bar height. + var barSize = Math.min(Math.abs(left - right), Math.abs(top - bottom)); + borderWidth = borderWidth > barSize ? barSize : borderWidth; + var halfStroke = borderWidth / 2; + // Adjust borderWidth when bar top position is near vm.base(zero). + var borderLeft = left + (borderSkipped !== 'left' ? halfStroke * signX : 0); + var borderRight = right + (borderSkipped !== 'right' ? -halfStroke * signX : 0); + var borderTop = top + (borderSkipped !== 'top' ? halfStroke * signY : 0); + var borderBottom = bottom + (borderSkipped !== 'bottom' ? -halfStroke * signY : 0); + // not become a vertical line? + if (borderLeft !== borderRight) { + top = borderTop; + bottom = borderBottom; + } + // not become a horizontal line? + if (borderTop !== borderBottom) { + left = borderLeft; + right = borderRight; + } + } + + ctx.beginPath(); + ctx.fillStyle = vm.backgroundColor; + ctx.strokeStyle = vm.borderColor; + ctx.lineWidth = borderWidth; + + // Corner points, from bottom-left to bottom-right clockwise + // | 1 2 | + // | 0 3 | + var corners = [ + [left, bottom], + [left, top], + [right, top], + [right, bottom] + ]; + + // Find first (starting) corner with fallback to 'bottom' + var borders = ['bottom', 'left', 'top', 'right']; + var startCorner = borders.indexOf(borderSkipped, 0); + if (startCorner === -1) { + startCorner = 0; + } + + function cornerAt(index) { + return corners[(startCorner + index) % 4]; + } + + // Draw rectangle from 'startCorner' + var corner = cornerAt(0); + ctx.moveTo(corner[0], corner[1]); + + for (var i = 1; i < 4; i++) { + corner = cornerAt(i); + ctx.lineTo(corner[0], corner[1]); + } + + ctx.fill(); + if (borderWidth) { + ctx.stroke(); + } + }, + + height: function() { + var vm = this._view; + return vm.base - vm.y; + }, + + inRange: function(mouseX, mouseY) { + var inRange = false; + + if (this._view) { + var bounds = getBarBounds(this); + inRange = mouseX >= bounds.left && mouseX <= bounds.right && mouseY >= bounds.top && mouseY <= bounds.bottom; + } + + return inRange; + }, + + inLabelRange: function(mouseX, mouseY) { + var me = this; + if (!me._view) { + return false; + } + + var inRange = false; + var bounds = getBarBounds(me); + + if (isVertical(me)) { + inRange = mouseX >= bounds.left && mouseX <= bounds.right; + } else { + inRange = mouseY >= bounds.top && mouseY <= bounds.bottom; + } + + return inRange; + }, + + inXRange: function(mouseX) { + var bounds = getBarBounds(this); + return mouseX >= bounds.left && mouseX <= bounds.right; + }, + + inYRange: function(mouseY) { + var bounds = getBarBounds(this); + return mouseY >= bounds.top && mouseY <= bounds.bottom; + }, + + getCenterPoint: function() { + var vm = this._view; + var x, y; + if (isVertical(this)) { + x = vm.x; + y = (vm.y + vm.base) / 2; + } else { + x = (vm.x + vm.base) / 2; + y = vm.y; + } + + return {x: x, y: y}; + }, + + getArea: function() { + var vm = this._view; + return vm.width * Math.abs(vm.y - vm.base); + }, + + tooltipPosition: function() { + var vm = this._view; + return { + x: vm.x, + y: vm.y + }; + } +}); + +},{"25":25,"26":26}],40:[function(require,module,exports){ +'use strict'; + +module.exports = {}; +module.exports.Arc = require(36); +module.exports.Line = require(37); +module.exports.Point = require(38); +module.exports.Rectangle = require(39); + +},{"36":36,"37":37,"38":38,"39":39}],41:[function(require,module,exports){ +'use strict'; + +var helpers = require(42); + +/** + * @namespace Chart.helpers.canvas + */ +var exports = module.exports = { + /** + * Clears the entire canvas associated to the given `chart`. + * @param {Chart} chart - The chart for which to clear the canvas. + */ + clear: function(chart) { + chart.ctx.clearRect(0, 0, chart.width, chart.height); + }, + + /** + * Creates a "path" for a rectangle with rounded corners at position (x, y) with a + * given size (width, height) and the same `radius` for all corners. + * @param {CanvasRenderingContext2D} ctx - The canvas 2D Context. + * @param {Number} x - The x axis of the coordinate for the rectangle starting point. + * @param {Number} y - The y axis of the coordinate for the rectangle starting point. + * @param {Number} width - The rectangle's width. + * @param {Number} height - The rectangle's height. + * @param {Number} radius - The rounded amount (in pixels) for the four corners. + * @todo handle `radius` as top-left, top-right, bottom-right, bottom-left array/object? + */ + roundedRect: function(ctx, x, y, width, height, radius) { + if (radius) { + var rx = Math.min(radius, width / 2); + var ry = Math.min(radius, height / 2); + + ctx.moveTo(x + rx, y); + ctx.lineTo(x + width - rx, y); + ctx.quadraticCurveTo(x + width, y, x + width, y + ry); + ctx.lineTo(x + width, y + height - ry); + ctx.quadraticCurveTo(x + width, y + height, x + width - rx, y + height); + ctx.lineTo(x + rx, y + height); + ctx.quadraticCurveTo(x, y + height, x, y + height - ry); + ctx.lineTo(x, y + ry); + ctx.quadraticCurveTo(x, y, x + rx, y); + } else { + ctx.rect(x, y, width, height); + } + }, + + drawPoint: function(ctx, style, radius, x, y) { + var type, edgeLength, xOffset, yOffset, height, size; + + if (style && typeof style === 'object') { + type = style.toString(); + if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') { + ctx.drawImage(style, x - style.width / 2, y - style.height / 2, style.width, style.height); + return; + } + } + + if (isNaN(radius) || radius <= 0) { + return; + } + + switch (style) { + // Default includes circle + default: + ctx.beginPath(); + ctx.arc(x, y, radius, 0, Math.PI * 2); + ctx.closePath(); + ctx.fill(); + break; + case 'triangle': + ctx.beginPath(); + edgeLength = 3 * radius / Math.sqrt(3); + height = edgeLength * Math.sqrt(3) / 2; + ctx.moveTo(x - edgeLength / 2, y + height / 3); + ctx.lineTo(x + edgeLength / 2, y + height / 3); + ctx.lineTo(x, y - 2 * height / 3); + ctx.closePath(); + ctx.fill(); + break; + case 'rect': + size = 1 / Math.SQRT2 * radius; + ctx.beginPath(); + ctx.fillRect(x - size, y - size, 2 * size, 2 * size); + ctx.strokeRect(x - size, y - size, 2 * size, 2 * size); + break; + case 'rectRounded': + var offset = radius / Math.SQRT2; + var leftX = x - offset; + var topY = y - offset; + var sideSize = Math.SQRT2 * radius; + ctx.beginPath(); + this.roundedRect(ctx, leftX, topY, sideSize, sideSize, radius / 2); + ctx.closePath(); + ctx.fill(); + break; + case 'rectRot': + size = 1 / Math.SQRT2 * radius; + ctx.beginPath(); + ctx.moveTo(x - size, y); + ctx.lineTo(x, y + size); + ctx.lineTo(x + size, y); + ctx.lineTo(x, y - size); + ctx.closePath(); + ctx.fill(); + break; + case 'cross': + ctx.beginPath(); + ctx.moveTo(x, y + radius); + ctx.lineTo(x, y - radius); + ctx.moveTo(x - radius, y); + ctx.lineTo(x + radius, y); + ctx.closePath(); + break; + case 'crossRot': + ctx.beginPath(); + xOffset = Math.cos(Math.PI / 4) * radius; + yOffset = Math.sin(Math.PI / 4) * radius; + ctx.moveTo(x - xOffset, y - yOffset); + ctx.lineTo(x + xOffset, y + yOffset); + ctx.moveTo(x - xOffset, y + yOffset); + ctx.lineTo(x + xOffset, y - yOffset); + ctx.closePath(); + break; + case 'star': + ctx.beginPath(); + ctx.moveTo(x, y + radius); + ctx.lineTo(x, y - radius); + ctx.moveTo(x - radius, y); + ctx.lineTo(x + radius, y); + xOffset = Math.cos(Math.PI / 4) * radius; + yOffset = Math.sin(Math.PI / 4) * radius; + ctx.moveTo(x - xOffset, y - yOffset); + ctx.lineTo(x + xOffset, y + yOffset); + ctx.moveTo(x - xOffset, y + yOffset); + ctx.lineTo(x + xOffset, y - yOffset); + ctx.closePath(); + break; + case 'line': + ctx.beginPath(); + ctx.moveTo(x - radius, y); + ctx.lineTo(x + radius, y); + ctx.closePath(); + break; + case 'dash': + ctx.beginPath(); + ctx.moveTo(x, y); + ctx.lineTo(x + radius, y); + ctx.closePath(); + break; + } + + ctx.stroke(); + }, + + clipArea: function(ctx, area) { + ctx.save(); + ctx.beginPath(); + ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top); + ctx.clip(); + }, + + unclipArea: function(ctx) { + ctx.restore(); + }, + + lineTo: function(ctx, previous, target, flip) { + if (target.steppedLine) { + if ((target.steppedLine === 'after' && !flip) || (target.steppedLine !== 'after' && flip)) { + ctx.lineTo(previous.x, target.y); + } else { + ctx.lineTo(target.x, previous.y); + } + ctx.lineTo(target.x, target.y); + return; + } + + if (!target.tension) { + ctx.lineTo(target.x, target.y); + return; + } + + ctx.bezierCurveTo( + flip ? previous.controlPointPreviousX : previous.controlPointNextX, + flip ? previous.controlPointPreviousY : previous.controlPointNextY, + flip ? target.controlPointNextX : target.controlPointPreviousX, + flip ? target.controlPointNextY : target.controlPointPreviousY, + target.x, + target.y); + } +}; + +// DEPRECATIONS + +/** + * Provided for backward compatibility, use Chart.helpers.canvas.clear instead. + * @namespace Chart.helpers.clear + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers.clear = exports.clear; + +/** + * Provided for backward compatibility, use Chart.helpers.canvas.roundedRect instead. + * @namespace Chart.helpers.drawRoundedRectangle + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers.drawRoundedRectangle = function(ctx) { + ctx.beginPath(); + exports.roundedRect.apply(exports, arguments); + ctx.closePath(); +}; + +},{"42":42}],42:[function(require,module,exports){ +'use strict'; + +/** + * @namespace Chart.helpers + */ +var helpers = { + /** + * An empty function that can be used, for example, for optional callback. + */ + noop: function() {}, + + /** + * Returns a unique id, sequentially generated from a global variable. + * @returns {Number} + * @function + */ + uid: (function() { + var id = 0; + return function() { + return id++; + }; + }()), + + /** + * Returns true if `value` is neither null nor undefined, else returns false. + * @param {*} value - The value to test. + * @returns {Boolean} + * @since 2.7.0 + */ + isNullOrUndef: function(value) { + return value === null || typeof value === 'undefined'; + }, + + /** + * Returns true if `value` is an array, else returns false. + * @param {*} value - The value to test. + * @returns {Boolean} + * @function + */ + isArray: Array.isArray ? Array.isArray : function(value) { + return Object.prototype.toString.call(value) === '[object Array]'; + }, + + /** + * Returns true if `value` is an object (excluding null), else returns false. + * @param {*} value - The value to test. + * @returns {Boolean} + * @since 2.7.0 + */ + isObject: function(value) { + return value !== null && Object.prototype.toString.call(value) === '[object Object]'; + }, + + /** + * Returns `value` if defined, else returns `defaultValue`. + * @param {*} value - The value to return if defined. + * @param {*} defaultValue - The value to return if `value` is undefined. + * @returns {*} + */ + valueOrDefault: function(value, defaultValue) { + return typeof value === 'undefined' ? defaultValue : value; + }, + + /** + * Returns value at the given `index` in array if defined, else returns `defaultValue`. + * @param {Array} value - The array to lookup for value at `index`. + * @param {Number} index - The index in `value` to lookup for value. + * @param {*} defaultValue - The value to return if `value[index]` is undefined. + * @returns {*} + */ + valueAtIndexOrDefault: function(value, index, defaultValue) { + return helpers.valueOrDefault(helpers.isArray(value) ? value[index] : value, defaultValue); + }, + + /** + * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the + * value returned by `fn`. If `fn` is not a function, this method returns undefined. + * @param {Function} fn - The function to call. + * @param {Array|undefined|null} args - The arguments with which `fn` should be called. + * @param {Object} [thisArg] - The value of `this` provided for the call to `fn`. + * @returns {*} + */ + callback: function(fn, args, thisArg) { + if (fn && typeof fn.call === 'function') { + return fn.apply(thisArg, args); + } + }, + + /** + * Note(SB) for performance sake, this method should only be used when loopable type + * is unknown or in none intensive code (not called often and small loopable). Else + * it's preferable to use a regular for() loop and save extra function calls. + * @param {Object|Array} loopable - The object or array to be iterated. + * @param {Function} fn - The function to call for each item. + * @param {Object} [thisArg] - The value of `this` provided for the call to `fn`. + * @param {Boolean} [reverse] - If true, iterates backward on the loopable. + */ + each: function(loopable, fn, thisArg, reverse) { + var i, len, keys; + if (helpers.isArray(loopable)) { + len = loopable.length; + if (reverse) { + for (i = len - 1; i >= 0; i--) { + fn.call(thisArg, loopable[i], i); + } + } else { + for (i = 0; i < len; i++) { + fn.call(thisArg, loopable[i], i); + } + } + } else if (helpers.isObject(loopable)) { + keys = Object.keys(loopable); + len = keys.length; + for (i = 0; i < len; i++) { + fn.call(thisArg, loopable[keys[i]], keys[i]); + } + } + }, + + /** + * Returns true if the `a0` and `a1` arrays have the same content, else returns false. + * @see http://stackoverflow.com/a/14853974 + * @param {Array} a0 - The array to compare + * @param {Array} a1 - The array to compare + * @returns {Boolean} + */ + arrayEquals: function(a0, a1) { + var i, ilen, v0, v1; + + if (!a0 || !a1 || a0.length !== a1.length) { + return false; + } + + for (i = 0, ilen = a0.length; i < ilen; ++i) { + v0 = a0[i]; + v1 = a1[i]; + + if (v0 instanceof Array && v1 instanceof Array) { + if (!helpers.arrayEquals(v0, v1)) { + return false; + } + } else if (v0 !== v1) { + // NOTE: two different object instances will never be equal: {x:20} != {x:20} + return false; + } + } + + return true; + }, + + /** + * Returns a deep copy of `source` without keeping references on objects and arrays. + * @param {*} source - The value to clone. + * @returns {*} + */ + clone: function(source) { + if (helpers.isArray(source)) { + return source.map(helpers.clone); + } + + if (helpers.isObject(source)) { + var target = {}; + var keys = Object.keys(source); + var klen = keys.length; + var k = 0; + + for (; k < klen; ++k) { + target[keys[k]] = helpers.clone(source[keys[k]]); + } + + return target; + } + + return source; + }, + + /** + * The default merger when Chart.helpers.merge is called without merger option. + * Note(SB): this method is also used by configMerge and scaleMerge as fallback. + * @private + */ + _merger: function(key, target, source, options) { + var tval = target[key]; + var sval = source[key]; + + if (helpers.isObject(tval) && helpers.isObject(sval)) { + helpers.merge(tval, sval, options); + } else { + target[key] = helpers.clone(sval); + } + }, + + /** + * Merges source[key] in target[key] only if target[key] is undefined. + * @private + */ + _mergerIf: function(key, target, source) { + var tval = target[key]; + var sval = source[key]; + + if (helpers.isObject(tval) && helpers.isObject(sval)) { + helpers.mergeIf(tval, sval); + } else if (!target.hasOwnProperty(key)) { + target[key] = helpers.clone(sval); + } + }, + + /** + * Recursively deep copies `source` properties into `target` with the given `options`. + * IMPORTANT: `target` is not cloned and will be updated with `source` properties. + * @param {Object} target - The target object in which all sources are merged into. + * @param {Object|Array(Object)} source - Object(s) to merge into `target`. + * @param {Object} [options] - Merging options: + * @param {Function} [options.merger] - The merge method (key, target, source, options) + * @returns {Object} The `target` object. + */ + merge: function(target, source, options) { + var sources = helpers.isArray(source) ? source : [source]; + var ilen = sources.length; + var merge, i, keys, klen, k; + + if (!helpers.isObject(target)) { + return target; + } + + options = options || {}; + merge = options.merger || helpers._merger; + + for (i = 0; i < ilen; ++i) { + source = sources[i]; + if (!helpers.isObject(source)) { + continue; + } + + keys = Object.keys(source); + for (k = 0, klen = keys.length; k < klen; ++k) { + merge(keys[k], target, source, options); + } + } + + return target; + }, + + /** + * Recursively deep copies `source` properties into `target` *only* if not defined in target. + * IMPORTANT: `target` is not cloned and will be updated with `source` properties. + * @param {Object} target - The target object in which all sources are merged into. + * @param {Object|Array(Object)} source - Object(s) to merge into `target`. + * @returns {Object} The `target` object. + */ + mergeIf: function(target, source) { + return helpers.merge(target, source, {merger: helpers._mergerIf}); + }, + + /** + * Applies the contents of two or more objects together into the first object. + * @param {Object} target - The target object in which all objects are merged into. + * @param {Object} arg1 - Object containing additional properties to merge in target. + * @param {Object} argN - Additional objects containing properties to merge in target. + * @returns {Object} The `target` object. + */ + extend: function(target) { + var setFn = function(value, key) { + target[key] = value; + }; + for (var i = 1, ilen = arguments.length; i < ilen; ++i) { + helpers.each(arguments[i], setFn); + } + return target; + }, + + /** + * Basic javascript inheritance based on the model created in Backbone.js + */ + inherits: function(extensions) { + var me = this; + var ChartElement = (extensions && extensions.hasOwnProperty('constructor')) ? extensions.constructor : function() { + return me.apply(this, arguments); + }; + + var Surrogate = function() { + this.constructor = ChartElement; + }; + + Surrogate.prototype = me.prototype; + ChartElement.prototype = new Surrogate(); + ChartElement.extend = helpers.inherits; + + if (extensions) { + helpers.extend(ChartElement.prototype, extensions); + } + + ChartElement.__super__ = me.prototype; + return ChartElement; + } +}; + +module.exports = helpers; + +// DEPRECATIONS + +/** + * Provided for backward compatibility, use Chart.helpers.callback instead. + * @function Chart.helpers.callCallback + * @deprecated since version 2.6.0 + * @todo remove at version 3 + * @private + */ +helpers.callCallback = helpers.callback; + +/** + * Provided for backward compatibility, use Array.prototype.indexOf instead. + * Array.prototype.indexOf compatibility: Chrome, Opera, Safari, FF1.5+, IE9+ + * @function Chart.helpers.indexOf + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers.indexOf = function(array, item, fromIndex) { + return Array.prototype.indexOf.call(array, item, fromIndex); +}; + +/** + * Provided for backward compatibility, use Chart.helpers.valueOrDefault instead. + * @function Chart.helpers.getValueOrDefault + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers.getValueOrDefault = helpers.valueOrDefault; + +/** + * Provided for backward compatibility, use Chart.helpers.valueAtIndexOrDefault instead. + * @function Chart.helpers.getValueAtIndexOrDefault + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers.getValueAtIndexOrDefault = helpers.valueAtIndexOrDefault; + +},{}],43:[function(require,module,exports){ +'use strict'; + +var helpers = require(42); + +/** + * Easing functions adapted from Robert Penner's easing equations. + * @namespace Chart.helpers.easingEffects + * @see http://www.robertpenner.com/easing/ + */ +var effects = { + linear: function(t) { + return t; + }, + + easeInQuad: function(t) { + return t * t; + }, + + easeOutQuad: function(t) { + return -t * (t - 2); + }, + + easeInOutQuad: function(t) { + if ((t /= 0.5) < 1) { + return 0.5 * t * t; + } + return -0.5 * ((--t) * (t - 2) - 1); + }, + + easeInCubic: function(t) { + return t * t * t; + }, + + easeOutCubic: function(t) { + return (t = t - 1) * t * t + 1; + }, + + easeInOutCubic: function(t) { + if ((t /= 0.5) < 1) { + return 0.5 * t * t * t; + } + return 0.5 * ((t -= 2) * t * t + 2); + }, + + easeInQuart: function(t) { + return t * t * t * t; + }, + + easeOutQuart: function(t) { + return -((t = t - 1) * t * t * t - 1); + }, + + easeInOutQuart: function(t) { + if ((t /= 0.5) < 1) { + return 0.5 * t * t * t * t; + } + return -0.5 * ((t -= 2) * t * t * t - 2); + }, + + easeInQuint: function(t) { + return t * t * t * t * t; + }, + + easeOutQuint: function(t) { + return (t = t - 1) * t * t * t * t + 1; + }, + + easeInOutQuint: function(t) { + if ((t /= 0.5) < 1) { + return 0.5 * t * t * t * t * t; + } + return 0.5 * ((t -= 2) * t * t * t * t + 2); + }, + + easeInSine: function(t) { + return -Math.cos(t * (Math.PI / 2)) + 1; + }, + + easeOutSine: function(t) { + return Math.sin(t * (Math.PI / 2)); + }, + + easeInOutSine: function(t) { + return -0.5 * (Math.cos(Math.PI * t) - 1); + }, + + easeInExpo: function(t) { + return (t === 0) ? 0 : Math.pow(2, 10 * (t - 1)); + }, + + easeOutExpo: function(t) { + return (t === 1) ? 1 : -Math.pow(2, -10 * t) + 1; + }, + + easeInOutExpo: function(t) { + if (t === 0) { + return 0; + } + if (t === 1) { + return 1; + } + if ((t /= 0.5) < 1) { + return 0.5 * Math.pow(2, 10 * (t - 1)); + } + return 0.5 * (-Math.pow(2, -10 * --t) + 2); + }, + + easeInCirc: function(t) { + if (t >= 1) { + return t; + } + return -(Math.sqrt(1 - t * t) - 1); + }, + + easeOutCirc: function(t) { + return Math.sqrt(1 - (t = t - 1) * t); + }, + + easeInOutCirc: function(t) { + if ((t /= 0.5) < 1) { + return -0.5 * (Math.sqrt(1 - t * t) - 1); + } + return 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1); + }, + + easeInElastic: function(t) { + var s = 1.70158; + var p = 0; + var a = 1; + if (t === 0) { + return 0; + } + if (t === 1) { + return 1; + } + if (!p) { + p = 0.3; + } + if (a < 1) { + a = 1; + s = p / 4; + } else { + s = p / (2 * Math.PI) * Math.asin(1 / a); + } + return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p)); + }, + + easeOutElastic: function(t) { + var s = 1.70158; + var p = 0; + var a = 1; + if (t === 0) { + return 0; + } + if (t === 1) { + return 1; + } + if (!p) { + p = 0.3; + } + if (a < 1) { + a = 1; + s = p / 4; + } else { + s = p / (2 * Math.PI) * Math.asin(1 / a); + } + return a * Math.pow(2, -10 * t) * Math.sin((t - s) * (2 * Math.PI) / p) + 1; + }, + + easeInOutElastic: function(t) { + var s = 1.70158; + var p = 0; + var a = 1; + if (t === 0) { + return 0; + } + if ((t /= 0.5) === 2) { + return 1; + } + if (!p) { + p = 0.45; + } + if (a < 1) { + a = 1; + s = p / 4; + } else { + s = p / (2 * Math.PI) * Math.asin(1 / a); + } + if (t < 1) { + return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p)); + } + return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p) * 0.5 + 1; + }, + easeInBack: function(t) { + var s = 1.70158; + return t * t * ((s + 1) * t - s); + }, + + easeOutBack: function(t) { + var s = 1.70158; + return (t = t - 1) * t * ((s + 1) * t + s) + 1; + }, + + easeInOutBack: function(t) { + var s = 1.70158; + if ((t /= 0.5) < 1) { + return 0.5 * (t * t * (((s *= (1.525)) + 1) * t - s)); + } + return 0.5 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2); + }, + + easeInBounce: function(t) { + return 1 - effects.easeOutBounce(1 - t); + }, + + easeOutBounce: function(t) { + if (t < (1 / 2.75)) { + return 7.5625 * t * t; + } + if (t < (2 / 2.75)) { + return 7.5625 * (t -= (1.5 / 2.75)) * t + 0.75; + } + if (t < (2.5 / 2.75)) { + return 7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375; + } + return 7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375; + }, + + easeInOutBounce: function(t) { + if (t < 0.5) { + return effects.easeInBounce(t * 2) * 0.5; + } + return effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5; + } +}; + +module.exports = { + effects: effects +}; + +// DEPRECATIONS + +/** + * Provided for backward compatibility, use Chart.helpers.easing.effects instead. + * @function Chart.helpers.easingEffects + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers.easingEffects = effects; + +},{"42":42}],44:[function(require,module,exports){ +'use strict'; + +var helpers = require(42); + +/** + * @alias Chart.helpers.options + * @namespace + */ +module.exports = { + /** + * Converts the given line height `value` in pixels for a specific font `size`. + * @param {Number|String} value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em'). + * @param {Number} size - The font size (in pixels) used to resolve relative `value`. + * @returns {Number} The effective line height in pixels (size * 1.2 if value is invalid). + * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height + * @since 2.7.0 + */ + toLineHeight: function(value, size) { + var matches = ('' + value).match(/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/); + if (!matches || matches[1] === 'normal') { + return size * 1.2; + } + + value = +matches[2]; + + switch (matches[3]) { + case 'px': + return value; + case '%': + value /= 100; + break; + default: + break; + } + + return size * value; + }, + + /** + * Converts the given value into a padding object with pre-computed width/height. + * @param {Number|Object} value - If a number, set the value to all TRBL component, + * else, if and object, use defined properties and sets undefined ones to 0. + * @returns {Object} The padding values (top, right, bottom, left, width, height) + * @since 2.7.0 + */ + toPadding: function(value) { + var t, r, b, l; + + if (helpers.isObject(value)) { + t = +value.top || 0; + r = +value.right || 0; + b = +value.bottom || 0; + l = +value.left || 0; + } else { + t = r = b = l = +value || 0; + } + + return { + top: t, + right: r, + bottom: b, + left: l, + height: t + b, + width: l + r + }; + }, + + /** + * Evaluates the given `inputs` sequentially and returns the first defined value. + * @param {Array[]} inputs - An array of values, falling back to the last value. + * @param {Object} [context] - If defined and the current value is a function, the value + * is called with `context` as first argument and the result becomes the new input. + * @param {Number} [index] - If defined and the current value is an array, the value + * at `index` become the new input. + * @since 2.7.0 + */ + resolve: function(inputs, context, index) { + var i, ilen, value; + + for (i = 0, ilen = inputs.length; i < ilen; ++i) { + value = inputs[i]; + if (value === undefined) { + continue; + } + if (context !== undefined && typeof value === 'function') { + value = value(context); + } + if (index !== undefined && helpers.isArray(value)) { + value = value[index]; + } + if (value !== undefined) { + return value; + } + } + } +}; + +},{"42":42}],45:[function(require,module,exports){ +'use strict'; + +module.exports = require(42); +module.exports.easing = require(43); +module.exports.canvas = require(41); +module.exports.options = require(44); + +},{"41":41,"42":42,"43":43,"44":44}],46:[function(require,module,exports){ +/** + * Platform fallback implementation (minimal). + * @see https://github.com/chartjs/Chart.js/pull/4591#issuecomment-319575939 + */ + +module.exports = { + acquireContext: function(item) { + if (item && item.canvas) { + // Support for any object associated to a canvas (including a context2d) + item = item.canvas; + } + + return item && item.getContext('2d') || null; + } +}; + +},{}],47:[function(require,module,exports){ +/** + * Chart.Platform implementation for targeting a web browser + */ + +'use strict'; + +var helpers = require(45); + +var EXPANDO_KEY = '$chartjs'; +var CSS_PREFIX = 'chartjs-'; +var CSS_RENDER_MONITOR = CSS_PREFIX + 'render-monitor'; +var CSS_RENDER_ANIMATION = CSS_PREFIX + 'render-animation'; +var ANIMATION_START_EVENTS = ['animationstart', 'webkitAnimationStart']; + +/** + * DOM event types -> Chart.js event types. + * Note: only events with different types are mapped. + * @see https://developer.mozilla.org/en-US/docs/Web/Events + */ +var EVENT_TYPES = { + touchstart: 'mousedown', + touchmove: 'mousemove', + touchend: 'mouseup', + pointerenter: 'mouseenter', + pointerdown: 'mousedown', + pointermove: 'mousemove', + pointerup: 'mouseup', + pointerleave: 'mouseout', + pointerout: 'mouseout' +}; + +/** + * The "used" size is the final value of a dimension property after all calculations have + * been performed. This method uses the computed style of `element` but returns undefined + * if the computed style is not expressed in pixels. That can happen in some cases where + * `element` has a size relative to its parent and this last one is not yet displayed, + * for example because of `display: none` on a parent node. + * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value + * @returns {Number} Size in pixels or undefined if unknown. + */ +function readUsedSize(element, property) { + var value = helpers.getStyle(element, property); + var matches = value && value.match(/^(\d+)(\.\d+)?px$/); + return matches ? Number(matches[1]) : undefined; +} + +/** + * Initializes the canvas style and render size without modifying the canvas display size, + * since responsiveness is handled by the controller.resize() method. The config is used + * to determine the aspect ratio to apply in case no explicit height has been specified. + */ +function initCanvas(canvas, config) { + var style = canvas.style; + + // NOTE(SB) canvas.getAttribute('width') !== canvas.width: in the first case it + // returns null or '' if no explicit value has been set to the canvas attribute. + var renderHeight = canvas.getAttribute('height'); + var renderWidth = canvas.getAttribute('width'); + + // Chart.js modifies some canvas values that we want to restore on destroy + canvas[EXPANDO_KEY] = { + initial: { + height: renderHeight, + width: renderWidth, + style: { + display: style.display, + height: style.height, + width: style.width + } + } + }; + + // Force canvas to display as block to avoid extra space caused by inline + // elements, which would interfere with the responsive resize process. + // https://github.com/chartjs/Chart.js/issues/2538 + style.display = style.display || 'block'; + + if (renderWidth === null || renderWidth === '') { + var displayWidth = readUsedSize(canvas, 'width'); + if (displayWidth !== undefined) { + canvas.width = displayWidth; + } + } + + if (renderHeight === null || renderHeight === '') { + if (canvas.style.height === '') { + // If no explicit render height and style height, let's apply the aspect ratio, + // which one can be specified by the user but also by charts as default option + // (i.e. options.aspectRatio). If not specified, use canvas aspect ratio of 2. + canvas.height = canvas.width / (config.options.aspectRatio || 2); + } else { + var displayHeight = readUsedSize(canvas, 'height'); + if (displayWidth !== undefined) { + canvas.height = displayHeight; + } + } + } + + return canvas; +} + +/** + * Detects support for options object argument in addEventListener. + * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support + * @private + */ +var supportsEventListenerOptions = (function() { + var supports = false; + try { + var options = Object.defineProperty({}, 'passive', { + get: function() { + supports = true; + } + }); + window.addEventListener('e', null, options); + } catch (e) { + // continue regardless of error + } + return supports; +}()); + +// Default passive to true as expected by Chrome for 'touchstart' and 'touchend' events. +// https://github.com/chartjs/Chart.js/issues/4287 +var eventListenerOptions = supportsEventListenerOptions ? {passive: true} : false; + +function addEventListener(node, type, listener) { + node.addEventListener(type, listener, eventListenerOptions); +} + +function removeEventListener(node, type, listener) { + node.removeEventListener(type, listener, eventListenerOptions); +} + +function createEvent(type, chart, x, y, nativeEvent) { + return { + type: type, + chart: chart, + native: nativeEvent || null, + x: x !== undefined ? x : null, + y: y !== undefined ? y : null, + }; +} + +function fromNativeEvent(event, chart) { + var type = EVENT_TYPES[event.type] || event.type; + var pos = helpers.getRelativePosition(event, chart); + return createEvent(type, chart, pos.x, pos.y, event); +} + +function throttled(fn, thisArg) { + var ticking = false; + var args = []; + + return function() { + args = Array.prototype.slice.call(arguments); + thisArg = thisArg || this; + + if (!ticking) { + ticking = true; + helpers.requestAnimFrame.call(window, function() { + ticking = false; + fn.apply(thisArg, args); + }); + } + }; +} + +// Implementation based on https://github.com/marcj/css-element-queries +function createResizer(handler) { + var resizer = document.createElement('div'); + var cls = CSS_PREFIX + 'size-monitor'; + var maxSize = 1000000; + var style = + 'position:absolute;' + + 'left:0;' + + 'top:0;' + + 'right:0;' + + 'bottom:0;' + + 'overflow:hidden;' + + 'pointer-events:none;' + + 'visibility:hidden;' + + 'z-index:-1;'; + + resizer.style.cssText = style; + resizer.className = cls; + resizer.innerHTML = + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    '; + + var expand = resizer.childNodes[0]; + var shrink = resizer.childNodes[1]; + + resizer._reset = function() { + expand.scrollLeft = maxSize; + expand.scrollTop = maxSize; + shrink.scrollLeft = maxSize; + shrink.scrollTop = maxSize; + }; + var onScroll = function() { + resizer._reset(); + handler(); + }; + + addEventListener(expand, 'scroll', onScroll.bind(expand, 'expand')); + addEventListener(shrink, 'scroll', onScroll.bind(shrink, 'shrink')); + + return resizer; +} + +// https://davidwalsh.name/detect-node-insertion +function watchForRender(node, handler) { + var expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {}); + var proxy = expando.renderProxy = function(e) { + if (e.animationName === CSS_RENDER_ANIMATION) { + handler(); + } + }; + + helpers.each(ANIMATION_START_EVENTS, function(type) { + addEventListener(node, type, proxy); + }); + + // #4737: Chrome might skip the CSS animation when the CSS_RENDER_MONITOR class + // is removed then added back immediately (same animation frame?). Accessing the + // `offsetParent` property will force a reflow and re-evaluate the CSS animation. + // https://gist.github.com/paulirish/5d52fb081b3570c81e3a#box-metrics + // https://github.com/chartjs/Chart.js/issues/4737 + expando.reflow = !!node.offsetParent; + + node.classList.add(CSS_RENDER_MONITOR); +} + +function unwatchForRender(node) { + var expando = node[EXPANDO_KEY] || {}; + var proxy = expando.renderProxy; + + if (proxy) { + helpers.each(ANIMATION_START_EVENTS, function(type) { + removeEventListener(node, type, proxy); + }); + + delete expando.renderProxy; + } + + node.classList.remove(CSS_RENDER_MONITOR); +} + +function addResizeListener(node, listener, chart) { + var expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {}); + + // Let's keep track of this added resizer and thus avoid DOM query when removing it. + var resizer = expando.resizer = createResizer(throttled(function() { + if (expando.resizer) { + return listener(createEvent('resize', chart)); + } + })); + + // The resizer needs to be attached to the node parent, so we first need to be + // sure that `node` is attached to the DOM before injecting the resizer element. + watchForRender(node, function() { + if (expando.resizer) { + var container = node.parentNode; + if (container && container !== resizer.parentNode) { + container.insertBefore(resizer, container.firstChild); + } + + // The container size might have changed, let's reset the resizer state. + resizer._reset(); + } + }); +} + +function removeResizeListener(node) { + var expando = node[EXPANDO_KEY] || {}; + var resizer = expando.resizer; + + delete expando.resizer; + unwatchForRender(node); + + if (resizer && resizer.parentNode) { + resizer.parentNode.removeChild(resizer); + } +} + +function injectCSS(platform, css) { + // http://stackoverflow.com/q/3922139 + var style = platform._style || document.createElement('style'); + if (!platform._style) { + platform._style = style; + css = '/* Chart.js */\n' + css; + style.setAttribute('type', 'text/css'); + document.getElementsByTagName('head')[0].appendChild(style); + } + + style.appendChild(document.createTextNode(css)); +} + +module.exports = { + /** + * This property holds whether this platform is enabled for the current environment. + * Currently used by platform.js to select the proper implementation. + * @private + */ + _enabled: typeof window !== 'undefined' && typeof document !== 'undefined', + + initialize: function() { + var keyframes = 'from{opacity:0.99}to{opacity:1}'; + + injectCSS(this, + // DOM rendering detection + // https://davidwalsh.name/detect-node-insertion + '@-webkit-keyframes ' + CSS_RENDER_ANIMATION + '{' + keyframes + '}' + + '@keyframes ' + CSS_RENDER_ANIMATION + '{' + keyframes + '}' + + '.' + CSS_RENDER_MONITOR + '{' + + '-webkit-animation:' + CSS_RENDER_ANIMATION + ' 0.001s;' + + 'animation:' + CSS_RENDER_ANIMATION + ' 0.001s;' + + '}' + ); + }, + + acquireContext: function(item, config) { + if (typeof item === 'string') { + item = document.getElementById(item); + } else if (item.length) { + // Support for array based queries (such as jQuery) + item = item[0]; + } + + if (item && item.canvas) { + // Support for any object associated to a canvas (including a context2d) + item = item.canvas; + } + + // To prevent canvas fingerprinting, some add-ons undefine the getContext + // method, for example: https://github.com/kkapsner/CanvasBlocker + // https://github.com/chartjs/Chart.js/issues/2807 + var context = item && item.getContext && item.getContext('2d'); + + // `instanceof HTMLCanvasElement/CanvasRenderingContext2D` fails when the item is + // inside an iframe or when running in a protected environment. We could guess the + // types from their toString() value but let's keep things flexible and assume it's + // a sufficient condition if the item has a context2D which has item as `canvas`. + // https://github.com/chartjs/Chart.js/issues/3887 + // https://github.com/chartjs/Chart.js/issues/4102 + // https://github.com/chartjs/Chart.js/issues/4152 + if (context && context.canvas === item) { + initCanvas(item, config); + return context; + } + + return null; + }, + + releaseContext: function(context) { + var canvas = context.canvas; + if (!canvas[EXPANDO_KEY]) { + return; + } + + var initial = canvas[EXPANDO_KEY].initial; + ['height', 'width'].forEach(function(prop) { + var value = initial[prop]; + if (helpers.isNullOrUndef(value)) { + canvas.removeAttribute(prop); + } else { + canvas.setAttribute(prop, value); + } + }); + + helpers.each(initial.style || {}, function(value, key) { + canvas.style[key] = value; + }); + + // The canvas render size might have been changed (and thus the state stack discarded), + // we can't use save() and restore() to restore the initial state. So make sure that at + // least the canvas context is reset to the default state by setting the canvas width. + // https://www.w3.org/TR/2011/WD-html5-20110525/the-canvas-element.html + canvas.width = canvas.width; + + delete canvas[EXPANDO_KEY]; + }, + + addEventListener: function(chart, type, listener) { + var canvas = chart.canvas; + if (type === 'resize') { + // Note: the resize event is not supported on all browsers. + addResizeListener(canvas, listener, chart); + return; + } + + var expando = listener[EXPANDO_KEY] || (listener[EXPANDO_KEY] = {}); + var proxies = expando.proxies || (expando.proxies = {}); + var proxy = proxies[chart.id + '_' + type] = function(event) { + listener(fromNativeEvent(event, chart)); + }; + + addEventListener(canvas, type, proxy); + }, + + removeEventListener: function(chart, type, listener) { + var canvas = chart.canvas; + if (type === 'resize') { + // Note: the resize event is not supported on all browsers. + removeResizeListener(canvas, listener); + return; + } + + var expando = listener[EXPANDO_KEY] || {}; + var proxies = expando.proxies || {}; + var proxy = proxies[chart.id + '_' + type]; + if (!proxy) { + return; + } + + removeEventListener(canvas, type, proxy); + } +}; + +// DEPRECATIONS + +/** + * Provided for backward compatibility, use EventTarget.addEventListener instead. + * EventTarget.addEventListener compatibility: Chrome, Opera 7, Safari, FF1.5+, IE9+ + * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener + * @function Chart.helpers.addEvent + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers.addEvent = addEventListener; + +/** + * Provided for backward compatibility, use EventTarget.removeEventListener instead. + * EventTarget.removeEventListener compatibility: Chrome, Opera 7, Safari, FF1.5+, IE9+ + * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/removeEventListener + * @function Chart.helpers.removeEvent + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers.removeEvent = removeEventListener; + +},{"45":45}],48:[function(require,module,exports){ +'use strict'; + +var helpers = require(45); +var basic = require(46); +var dom = require(47); + +// @TODO Make possible to select another platform at build time. +var implementation = dom._enabled ? dom : basic; + +/** + * @namespace Chart.platform + * @see https://chartjs.gitbooks.io/proposals/content/Platform.html + * @since 2.4.0 + */ +module.exports = helpers.extend({ + /** + * @since 2.7.0 + */ + initialize: function() {}, + + /** + * Called at chart construction time, returns a context2d instance implementing + * the [W3C Canvas 2D Context API standard]{@link https://www.w3.org/TR/2dcontext/}. + * @param {*} item - The native item from which to acquire context (platform specific) + * @param {Object} options - The chart options + * @returns {CanvasRenderingContext2D} context2d instance + */ + acquireContext: function() {}, + + /** + * Called at chart destruction time, releases any resources associated to the context + * previously returned by the acquireContext() method. + * @param {CanvasRenderingContext2D} context - The context2d instance + * @returns {Boolean} true if the method succeeded, else false + */ + releaseContext: function() {}, + + /** + * Registers the specified listener on the given chart. + * @param {Chart} chart - Chart from which to listen for event + * @param {String} type - The ({@link IEvent}) type to listen for + * @param {Function} listener - Receives a notification (an object that implements + * the {@link IEvent} interface) when an event of the specified type occurs. + */ + addEventListener: function() {}, + + /** + * Removes the specified listener previously registered with addEventListener. + * @param {Chart} chart -Chart from which to remove the listener + * @param {String} type - The ({@link IEvent}) type to remove + * @param {Function} listener - The listener function to remove from the event target. + */ + removeEventListener: function() {} + +}, implementation); + +/** + * @interface IPlatform + * Allows abstracting platform dependencies away from the chart + * @borrows Chart.platform.acquireContext as acquireContext + * @borrows Chart.platform.releaseContext as releaseContext + * @borrows Chart.platform.addEventListener as addEventListener + * @borrows Chart.platform.removeEventListener as removeEventListener + */ + +/** + * @interface IEvent + * @prop {String} type - The event type name, possible values are: + * 'contextmenu', 'mouseenter', 'mousedown', 'mousemove', 'mouseup', 'mouseout', + * 'click', 'dblclick', 'keydown', 'keypress', 'keyup' and 'resize' + * @prop {*} native - The original native event (null for emulated events, e.g. 'resize') + * @prop {Number} x - The mouse x position, relative to the canvas (null for incompatible events) + * @prop {Number} y - The mouse y position, relative to the canvas (null for incompatible events) + */ + +},{"45":45,"46":46,"47":47}],49:[function(require,module,exports){ +/** + * Plugin based on discussion from the following Chart.js issues: + * @see https://github.com/chartjs/Chart.js/issues/2380#issuecomment-279961569 + * @see https://github.com/chartjs/Chart.js/issues/2440#issuecomment-256461897 + */ + +'use strict'; + +var defaults = require(25); +var elements = require(40); +var helpers = require(45); + +defaults._set('global', { + plugins: { + filler: { + propagate: true + } + } +}); + +module.exports = function() { + + var mappers = { + dataset: function(source) { + var index = source.fill; + var chart = source.chart; + var meta = chart.getDatasetMeta(index); + var visible = meta && chart.isDatasetVisible(index); + var points = (visible && meta.dataset._children) || []; + var length = points.length || 0; + + return !length ? null : function(point, i) { + return (i < length && points[i]._view) || null; + }; + }, + + boundary: function(source) { + var boundary = source.boundary; + var x = boundary ? boundary.x : null; + var y = boundary ? boundary.y : null; + + return function(point) { + return { + x: x === null ? point.x : x, + y: y === null ? point.y : y, + }; + }; + } + }; + + // @todo if (fill[0] === '#') + function decodeFill(el, index, count) { + var model = el._model || {}; + var fill = model.fill; + var target; + + if (fill === undefined) { + fill = !!model.backgroundColor; + } + + if (fill === false || fill === null) { + return false; + } + + if (fill === true) { + return 'origin'; + } + + target = parseFloat(fill, 10); + if (isFinite(target) && Math.floor(target) === target) { + if (fill[0] === '-' || fill[0] === '+') { + target = index + target; + } + + if (target === index || target < 0 || target >= count) { + return false; + } + + return target; + } + + switch (fill) { + // compatibility + case 'bottom': + return 'start'; + case 'top': + return 'end'; + case 'zero': + return 'origin'; + // supported boundaries + case 'origin': + case 'start': + case 'end': + return fill; + // invalid fill values + default: + return false; + } + } + + function computeBoundary(source) { + var model = source.el._model || {}; + var scale = source.el._scale || {}; + var fill = source.fill; + var target = null; + var horizontal; + + if (isFinite(fill)) { + return null; + } + + // Backward compatibility: until v3, we still need to support boundary values set on + // the model (scaleTop, scaleBottom and scaleZero) because some external plugins and + // controllers might still use it (e.g. the Smith chart). + + if (fill === 'start') { + target = model.scaleBottom === undefined ? scale.bottom : model.scaleBottom; + } else if (fill === 'end') { + target = model.scaleTop === undefined ? scale.top : model.scaleTop; + } else if (model.scaleZero !== undefined) { + target = model.scaleZero; + } else if (scale.getBasePosition) { + target = scale.getBasePosition(); + } else if (scale.getBasePixel) { + target = scale.getBasePixel(); + } + + if (target !== undefined && target !== null) { + if (target.x !== undefined && target.y !== undefined) { + return target; + } + + if (typeof target === 'number' && isFinite(target)) { + horizontal = scale.isHorizontal(); + return { + x: horizontal ? target : null, + y: horizontal ? null : target + }; + } + } + + return null; + } + + function resolveTarget(sources, index, propagate) { + var source = sources[index]; + var fill = source.fill; + var visited = [index]; + var target; + + if (!propagate) { + return fill; + } + + while (fill !== false && visited.indexOf(fill) === -1) { + if (!isFinite(fill)) { + return fill; + } + + target = sources[fill]; + if (!target) { + return false; + } + + if (target.visible) { + return fill; + } + + visited.push(fill); + fill = target.fill; + } + + return false; + } + + function createMapper(source) { + var fill = source.fill; + var type = 'dataset'; + + if (fill === false) { + return null; + } + + if (!isFinite(fill)) { + type = 'boundary'; + } + + return mappers[type](source); + } + + function isDrawable(point) { + return point && !point.skip; + } + + function drawArea(ctx, curve0, curve1, len0, len1) { + var i; + + if (!len0 || !len1) { + return; + } + + // building first area curve (normal) + ctx.moveTo(curve0[0].x, curve0[0].y); + for (i = 1; i < len0; ++i) { + helpers.canvas.lineTo(ctx, curve0[i - 1], curve0[i]); + } + + // joining the two area curves + ctx.lineTo(curve1[len1 - 1].x, curve1[len1 - 1].y); + + // building opposite area curve (reverse) + for (i = len1 - 1; i > 0; --i) { + helpers.canvas.lineTo(ctx, curve1[i], curve1[i - 1], true); + } + } + + function doFill(ctx, points, mapper, view, color, loop) { + var count = points.length; + var span = view.spanGaps; + var curve0 = []; + var curve1 = []; + var len0 = 0; + var len1 = 0; + var i, ilen, index, p0, p1, d0, d1; + + ctx.beginPath(); + + for (i = 0, ilen = (count + !!loop); i < ilen; ++i) { + index = i % count; + p0 = points[index]._view; + p1 = mapper(p0, index, view); + d0 = isDrawable(p0); + d1 = isDrawable(p1); + + if (d0 && d1) { + len0 = curve0.push(p0); + len1 = curve1.push(p1); + } else if (len0 && len1) { + if (!span) { + drawArea(ctx, curve0, curve1, len0, len1); + len0 = len1 = 0; + curve0 = []; + curve1 = []; + } else { + if (d0) { + curve0.push(p0); + } + if (d1) { + curve1.push(p1); + } + } + } + } + + drawArea(ctx, curve0, curve1, len0, len1); + + ctx.closePath(); + ctx.fillStyle = color; + ctx.fill(); + } + + return { + id: 'filler', + + afterDatasetsUpdate: function(chart, options) { + var count = (chart.data.datasets || []).length; + var propagate = options.propagate; + var sources = []; + var meta, i, el, source; + + for (i = 0; i < count; ++i) { + meta = chart.getDatasetMeta(i); + el = meta.dataset; + source = null; + + if (el && el._model && el instanceof elements.Line) { + source = { + visible: chart.isDatasetVisible(i), + fill: decodeFill(el, i, count), + chart: chart, + el: el + }; + } + + meta.$filler = source; + sources.push(source); + } + + for (i = 0; i < count; ++i) { + source = sources[i]; + if (!source) { + continue; + } + + source.fill = resolveTarget(sources, i, propagate); + source.boundary = computeBoundary(source); + source.mapper = createMapper(source); + } + }, + + beforeDatasetDraw: function(chart, args) { + var meta = args.meta.$filler; + if (!meta) { + return; + } + + var ctx = chart.ctx; + var el = meta.el; + var view = el._view; + var points = el._children || []; + var mapper = meta.mapper; + var color = view.backgroundColor || defaults.global.defaultColor; + + if (mapper && color && points.length) { + helpers.canvas.clipArea(ctx, chart.chartArea); + doFill(ctx, points, mapper, view, color, el._loop); + helpers.canvas.unclipArea(ctx); + } + } + }; +}; + +},{"25":25,"40":40,"45":45}],50:[function(require,module,exports){ +'use strict'; + +var defaults = require(25); +var Element = require(26); +var helpers = require(45); + +defaults._set('global', { + legend: { + display: true, + position: 'top', + fullWidth: true, + reverse: false, + weight: 1000, + + // a callback that will handle + onClick: function(e, legendItem) { + var index = legendItem.datasetIndex; + var ci = this.chart; + var meta = ci.getDatasetMeta(index); + + // See controller.isDatasetVisible comment + meta.hidden = meta.hidden === null ? !ci.data.datasets[index].hidden : null; + + // We hid a dataset ... rerender the chart + ci.update(); + }, + + onHover: null, + + labels: { + boxWidth: 40, + padding: 10, + // Generates labels shown in the legend + // Valid properties to return: + // text : text to display + // fillStyle : fill of coloured box + // strokeStyle: stroke of coloured box + // hidden : if this legend item refers to a hidden item + // lineCap : cap style for line + // lineDash + // lineDashOffset : + // lineJoin : + // lineWidth : + generateLabels: function(chart) { + var data = chart.data; + return helpers.isArray(data.datasets) ? data.datasets.map(function(dataset, i) { + return { + text: dataset.label, + fillStyle: (!helpers.isArray(dataset.backgroundColor) ? dataset.backgroundColor : dataset.backgroundColor[0]), + hidden: !chart.isDatasetVisible(i), + lineCap: dataset.borderCapStyle, + lineDash: dataset.borderDash, + lineDashOffset: dataset.borderDashOffset, + lineJoin: dataset.borderJoinStyle, + lineWidth: dataset.borderWidth, + strokeStyle: dataset.borderColor, + pointStyle: dataset.pointStyle, + + // Below is extra data used for toggling the datasets + datasetIndex: i + }; + }, this) : []; + } + } + }, + + legendCallback: function(chart) { + var text = []; + text.push('
      '); + for (var i = 0; i < chart.data.datasets.length; i++) { + text.push('
    • '); + if (chart.data.datasets[i].label) { + text.push(chart.data.datasets[i].label); + } + text.push('
    • '); + } + text.push('
    '); + return text.join(''); + } +}); + +module.exports = function(Chart) { + + var layout = Chart.layoutService; + var noop = helpers.noop; + + /** + * Helper function to get the box width based on the usePointStyle option + * @param labelopts {Object} the label options on the legend + * @param fontSize {Number} the label font size + * @return {Number} width of the color box area + */ + function getBoxWidth(labelOpts, fontSize) { + return labelOpts.usePointStyle ? + fontSize * Math.SQRT2 : + labelOpts.boxWidth; + } + + Chart.Legend = Element.extend({ + + initialize: function(config) { + helpers.extend(this, config); + + // Contains hit boxes for each dataset (in dataset order) + this.legendHitBoxes = []; + + // Are we in doughnut mode which has a different data type + this.doughnutMode = false; + }, + + // These methods are ordered by lifecycle. Utilities then follow. + // Any function defined here is inherited by all legend types. + // Any function can be extended by the legend type + + beforeUpdate: noop, + update: function(maxWidth, maxHeight, margins) { + var me = this; + + // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;) + me.beforeUpdate(); + + // Absorb the master measurements + me.maxWidth = maxWidth; + me.maxHeight = maxHeight; + me.margins = margins; + + // Dimensions + me.beforeSetDimensions(); + me.setDimensions(); + me.afterSetDimensions(); + // Labels + me.beforeBuildLabels(); + me.buildLabels(); + me.afterBuildLabels(); + + // Fit + me.beforeFit(); + me.fit(); + me.afterFit(); + // + me.afterUpdate(); + + return me.minSize; + }, + afterUpdate: noop, + + // + + beforeSetDimensions: noop, + setDimensions: function() { + var me = this; + // Set the unconstrained dimension before label rotation + if (me.isHorizontal()) { + // Reset position before calculating rotation + me.width = me.maxWidth; + me.left = 0; + me.right = me.width; + } else { + me.height = me.maxHeight; + + // Reset position before calculating rotation + me.top = 0; + me.bottom = me.height; + } + + // Reset padding + me.paddingLeft = 0; + me.paddingTop = 0; + me.paddingRight = 0; + me.paddingBottom = 0; + + // Reset minSize + me.minSize = { + width: 0, + height: 0 + }; + }, + afterSetDimensions: noop, + + // + + beforeBuildLabels: noop, + buildLabels: function() { + var me = this; + var labelOpts = me.options.labels || {}; + var legendItems = helpers.callback(labelOpts.generateLabels, [me.chart], me) || []; + + if (labelOpts.filter) { + legendItems = legendItems.filter(function(item) { + return labelOpts.filter(item, me.chart.data); + }); + } + + if (me.options.reverse) { + legendItems.reverse(); + } + + me.legendItems = legendItems; + }, + afterBuildLabels: noop, + + // + + beforeFit: noop, + fit: function() { + var me = this; + var opts = me.options; + var labelOpts = opts.labels; + var display = opts.display; + + var ctx = me.ctx; + + var globalDefault = defaults.global; + var valueOrDefault = helpers.valueOrDefault; + var fontSize = valueOrDefault(labelOpts.fontSize, globalDefault.defaultFontSize); + var fontStyle = valueOrDefault(labelOpts.fontStyle, globalDefault.defaultFontStyle); + var fontFamily = valueOrDefault(labelOpts.fontFamily, globalDefault.defaultFontFamily); + var labelFont = helpers.fontString(fontSize, fontStyle, fontFamily); + + // Reset hit boxes + var hitboxes = me.legendHitBoxes = []; + + var minSize = me.minSize; + var isHorizontal = me.isHorizontal(); + + if (isHorizontal) { + minSize.width = me.maxWidth; // fill all the width + minSize.height = display ? 10 : 0; + } else { + minSize.width = display ? 10 : 0; + minSize.height = me.maxHeight; // fill all the height + } + + // Increase sizes here + if (display) { + ctx.font = labelFont; + + if (isHorizontal) { + // Labels + + // Width of each line of legend boxes. Labels wrap onto multiple lines when there are too many to fit on one + var lineWidths = me.lineWidths = [0]; + var totalHeight = me.legendItems.length ? fontSize + (labelOpts.padding) : 0; + + ctx.textAlign = 'left'; + ctx.textBaseline = 'top'; + + helpers.each(me.legendItems, function(legendItem, i) { + var boxWidth = getBoxWidth(labelOpts, fontSize); + var width = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width; + + if (lineWidths[lineWidths.length - 1] + width + labelOpts.padding >= me.width) { + totalHeight += fontSize + (labelOpts.padding); + lineWidths[lineWidths.length] = me.left; + } + + // Store the hitbox width and height here. Final position will be updated in `draw` + hitboxes[i] = { + left: 0, + top: 0, + width: width, + height: fontSize + }; + + lineWidths[lineWidths.length - 1] += width + labelOpts.padding; + }); + + minSize.height += totalHeight; + + } else { + var vPadding = labelOpts.padding; + var columnWidths = me.columnWidths = []; + var totalWidth = labelOpts.padding; + var currentColWidth = 0; + var currentColHeight = 0; + var itemHeight = fontSize + vPadding; + + helpers.each(me.legendItems, function(legendItem, i) { + var boxWidth = getBoxWidth(labelOpts, fontSize); + var itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width; + + // If too tall, go to new column + if (currentColHeight + itemHeight > minSize.height) { + totalWidth += currentColWidth + labelOpts.padding; + columnWidths.push(currentColWidth); // previous column width + + currentColWidth = 0; + currentColHeight = 0; + } + + // Get max width + currentColWidth = Math.max(currentColWidth, itemWidth); + currentColHeight += itemHeight; + + // Store the hitbox width and height here. Final position will be updated in `draw` + hitboxes[i] = { + left: 0, + top: 0, + width: itemWidth, + height: fontSize + }; + }); + + totalWidth += currentColWidth; + columnWidths.push(currentColWidth); + minSize.width += totalWidth; + } + } + + me.width = minSize.width; + me.height = minSize.height; + }, + afterFit: noop, + + // Shared Methods + isHorizontal: function() { + return this.options.position === 'top' || this.options.position === 'bottom'; + }, + + // Actually draw the legend on the canvas + draw: function() { + var me = this; + var opts = me.options; + var labelOpts = opts.labels; + var globalDefault = defaults.global; + var lineDefault = globalDefault.elements.line; + var legendWidth = me.width; + var lineWidths = me.lineWidths; + + if (opts.display) { + var ctx = me.ctx; + var valueOrDefault = helpers.valueOrDefault; + var fontColor = valueOrDefault(labelOpts.fontColor, globalDefault.defaultFontColor); + var fontSize = valueOrDefault(labelOpts.fontSize, globalDefault.defaultFontSize); + var fontStyle = valueOrDefault(labelOpts.fontStyle, globalDefault.defaultFontStyle); + var fontFamily = valueOrDefault(labelOpts.fontFamily, globalDefault.defaultFontFamily); + var labelFont = helpers.fontString(fontSize, fontStyle, fontFamily); + var cursor; + + // Canvas setup + ctx.textAlign = 'left'; + ctx.textBaseline = 'middle'; + ctx.lineWidth = 0.5; + ctx.strokeStyle = fontColor; // for strikethrough effect + ctx.fillStyle = fontColor; // render in correct colour + ctx.font = labelFont; + + var boxWidth = getBoxWidth(labelOpts, fontSize); + var hitboxes = me.legendHitBoxes; + + // current position + var drawLegendBox = function(x, y, legendItem) { + if (isNaN(boxWidth) || boxWidth <= 0) { + return; + } + + // Set the ctx for the box + ctx.save(); + + ctx.fillStyle = valueOrDefault(legendItem.fillStyle, globalDefault.defaultColor); + ctx.lineCap = valueOrDefault(legendItem.lineCap, lineDefault.borderCapStyle); + ctx.lineDashOffset = valueOrDefault(legendItem.lineDashOffset, lineDefault.borderDashOffset); + ctx.lineJoin = valueOrDefault(legendItem.lineJoin, lineDefault.borderJoinStyle); + ctx.lineWidth = valueOrDefault(legendItem.lineWidth, lineDefault.borderWidth); + ctx.strokeStyle = valueOrDefault(legendItem.strokeStyle, globalDefault.defaultColor); + var isLineWidthZero = (valueOrDefault(legendItem.lineWidth, lineDefault.borderWidth) === 0); + + if (ctx.setLineDash) { + // IE 9 and 10 do not support line dash + ctx.setLineDash(valueOrDefault(legendItem.lineDash, lineDefault.borderDash)); + } + + if (opts.labels && opts.labels.usePointStyle) { + // Recalculate x and y for drawPoint() because its expecting + // x and y to be center of figure (instead of top left) + var radius = fontSize * Math.SQRT2 / 2; + var offSet = radius / Math.SQRT2; + var centerX = x + offSet; + var centerY = y + offSet; + + // Draw pointStyle as legend symbol + helpers.canvas.drawPoint(ctx, legendItem.pointStyle, radius, centerX, centerY); + } else { + // Draw box as legend symbol + if (!isLineWidthZero) { + ctx.strokeRect(x, y, boxWidth, fontSize); + } + ctx.fillRect(x, y, boxWidth, fontSize); + } + + ctx.restore(); + }; + var fillText = function(x, y, legendItem, textWidth) { + var halfFontSize = fontSize / 2; + var xLeft = boxWidth + halfFontSize + x; + var yMiddle = y + halfFontSize; + + ctx.fillText(legendItem.text, xLeft, yMiddle); + + if (legendItem.hidden) { + // Strikethrough the text if hidden + ctx.beginPath(); + ctx.lineWidth = 2; + ctx.moveTo(xLeft, yMiddle); + ctx.lineTo(xLeft + textWidth, yMiddle); + ctx.stroke(); + } + }; + + // Horizontal + var isHorizontal = me.isHorizontal(); + if (isHorizontal) { + cursor = { + x: me.left + ((legendWidth - lineWidths[0]) / 2), + y: me.top + labelOpts.padding, + line: 0 + }; + } else { + cursor = { + x: me.left + labelOpts.padding, + y: me.top + labelOpts.padding, + line: 0 + }; + } + + var itemHeight = fontSize + labelOpts.padding; + helpers.each(me.legendItems, function(legendItem, i) { + var textWidth = ctx.measureText(legendItem.text).width; + var width = boxWidth + (fontSize / 2) + textWidth; + var x = cursor.x; + var y = cursor.y; + + if (isHorizontal) { + if (x + width >= legendWidth) { + y = cursor.y += itemHeight; + cursor.line++; + x = cursor.x = me.left + ((legendWidth - lineWidths[cursor.line]) / 2); + } + } else if (y + itemHeight > me.bottom) { + x = cursor.x = x + me.columnWidths[cursor.line] + labelOpts.padding; + y = cursor.y = me.top + labelOpts.padding; + cursor.line++; + } + + drawLegendBox(x, y, legendItem); + + hitboxes[i].left = x; + hitboxes[i].top = y; + + // Fill the actual label + fillText(x, y, legendItem, textWidth); + + if (isHorizontal) { + cursor.x += width + (labelOpts.padding); + } else { + cursor.y += itemHeight; + } + + }); + } + }, + + /** + * Handle an event + * @private + * @param {IEvent} event - The event to handle + * @return {Boolean} true if a change occured + */ + handleEvent: function(e) { + var me = this; + var opts = me.options; + var type = e.type === 'mouseup' ? 'click' : e.type; + var changed = false; + + if (type === 'mousemove') { + if (!opts.onHover) { + return; + } + } else if (type === 'click') { + if (!opts.onClick) { + return; + } + } else { + return; + } + + // Chart event already has relative position in it + var x = e.x; + var y = e.y; + + if (x >= me.left && x <= me.right && y >= me.top && y <= me.bottom) { + // See if we are touching one of the dataset boxes + var lh = me.legendHitBoxes; + for (var i = 0; i < lh.length; ++i) { + var hitBox = lh[i]; + + if (x >= hitBox.left && x <= hitBox.left + hitBox.width && y >= hitBox.top && y <= hitBox.top + hitBox.height) { + // Touching an element + if (type === 'click') { + // use e.native for backwards compatibility + opts.onClick.call(me, e.native, me.legendItems[i]); + changed = true; + break; + } else if (type === 'mousemove') { + // use e.native for backwards compatibility + opts.onHover.call(me, e.native, me.legendItems[i]); + changed = true; + break; + } + } + } + } + + return changed; + } + }); + + function createNewLegendAndAttach(chart, legendOpts) { + var legend = new Chart.Legend({ + ctx: chart.ctx, + options: legendOpts, + chart: chart + }); + + layout.configure(chart, legend, legendOpts); + layout.addBox(chart, legend); + chart.legend = legend; + } + + return { + id: 'legend', + + beforeInit: function(chart) { + var legendOpts = chart.options.legend; + + if (legendOpts) { + createNewLegendAndAttach(chart, legendOpts); + } + }, + + beforeUpdate: function(chart) { + var legendOpts = chart.options.legend; + var legend = chart.legend; + + if (legendOpts) { + helpers.mergeIf(legendOpts, defaults.global.legend); + + if (legend) { + layout.configure(chart, legend, legendOpts); + legend.options = legendOpts; + } else { + createNewLegendAndAttach(chart, legendOpts); + } + } else if (legend) { + layout.removeBox(chart, legend); + delete chart.legend; + } + }, + + afterEvent: function(chart, e) { + var legend = chart.legend; + if (legend) { + legend.handleEvent(e); + } + } + }; +}; + +},{"25":25,"26":26,"45":45}],51:[function(require,module,exports){ +'use strict'; + +var defaults = require(25); +var Element = require(26); +var helpers = require(45); + +defaults._set('global', { + title: { + display: false, + fontStyle: 'bold', + fullWidth: true, + lineHeight: 1.2, + padding: 10, + position: 'top', + text: '', + weight: 2000 // by default greater than legend (1000) to be above + } +}); + +module.exports = function(Chart) { + + var layout = Chart.layoutService; + var noop = helpers.noop; + + Chart.Title = Element.extend({ + initialize: function(config) { + var me = this; + helpers.extend(me, config); + + // Contains hit boxes for each dataset (in dataset order) + me.legendHitBoxes = []; + }, + + // These methods are ordered by lifecycle. Utilities then follow. + + beforeUpdate: noop, + update: function(maxWidth, maxHeight, margins) { + var me = this; + + // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;) + me.beforeUpdate(); + + // Absorb the master measurements + me.maxWidth = maxWidth; + me.maxHeight = maxHeight; + me.margins = margins; + + // Dimensions + me.beforeSetDimensions(); + me.setDimensions(); + me.afterSetDimensions(); + // Labels + me.beforeBuildLabels(); + me.buildLabels(); + me.afterBuildLabels(); + + // Fit + me.beforeFit(); + me.fit(); + me.afterFit(); + // + me.afterUpdate(); + + return me.minSize; + + }, + afterUpdate: noop, + + // + + beforeSetDimensions: noop, + setDimensions: function() { + var me = this; + // Set the unconstrained dimension before label rotation + if (me.isHorizontal()) { + // Reset position before calculating rotation + me.width = me.maxWidth; + me.left = 0; + me.right = me.width; + } else { + me.height = me.maxHeight; + + // Reset position before calculating rotation + me.top = 0; + me.bottom = me.height; + } + + // Reset padding + me.paddingLeft = 0; + me.paddingTop = 0; + me.paddingRight = 0; + me.paddingBottom = 0; + + // Reset minSize + me.minSize = { + width: 0, + height: 0 + }; + }, + afterSetDimensions: noop, + + // + + beforeBuildLabels: noop, + buildLabels: noop, + afterBuildLabels: noop, + + // + + beforeFit: noop, + fit: function() { + var me = this; + var valueOrDefault = helpers.valueOrDefault; + var opts = me.options; + var display = opts.display; + var fontSize = valueOrDefault(opts.fontSize, defaults.global.defaultFontSize); + var minSize = me.minSize; + var lineCount = helpers.isArray(opts.text) ? opts.text.length : 1; + var lineHeight = helpers.options.toLineHeight(opts.lineHeight, fontSize); + var textSize = display ? (lineCount * lineHeight) + (opts.padding * 2) : 0; + + if (me.isHorizontal()) { + minSize.width = me.maxWidth; // fill all the width + minSize.height = textSize; + } else { + minSize.width = textSize; + minSize.height = me.maxHeight; // fill all the height + } + + me.width = minSize.width; + me.height = minSize.height; + + }, + afterFit: noop, + + // Shared Methods + isHorizontal: function() { + var pos = this.options.position; + return pos === 'top' || pos === 'bottom'; + }, + + // Actually draw the title block on the canvas + draw: function() { + var me = this; + var ctx = me.ctx; + var valueOrDefault = helpers.valueOrDefault; + var opts = me.options; + var globalDefaults = defaults.global; + + if (opts.display) { + var fontSize = valueOrDefault(opts.fontSize, globalDefaults.defaultFontSize); + var fontStyle = valueOrDefault(opts.fontStyle, globalDefaults.defaultFontStyle); + var fontFamily = valueOrDefault(opts.fontFamily, globalDefaults.defaultFontFamily); + var titleFont = helpers.fontString(fontSize, fontStyle, fontFamily); + var lineHeight = helpers.options.toLineHeight(opts.lineHeight, fontSize); + var offset = lineHeight / 2 + opts.padding; + var rotation = 0; + var top = me.top; + var left = me.left; + var bottom = me.bottom; + var right = me.right; + var maxWidth, titleX, titleY; + + ctx.fillStyle = valueOrDefault(opts.fontColor, globalDefaults.defaultFontColor); // render in correct colour + ctx.font = titleFont; + + // Horizontal + if (me.isHorizontal()) { + titleX = left + ((right - left) / 2); // midpoint of the width + titleY = top + offset; + maxWidth = right - left; + } else { + titleX = opts.position === 'left' ? left + offset : right - offset; + titleY = top + ((bottom - top) / 2); + maxWidth = bottom - top; + rotation = Math.PI * (opts.position === 'left' ? -0.5 : 0.5); + } + + ctx.save(); + ctx.translate(titleX, titleY); + ctx.rotate(rotation); + ctx.textAlign = 'center'; + ctx.textBaseline = 'middle'; + + var text = opts.text; + if (helpers.isArray(text)) { + var y = 0; + for (var i = 0; i < text.length; ++i) { + ctx.fillText(text[i], 0, y, maxWidth); + y += lineHeight; + } + } else { + ctx.fillText(text, 0, 0, maxWidth); + } + + ctx.restore(); + } + } + }); + + function createNewTitleBlockAndAttach(chart, titleOpts) { + var title = new Chart.Title({ + ctx: chart.ctx, + options: titleOpts, + chart: chart + }); + + layout.configure(chart, title, titleOpts); + layout.addBox(chart, title); + chart.titleBlock = title; + } + + return { + id: 'title', + + beforeInit: function(chart) { + var titleOpts = chart.options.title; + + if (titleOpts) { + createNewTitleBlockAndAttach(chart, titleOpts); + } + }, + + beforeUpdate: function(chart) { + var titleOpts = chart.options.title; + var titleBlock = chart.titleBlock; + + if (titleOpts) { + helpers.mergeIf(titleOpts, defaults.global.title); + + if (titleBlock) { + layout.configure(chart, titleBlock, titleOpts); + titleBlock.options = titleOpts; + } else { + createNewTitleBlockAndAttach(chart, titleOpts); + } + } else if (titleBlock) { + Chart.layoutService.removeBox(chart, titleBlock); + delete chart.titleBlock; + } + } + }; +}; + +},{"25":25,"26":26,"45":45}],52:[function(require,module,exports){ +'use strict'; + +module.exports = function(Chart) { + + // Default config for a category scale + var defaultConfig = { + position: 'bottom' + }; + + var DatasetScale = Chart.Scale.extend({ + /** + * Internal function to get the correct labels. If data.xLabels or data.yLabels are defined, use those + * else fall back to data.labels + * @private + */ + getLabels: function() { + var data = this.chart.data; + return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels; + }, + + determineDataLimits: function() { + var me = this; + var labels = me.getLabels(); + me.minIndex = 0; + me.maxIndex = labels.length - 1; + var findIndex; + + if (me.options.ticks.min !== undefined) { + // user specified min value + findIndex = labels.indexOf(me.options.ticks.min); + me.minIndex = findIndex !== -1 ? findIndex : me.minIndex; + } + + if (me.options.ticks.max !== undefined) { + // user specified max value + findIndex = labels.indexOf(me.options.ticks.max); + me.maxIndex = findIndex !== -1 ? findIndex : me.maxIndex; + } + + me.min = labels[me.minIndex]; + me.max = labels[me.maxIndex]; + }, + + buildTicks: function() { + var me = this; + var labels = me.getLabels(); + // If we are viewing some subset of labels, slice the original array + me.ticks = (me.minIndex === 0 && me.maxIndex === labels.length - 1) ? labels : labels.slice(me.minIndex, me.maxIndex + 1); + }, + + getLabelForIndex: function(index, datasetIndex) { + var me = this; + var data = me.chart.data; + var isHorizontal = me.isHorizontal(); + + if (data.yLabels && !isHorizontal) { + return me.getRightValue(data.datasets[datasetIndex].data[index]); + } + return me.ticks[index - me.minIndex]; + }, + + // Used to get data value locations. Value can either be an index or a numerical value + getPixelForValue: function(value, index) { + var me = this; + var offset = me.options.offset; + // 1 is added because we need the length but we have the indexes + var offsetAmt = Math.max((me.maxIndex + 1 - me.minIndex - (offset ? 0 : 1)), 1); + + // If value is a data object, then index is the index in the data array, + // not the index of the scale. We need to change that. + var valueCategory; + if (value !== undefined && value !== null) { + valueCategory = me.isHorizontal() ? value.x : value.y; + } + if (valueCategory !== undefined || (value !== undefined && isNaN(index))) { + var labels = me.getLabels(); + value = valueCategory || value; + var idx = labels.indexOf(value); + index = idx !== -1 ? idx : index; + } + + if (me.isHorizontal()) { + var valueWidth = me.width / offsetAmt; + var widthOffset = (valueWidth * (index - me.minIndex)); + + if (offset) { + widthOffset += (valueWidth / 2); + } + + return me.left + Math.round(widthOffset); + } + var valueHeight = me.height / offsetAmt; + var heightOffset = (valueHeight * (index - me.minIndex)); + + if (offset) { + heightOffset += (valueHeight / 2); + } + + return me.top + Math.round(heightOffset); + }, + getPixelForTick: function(index) { + return this.getPixelForValue(this.ticks[index], index + this.minIndex, null); + }, + getValueForPixel: function(pixel) { + var me = this; + var offset = me.options.offset; + var value; + var offsetAmt = Math.max((me._ticks.length - (offset ? 0 : 1)), 1); + var horz = me.isHorizontal(); + var valueDimension = (horz ? me.width : me.height) / offsetAmt; + + pixel -= horz ? me.left : me.top; + + if (offset) { + pixel -= (valueDimension / 2); + } + + if (pixel <= 0) { + value = 0; + } else { + value = Math.round(pixel / valueDimension); + } + + return value + me.minIndex; + }, + getBasePixel: function() { + return this.bottom; + } + }); + + Chart.scaleService.registerScaleType('category', DatasetScale, defaultConfig); + +}; + +},{}],53:[function(require,module,exports){ +'use strict'; + +var defaults = require(25); +var helpers = require(45); +var Ticks = require(34); + +module.exports = function(Chart) { + + var defaultConfig = { + position: 'left', + ticks: { + callback: Ticks.formatters.linear + } + }; + + var LinearScale = Chart.LinearScaleBase.extend({ + + determineDataLimits: function() { + var me = this; + var opts = me.options; + var chart = me.chart; + var data = chart.data; + var datasets = data.datasets; + var isHorizontal = me.isHorizontal(); + var DEFAULT_MIN = 0; + var DEFAULT_MAX = 1; + + function IDMatches(meta) { + return isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id; + } + + // First Calculate the range + me.min = null; + me.max = null; + + var hasStacks = opts.stacked; + if (hasStacks === undefined) { + helpers.each(datasets, function(dataset, datasetIndex) { + if (hasStacks) { + return; + } + + var meta = chart.getDatasetMeta(datasetIndex); + if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) && + meta.stack !== undefined) { + hasStacks = true; + } + }); + } + + if (opts.stacked || hasStacks) { + var valuesPerStack = {}; + + helpers.each(datasets, function(dataset, datasetIndex) { + var meta = chart.getDatasetMeta(datasetIndex); + var key = [ + meta.type, + // we have a separate stack for stack=undefined datasets when the opts.stacked is undefined + ((opts.stacked === undefined && meta.stack === undefined) ? datasetIndex : ''), + meta.stack + ].join('.'); + + if (valuesPerStack[key] === undefined) { + valuesPerStack[key] = { + positiveValues: [], + negativeValues: [] + }; + } + + // Store these per type + var positiveValues = valuesPerStack[key].positiveValues; + var negativeValues = valuesPerStack[key].negativeValues; + + if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { + helpers.each(dataset.data, function(rawValue, index) { + var value = +me.getRightValue(rawValue); + if (isNaN(value) || meta.data[index].hidden) { + return; + } + + positiveValues[index] = positiveValues[index] || 0; + negativeValues[index] = negativeValues[index] || 0; + + if (opts.relativePoints) { + positiveValues[index] = 100; + } else if (value < 0) { + negativeValues[index] += value; + } else { + positiveValues[index] += value; + } + }); + } + }); + + helpers.each(valuesPerStack, function(valuesForType) { + var values = valuesForType.positiveValues.concat(valuesForType.negativeValues); + var minVal = helpers.min(values); + var maxVal = helpers.max(values); + me.min = me.min === null ? minVal : Math.min(me.min, minVal); + me.max = me.max === null ? maxVal : Math.max(me.max, maxVal); + }); + + } else { + helpers.each(datasets, function(dataset, datasetIndex) { + var meta = chart.getDatasetMeta(datasetIndex); + if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { + helpers.each(dataset.data, function(rawValue, index) { + var value = +me.getRightValue(rawValue); + if (isNaN(value) || meta.data[index].hidden) { + return; + } + + if (me.min === null) { + me.min = value; + } else if (value < me.min) { + me.min = value; + } + + if (me.max === null) { + me.max = value; + } else if (value > me.max) { + me.max = value; + } + }); + } + }); + } + + me.min = isFinite(me.min) && !isNaN(me.min) ? me.min : DEFAULT_MIN; + me.max = isFinite(me.max) && !isNaN(me.max) ? me.max : DEFAULT_MAX; + + // Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero + this.handleTickRangeOptions(); + }, + getTickLimit: function() { + var maxTicks; + var me = this; + var tickOpts = me.options.ticks; + + if (me.isHorizontal()) { + maxTicks = Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(me.width / 50)); + } else { + // The factor of 2 used to scale the font size has been experimentally determined. + var tickFontSize = helpers.valueOrDefault(tickOpts.fontSize, defaults.global.defaultFontSize); + maxTicks = Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(me.height / (2 * tickFontSize))); + } + + return maxTicks; + }, + // Called after the ticks are built. We need + handleDirectionalChanges: function() { + if (!this.isHorizontal()) { + // We are in a vertical orientation. The top value is the highest. So reverse the array + this.ticks.reverse(); + } + }, + getLabelForIndex: function(index, datasetIndex) { + return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]); + }, + // Utils + getPixelForValue: function(value) { + // This must be called after fit has been run so that + // this.left, this.top, this.right, and this.bottom have been defined + var me = this; + var start = me.start; + + var rightValue = +me.getRightValue(value); + var pixel; + var range = me.end - start; + + if (me.isHorizontal()) { + pixel = me.left + (me.width / range * (rightValue - start)); + return Math.round(pixel); + } + + pixel = me.bottom - (me.height / range * (rightValue - start)); + return Math.round(pixel); + }, + getValueForPixel: function(pixel) { + var me = this; + var isHorizontal = me.isHorizontal(); + var innerDimension = isHorizontal ? me.width : me.height; + var offset = (isHorizontal ? pixel - me.left : me.bottom - pixel) / innerDimension; + return me.start + ((me.end - me.start) * offset); + }, + getPixelForTick: function(index) { + return this.getPixelForValue(this.ticksAsNumbers[index]); + } + }); + Chart.scaleService.registerScaleType('linear', LinearScale, defaultConfig); + +}; + +},{"25":25,"34":34,"45":45}],54:[function(require,module,exports){ +'use strict'; + +var helpers = require(45); +var Ticks = require(34); + +module.exports = function(Chart) { + + var noop = helpers.noop; + + Chart.LinearScaleBase = Chart.Scale.extend({ + getRightValue: function(value) { + if (typeof value === 'string') { + return +value; + } + return Chart.Scale.prototype.getRightValue.call(this, value); + }, + + handleTickRangeOptions: function() { + var me = this; + var opts = me.options; + var tickOpts = opts.ticks; + + // If we are forcing it to begin at 0, but 0 will already be rendered on the chart, + // do nothing since that would make the chart weird. If the user really wants a weird chart + // axis, they can manually override it + if (tickOpts.beginAtZero) { + var minSign = helpers.sign(me.min); + var maxSign = helpers.sign(me.max); + + if (minSign < 0 && maxSign < 0) { + // move the top up to 0 + me.max = 0; + } else if (minSign > 0 && maxSign > 0) { + // move the bottom down to 0 + me.min = 0; + } + } + + var setMin = tickOpts.min !== undefined || tickOpts.suggestedMin !== undefined; + var setMax = tickOpts.max !== undefined || tickOpts.suggestedMax !== undefined; + + if (tickOpts.min !== undefined) { + me.min = tickOpts.min; + } else if (tickOpts.suggestedMin !== undefined) { + if (me.min === null) { + me.min = tickOpts.suggestedMin; + } else { + me.min = Math.min(me.min, tickOpts.suggestedMin); + } + } + + if (tickOpts.max !== undefined) { + me.max = tickOpts.max; + } else if (tickOpts.suggestedMax !== undefined) { + if (me.max === null) { + me.max = tickOpts.suggestedMax; + } else { + me.max = Math.max(me.max, tickOpts.suggestedMax); + } + } + + if (setMin !== setMax) { + // We set the min or the max but not both. + // So ensure that our range is good + // Inverted or 0 length range can happen when + // ticks.min is set, and no datasets are visible + if (me.min >= me.max) { + if (setMin) { + me.max = me.min + 1; + } else { + me.min = me.max - 1; + } + } + } + + if (me.min === me.max) { + me.max++; + + if (!tickOpts.beginAtZero) { + me.min--; + } + } + }, + getTickLimit: noop, + handleDirectionalChanges: noop, + + buildTicks: function() { + var me = this; + var opts = me.options; + var tickOpts = opts.ticks; + + // Figure out what the max number of ticks we can support it is based on the size of + // the axis area. For now, we say that the minimum tick spacing in pixels must be 50 + // We also limit the maximum number of ticks to 11 which gives a nice 10 squares on + // the graph. Make sure we always have at least 2 ticks + var maxTicks = me.getTickLimit(); + maxTicks = Math.max(2, maxTicks); + + var numericGeneratorOptions = { + maxTicks: maxTicks, + min: tickOpts.min, + max: tickOpts.max, + stepSize: helpers.valueOrDefault(tickOpts.fixedStepSize, tickOpts.stepSize) + }; + var ticks = me.ticks = Ticks.generators.linear(numericGeneratorOptions, me); + + me.handleDirectionalChanges(); + + // At this point, we need to update our max and min given the tick values since we have expanded the + // range of the scale + me.max = helpers.max(ticks); + me.min = helpers.min(ticks); + + if (tickOpts.reverse) { + ticks.reverse(); + + me.start = me.max; + me.end = me.min; + } else { + me.start = me.min; + me.end = me.max; + } + }, + convertTicksToLabels: function() { + var me = this; + me.ticksAsNumbers = me.ticks.slice(); + me.zeroLineIndex = me.ticks.indexOf(0); + + Chart.Scale.prototype.convertTicksToLabels.call(me); + } + }); +}; + +},{"34":34,"45":45}],55:[function(require,module,exports){ +'use strict'; + +var helpers = require(45); +var Ticks = require(34); + +module.exports = function(Chart) { + + var defaultConfig = { + position: 'left', + + // label settings + ticks: { + callback: Ticks.formatters.logarithmic + } + }; + + var LogarithmicScale = Chart.Scale.extend({ + determineDataLimits: function() { + var me = this; + var opts = me.options; + var tickOpts = opts.ticks; + var chart = me.chart; + var data = chart.data; + var datasets = data.datasets; + var valueOrDefault = helpers.valueOrDefault; + var isHorizontal = me.isHorizontal(); + function IDMatches(meta) { + return isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id; + } + + // Calculate Range + me.min = null; + me.max = null; + me.minNotZero = null; + + var hasStacks = opts.stacked; + if (hasStacks === undefined) { + helpers.each(datasets, function(dataset, datasetIndex) { + if (hasStacks) { + return; + } + + var meta = chart.getDatasetMeta(datasetIndex); + if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) && + meta.stack !== undefined) { + hasStacks = true; + } + }); + } + + if (opts.stacked || hasStacks) { + var valuesPerStack = {}; + + helpers.each(datasets, function(dataset, datasetIndex) { + var meta = chart.getDatasetMeta(datasetIndex); + var key = [ + meta.type, + // we have a separate stack for stack=undefined datasets when the opts.stacked is undefined + ((opts.stacked === undefined && meta.stack === undefined) ? datasetIndex : ''), + meta.stack + ].join('.'); + + if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { + if (valuesPerStack[key] === undefined) { + valuesPerStack[key] = []; + } + + helpers.each(dataset.data, function(rawValue, index) { + var values = valuesPerStack[key]; + var value = +me.getRightValue(rawValue); + if (isNaN(value) || meta.data[index].hidden) { + return; + } + + values[index] = values[index] || 0; + + if (opts.relativePoints) { + values[index] = 100; + } else { + // Don't need to split positive and negative since the log scale can't handle a 0 crossing + values[index] += value; + } + }); + } + }); + + helpers.each(valuesPerStack, function(valuesForType) { + var minVal = helpers.min(valuesForType); + var maxVal = helpers.max(valuesForType); + me.min = me.min === null ? minVal : Math.min(me.min, minVal); + me.max = me.max === null ? maxVal : Math.max(me.max, maxVal); + }); + + } else { + helpers.each(datasets, function(dataset, datasetIndex) { + var meta = chart.getDatasetMeta(datasetIndex); + if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { + helpers.each(dataset.data, function(rawValue, index) { + var value = +me.getRightValue(rawValue); + if (isNaN(value) || meta.data[index].hidden) { + return; + } + + if (me.min === null) { + me.min = value; + } else if (value < me.min) { + me.min = value; + } + + if (me.max === null) { + me.max = value; + } else if (value > me.max) { + me.max = value; + } + + if (value !== 0 && (me.minNotZero === null || value < me.minNotZero)) { + me.minNotZero = value; + } + }); + } + }); + } + + me.min = valueOrDefault(tickOpts.min, me.min); + me.max = valueOrDefault(tickOpts.max, me.max); + + if (me.min === me.max) { + if (me.min !== 0 && me.min !== null) { + me.min = Math.pow(10, Math.floor(helpers.log10(me.min)) - 1); + me.max = Math.pow(10, Math.floor(helpers.log10(me.max)) + 1); + } else { + me.min = 1; + me.max = 10; + } + } + }, + buildTicks: function() { + var me = this; + var opts = me.options; + var tickOpts = opts.ticks; + + var generationOptions = { + min: tickOpts.min, + max: tickOpts.max + }; + var ticks = me.ticks = Ticks.generators.logarithmic(generationOptions, me); + + if (!me.isHorizontal()) { + // We are in a vertical orientation. The top value is the highest. So reverse the array + ticks.reverse(); + } + + // At this point, we need to update our max and min given the tick values since we have expanded the + // range of the scale + me.max = helpers.max(ticks); + me.min = helpers.min(ticks); + + if (tickOpts.reverse) { + ticks.reverse(); + + me.start = me.max; + me.end = me.min; + } else { + me.start = me.min; + me.end = me.max; + } + }, + convertTicksToLabels: function() { + this.tickValues = this.ticks.slice(); + + Chart.Scale.prototype.convertTicksToLabels.call(this); + }, + // Get the correct tooltip label + getLabelForIndex: function(index, datasetIndex) { + return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]); + }, + getPixelForTick: function(index) { + return this.getPixelForValue(this.tickValues[index]); + }, + getPixelForValue: function(value) { + var me = this; + var start = me.start; + var newVal = +me.getRightValue(value); + var opts = me.options; + var tickOpts = opts.ticks; + var innerDimension, pixel, range; + + if (me.isHorizontal()) { + range = helpers.log10(me.end) - helpers.log10(start); // todo: if start === 0 + if (newVal === 0) { + pixel = me.left; + } else { + innerDimension = me.width; + pixel = me.left + (innerDimension / range * (helpers.log10(newVal) - helpers.log10(start))); + } + } else { + // Bottom - top since pixels increase downward on a screen + innerDimension = me.height; + if (start === 0 && !tickOpts.reverse) { + range = helpers.log10(me.end) - helpers.log10(me.minNotZero); + if (newVal === start) { + pixel = me.bottom; + } else if (newVal === me.minNotZero) { + pixel = me.bottom - innerDimension * 0.02; + } else { + pixel = me.bottom - innerDimension * 0.02 - (innerDimension * 0.98 / range * (helpers.log10(newVal) - helpers.log10(me.minNotZero))); + } + } else if (me.end === 0 && tickOpts.reverse) { + range = helpers.log10(me.start) - helpers.log10(me.minNotZero); + if (newVal === me.end) { + pixel = me.top; + } else if (newVal === me.minNotZero) { + pixel = me.top + innerDimension * 0.02; + } else { + pixel = me.top + innerDimension * 0.02 + (innerDimension * 0.98 / range * (helpers.log10(newVal) - helpers.log10(me.minNotZero))); + } + } else if (newVal === 0) { + pixel = tickOpts.reverse ? me.top : me.bottom; + } else { + range = helpers.log10(me.end) - helpers.log10(start); + innerDimension = me.height; + pixel = me.bottom - (innerDimension / range * (helpers.log10(newVal) - helpers.log10(start))); + } + } + return pixel; + }, + getValueForPixel: function(pixel) { + var me = this; + var range = helpers.log10(me.end) - helpers.log10(me.start); + var value, innerDimension; + + if (me.isHorizontal()) { + innerDimension = me.width; + value = me.start * Math.pow(10, (pixel - me.left) * range / innerDimension); + } else { // todo: if start === 0 + innerDimension = me.height; + value = Math.pow(10, (me.bottom - pixel) * range / innerDimension) / me.start; + } + return value; + } + }); + Chart.scaleService.registerScaleType('logarithmic', LogarithmicScale, defaultConfig); + +}; + +},{"34":34,"45":45}],56:[function(require,module,exports){ +'use strict'; + +var defaults = require(25); +var helpers = require(45); +var Ticks = require(34); + +module.exports = function(Chart) { + + var globalDefaults = defaults.global; + + var defaultConfig = { + display: true, + + // Boolean - Whether to animate scaling the chart from the centre + animate: true, + position: 'chartArea', + + angleLines: { + display: true, + color: 'rgba(0, 0, 0, 0.1)', + lineWidth: 1 + }, + + gridLines: { + circular: false + }, + + // label settings + ticks: { + // Boolean - Show a backdrop to the scale label + showLabelBackdrop: true, + + // String - The colour of the label backdrop + backdropColor: 'rgba(255,255,255,0.75)', + + // Number - The backdrop padding above & below the label in pixels + backdropPaddingY: 2, + + // Number - The backdrop padding to the side of the label in pixels + backdropPaddingX: 2, + + callback: Ticks.formatters.linear + }, + + pointLabels: { + // Boolean - if true, show point labels + display: true, + + // Number - Point label font size in pixels + fontSize: 10, + + // Function - Used to convert point labels + callback: function(label) { + return label; + } + } + }; + + function getValueCount(scale) { + var opts = scale.options; + return opts.angleLines.display || opts.pointLabels.display ? scale.chart.data.labels.length : 0; + } + + function getPointLabelFontOptions(scale) { + var pointLabelOptions = scale.options.pointLabels; + var fontSize = helpers.valueOrDefault(pointLabelOptions.fontSize, globalDefaults.defaultFontSize); + var fontStyle = helpers.valueOrDefault(pointLabelOptions.fontStyle, globalDefaults.defaultFontStyle); + var fontFamily = helpers.valueOrDefault(pointLabelOptions.fontFamily, globalDefaults.defaultFontFamily); + var font = helpers.fontString(fontSize, fontStyle, fontFamily); + + return { + size: fontSize, + style: fontStyle, + family: fontFamily, + font: font + }; + } + + function measureLabelSize(ctx, fontSize, label) { + if (helpers.isArray(label)) { + return { + w: helpers.longestText(ctx, ctx.font, label), + h: (label.length * fontSize) + ((label.length - 1) * 1.5 * fontSize) + }; + } + + return { + w: ctx.measureText(label).width, + h: fontSize + }; + } + + function determineLimits(angle, pos, size, min, max) { + if (angle === min || angle === max) { + return { + start: pos - (size / 2), + end: pos + (size / 2) + }; + } else if (angle < min || angle > max) { + return { + start: pos - size - 5, + end: pos + }; + } + + return { + start: pos, + end: pos + size + 5 + }; + } + + /** + * Helper function to fit a radial linear scale with point labels + */ + function fitWithPointLabels(scale) { + /* + * Right, this is really confusing and there is a lot of maths going on here + * The gist of the problem is here: https://gist.github.com/nnnick/696cc9c55f4b0beb8fe9 + * + * Reaction: https://dl.dropboxusercontent.com/u/34601363/toomuchscience.gif + * + * Solution: + * + * We assume the radius of the polygon is half the size of the canvas at first + * at each index we check if the text overlaps. + * + * Where it does, we store that angle and that index. + * + * After finding the largest index and angle we calculate how much we need to remove + * from the shape radius to move the point inwards by that x. + * + * We average the left and right distances to get the maximum shape radius that can fit in the box + * along with labels. + * + * Once we have that, we can find the centre point for the chart, by taking the x text protrusion + * on each side, removing that from the size, halving it and adding the left x protrusion width. + * + * This will mean we have a shape fitted to the canvas, as large as it can be with the labels + * and position it in the most space efficient manner + * + * https://dl.dropboxusercontent.com/u/34601363/yeahscience.gif + */ + + var plFont = getPointLabelFontOptions(scale); + + // Get maximum radius of the polygon. Either half the height (minus the text width) or half the width. + // Use this to calculate the offset + change. - Make sure L/R protrusion is at least 0 to stop issues with centre points + var largestPossibleRadius = Math.min(scale.height / 2, scale.width / 2); + var furthestLimits = { + r: scale.width, + l: 0, + t: scale.height, + b: 0 + }; + var furthestAngles = {}; + var i, textSize, pointPosition; + + scale.ctx.font = plFont.font; + scale._pointLabelSizes = []; + + var valueCount = getValueCount(scale); + for (i = 0; i < valueCount; i++) { + pointPosition = scale.getPointPosition(i, largestPossibleRadius); + textSize = measureLabelSize(scale.ctx, plFont.size, scale.pointLabels[i] || ''); + scale._pointLabelSizes[i] = textSize; + + // Add quarter circle to make degree 0 mean top of circle + var angleRadians = scale.getIndexAngle(i); + var angle = helpers.toDegrees(angleRadians) % 360; + var hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180); + var vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270); + + if (hLimits.start < furthestLimits.l) { + furthestLimits.l = hLimits.start; + furthestAngles.l = angleRadians; + } + + if (hLimits.end > furthestLimits.r) { + furthestLimits.r = hLimits.end; + furthestAngles.r = angleRadians; + } + + if (vLimits.start < furthestLimits.t) { + furthestLimits.t = vLimits.start; + furthestAngles.t = angleRadians; + } + + if (vLimits.end > furthestLimits.b) { + furthestLimits.b = vLimits.end; + furthestAngles.b = angleRadians; + } + } + + scale.setReductions(largestPossibleRadius, furthestLimits, furthestAngles); + } + + /** + * Helper function to fit a radial linear scale with no point labels + */ + function fit(scale) { + var largestPossibleRadius = Math.min(scale.height / 2, scale.width / 2); + scale.drawingArea = Math.round(largestPossibleRadius); + scale.setCenterPoint(0, 0, 0, 0); + } + + function getTextAlignForAngle(angle) { + if (angle === 0 || angle === 180) { + return 'center'; + } else if (angle < 180) { + return 'left'; + } + + return 'right'; + } + + function fillText(ctx, text, position, fontSize) { + if (helpers.isArray(text)) { + var y = position.y; + var spacing = 1.5 * fontSize; + + for (var i = 0; i < text.length; ++i) { + ctx.fillText(text[i], position.x, y); + y += spacing; + } + } else { + ctx.fillText(text, position.x, position.y); + } + } + + function adjustPointPositionForLabelHeight(angle, textSize, position) { + if (angle === 90 || angle === 270) { + position.y -= (textSize.h / 2); + } else if (angle > 270 || angle < 90) { + position.y -= textSize.h; + } + } + + function drawPointLabels(scale) { + var ctx = scale.ctx; + var valueOrDefault = helpers.valueOrDefault; + var opts = scale.options; + var angleLineOpts = opts.angleLines; + var pointLabelOpts = opts.pointLabels; + + ctx.lineWidth = angleLineOpts.lineWidth; + ctx.strokeStyle = angleLineOpts.color; + + var outerDistance = scale.getDistanceFromCenterForValue(opts.ticks.reverse ? scale.min : scale.max); + + // Point Label Font + var plFont = getPointLabelFontOptions(scale); + + ctx.textBaseline = 'top'; + + for (var i = getValueCount(scale) - 1; i >= 0; i--) { + if (angleLineOpts.display) { + var outerPosition = scale.getPointPosition(i, outerDistance); + ctx.beginPath(); + ctx.moveTo(scale.xCenter, scale.yCenter); + ctx.lineTo(outerPosition.x, outerPosition.y); + ctx.stroke(); + ctx.closePath(); + } + + if (pointLabelOpts.display) { + // Extra 3px out for some label spacing + var pointLabelPosition = scale.getPointPosition(i, outerDistance + 5); + + // Keep this in loop since we may support array properties here + var pointLabelFontColor = valueOrDefault(pointLabelOpts.fontColor, globalDefaults.defaultFontColor); + ctx.font = plFont.font; + ctx.fillStyle = pointLabelFontColor; + + var angleRadians = scale.getIndexAngle(i); + var angle = helpers.toDegrees(angleRadians); + ctx.textAlign = getTextAlignForAngle(angle); + adjustPointPositionForLabelHeight(angle, scale._pointLabelSizes[i], pointLabelPosition); + fillText(ctx, scale.pointLabels[i] || '', pointLabelPosition, plFont.size); + } + } + } + + function drawRadiusLine(scale, gridLineOpts, radius, index) { + var ctx = scale.ctx; + ctx.strokeStyle = helpers.valueAtIndexOrDefault(gridLineOpts.color, index - 1); + ctx.lineWidth = helpers.valueAtIndexOrDefault(gridLineOpts.lineWidth, index - 1); + + if (scale.options.gridLines.circular) { + // Draw circular arcs between the points + ctx.beginPath(); + ctx.arc(scale.xCenter, scale.yCenter, radius, 0, Math.PI * 2); + ctx.closePath(); + ctx.stroke(); + } else { + // Draw straight lines connecting each index + var valueCount = getValueCount(scale); + + if (valueCount === 0) { + return; + } + + ctx.beginPath(); + var pointPosition = scale.getPointPosition(0, radius); + ctx.moveTo(pointPosition.x, pointPosition.y); + + for (var i = 1; i < valueCount; i++) { + pointPosition = scale.getPointPosition(i, radius); + ctx.lineTo(pointPosition.x, pointPosition.y); + } + + ctx.closePath(); + ctx.stroke(); + } + } + + function numberOrZero(param) { + return helpers.isNumber(param) ? param : 0; + } + + var LinearRadialScale = Chart.LinearScaleBase.extend({ + setDimensions: function() { + var me = this; + var opts = me.options; + var tickOpts = opts.ticks; + // Set the unconstrained dimension before label rotation + me.width = me.maxWidth; + me.height = me.maxHeight; + me.xCenter = Math.round(me.width / 2); + me.yCenter = Math.round(me.height / 2); + + var minSize = helpers.min([me.height, me.width]); + var tickFontSize = helpers.valueOrDefault(tickOpts.fontSize, globalDefaults.defaultFontSize); + me.drawingArea = opts.display ? (minSize / 2) - (tickFontSize / 2 + tickOpts.backdropPaddingY) : (minSize / 2); + }, + determineDataLimits: function() { + var me = this; + var chart = me.chart; + var min = Number.POSITIVE_INFINITY; + var max = Number.NEGATIVE_INFINITY; + + helpers.each(chart.data.datasets, function(dataset, datasetIndex) { + if (chart.isDatasetVisible(datasetIndex)) { + var meta = chart.getDatasetMeta(datasetIndex); + + helpers.each(dataset.data, function(rawValue, index) { + var value = +me.getRightValue(rawValue); + if (isNaN(value) || meta.data[index].hidden) { + return; + } + + min = Math.min(value, min); + max = Math.max(value, max); + }); + } + }); + + me.min = (min === Number.POSITIVE_INFINITY ? 0 : min); + me.max = (max === Number.NEGATIVE_INFINITY ? 0 : max); + + // Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero + me.handleTickRangeOptions(); + }, + getTickLimit: function() { + var tickOpts = this.options.ticks; + var tickFontSize = helpers.valueOrDefault(tickOpts.fontSize, globalDefaults.defaultFontSize); + return Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(this.drawingArea / (1.5 * tickFontSize))); + }, + convertTicksToLabels: function() { + var me = this; + + Chart.LinearScaleBase.prototype.convertTicksToLabels.call(me); + + // Point labels + me.pointLabels = me.chart.data.labels.map(me.options.pointLabels.callback, me); + }, + getLabelForIndex: function(index, datasetIndex) { + return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]); + }, + fit: function() { + if (this.options.pointLabels.display) { + fitWithPointLabels(this); + } else { + fit(this); + } + }, + /** + * Set radius reductions and determine new radius and center point + * @private + */ + setReductions: function(largestPossibleRadius, furthestLimits, furthestAngles) { + var me = this; + var radiusReductionLeft = furthestLimits.l / Math.sin(furthestAngles.l); + var radiusReductionRight = Math.max(furthestLimits.r - me.width, 0) / Math.sin(furthestAngles.r); + var radiusReductionTop = -furthestLimits.t / Math.cos(furthestAngles.t); + var radiusReductionBottom = -Math.max(furthestLimits.b - me.height, 0) / Math.cos(furthestAngles.b); + + radiusReductionLeft = numberOrZero(radiusReductionLeft); + radiusReductionRight = numberOrZero(radiusReductionRight); + radiusReductionTop = numberOrZero(radiusReductionTop); + radiusReductionBottom = numberOrZero(radiusReductionBottom); + + me.drawingArea = Math.min( + Math.round(largestPossibleRadius - (radiusReductionLeft + radiusReductionRight) / 2), + Math.round(largestPossibleRadius - (radiusReductionTop + radiusReductionBottom) / 2)); + me.setCenterPoint(radiusReductionLeft, radiusReductionRight, radiusReductionTop, radiusReductionBottom); + }, + setCenterPoint: function(leftMovement, rightMovement, topMovement, bottomMovement) { + var me = this; + var maxRight = me.width - rightMovement - me.drawingArea; + var maxLeft = leftMovement + me.drawingArea; + var maxTop = topMovement + me.drawingArea; + var maxBottom = me.height - bottomMovement - me.drawingArea; + + me.xCenter = Math.round(((maxLeft + maxRight) / 2) + me.left); + me.yCenter = Math.round(((maxTop + maxBottom) / 2) + me.top); + }, + + getIndexAngle: function(index) { + var angleMultiplier = (Math.PI * 2) / getValueCount(this); + var startAngle = this.chart.options && this.chart.options.startAngle ? + this.chart.options.startAngle : + 0; + + var startAngleRadians = startAngle * Math.PI * 2 / 360; + + // Start from the top instead of right, so remove a quarter of the circle + return index * angleMultiplier + startAngleRadians; + }, + getDistanceFromCenterForValue: function(value) { + var me = this; + + if (value === null) { + return 0; // null always in center + } + + // Take into account half font size + the yPadding of the top value + var scalingFactor = me.drawingArea / (me.max - me.min); + if (me.options.ticks.reverse) { + return (me.max - value) * scalingFactor; + } + return (value - me.min) * scalingFactor; + }, + getPointPosition: function(index, distanceFromCenter) { + var me = this; + var thisAngle = me.getIndexAngle(index) - (Math.PI / 2); + return { + x: Math.round(Math.cos(thisAngle) * distanceFromCenter) + me.xCenter, + y: Math.round(Math.sin(thisAngle) * distanceFromCenter) + me.yCenter + }; + }, + getPointPositionForValue: function(index, value) { + return this.getPointPosition(index, this.getDistanceFromCenterForValue(value)); + }, + + getBasePosition: function() { + var me = this; + var min = me.min; + var max = me.max; + + return me.getPointPositionForValue(0, + me.beginAtZero ? 0 : + min < 0 && max < 0 ? max : + min > 0 && max > 0 ? min : + 0); + }, + + draw: function() { + var me = this; + var opts = me.options; + var gridLineOpts = opts.gridLines; + var tickOpts = opts.ticks; + var valueOrDefault = helpers.valueOrDefault; + + if (opts.display) { + var ctx = me.ctx; + var startAngle = this.getIndexAngle(0); + + // Tick Font + var tickFontSize = valueOrDefault(tickOpts.fontSize, globalDefaults.defaultFontSize); + var tickFontStyle = valueOrDefault(tickOpts.fontStyle, globalDefaults.defaultFontStyle); + var tickFontFamily = valueOrDefault(tickOpts.fontFamily, globalDefaults.defaultFontFamily); + var tickLabelFont = helpers.fontString(tickFontSize, tickFontStyle, tickFontFamily); + + helpers.each(me.ticks, function(label, index) { + // Don't draw a centre value (if it is minimum) + if (index > 0 || tickOpts.reverse) { + var yCenterOffset = me.getDistanceFromCenterForValue(me.ticksAsNumbers[index]); + + // Draw circular lines around the scale + if (gridLineOpts.display && index !== 0) { + drawRadiusLine(me, gridLineOpts, yCenterOffset, index); + } + + if (tickOpts.display) { + var tickFontColor = valueOrDefault(tickOpts.fontColor, globalDefaults.defaultFontColor); + ctx.font = tickLabelFont; + + ctx.save(); + ctx.translate(me.xCenter, me.yCenter); + ctx.rotate(startAngle); + + if (tickOpts.showLabelBackdrop) { + var labelWidth = ctx.measureText(label).width; + ctx.fillStyle = tickOpts.backdropColor; + ctx.fillRect( + -labelWidth / 2 - tickOpts.backdropPaddingX, + -yCenterOffset - tickFontSize / 2 - tickOpts.backdropPaddingY, + labelWidth + tickOpts.backdropPaddingX * 2, + tickFontSize + tickOpts.backdropPaddingY * 2 + ); + } + + ctx.textAlign = 'center'; + ctx.textBaseline = 'middle'; + ctx.fillStyle = tickFontColor; + ctx.fillText(label, 0, -yCenterOffset); + ctx.restore(); + } + } + }); + + if (opts.angleLines.display || opts.pointLabels.display) { + drawPointLabels(me); + } + } + } + }); + Chart.scaleService.registerScaleType('radialLinear', LinearRadialScale, defaultConfig); + +}; + +},{"25":25,"34":34,"45":45}],57:[function(require,module,exports){ +/* global window: false */ +'use strict'; + +var moment = require(1); +moment = typeof moment === 'function' ? moment : window.moment; + +var defaults = require(25); +var helpers = require(45); + +// Integer constants are from the ES6 spec. +var MIN_INTEGER = Number.MIN_SAFE_INTEGER || -9007199254740991; +var MAX_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991; + +var INTERVALS = { + millisecond: { + common: true, + size: 1, + steps: [1, 2, 5, 10, 20, 50, 100, 250, 500] + }, + second: { + common: true, + size: 1000, + steps: [1, 2, 5, 10, 30] + }, + minute: { + common: true, + size: 60000, + steps: [1, 2, 5, 10, 30] + }, + hour: { + common: true, + size: 3600000, + steps: [1, 2, 3, 6, 12] + }, + day: { + common: true, + size: 86400000, + steps: [1, 2, 5] + }, + week: { + common: false, + size: 604800000, + steps: [1, 2, 3, 4] + }, + month: { + common: true, + size: 2.628e9, + steps: [1, 2, 3] + }, + quarter: { + common: false, + size: 7.884e9, + steps: [1, 2, 3, 4] + }, + year: { + common: true, + size: 3.154e10 + } +}; + +var UNITS = Object.keys(INTERVALS); + +function sorter(a, b) { + return a - b; +} + +function arrayUnique(items) { + var hash = {}; + var out = []; + var i, ilen, item; + + for (i = 0, ilen = items.length; i < ilen; ++i) { + item = items[i]; + if (!hash[item]) { + hash[item] = true; + out.push(item); + } + } + + return out; +} + +/** + * Returns an array of {time, pos} objects used to interpolate a specific `time` or position + * (`pos`) on the scale, by searching entries before and after the requested value. `pos` is + * a decimal between 0 and 1: 0 being the start of the scale (left or top) and 1 the other + * extremity (left + width or top + height). Note that it would be more optimized to directly + * store pre-computed pixels, but the scale dimensions are not guaranteed at the time we need + * to create the lookup table. The table ALWAYS contains at least two items: min and max. + * + * @param {Number[]} timestamps - timestamps sorted from lowest to highest. + * @param {String} distribution - If 'linear', timestamps will be spread linearly along the min + * and max range, so basically, the table will contains only two items: {min, 0} and {max, 1}. + * If 'series', timestamps will be positioned at the same distance from each other. In this + * case, only timestamps that break the time linearity are registered, meaning that in the + * best case, all timestamps are linear, the table contains only min and max. + */ +function buildLookupTable(timestamps, min, max, distribution) { + if (distribution === 'linear' || !timestamps.length) { + return [ + {time: min, pos: 0}, + {time: max, pos: 1} + ]; + } + + var table = []; + var items = [min]; + var i, ilen, prev, curr, next; + + for (i = 0, ilen = timestamps.length; i < ilen; ++i) { + curr = timestamps[i]; + if (curr > min && curr < max) { + items.push(curr); + } + } + + items.push(max); + + for (i = 0, ilen = items.length; i < ilen; ++i) { + next = items[i + 1]; + prev = items[i - 1]; + curr = items[i]; + + // only add points that breaks the scale linearity + if (prev === undefined || next === undefined || Math.round((next + prev) / 2) !== curr) { + table.push({time: curr, pos: i / (ilen - 1)}); + } + } + + return table; +} + +// @see adapted from http://www.anujgakhar.com/2014/03/01/binary-search-in-javascript/ +function lookup(table, key, value) { + var lo = 0; + var hi = table.length - 1; + var mid, i0, i1; + + while (lo >= 0 && lo <= hi) { + mid = (lo + hi) >> 1; + i0 = table[mid - 1] || null; + i1 = table[mid]; + + if (!i0) { + // given value is outside table (before first item) + return {lo: null, hi: i1}; + } else if (i1[key] < value) { + lo = mid + 1; + } else if (i0[key] > value) { + hi = mid - 1; + } else { + return {lo: i0, hi: i1}; + } + } + + // given value is outside table (after last item) + return {lo: i1, hi: null}; +} + +/** + * Linearly interpolates the given source `value` using the table items `skey` values and + * returns the associated `tkey` value. For example, interpolate(table, 'time', 42, 'pos') + * returns the position for a timestamp equal to 42. If value is out of bounds, values at + * index [0, 1] or [n - 1, n] are used for the interpolation. + */ +function interpolate(table, skey, sval, tkey) { + var range = lookup(table, skey, sval); + + // Note: the lookup table ALWAYS contains at least 2 items (min and max) + var prev = !range.lo ? table[0] : !range.hi ? table[table.length - 2] : range.lo; + var next = !range.lo ? table[1] : !range.hi ? table[table.length - 1] : range.hi; + + var span = next[skey] - prev[skey]; + var ratio = span ? (sval - prev[skey]) / span : 0; + var offset = (next[tkey] - prev[tkey]) * ratio; + + return prev[tkey] + offset; +} + +/** + * Convert the given value to a moment object using the given time options. + * @see http://momentjs.com/docs/#/parsing/ + */ +function momentify(value, options) { + var parser = options.parser; + var format = options.parser || options.format; + + if (typeof parser === 'function') { + return parser(value); + } + + if (typeof value === 'string' && typeof format === 'string') { + return moment(value, format); + } + + if (!(value instanceof moment)) { + value = moment(value); + } + + if (value.isValid()) { + return value; + } + + // Labels are in an incompatible moment format and no `parser` has been provided. + // The user might still use the deprecated `format` option to convert his inputs. + if (typeof format === 'function') { + return format(value); + } + + return value; +} + +function parse(input, scale) { + if (helpers.isNullOrUndef(input)) { + return null; + } + + var options = scale.options.time; + var value = momentify(scale.getRightValue(input), options); + if (!value.isValid()) { + return null; + } + + if (options.round) { + value.startOf(options.round); + } + + return value.valueOf(); +} + +/** + * Returns the number of unit to skip to be able to display up to `capacity` number of ticks + * in `unit` for the given `min` / `max` range and respecting the interval steps constraints. + */ +function determineStepSize(min, max, unit, capacity) { + var range = max - min; + var interval = INTERVALS[unit]; + var milliseconds = interval.size; + var steps = interval.steps; + var i, ilen, factor; + + if (!steps) { + return Math.ceil(range / ((capacity || 1) * milliseconds)); + } + + for (i = 0, ilen = steps.length; i < ilen; ++i) { + factor = steps[i]; + if (Math.ceil(range / (milliseconds * factor)) <= capacity) { + break; + } + } + + return factor; +} + +/** + * Figures out what unit results in an appropriate number of auto-generated ticks + */ +function determineUnitForAutoTicks(minUnit, min, max, capacity) { + var ilen = UNITS.length; + var i, interval, factor; + + for (i = UNITS.indexOf(minUnit); i < ilen - 1; ++i) { + interval = INTERVALS[UNITS[i]]; + factor = interval.steps ? interval.steps[interval.steps.length - 1] : MAX_INTEGER; + + if (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) { + return UNITS[i]; + } + } + + return UNITS[ilen - 1]; +} + +/** + * Figures out what unit to format a set of ticks with + */ +function determineUnitForFormatting(ticks, minUnit, min, max) { + var duration = moment.duration(moment(max).diff(moment(min))); + var ilen = UNITS.length; + var i, unit; + + for (i = ilen - 1; i >= UNITS.indexOf(minUnit); i--) { + unit = UNITS[i]; + if (INTERVALS[unit].common && duration.as(unit) >= ticks.length) { + return unit; + } + } + + return UNITS[minUnit ? UNITS.indexOf(minUnit) : 0]; +} + +function determineMajorUnit(unit) { + for (var i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i) { + if (INTERVALS[UNITS[i]].common) { + return UNITS[i]; + } + } +} + +/** + * Generates a maximum of `capacity` timestamps between min and max, rounded to the + * `minor` unit, aligned on the `major` unit and using the given scale time `options`. + * Important: this method can return ticks outside the min and max range, it's the + * responsibility of the calling code to clamp values if needed. + */ +function generate(min, max, capacity, options) { + var timeOpts = options.time; + var minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, capacity); + var major = determineMajorUnit(minor); + var stepSize = helpers.valueOrDefault(timeOpts.stepSize, timeOpts.unitStepSize); + var weekday = minor === 'week' ? timeOpts.isoWeekday : false; + var majorTicksEnabled = options.ticks.major.enabled; + var interval = INTERVALS[minor]; + var first = moment(min); + var last = moment(max); + var ticks = []; + var time; + + if (!stepSize) { + stepSize = determineStepSize(min, max, minor, capacity); + } + + // For 'week' unit, handle the first day of week option + if (weekday) { + first = first.isoWeekday(weekday); + last = last.isoWeekday(weekday); + } + + // Align first/last ticks on unit + first = first.startOf(weekday ? 'day' : minor); + last = last.startOf(weekday ? 'day' : minor); + + // Make sure that the last tick include max + if (last < max) { + last.add(1, minor); + } + + time = moment(first); + + if (majorTicksEnabled && major && !weekday && !timeOpts.round) { + // Align the first tick on the previous `minor` unit aligned on the `major` unit: + // we first aligned time on the previous `major` unit then add the number of full + // stepSize there is between first and the previous major time. + time.startOf(major); + time.add(~~((first - time) / (interval.size * stepSize)) * stepSize, minor); + } + + for (; time < last; time.add(stepSize, minor)) { + ticks.push(+time); + } + + ticks.push(+time); + + return ticks; +} + +/** + * Returns the right and left offsets from edges in the form of {left, right}. + * Offsets are added when the `offset` option is true. + */ +function computeOffsets(table, ticks, min, max, options) { + var left = 0; + var right = 0; + var upper, lower; + + if (options.offset && ticks.length) { + if (!options.time.min) { + upper = ticks.length > 1 ? ticks[1] : max; + lower = ticks[0]; + left = ( + interpolate(table, 'time', upper, 'pos') - + interpolate(table, 'time', lower, 'pos') + ) / 2; + } + if (!options.time.max) { + upper = ticks[ticks.length - 1]; + lower = ticks.length > 1 ? ticks[ticks.length - 2] : min; + right = ( + interpolate(table, 'time', upper, 'pos') - + interpolate(table, 'time', lower, 'pos') + ) / 2; + } + } + + return {left: left, right: right}; +} + +function ticksFromTimestamps(values, majorUnit) { + var ticks = []; + var i, ilen, value, major; + + for (i = 0, ilen = values.length; i < ilen; ++i) { + value = values[i]; + major = majorUnit ? value === +moment(value).startOf(majorUnit) : false; + + ticks.push({ + value: value, + major: major + }); + } + + return ticks; +} + +module.exports = function(Chart) { + + var defaultConfig = { + position: 'bottom', + + /** + * Data distribution along the scale: + * - 'linear': data are spread according to their time (distances can vary), + * - 'series': data are spread at the same distance from each other. + * @see https://github.com/chartjs/Chart.js/pull/4507 + * @since 2.7.0 + */ + distribution: 'linear', + + /** + * Scale boundary strategy (bypassed by min/max time options) + * - `data`: make sure data are fully visible, ticks outside are removed + * - `ticks`: make sure ticks are fully visible, data outside are truncated + * @see https://github.com/chartjs/Chart.js/pull/4556 + * @since 2.7.0 + */ + bounds: 'data', + + time: { + parser: false, // false == a pattern string from http://momentjs.com/docs/#/parsing/string-format/ or a custom callback that converts its argument to a moment + format: false, // DEPRECATED false == date objects, moment object, callback or a pattern string from http://momentjs.com/docs/#/parsing/string-format/ + unit: false, // false == automatic or override with week, month, year, etc. + round: false, // none, or override with week, month, year, etc. + displayFormat: false, // DEPRECATED + isoWeekday: false, // override week start day - see http://momentjs.com/docs/#/get-set/iso-weekday/ + minUnit: 'millisecond', + + // defaults to unit's corresponding unitFormat below or override using pattern string from http://momentjs.com/docs/#/displaying/format/ + displayFormats: { + millisecond: 'h:mm:ss.SSS a', // 11:20:01.123 AM, + second: 'h:mm:ss a', // 11:20:01 AM + minute: 'h:mm a', // 11:20 AM + hour: 'hA', // 5PM + day: 'MMM D', // Sep 4 + week: 'll', // Week 46, or maybe "[W]WW - YYYY" ? + month: 'MMM YYYY', // Sept 2015 + quarter: '[Q]Q - YYYY', // Q3 + year: 'YYYY' // 2015 + }, + }, + ticks: { + autoSkip: false, + + /** + * Ticks generation input values: + * - 'auto': generates "optimal" ticks based on scale size and time options. + * - 'data': generates ticks from data (including labels from data {t|x|y} objects). + * - 'labels': generates ticks from user given `data.labels` values ONLY. + * @see https://github.com/chartjs/Chart.js/pull/4507 + * @since 2.7.0 + */ + source: 'auto', + + major: { + enabled: false + } + } + }; + + var TimeScale = Chart.Scale.extend({ + initialize: function() { + if (!moment) { + throw new Error('Chart.js - Moment.js could not be found! You must include it before Chart.js to use the time scale. Download at https://momentjs.com'); + } + + this.mergeTicksOptions(); + + Chart.Scale.prototype.initialize.call(this); + }, + + update: function() { + var me = this; + var options = me.options; + + // DEPRECATIONS: output a message only one time per update + if (options.time && options.time.format) { + console.warn('options.time.format is deprecated and replaced by options.time.parser.'); + } + + return Chart.Scale.prototype.update.apply(me, arguments); + }, + + /** + * Allows data to be referenced via 't' attribute + */ + getRightValue: function(rawValue) { + if (rawValue && rawValue.t !== undefined) { + rawValue = rawValue.t; + } + return Chart.Scale.prototype.getRightValue.call(this, rawValue); + }, + + determineDataLimits: function() { + var me = this; + var chart = me.chart; + var timeOpts = me.options.time; + var min = MAX_INTEGER; + var max = MIN_INTEGER; + var timestamps = []; + var datasets = []; + var labels = []; + var i, j, ilen, jlen, data, timestamp; + + // Convert labels to timestamps + for (i = 0, ilen = chart.data.labels.length; i < ilen; ++i) { + labels.push(parse(chart.data.labels[i], me)); + } + + // Convert data to timestamps + for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) { + if (chart.isDatasetVisible(i)) { + data = chart.data.datasets[i].data; + + // Let's consider that all data have the same format. + if (helpers.isObject(data[0])) { + datasets[i] = []; + + for (j = 0, jlen = data.length; j < jlen; ++j) { + timestamp = parse(data[j], me); + timestamps.push(timestamp); + datasets[i][j] = timestamp; + } + } else { + timestamps.push.apply(timestamps, labels); + datasets[i] = labels.slice(0); + } + } else { + datasets[i] = []; + } + } + + if (labels.length) { + // Sort labels **after** data have been converted + labels = arrayUnique(labels).sort(sorter); + min = Math.min(min, labels[0]); + max = Math.max(max, labels[labels.length - 1]); + } + + if (timestamps.length) { + timestamps = arrayUnique(timestamps).sort(sorter); + min = Math.min(min, timestamps[0]); + max = Math.max(max, timestamps[timestamps.length - 1]); + } + + min = parse(timeOpts.min, me) || min; + max = parse(timeOpts.max, me) || max; + + // In case there is no valid min/max, let's use today limits + min = min === MAX_INTEGER ? +moment().startOf('day') : min; + max = max === MIN_INTEGER ? +moment().endOf('day') + 1 : max; + + // Make sure that max is strictly higher than min (required by the lookup table) + me.min = Math.min(min, max); + me.max = Math.max(min + 1, max); + + // PRIVATE + me._horizontal = me.isHorizontal(); + me._table = []; + me._timestamps = { + data: timestamps, + datasets: datasets, + labels: labels + }; + }, + + buildTicks: function() { + var me = this; + var min = me.min; + var max = me.max; + var options = me.options; + var timeOpts = options.time; + var timestamps = []; + var ticks = []; + var i, ilen, timestamp; + + switch (options.ticks.source) { + case 'data': + timestamps = me._timestamps.data; + break; + case 'labels': + timestamps = me._timestamps.labels; + break; + case 'auto': + default: + timestamps = generate(min, max, me.getLabelCapacity(min), options); + } + + if (options.bounds === 'ticks' && timestamps.length) { + min = timestamps[0]; + max = timestamps[timestamps.length - 1]; + } + + // Enforce limits with user min/max options + min = parse(timeOpts.min, me) || min; + max = parse(timeOpts.max, me) || max; + + // Remove ticks outside the min/max range + for (i = 0, ilen = timestamps.length; i < ilen; ++i) { + timestamp = timestamps[i]; + if (timestamp >= min && timestamp <= max) { + ticks.push(timestamp); + } + } + + me.min = min; + me.max = max; + + // PRIVATE + me._unit = timeOpts.unit || determineUnitForFormatting(ticks, timeOpts.minUnit, me.min, me.max); + me._majorUnit = determineMajorUnit(me._unit); + me._table = buildLookupTable(me._timestamps.data, min, max, options.distribution); + me._offsets = computeOffsets(me._table, ticks, min, max, options); + + return ticksFromTimestamps(ticks, me._majorUnit); + }, + + getLabelForIndex: function(index, datasetIndex) { + var me = this; + var data = me.chart.data; + var timeOpts = me.options.time; + var label = data.labels && index < data.labels.length ? data.labels[index] : ''; + var value = data.datasets[datasetIndex].data[index]; + + if (helpers.isObject(value)) { + label = me.getRightValue(value); + } + if (timeOpts.tooltipFormat) { + label = momentify(label, timeOpts).format(timeOpts.tooltipFormat); + } + + return label; + }, + + /** + * Function to format an individual tick mark + * @private + */ + tickFormatFunction: function(tick, index, ticks, formatOverride) { + var me = this; + var options = me.options; + var time = tick.valueOf(); + var formats = options.time.displayFormats; + var minorFormat = formats[me._unit]; + var majorUnit = me._majorUnit; + var majorFormat = formats[majorUnit]; + var majorTime = tick.clone().startOf(majorUnit).valueOf(); + var majorTickOpts = options.ticks.major; + var major = majorTickOpts.enabled && majorUnit && majorFormat && time === majorTime; + var label = tick.format(formatOverride ? formatOverride : major ? majorFormat : minorFormat); + var tickOpts = major ? majorTickOpts : options.ticks.minor; + var formatter = helpers.valueOrDefault(tickOpts.callback, tickOpts.userCallback); + + return formatter ? formatter(label, index, ticks) : label; + }, + + convertTicksToLabels: function(ticks) { + var labels = []; + var i, ilen; + + for (i = 0, ilen = ticks.length; i < ilen; ++i) { + labels.push(this.tickFormatFunction(moment(ticks[i].value), i, ticks)); + } + + return labels; + }, + + /** + * @private + */ + getPixelForOffset: function(time) { + var me = this; + var size = me._horizontal ? me.width : me.height; + var start = me._horizontal ? me.left : me.top; + var pos = interpolate(me._table, 'time', time, 'pos'); + + return start + size * (me._offsets.left + pos) / (me._offsets.left + 1 + me._offsets.right); + }, + + getPixelForValue: function(value, index, datasetIndex) { + var me = this; + var time = null; + + if (index !== undefined && datasetIndex !== undefined) { + time = me._timestamps.datasets[datasetIndex][index]; + } + + if (time === null) { + time = parse(value, me); + } + + if (time !== null) { + return me.getPixelForOffset(time); + } + }, + + getPixelForTick: function(index) { + var ticks = this.getTicks(); + return index >= 0 && index < ticks.length ? + this.getPixelForOffset(ticks[index].value) : + null; + }, + + getValueForPixel: function(pixel) { + var me = this; + var size = me._horizontal ? me.width : me.height; + var start = me._horizontal ? me.left : me.top; + var pos = (size ? (pixel - start) / size : 0) * (me._offsets.left + 1 + me._offsets.left) - me._offsets.right; + var time = interpolate(me._table, 'pos', pos, 'time'); + + return moment(time); + }, + + /** + * Crude approximation of what the label width might be + * @private + */ + getLabelWidth: function(label) { + var me = this; + var ticksOpts = me.options.ticks; + var tickLabelWidth = me.ctx.measureText(label).width; + var angle = helpers.toRadians(ticksOpts.maxRotation); + var cosRotation = Math.cos(angle); + var sinRotation = Math.sin(angle); + var tickFontSize = helpers.valueOrDefault(ticksOpts.fontSize, defaults.global.defaultFontSize); + + return (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation); + }, + + /** + * @private + */ + getLabelCapacity: function(exampleTime) { + var me = this; + + var formatOverride = me.options.time.displayFormats.millisecond; // Pick the longest format for guestimation + + var exampleLabel = me.tickFormatFunction(moment(exampleTime), 0, [], formatOverride); + var tickLabelWidth = me.getLabelWidth(exampleLabel); + var innerWidth = me.isHorizontal() ? me.width : me.height; + + return Math.floor(innerWidth / tickLabelWidth); + } + }); + + Chart.scaleService.registerScaleType('time', TimeScale, defaultConfig); +}; + +},{"1":1,"25":25,"45":45}]},{},[7])(7) +}); \ No newline at end of file diff --git a/generator-web/src/main/resources/static/vendor/chart.js/chart.min.js b/generator-web/src/main/resources/static/vendor/chart.js/chart.min.js new file mode 100644 index 0000000..2130e2a --- /dev/null +++ b/generator-web/src/main/resources/static/vendor/chart.js/chart.min.js @@ -0,0 +1,10 @@ +/*! + * Chart.js + * http://chartjs.org/ + * Version: 2.7.1 + * + * Copyright 2017 Nick Downie + * Released under the MIT license + * https://github.com/chartjs/Chart.js/blob/master/LICENSE.md + */ +!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).Chart=t()}}(function(){return function t(e,n,i){function a(r,l){if(!n[r]){if(!e[r]){var s="function"==typeof require&&require;if(!l&&s)return s(r,!0);if(o)return o(r,!0);var u=new Error("Cannot find module '"+r+"'");throw u.code="MODULE_NOT_FOUND",u}var d=n[r]={exports:{}};e[r][0].call(d.exports,function(t){var n=e[r][1][t];return a(n||t)},d,d.exports,t,e,n,i)}return n[r].exports}for(var o="function"==typeof require&&require,r=0;rn?(e+.05)/(n+.05):(n+.05)/(e+.05)},level:function(t){var e=this.contrast(t);return e>=7.1?"AAA":e>=4.5?"AA":""},dark:function(){var t=this.values.rgb;return(299*t[0]+587*t[1]+114*t[2])/1e3<128},light:function(){return!this.dark()},negate:function(){for(var t=[],e=0;e<3;e++)t[e]=255-this.values.rgb[e];return this.setValues("rgb",t),this},lighten:function(t){var e=this.values.hsl;return e[2]+=e[2]*t,this.setValues("hsl",e),this},darken:function(t){var e=this.values.hsl;return e[2]-=e[2]*t,this.setValues("hsl",e),this},saturate:function(t){var e=this.values.hsl;return e[1]+=e[1]*t,this.setValues("hsl",e),this},desaturate:function(t){var e=this.values.hsl;return e[1]-=e[1]*t,this.setValues("hsl",e),this},whiten:function(t){var e=this.values.hwb;return e[1]+=e[1]*t,this.setValues("hwb",e),this},blacken:function(t){var e=this.values.hwb;return e[2]+=e[2]*t,this.setValues("hwb",e),this},greyscale:function(){var t=this.values.rgb,e=.3*t[0]+.59*t[1]+.11*t[2];return this.setValues("rgb",[e,e,e]),this},clearer:function(t){var e=this.values.alpha;return this.setValues("alpha",e-e*t),this},opaquer:function(t){var e=this.values.alpha;return this.setValues("alpha",e+e*t),this},rotate:function(t){var e=this.values.hsl,n=(e[0]+t)%360;return e[0]=n<0?360+n:n,this.setValues("hsl",e),this},mix:function(t,e){var n=this,i=t,a=void 0===e?.5:e,o=2*a-1,r=n.alpha()-i.alpha(),l=((o*r==-1?o:(o+r)/(1+o*r))+1)/2,s=1-l;return this.rgb(l*n.red()+s*i.red(),l*n.green()+s*i.green(),l*n.blue()+s*i.blue()).alpha(n.alpha()*a+i.alpha()*(1-a))},toJSON:function(){return this.rgb()},clone:function(){var t,e,n=new o,i=this.values,a=n.values;for(var r in i)i.hasOwnProperty(r)&&(t=i[r],"[object Array]"===(e={}.toString.call(t))?a[r]=t.slice(0):"[object Number]"===e?a[r]=t:console.error("unexpected color value:",t));return n}},o.prototype.spaces={rgb:["red","green","blue"],hsl:["hue","saturation","lightness"],hsv:["hue","saturation","value"],hwb:["hue","whiteness","blackness"],cmyk:["cyan","magenta","yellow","black"]},o.prototype.maxes={rgb:[255,255,255],hsl:[360,100,100],hsv:[360,100,100],hwb:[360,100,100],cmyk:[100,100,100,100]},o.prototype.getValues=function(t){for(var e=this.values,n={},i=0;i.04045?Math.pow((e+.055)/1.055,2.4):e/12.92)+.3576*(n=n>.04045?Math.pow((n+.055)/1.055,2.4):n/12.92)+.1805*(i=i>.04045?Math.pow((i+.055)/1.055,2.4):i/12.92)),100*(.2126*e+.7152*n+.0722*i),100*(.0193*e+.1192*n+.9505*i)]}function d(t){var e,n,i,a=u(t),o=a[0],r=a[1],l=a[2];return o/=95.047,r/=100,l/=108.883,o=o>.008856?Math.pow(o,1/3):7.787*o+16/116,r=r>.008856?Math.pow(r,1/3):7.787*r+16/116,l=l>.008856?Math.pow(l,1/3):7.787*l+16/116,e=116*r-16,n=500*(o-r),i=200*(r-l),[e,n,i]}function c(t){var e,n,i,a,o,r=t[0]/360,l=t[1]/100,s=t[2]/100;if(0==l)return o=255*s,[o,o,o];e=2*s-(n=s<.5?s*(1+l):s+l-s*l),a=[0,0,0];for(var u=0;u<3;u++)(i=r+1/3*-(u-1))<0&&i++,i>1&&i--,o=6*i<1?e+6*(n-e)*i:2*i<1?n:3*i<2?e+(n-e)*(2/3-i)*6:e,a[u]=255*o;return a}function h(t){var e=t[0]/60,n=t[1]/100,i=t[2]/100,a=Math.floor(e)%6,o=e-Math.floor(e),r=255*i*(1-n),l=255*i*(1-n*o),s=255*i*(1-n*(1-o)),i=255*i;switch(a){case 0:return[i,s,r];case 1:return[l,i,r];case 2:return[r,i,s];case 3:return[r,l,i];case 4:return[s,r,i];case 5:return[i,r,l]}}function f(t){var e,n,i,a,o=t[0]/360,l=t[1]/100,s=t[2]/100,u=l+s;switch(u>1&&(l/=u,s/=u),e=Math.floor(6*o),n=1-s,i=6*o-e,0!=(1&e)&&(i=1-i),a=l+i*(n-l),e){default:case 6:case 0:r=n,g=a,b=l;break;case 1:r=a,g=n,b=l;break;case 2:r=l,g=n,b=a;break;case 3:r=l,g=a,b=n;break;case 4:r=a,g=l,b=n;break;case 5:r=n,g=l,b=a}return[255*r,255*g,255*b]}function p(t){var e,n,i,a=t[0]/100,o=t[1]/100,r=t[2]/100,l=t[3]/100;return e=1-Math.min(1,a*(1-l)+l),n=1-Math.min(1,o*(1-l)+l),i=1-Math.min(1,r*(1-l)+l),[255*e,255*n,255*i]}function v(t){var e,n,i,a=t[0]/100,o=t[1]/100,r=t[2]/100;return e=3.2406*a+-1.5372*o+-.4986*r,n=-.9689*a+1.8758*o+.0415*r,i=.0557*a+-.204*o+1.057*r,e=e>.0031308?1.055*Math.pow(e,1/2.4)-.055:e*=12.92,n=n>.0031308?1.055*Math.pow(n,1/2.4)-.055:n*=12.92,i=i>.0031308?1.055*Math.pow(i,1/2.4)-.055:i*=12.92,e=Math.min(Math.max(0,e),1),n=Math.min(Math.max(0,n),1),i=Math.min(Math.max(0,i),1),[255*e,255*n,255*i]}function m(t){var e,n,i,a=t[0],o=t[1],r=t[2];return a/=95.047,o/=100,r/=108.883,a=a>.008856?Math.pow(a,1/3):7.787*a+16/116,o=o>.008856?Math.pow(o,1/3):7.787*o+16/116,r=r>.008856?Math.pow(r,1/3):7.787*r+16/116,e=116*o-16,n=500*(a-o),i=200*(o-r),[e,n,i]}function x(t){var e,n,i,a,o=t[0],r=t[1],l=t[2];return o<=8?a=(n=100*o/903.3)/100*7.787+16/116:(n=100*Math.pow((o+16)/116,3),a=Math.pow(n/100,1/3)),e=e/95.047<=.008856?e=95.047*(r/500+a-16/116)/7.787:95.047*Math.pow(r/500+a,3),i=i/108.883<=.008859?i=108.883*(a-l/200-16/116)/7.787:108.883*Math.pow(a-l/200,3),[e,n,i]}function y(t){var e,n,i,a=t[0],o=t[1],r=t[2];return e=Math.atan2(r,o),(n=360*e/2/Math.PI)<0&&(n+=360),i=Math.sqrt(o*o+r*r),[a,i,n]}function k(t){return v(x(t))}function w(t){var e,n,i,a=t[0],o=t[1];return i=t[2]/360*2*Math.PI,e=o*Math.cos(i),n=o*Math.sin(i),[a,e,n]}function M(t){return S[t]}e.exports={rgb2hsl:i,rgb2hsv:a,rgb2hwb:o,rgb2cmyk:l,rgb2keyword:s,rgb2xyz:u,rgb2lab:d,rgb2lch:function(t){return y(d(t))},hsl2rgb:c,hsl2hsv:function(t){var e,n,i=t[0],a=t[1]/100,o=t[2]/100;return 0===o?[0,0,0]:(o*=2,a*=o<=1?o:2-o,n=(o+a)/2,e=2*a/(o+a),[i,100*e,100*n])},hsl2hwb:function(t){return o(c(t))},hsl2cmyk:function(t){return l(c(t))},hsl2keyword:function(t){return s(c(t))},hsv2rgb:h,hsv2hsl:function(t){var e,n,i=t[0],a=t[1]/100,o=t[2]/100;return n=(2-a)*o,e=a*o,e/=n<=1?n:2-n,e=e||0,n/=2,[i,100*e,100*n]},hsv2hwb:function(t){return o(h(t))},hsv2cmyk:function(t){return l(h(t))},hsv2keyword:function(t){return s(h(t))},hwb2rgb:f,hwb2hsl:function(t){return i(f(t))},hwb2hsv:function(t){return a(f(t))},hwb2cmyk:function(t){return l(f(t))},hwb2keyword:function(t){return s(f(t))},cmyk2rgb:p,cmyk2hsl:function(t){return i(p(t))},cmyk2hsv:function(t){return a(p(t))},cmyk2hwb:function(t){return o(p(t))},cmyk2keyword:function(t){return s(p(t))},keyword2rgb:M,keyword2hsl:function(t){return i(M(t))},keyword2hsv:function(t){return a(M(t))},keyword2hwb:function(t){return o(M(t))},keyword2cmyk:function(t){return l(M(t))},keyword2lab:function(t){return d(M(t))},keyword2xyz:function(t){return u(M(t))},xyz2rgb:v,xyz2lab:m,xyz2lch:function(t){return y(m(t))},lab2xyz:x,lab2rgb:k,lab2lch:y,lch2lab:w,lch2xyz:function(t){return x(w(t))},lch2rgb:function(t){return k(w(t))}};var S={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],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],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},C={};for(var _ in S)C[JSON.stringify(S[_])]=_},{}],5:[function(t,e,n){var i=t(4),a=function(){return new u};for(var o in i){a[o+"Raw"]=function(t){return function(e){return"number"==typeof e&&(e=Array.prototype.slice.call(arguments)),i[t](e)}}(o);var r=/(\w+)2(\w+)/.exec(o),l=r[1],s=r[2];(a[l]=a[l]||{})[s]=a[o]=function(t){return function(e){"number"==typeof e&&(e=Array.prototype.slice.call(arguments));var n=i[t](e);if("string"==typeof n||void 0===n)return n;for(var a=0;a0&&(t[0].yLabel?n=t[0].yLabel:e.labels.length>0&&t[0].index=0&&a>0)&&(v+=a));return o=c.getPixelForValue(v),r=c.getPixelForValue(v+f),l=(r-o)/2,{size:l,base:o,head:r,center:r+l/2}},calculateBarIndexPixels:function(t,e,n){var i,a,r,l,s,u,d=this,c=n.scale.options,h=d.getStackIndex(t),f=n.pixels,g=f[e],p=f.length,v=n.start,m=n.end;return 1===p?(i=g>v?g-v:m-g,a=g0&&(i=(g-f[e-1])/2,e===p-1&&(a=i)),e');var n=t.data,i=n.datasets,a=n.labels;if(i.length)for(var o=0;o'),a[o]&&e.push(a[o]),e.push("");return e.push(""),e.join("")},legend:{labels:{generateLabels:function(t){var e=t.data;return e.labels.length&&e.datasets.length?e.labels.map(function(n,i){var a=t.getDatasetMeta(0),r=e.datasets[0],l=a.data[i],s=l&&l.custom||{},u=o.valueAtIndexOrDefault,d=t.options.elements.arc;return{text:n,fillStyle:s.backgroundColor?s.backgroundColor:u(r.backgroundColor,i,d.backgroundColor),strokeStyle:s.borderColor?s.borderColor:u(r.borderColor,i,d.borderColor),lineWidth:s.borderWidth?s.borderWidth:u(r.borderWidth,i,d.borderWidth),hidden:isNaN(r.data[i])||a.data[i].hidden,index:i}}):[]}},onClick:function(t,e){var n,i,a,o=e.index,r=this.chart;for(n=0,i=(r.data.datasets||[]).length;n=Math.PI?-1:g<-Math.PI?1:0))+f,v={x:Math.cos(g),y:Math.sin(g)},m={x:Math.cos(p),y:Math.sin(p)},b=g<=0&&p>=0||g<=2*Math.PI&&2*Math.PI<=p,x=g<=.5*Math.PI&&.5*Math.PI<=p||g<=2.5*Math.PI&&2.5*Math.PI<=p,y=g<=-Math.PI&&-Math.PI<=p||g<=Math.PI&&Math.PI<=p,k=g<=.5*-Math.PI&&.5*-Math.PI<=p||g<=1.5*Math.PI&&1.5*Math.PI<=p,w=h/100,M={x:y?-1:Math.min(v.x*(v.x<0?1:w),m.x*(m.x<0?1:w)),y:k?-1:Math.min(v.y*(v.y<0?1:w),m.y*(m.y<0?1:w))},S={x:b?1:Math.max(v.x*(v.x>0?1:w),m.x*(m.x>0?1:w)),y:x?1:Math.max(v.y*(v.y>0?1:w),m.y*(m.y>0?1:w))},C={width:.5*(S.x-M.x),height:.5*(S.y-M.y)};u=Math.min(l/C.width,s/C.height),d={x:-.5*(S.x+M.x),y:-.5*(S.y+M.y)}}n.borderWidth=e.getMaxBorderWidth(c.data),n.outerRadius=Math.max((u-n.borderWidth)/2,0),n.innerRadius=Math.max(h?n.outerRadius/100*h:0,0),n.radiusLength=(n.outerRadius-n.innerRadius)/n.getVisibleDatasetCount(),n.offsetX=d.x*n.outerRadius,n.offsetY=d.y*n.outerRadius,c.total=e.calculateTotal(),e.outerRadius=n.outerRadius-n.radiusLength*e.getRingIndex(e.index),e.innerRadius=Math.max(e.outerRadius-n.radiusLength,0),o.each(c.data,function(n,i){e.updateElement(n,i,t)})},updateElement:function(t,e,n){var i=this,a=i.chart,r=a.chartArea,l=a.options,s=l.animation,u=(r.left+r.right)/2,d=(r.top+r.bottom)/2,c=l.rotation,h=l.rotation,f=i.getDataset(),g=n&&s.animateRotate?0:t.hidden?0:i.calculateCircumference(f.data[e])*(l.circumference/(2*Math.PI)),p=n&&s.animateScale?0:i.innerRadius,v=n&&s.animateScale?0:i.outerRadius,m=o.valueAtIndexOrDefault;o.extend(t,{_datasetIndex:i.index,_index:e,_model:{x:u+a.offsetX,y:d+a.offsetY,startAngle:c,endAngle:h,circumference:g,outerRadius:v,innerRadius:p,label:m(f.label,e,a.data.labels[e])}});var b=t._model;this.removeHoverStyle(t),n&&s.animateRotate||(b.startAngle=0===e?l.rotation:i.getMeta().data[e-1]._model.endAngle,b.endAngle=b.startAngle+b.circumference),t.pivot()},removeHoverStyle:function(e){t.DatasetController.prototype.removeHoverStyle.call(this,e,this.chart.options.elements.arc)},calculateTotal:function(){var t,e=this.getDataset(),n=this.getMeta(),i=0;return o.each(n.data,function(n,a){t=e.data[a],isNaN(t)||n.hidden||(i+=Math.abs(t))}),i},calculateCircumference:function(t){var e=this.getMeta().total;return e>0&&!isNaN(t)?2*Math.PI*(t/e):0},getMaxBorderWidth:function(t){for(var e,n,i=0,a=this.index,o=t.length,r=0;r(i=e>i?e:i)?n:i;return i}})}},{25:25,40:40,45:45}],18:[function(t,e,n){"use strict";var i=t(25),a=t(40),o=t(45);i._set("line",{showLines:!0,spanGaps:!1,hover:{mode:"label"},scales:{xAxes:[{type:"category",id:"x-axis-0"}],yAxes:[{type:"linear",id:"y-axis-0"}]}}),e.exports=function(t){function e(t,e){return o.valueOrDefault(t.showLine,e.showLines)}t.controllers.line=t.DatasetController.extend({datasetElementType:a.Line,dataElementType:a.Point,update:function(t){var n,i,a,r=this,l=r.getMeta(),s=l.dataset,u=l.data||[],d=r.chart.options,c=d.elements.line,h=r.getScaleForId(l.yAxisID),f=r.getDataset(),g=e(f,d);for(g&&(a=s.custom||{},void 0!==f.tension&&void 0===f.lineTension&&(f.lineTension=f.tension),s._scale=h,s._datasetIndex=r.index,s._children=u,s._model={spanGaps:f.spanGaps?f.spanGaps:d.spanGaps,tension:a.tension?a.tension:o.valueOrDefault(f.lineTension,c.tension),backgroundColor:a.backgroundColor?a.backgroundColor:f.backgroundColor||c.backgroundColor,borderWidth:a.borderWidth?a.borderWidth:f.borderWidth||c.borderWidth,borderColor:a.borderColor?a.borderColor:f.borderColor||c.borderColor,borderCapStyle:a.borderCapStyle?a.borderCapStyle:f.borderCapStyle||c.borderCapStyle,borderDash:a.borderDash?a.borderDash:f.borderDash||c.borderDash,borderDashOffset:a.borderDashOffset?a.borderDashOffset:f.borderDashOffset||c.borderDashOffset,borderJoinStyle:a.borderJoinStyle?a.borderJoinStyle:f.borderJoinStyle||c.borderJoinStyle,fill:a.fill?a.fill:void 0!==f.fill?f.fill:c.fill,steppedLine:a.steppedLine?a.steppedLine:o.valueOrDefault(f.steppedLine,c.stepped),cubicInterpolationMode:a.cubicInterpolationMode?a.cubicInterpolationMode:o.valueOrDefault(f.cubicInterpolationMode,c.cubicInterpolationMode)},s.pivot()),n=0,i=u.length;n');var n=t.data,i=n.datasets,a=n.labels;if(i.length)for(var o=0;o'),a[o]&&e.push(a[o]),e.push("");return e.push(""),e.join("")},legend:{labels:{generateLabels:function(t){var e=t.data;return e.labels.length&&e.datasets.length?e.labels.map(function(n,i){var a=t.getDatasetMeta(0),r=e.datasets[0],l=a.data[i].custom||{},s=o.valueAtIndexOrDefault,u=t.options.elements.arc;return{text:n,fillStyle:l.backgroundColor?l.backgroundColor:s(r.backgroundColor,i,u.backgroundColor),strokeStyle:l.borderColor?l.borderColor:s(r.borderColor,i,u.borderColor),lineWidth:l.borderWidth?l.borderWidth:s(r.borderWidth,i,u.borderWidth),hidden:isNaN(r.data[i])||a.data[i].hidden,index:i}}):[]}},onClick:function(t,e){var n,i,a,o=e.index,r=this.chart;for(n=0,i=(r.data.datasets||[]).length;n0&&!isNaN(t)?2*Math.PI/e:0}})}},{25:25,40:40,45:45}],20:[function(t,e,n){"use strict";var i=t(25),a=t(40),o=t(45);i._set("radar",{scale:{type:"radialLinear"},elements:{line:{tension:0}}}),e.exports=function(t){t.controllers.radar=t.DatasetController.extend({datasetElementType:a.Line,dataElementType:a.Point,linkScales:o.noop,update:function(t){var e=this,n=e.getMeta(),i=n.dataset,a=n.data,r=i.custom||{},l=e.getDataset(),s=e.chart.options.elements.line,u=e.chart.scale;void 0!==l.tension&&void 0===l.lineTension&&(l.lineTension=l.tension),o.extend(n.dataset,{_datasetIndex:e.index,_scale:u,_children:a,_loop:!0,_model:{tension:r.tension?r.tension:o.valueOrDefault(l.lineTension,s.tension),backgroundColor:r.backgroundColor?r.backgroundColor:l.backgroundColor||s.backgroundColor,borderWidth:r.borderWidth?r.borderWidth:l.borderWidth||s.borderWidth,borderColor:r.borderColor?r.borderColor:l.borderColor||s.borderColor,fill:r.fill?r.fill:void 0!==l.fill?l.fill:s.fill,borderCapStyle:r.borderCapStyle?r.borderCapStyle:l.borderCapStyle||s.borderCapStyle,borderDash:r.borderDash?r.borderDash:l.borderDash||s.borderDash,borderDashOffset:r.borderDashOffset?r.borderDashOffset:l.borderDashOffset||s.borderDashOffset,borderJoinStyle:r.borderJoinStyle?r.borderJoinStyle:l.borderJoinStyle||s.borderJoinStyle}}),n.dataset.pivot(),o.each(a,function(n,i){e.updateElement(n,i,t)},e),e.updateBezierControlPoints()},updateElement:function(t,e,n){var i=this,a=t.custom||{},r=i.getDataset(),l=i.chart.scale,s=i.chart.options.elements.point,u=l.getPointPositionForValue(e,r.data[e]);void 0!==r.radius&&void 0===r.pointRadius&&(r.pointRadius=r.radius),void 0!==r.hitRadius&&void 0===r.pointHitRadius&&(r.pointHitRadius=r.hitRadius),o.extend(t,{_datasetIndex:i.index,_index:e,_scale:l,_model:{x:n?l.xCenter:u.x,y:n?l.yCenter:u.y,tension:a.tension?a.tension:o.valueOrDefault(r.lineTension,i.chart.options.elements.line.tension),radius:a.radius?a.radius:o.valueAtIndexOrDefault(r.pointRadius,e,s.radius),backgroundColor:a.backgroundColor?a.backgroundColor:o.valueAtIndexOrDefault(r.pointBackgroundColor,e,s.backgroundColor),borderColor:a.borderColor?a.borderColor:o.valueAtIndexOrDefault(r.pointBorderColor,e,s.borderColor),borderWidth:a.borderWidth?a.borderWidth:o.valueAtIndexOrDefault(r.pointBorderWidth,e,s.borderWidth),pointStyle:a.pointStyle?a.pointStyle:o.valueAtIndexOrDefault(r.pointStyle,e,s.pointStyle),hitRadius:a.hitRadius?a.hitRadius:o.valueAtIndexOrDefault(r.pointHitRadius,e,s.hitRadius)}}),t._model.skip=a.skip?a.skip:isNaN(t._model.x)||isNaN(t._model.y)},updateBezierControlPoints:function(){var t=this.chart.chartArea,e=this.getMeta();o.each(e.data,function(n,i){var a=n._model,r=o.splineCurve(o.previousItem(e.data,i,!0)._model,a,o.nextItem(e.data,i,!0)._model,a.tension);a.controlPointPreviousX=Math.max(Math.min(r.previous.x,t.right),t.left),a.controlPointPreviousY=Math.max(Math.min(r.previous.y,t.bottom),t.top),a.controlPointNextX=Math.max(Math.min(r.next.x,t.right),t.left),a.controlPointNextY=Math.max(Math.min(r.next.y,t.bottom),t.top),n.pivot()})},setHoverStyle:function(t){var e=this.chart.data.datasets[t._datasetIndex],n=t.custom||{},i=t._index,a=t._model;a.radius=n.hoverRadius?n.hoverRadius:o.valueAtIndexOrDefault(e.pointHoverRadius,i,this.chart.options.elements.point.hoverRadius),a.backgroundColor=n.hoverBackgroundColor?n.hoverBackgroundColor:o.valueAtIndexOrDefault(e.pointHoverBackgroundColor,i,o.getHoverColor(a.backgroundColor)),a.borderColor=n.hoverBorderColor?n.hoverBorderColor:o.valueAtIndexOrDefault(e.pointHoverBorderColor,i,o.getHoverColor(a.borderColor)),a.borderWidth=n.hoverBorderWidth?n.hoverBorderWidth:o.valueAtIndexOrDefault(e.pointHoverBorderWidth,i,a.borderWidth)},removeHoverStyle:function(t){var e=this.chart.data.datasets[t._datasetIndex],n=t.custom||{},i=t._index,a=t._model,r=this.chart.options.elements.point;a.radius=n.radius?n.radius:o.valueAtIndexOrDefault(e.pointRadius,i,r.radius),a.backgroundColor=n.backgroundColor?n.backgroundColor:o.valueAtIndexOrDefault(e.pointBackgroundColor,i,r.backgroundColor),a.borderColor=n.borderColor?n.borderColor:o.valueAtIndexOrDefault(e.pointBorderColor,i,r.borderColor),a.borderWidth=n.borderWidth?n.borderWidth:o.valueAtIndexOrDefault(e.pointBorderWidth,i,r.borderWidth)}})}},{25:25,40:40,45:45}],21:[function(t,e,n){"use strict";t(25)._set("scatter",{hover:{mode:"single"},scales:{xAxes:[{id:"x-axis-1",type:"linear",position:"bottom"}],yAxes:[{id:"y-axis-1",type:"linear",position:"left"}]},showLines:!1,tooltips:{callbacks:{title:function(){return""},label:function(t){return"("+t.xLabel+", "+t.yLabel+")"}}}}),e.exports=function(t){t.controllers.scatter=t.controllers.line}},{25:25}],22:[function(t,e,n){"use strict";var i=t(25),a=t(26),o=t(45);i._set("global",{animation:{duration:1e3,easing:"easeOutQuart",onProgress:o.noop,onComplete:o.noop}}),e.exports=function(t){t.Animation=a.extend({chart:null,currentStep:0,numSteps:60,easing:"",render:null,onAnimationProgress:null,onAnimationComplete:null}),t.animationService={frameDuration:17,animations:[],dropFrames:0,request:null,addAnimation:function(t,e,n,i){var a,o,r=this.animations;for(e.chart=t,i||(t.animating=!0),a=0,o=r.length;a1&&(n=Math.floor(t.dropFrames),t.dropFrames=t.dropFrames%1),t.advance(1+n);var i=Date.now();t.dropFrames+=(i-e)/t.frameDuration,t.animations.length>0&&t.requestAnimationFrame()},advance:function(t){for(var e,n,i=this.animations,a=0;a=e.numSteps?(o.callback(e.onAnimationComplete,[e],n),n.animating=!1,i.splice(a,1)):++a}},Object.defineProperty(t.Animation.prototype,"animationObject",{get:function(){return this}}),Object.defineProperty(t.Animation.prototype,"chartInstance",{get:function(){return this.chart},set:function(t){this.chart=t}})}},{25:25,26:26,45:45}],23:[function(t,e,n){"use strict";var i=t(25),a=t(45),o=t(28),r=t(48);e.exports=function(t){function e(t){var e=(t=t||{}).data=t.data||{};return e.datasets=e.datasets||[],e.labels=e.labels||[],t.options=a.configMerge(i.global,i[t.type],t.options||{}),t}function n(t){var e=t.options;e.scale?t.scale.options=e.scale:e.scales&&e.scales.xAxes.concat(e.scales.yAxes).forEach(function(e){t.scales[e.id].options=e}),t.tooltip._options=e.tooltips}function l(t){return"top"===t||"bottom"===t}var s=t.plugins;t.types={},t.instances={},t.controllers={},a.extend(t.prototype,{construct:function(n,i){var o=this;i=e(i);var l=r.acquireContext(n,i),s=l&&l.canvas,u=s&&s.height,d=s&&s.width;o.id=a.uid(),o.ctx=l,o.canvas=s,o.config=i,o.width=d,o.height=u,o.aspectRatio=u?d/u:null,o.options=i.options,o._bufferedRender=!1,o.chart=o,o.controller=o,t.instances[o.id]=o,Object.defineProperty(o,"data",{get:function(){return o.config.data},set:function(t){o.config.data=t}}),l&&s?(o.initialize(),o.update()):console.error("Failed to create chart: can't acquire context from the given item")},initialize:function(){var t=this;return s.notify(t,"beforeInit"),a.retinaScale(t,t.options.devicePixelRatio),t.bindEvents(),t.options.responsive&&t.resize(!0),t.ensureScalesHaveIDs(),t.buildScales(),t.initToolTip(),s.notify(t,"afterInit"),t},clear:function(){return a.canvas.clear(this),this},stop:function(){return t.animationService.cancelAnimation(this),this},resize:function(t){var e=this,n=e.options,i=e.canvas,o=n.maintainAspectRatio&&e.aspectRatio||null,r=Math.max(0,Math.floor(a.getMaximumWidth(i))),l=Math.max(0,Math.floor(o?r/o:a.getMaximumHeight(i)));if((e.width!==r||e.height!==l)&&(i.width=e.width=r,i.height=e.height=l,i.style.width=r+"px",i.style.height=l+"px",a.retinaScale(e,n.devicePixelRatio),!t)){var u={width:r,height:l};s.notify(e,"resize",[u]),e.options.onResize&&e.options.onResize(e,u),e.stop(),e.update(e.options.responsiveAnimationDuration)}},ensureScalesHaveIDs:function(){var t=this.options,e=t.scales||{},n=t.scale;a.each(e.xAxes,function(t,e){t.id=t.id||"x-axis-"+e}),a.each(e.yAxes,function(t,e){t.id=t.id||"y-axis-"+e}),n&&(n.id=n.id||"scale")},buildScales:function(){var e=this,n=e.options,i=e.scales={},o=[];n.scales&&(o=o.concat((n.scales.xAxes||[]).map(function(t){return{options:t,dtype:"category",dposition:"bottom"}}),(n.scales.yAxes||[]).map(function(t){return{options:t,dtype:"linear",dposition:"left"}}))),n.scale&&o.push({options:n.scale,dtype:"radialLinear",isDefault:!0,dposition:"chartArea"}),a.each(o,function(n){var o=n.options,r=a.valueOrDefault(o.type,n.dtype),s=t.scaleService.getScaleConstructor(r);if(s){l(o.position)!==l(n.dposition)&&(o.position=n.dposition);var u=new s({id:o.id,options:o,ctx:e.ctx,chart:e});i[u.id]=u,u.mergeTicksOptions(),n.isDefault&&(e.scale=u)}}),t.scaleService.addScalesToLayout(this)},buildOrUpdateControllers:function(){var e=this,n=[],i=[];return a.each(e.data.datasets,function(a,o){var r=e.getDatasetMeta(o),l=a.type||e.config.type;if(r.type&&r.type!==l&&(e.destroyDatasetMeta(o),r=e.getDatasetMeta(o)),r.type=l,n.push(r.type),r.controller)r.controller.updateIndex(o);else{var s=t.controllers[r.type];if(void 0===s)throw new Error('"'+r.type+'" is not a chart type.');r.controller=new s(e,o),i.push(r.controller)}},e),i},resetElements:function(){var t=this;a.each(t.data.datasets,function(e,n){t.getDatasetMeta(n).controller.reset()},t)},reset:function(){this.resetElements(),this.tooltip.initialize()},update:function(t){var e=this;if(t&&"object"==typeof t||(t={duration:t,lazy:arguments[1]}),n(e),!1!==s.notify(e,"beforeUpdate")){e.tooltip._data=e.data;var i=e.buildOrUpdateControllers();a.each(e.data.datasets,function(t,n){e.getDatasetMeta(n).controller.buildOrUpdateElements()},e),e.updateLayout(),a.each(i,function(t){t.reset()}),e.updateDatasets(),e.tooltip.initialize(),e.lastActive=[],s.notify(e,"afterUpdate"),e._bufferedRender?e._bufferedRequest={duration:t.duration,easing:t.easing,lazy:t.lazy}:e.render(t)}},updateLayout:function(){var e=this;!1!==s.notify(e,"beforeLayout")&&(t.layoutService.update(this,this.width,this.height),s.notify(e,"afterScaleUpdate"),s.notify(e,"afterLayout"))},updateDatasets:function(){var t=this;if(!1!==s.notify(t,"beforeDatasetsUpdate")){for(var e=0,n=t.data.datasets.length;e=0;--n)e.isDatasetVisible(n)&&e.drawDataset(n,t);s.notify(e,"afterDatasetsDraw",[t])}},drawDataset:function(t,e){var n=this,i=n.getDatasetMeta(t),a={meta:i,index:t,easingValue:e};!1!==s.notify(n,"beforeDatasetDraw",[a])&&(i.controller.draw(e),s.notify(n,"afterDatasetDraw",[a]))},_drawTooltip:function(t){var e=this,n=e.tooltip,i={tooltip:n,easingValue:t};!1!==s.notify(e,"beforeTooltipDraw",[i])&&(n.draw(),s.notify(e,"afterTooltipDraw",[i]))},getElementAtEvent:function(t){return o.modes.single(this,t)},getElementsAtEvent:function(t){return o.modes.label(this,t,{intersect:!0})},getElementsAtXAxis:function(t){return o.modes["x-axis"](this,t,{intersect:!0})},getElementsAtEventForMode:function(t,e,n){var i=o.modes[e];return"function"==typeof i?i(this,t,n):[]},getDatasetAtEvent:function(t){return o.modes.dataset(this,t,{intersect:!0})},getDatasetMeta:function(t){var e=this,n=e.data.datasets[t];n._meta||(n._meta={});var i=n._meta[e.id];return i||(i=n._meta[e.id]={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null}),i},getVisibleDatasetCount:function(){for(var t=0,e=0,n=this.data.datasets.length;e0||(a.forEach(function(e){delete t[e]}),delete t._chartjs)}}var a=["push","pop","shift","splice","unshift"];t.DatasetController=function(t,e){this.initialize(t,e)},i.extend(t.DatasetController.prototype,{datasetElementType:null,dataElementType:null,initialize:function(t,e){var n=this;n.chart=t,n.index=e,n.linkScales(),n.addElements()},updateIndex:function(t){this.index=t},linkScales:function(){var t=this,e=t.getMeta(),n=t.getDataset();null===e.xAxisID&&(e.xAxisID=n.xAxisID||t.chart.options.scales.xAxes[0].id),null===e.yAxisID&&(e.yAxisID=n.yAxisID||t.chart.options.scales.yAxes[0].id)},getDataset:function(){return this.chart.data.datasets[this.index]},getMeta:function(){return this.chart.getDatasetMeta(this.index)},getScaleForId:function(t){return this.chart.scales[t]},reset:function(){this.update(!0)},destroy:function(){this._data&&n(this._data,this)},createMetaDataset:function(){var t=this,e=t.datasetElementType;return e&&new e({_chart:t.chart,_datasetIndex:t.index})},createMetaData:function(t){var e=this,n=e.dataElementType;return n&&new n({_chart:e.chart,_datasetIndex:e.index,_index:t})},addElements:function(){var t,e,n=this,i=n.getMeta(),a=n.getDataset().data||[],o=i.data;for(t=0,e=a.length;ti&&t.insertElements(i,a-i)},insertElements:function(t,e){for(var n=0;n=n[e].length&&n[e].push({}),!n[e][r].type||s.type&&s.type!==n[e][r].type?o.merge(n[e][r],[t.scaleService.getScaleDefaults(l),s]):o.merge(n[e][r],s)}else o._merger(e,n,i,a)}})},o.where=function(t,e){if(o.isArray(t)&&Array.prototype.filter)return t.filter(e);var n=[];return o.each(t,function(t){e(t)&&n.push(t)}),n},o.findIndex=Array.prototype.findIndex?function(t,e,n){return t.findIndex(e,n)}:function(t,e,n){n=void 0===n?t:n;for(var i=0,a=t.length;i=0;i--){var a=t[i];if(e(a))return a}},o.isNumber=function(t){return!isNaN(parseFloat(t))&&isFinite(t)},o.almostEquals=function(t,e,n){return Math.abs(t-e)t},o.max=function(t){return t.reduce(function(t,e){return isNaN(e)?t:Math.max(t,e)},Number.NEGATIVE_INFINITY)},o.min=function(t){return t.reduce(function(t,e){return isNaN(e)?t:Math.min(t,e)},Number.POSITIVE_INFINITY)},o.sign=Math.sign?function(t){return Math.sign(t)}:function(t){return 0==(t=+t)||isNaN(t)?t:t>0?1:-1},o.log10=Math.log10?function(t){return Math.log10(t)}:function(t){return Math.log(t)/Math.LN10},o.toRadians=function(t){return t*(Math.PI/180)},o.toDegrees=function(t){return t*(180/Math.PI)},o.getAngleFromPoint=function(t,e){var n=e.x-t.x,i=e.y-t.y,a=Math.sqrt(n*n+i*i),o=Math.atan2(i,n);return o<-.5*Math.PI&&(o+=2*Math.PI),{angle:o,distance:a}},o.distanceBetweenPoints=function(t,e){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))},o.aliasPixel=function(t){return t%2==0?0:.5},o.splineCurve=function(t,e,n,i){var a=t.skip?e:t,o=e,r=n.skip?e:n,l=Math.sqrt(Math.pow(o.x-a.x,2)+Math.pow(o.y-a.y,2)),s=Math.sqrt(Math.pow(r.x-o.x,2)+Math.pow(r.y-o.y,2)),u=l/(l+s),d=s/(l+s),c=i*(u=isNaN(u)?0:u),h=i*(d=isNaN(d)?0:d);return{previous:{x:o.x-c*(r.x-a.x),y:o.y-c*(r.y-a.y)},next:{x:o.x+h*(r.x-a.x),y:o.y+h*(r.y-a.y)}}},o.EPSILON=Number.EPSILON||1e-14,o.splineCurveMonotone=function(t){var e,n,i,a,r=(t||[]).map(function(t){return{model:t._model,deltaK:0,mK:0}}),l=r.length;for(e=0;e0?r[e-1]:null,(a=e0?r[e-1]:null,a=e=t.length-1?t[0]:t[e+1]:e>=t.length-1?t[t.length-1]:t[e+1]},o.previousItem=function(t,e,n){return n?e<=0?t[t.length-1]:t[e-1]:e<=0?t[0]:t[e-1]},o.niceNum=function(t,e){var n=Math.floor(o.log10(t)),i=t/Math.pow(10,n);return(e?i<1.5?1:i<3?2:i<7?5:10:i<=1?1:i<=2?2:i<=5?5:10)*Math.pow(10,n)},o.requestAnimFrame="undefined"==typeof window?function(t){t()}:window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){return window.setTimeout(t,1e3/60)},o.getRelativePosition=function(t,e){var n,i,a=t.originalEvent||t,r=t.currentTarget||t.srcElement,l=r.getBoundingClientRect(),s=a.touches;s&&s.length>0?(n=s[0].clientX,i=s[0].clientY):(n=a.clientX,i=a.clientY);var u=parseFloat(o.getStyle(r,"padding-left")),d=parseFloat(o.getStyle(r,"padding-top")),c=parseFloat(o.getStyle(r,"padding-right")),h=parseFloat(o.getStyle(r,"padding-bottom")),f=l.right-l.left-u-c,g=l.bottom-l.top-d-h;return n=Math.round((n-l.left-u)/f*r.width/e.currentDevicePixelRatio),i=Math.round((i-l.top-d)/g*r.height/e.currentDevicePixelRatio),{x:n,y:i}},o.getConstraintWidth=function(t){return r(t,"max-width","clientWidth")},o.getConstraintHeight=function(t){return r(t,"max-height","clientHeight")},o.getMaximumWidth=function(t){var e=t.parentNode;if(!e)return t.clientWidth;var n=parseInt(o.getStyle(e,"padding-left"),10),i=parseInt(o.getStyle(e,"padding-right"),10),a=e.clientWidth-n-i,r=o.getConstraintWidth(t);return isNaN(r)?a:Math.min(a,r)},o.getMaximumHeight=function(t){var e=t.parentNode;if(!e)return t.clientHeight;var n=parseInt(o.getStyle(e,"padding-top"),10),i=parseInt(o.getStyle(e,"padding-bottom"),10),a=e.clientHeight-n-i,r=o.getConstraintHeight(t);return isNaN(r)?a:Math.min(a,r)},o.getStyle=function(t,e){return t.currentStyle?t.currentStyle[e]:document.defaultView.getComputedStyle(t,null).getPropertyValue(e)},o.retinaScale=function(t,e){var n=t.currentDevicePixelRatio=e||window.devicePixelRatio||1;if(1!==n){var i=t.canvas,a=t.height,o=t.width;i.height=a*n,i.width=o*n,t.ctx.scale(n,n),i.style.height=a+"px",i.style.width=o+"px"}},o.fontString=function(t,e,n){return e+" "+t+"px "+n},o.longestText=function(t,e,n,i){var a=(i=i||{}).data=i.data||{},r=i.garbageCollect=i.garbageCollect||[];i.font!==e&&(a=i.data={},r=i.garbageCollect=[],i.font=e),t.font=e;var l=0;o.each(n,function(e){void 0!==e&&null!==e&&!0!==o.isArray(e)?l=o.measureText(t,a,r,l,e):o.isArray(e)&&o.each(e,function(e){void 0===e||null===e||o.isArray(e)||(l=o.measureText(t,a,r,l,e))})});var s=r.length/2;if(s>n.length){for(var u=0;ui&&(i=o),i},o.numberOfLabelLines=function(t){var e=1;return o.each(t,function(t){o.isArray(t)&&t.length>e&&(e=t.length)}),e},o.color=i?function(t){return t instanceof CanvasGradient&&(t=a.global.defaultColor),i(t)}:function(t){return console.error("Color.js not found!"),t},o.getHoverColor=function(t){return t instanceof CanvasPattern?t:o.color(t).saturate(.5).darken(.1).rgbString()}}},{25:25,3:3,45:45}],28:[function(t,e,n){"use strict";function i(t,e){return t.native?{x:t.x,y:t.y}:u.getRelativePosition(t,e)}function a(t,e){var n,i,a,o,r;for(i=0,o=t.data.datasets.length;i0&&(u=t.getDatasetMeta(u[0]._datasetIndex).data),u},"x-axis":function(t,e){return s(t,e,{intersect:!1})},point:function(t,e){return o(t,i(e,t))},nearest:function(t,e,n){var a=i(e,t);n.axis=n.axis||"xy";var o=l(n.axis),s=r(t,a,n.intersect,o);return s.length>1&&s.sort(function(t,e){var n=t.getArea()-e.getArea();return 0===n&&(n=t._datasetIndex-e._datasetIndex),n}),s.slice(0,1)},x:function(t,e,n){var o=i(e,t),r=[],l=!1;return a(t,function(t){t.inXRange(o.x)&&r.push(t),t.inRange(o.x,o.y)&&(l=!0)}),n.intersect&&!l&&(r=[]),r},y:function(t,e,n){var o=i(e,t),r=[],l=!1;return a(t,function(t){t.inYRange(o.y)&&r.push(t),t.inRange(o.x,o.y)&&(l=!0)}),n.intersect&&!l&&(r=[]),r}}}},{45:45}],29:[function(t,e,n){"use strict";t(25)._set("global",{responsive:!0,responsiveAnimationDuration:0,maintainAspectRatio:!0,events:["mousemove","mouseout","click","touchstart","touchmove"],hover:{onHover:null,mode:"nearest",intersect:!0,animationDuration:400},onClick:null,defaultColor:"rgba(0,0,0,0.1)",defaultFontColor:"#666",defaultFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",defaultFontSize:12,defaultFontStyle:"normal",showLines:!0,elements:{},layout:{padding:{top:0,right:0,bottom:0,left:0}}}),e.exports=function(){var t=function(t,e){return this.construct(t,e),this};return t.Chart=t,t}},{25:25}],30:[function(t,e,n){"use strict";var i=t(45);e.exports=function(t){function e(t,e){return i.where(t,function(t){return t.position===e})}function n(t,e){t.forEach(function(t,e){return t._tmpIndex_=e,t}),t.sort(function(t,n){var i=e?n:t,a=e?t:n;return i.weight===a.weight?i._tmpIndex_-a._tmpIndex_:i.weight-a.weight}),t.forEach(function(t){delete t._tmpIndex_})}t.layoutService={defaults:{},addBox:function(t,e){t.boxes||(t.boxes=[]),e.fullWidth=e.fullWidth||!1,e.position=e.position||"top",e.weight=e.weight||0,t.boxes.push(e)},removeBox:function(t,e){var n=t.boxes?t.boxes.indexOf(e):-1;-1!==n&&t.boxes.splice(n,1)},configure:function(t,e,n){for(var i,a=["fullWidth","position","weight"],o=a.length,r=0;rh&&st.maxHeight){s--;break}s++,c=u*d}t.labelRotation=s},afterCalculateTickRotation:function(){l.callback(this.options.afterCalculateTickRotation,[this])},beforeFit:function(){l.callback(this.options.beforeFit,[this])},fit:function(){var t=this,a=t.minSize={width:0,height:0},o=i(t._ticks),r=t.options,u=r.ticks,d=r.scaleLabel,c=r.gridLines,h=r.display,f=t.isHorizontal(),g=n(u),p=r.gridLines.tickMarkLength;if(a.width=f?t.isFullWidth()?t.maxWidth-t.margins.left-t.margins.right:t.maxWidth:h&&c.drawTicks?p:0,a.height=f?h&&c.drawTicks?p:0:t.maxHeight,d.display&&h){var v=s(d)+l.options.toPadding(d.padding).height;f?a.height+=v:a.width+=v}if(u.display&&h){var m=l.longestText(t.ctx,g.font,o,t.longestTextCache),b=l.numberOfLabelLines(o),x=.5*g.size,y=t.options.ticks.padding;if(f){t.longestLabelWidth=m;var k=l.toRadians(t.labelRotation),w=Math.cos(k),M=Math.sin(k)*m+g.size*b+x*(b-1)+x;a.height=Math.min(t.maxHeight,a.height+M+y),t.ctx.font=g.font;var S=e(t.ctx,o[0],g.font),C=e(t.ctx,o[o.length-1],g.font);0!==t.labelRotation?(t.paddingLeft="bottom"===r.position?w*S+3:w*x+3,t.paddingRight="bottom"===r.position?w*x+3:w*C+3):(t.paddingLeft=S/2+3,t.paddingRight=C/2+3)}else u.mirror?m=0:m+=y+x,a.width=Math.min(t.maxWidth,a.width+m),t.paddingTop=g.size/2,t.paddingBottom=g.size/2}t.handleMargins(),t.width=a.width,t.height=a.height},handleMargins:function(){var t=this;t.margins&&(t.paddingLeft=Math.max(t.paddingLeft-t.margins.left,0),t.paddingTop=Math.max(t.paddingTop-t.margins.top,0),t.paddingRight=Math.max(t.paddingRight-t.margins.right,0),t.paddingBottom=Math.max(t.paddingBottom-t.margins.bottom,0))},afterFit:function(){l.callback(this.options.afterFit,[this])},isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},isFullWidth:function(){return this.options.fullWidth},getRightValue:function(t){if(l.isNullOrUndef(t))return NaN;if("number"==typeof t&&!isFinite(t))return NaN;if(t)if(this.isHorizontal()){if(void 0!==t.x)return this.getRightValue(t.x)}else if(void 0!==t.y)return this.getRightValue(t.y);return t},getLabelForIndex:l.noop,getPixelForValue:l.noop,getValueForPixel:l.noop,getPixelForTick:function(t){var e=this,n=e.options.offset;if(e.isHorizontal()){var i=(e.width-(e.paddingLeft+e.paddingRight))/Math.max(e._ticks.length-(n?0:1),1),a=i*t+e.paddingLeft;n&&(a+=i/2);var o=e.left+Math.round(a);return o+=e.isFullWidth()?e.margins.left:0}var r=e.height-(e.paddingTop+e.paddingBottom);return e.top+t*(r/(e._ticks.length-1))},getPixelForDecimal:function(t){var e=this;if(e.isHorizontal()){var n=(e.width-(e.paddingLeft+e.paddingRight))*t+e.paddingLeft,i=e.left+Math.round(n);return i+=e.isFullWidth()?e.margins.left:0}return e.top+t*e.height},getBasePixel:function(){return this.getPixelForValue(this.getBaseValue())},getBaseValue:function(){var t=this,e=t.min,n=t.max;return t.beginAtZero?0:e<0&&n<0?n:e>0&&n>0?e:0},_autoSkip:function(t){var e,n,i,a,o=this,r=o.isHorizontal(),s=o.options.ticks.minor,u=t.length,d=l.toRadians(o.labelRotation),c=Math.cos(d),h=o.longestLabelWidth*c,f=[];for(s.maxTicksLimit&&(a=s.maxTicksLimit),r&&(e=!1,(h+s.autoSkipPadding)*u>o.width-(o.paddingLeft+o.paddingRight)&&(e=1+Math.floor((h+s.autoSkipPadding)*u/(o.width-(o.paddingLeft+o.paddingRight)))),a&&u>a&&(e=Math.max(e,Math.floor(u/a)))),n=0;n1&&n%e>0||n%e==0&&n+e>=u)&&n!==u-1&&delete i.label,f.push(i);return f},draw:function(t){var e=this,i=e.options;if(i.display){var r=e.ctx,u=o.global,d=i.ticks.minor,c=i.ticks.major||d,h=i.gridLines,f=i.scaleLabel,g=0!==e.labelRotation,p=e.isHorizontal(),v=d.autoSkip?e._autoSkip(e.getTicks()):e.getTicks(),m=l.valueOrDefault(d.fontColor,u.defaultFontColor),b=n(d),x=l.valueOrDefault(c.fontColor,u.defaultFontColor),y=n(c),k=h.drawTicks?h.tickMarkLength:0,w=l.valueOrDefault(f.fontColor,u.defaultFontColor),M=n(f),S=l.options.toPadding(f.padding),C=l.toRadians(e.labelRotation),_=[],D="right"===i.position?e.left:e.right-k,I="right"===i.position?e.left+k:e.right,P="bottom"===i.position?e.top:e.bottom-k,A="bottom"===i.position?e.top+k:e.bottom;if(l.each(v,function(n,o){if(!l.isNullOrUndef(n.label)){var r,s,c,f,m=n.label;o===e.zeroLineIndex&&i.offset===h.offsetGridLines?(r=h.zeroLineWidth,s=h.zeroLineColor,c=h.zeroLineBorderDash,f=h.zeroLineBorderDashOffset):(r=l.valueAtIndexOrDefault(h.lineWidth,o),s=l.valueAtIndexOrDefault(h.color,o),c=l.valueOrDefault(h.borderDash,u.borderDash),f=l.valueOrDefault(h.borderDashOffset,u.borderDashOffset));var b,x,y,w,M,S,T,F,O,R,L="middle",z="middle",B=d.padding;if(p){var W=k+B;"bottom"===i.position?(z=g?"middle":"top",L=g?"right":"center",R=e.top+W):(z=g?"middle":"bottom",L=g?"left":"center",R=e.bottom-W);var N=a(e,o,h.offsetGridLines&&v.length>1);N1);H0)n=t.stepSize;else{var o=i.niceNum(e.max-e.min,!1);n=i.niceNum(o/(t.maxTicks-1),!0)}var r=Math.floor(e.min/n)*n,l=Math.ceil(e.max/n)*n;t.min&&t.max&&t.stepSize&&i.almostWhole((t.max-t.min)/t.stepSize,n/1e3)&&(r=t.min,l=t.max);var s=(l-r)/n;s=i.almostEquals(s,Math.round(s),n/1e3)?Math.round(s):Math.ceil(s),a.push(void 0!==t.min?t.min:r);for(var u=1;u3?n[2]-n[1]:n[1]-n[0];Math.abs(a)>1&&t!==Math.floor(t)&&(a=t-Math.floor(t));var o=i.log10(Math.abs(a)),r="";if(0!==t){var l=-1*Math.floor(o);l=Math.max(Math.min(l,20),0),r=t.toFixed(l)}else r="0";return r},logarithmic:function(t,e,n){var a=t/Math.pow(10,Math.floor(i.log10(t)));return 0===t?"0":1===a||2===a||5===a||0===e||e===n.length-1?t.toExponential():""}}}},{45:45}],35:[function(t,e,n){"use strict";var i=t(25),a=t(26),o=t(45);i._set("global",{tooltips:{enabled:!0,custom:null,mode:"nearest",position:"average",intersect:!0,backgroundColor:"rgba(0,0,0,0.8)",titleFontStyle:"bold",titleSpacing:2,titleMarginBottom:6,titleFontColor:"#fff",titleAlign:"left",bodySpacing:2,bodyFontColor:"#fff",bodyAlign:"left",footerFontStyle:"bold",footerSpacing:2,footerMarginTop:6,footerFontColor:"#fff",footerAlign:"left",yPadding:6,xPadding:6,caretPadding:2,caretSize:5,cornerRadius:6,multiKeyBackground:"#fff",displayColors:!0,borderColor:"rgba(0,0,0,0)",borderWidth:0,callbacks:{beforeTitle:o.noop,title:function(t,e){var n="",i=e.labels,a=i?i.length:0;if(t.length>0){var o=t[0];o.xLabel?n=o.xLabel:a>0&&o.indexi.height-e.height&&(r="bottom");var l,s,u,d,c,h=(a.left+a.right)/2,f=(a.top+a.bottom)/2;"center"===r?(l=function(t){return t<=h},s=function(t){return t>h}):(l=function(t){return t<=e.width/2},s=function(t){return t>=i.width-e.width/2}),u=function(t){return t+e.width>i.width},d=function(t){return t-e.width<0},c=function(t){return t<=f?"top":"bottom"},l(n.x)?(o="left",u(n.x)&&(o="center",r=c(n.y))):s(n.x)&&(o="right",d(n.x)&&(o="center",r=c(n.y)));var g=t._options;return{xAlign:g.xAlign?g.xAlign:o,yAlign:g.yAlign?g.yAlign:r}}function d(t,e,n){var i=t.x,a=t.y,o=t.caretSize,r=t.caretPadding,l=t.cornerRadius,s=n.xAlign,u=n.yAlign,d=o+r,c=l+r;return"right"===s?i-=e.width:"center"===s&&(i-=e.width/2),"top"===u?a+=d:a-="bottom"===u?e.height+d:e.height/2,"center"===u?"left"===s?i+=d:"right"===s&&(i-=d):"left"===s?i-=c:"right"===s&&(i+=c),{x:i,y:a}}t.Tooltip=a.extend({initialize:function(){this._model=l(this._options),this._lastActive=[]},getTitle:function(){var t=this,e=t._options.callbacks,i=e.beforeTitle.apply(t,arguments),a=e.title.apply(t,arguments),o=e.afterTitle.apply(t,arguments),r=[];return r=n(r,i),r=n(r,a),r=n(r,o)},getBeforeBody:function(){var t=this._options.callbacks.beforeBody.apply(this,arguments);return o.isArray(t)?t:void 0!==t?[t]:[]},getBody:function(t,e){var i=this,a=i._options.callbacks,r=[];return o.each(t,function(t){var o={before:[],lines:[],after:[]};n(o.before,a.beforeLabel.call(i,t,e)),n(o.lines,a.label.call(i,t,e)),n(o.after,a.afterLabel.call(i,t,e)),r.push(o)}),r},getAfterBody:function(){var t=this._options.callbacks.afterBody.apply(this,arguments);return o.isArray(t)?t:void 0!==t?[t]:[]},getFooter:function(){var t=this,e=t._options.callbacks,i=e.beforeFooter.apply(t,arguments),a=e.footer.apply(t,arguments),o=e.afterFooter.apply(t,arguments),r=[];return r=n(r,i),r=n(r,a),r=n(r,o)},update:function(e){var n,i,a=this,c=a._options,h=a._model,f=a._model=l(c),g=a._active,p=a._data,v={xAlign:h.xAlign,yAlign:h.yAlign},m={x:h.x,y:h.y},b={width:h.width,height:h.height},x={x:h.caretX,y:h.caretY};if(g.length){f.opacity=1;var y=[],k=[];x=t.Tooltip.positioners[c.position].call(a,g,a._eventPosition);var w=[];for(n=0,i=g.length;n0&&i.stroke()},draw:function(){var t=this._chart.ctx,e=this._view;if(0!==e.opacity){var n={width:e.width,height:e.height},i={x:e.x,y:e.y},a=Math.abs(e.opacity<.001)?0:e.opacity,o=e.title.length||e.beforeBody.length||e.body.length||e.afterBody.length||e.footer.length;this._options.enabled&&o&&(this.drawBackground(i,e,t,n,a),i.x+=e.xPadding,i.y+=e.yPadding,this.drawTitle(i,e,t,a),this.drawBody(i,e,t,a),this.drawFooter(i,e,t,a))}},handleEvent:function(t){var e=this,n=e._options,i=!1;if(e._lastActive=e._lastActive||[],"mouseout"===t.type?e._active=[]:e._active=e._chart.getElementsAtEventForMode(t,n.mode,n),!(i=!o.arrayEquals(e._active,e._lastActive)))return!1;if(e._lastActive=e._active,n.enabled||n.custom){e._eventPosition={x:t.x,y:t.y};var a=e._model;e.update(!0),e.pivot(),i|=a.x!==e._model.x||a.y!==e._model.y}return i}}),t.Tooltip.positioners={average:function(t){if(!t.length)return!1;var e,n,i=0,a=0,o=0;for(e=0,n=t.length;es;)a-=2*Math.PI;for(;a=l&&a<=s,d=r>=n.innerRadius&&r<=n.outerRadius;return u&&d}return!1},getCenterPoint:function(){var t=this._view,e=(t.startAngle+t.endAngle)/2,n=(t.innerRadius+t.outerRadius)/2;return{x:t.x+Math.cos(e)*n,y:t.y+Math.sin(e)*n}},getArea:function(){var t=this._view;return Math.PI*((t.endAngle-t.startAngle)/(2*Math.PI))*(Math.pow(t.outerRadius,2)-Math.pow(t.innerRadius,2))},tooltipPosition:function(){var t=this._view,e=t.startAngle+(t.endAngle-t.startAngle)/2,n=(t.outerRadius-t.innerRadius)/2+t.innerRadius;return{x:t.x+Math.cos(e)*n,y:t.y+Math.sin(e)*n}},draw:function(){var t=this._chart.ctx,e=this._view,n=e.startAngle,i=e.endAngle;t.beginPath(),t.arc(e.x,e.y,e.outerRadius,n,i),t.arc(e.x,e.y,e.innerRadius,i,n,!0),t.closePath(),t.strokeStyle=e.borderColor,t.lineWidth=e.borderWidth,t.fillStyle=e.backgroundColor,t.fill(),t.lineJoin="bevel",e.borderWidth&&t.stroke()}})},{25:25,26:26,45:45}],37:[function(t,e,n){"use strict";var i=t(25),a=t(26),o=t(45),r=i.global;i._set("global",{elements:{line:{tension:.4,backgroundColor:r.defaultColor,borderWidth:3,borderColor:r.defaultColor,borderCapStyle:"butt",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",capBezierPoints:!0,fill:!0}}}),e.exports=a.extend({draw:function(){var t,e,n,i,a=this,l=a._view,s=a._chart.ctx,u=l.spanGaps,d=a._children.slice(),c=r.elements.line,h=-1;for(a._loop&&d.length&&d.push(d[0]),s.save(),s.lineCap=l.borderCapStyle||c.borderCapStyle,s.setLineDash&&s.setLineDash(l.borderDash||c.borderDash),s.lineDashOffset=l.borderDashOffset||c.borderDashOffset,s.lineJoin=l.borderJoinStyle||c.borderJoinStyle,s.lineWidth=l.borderWidth||c.borderWidth,s.strokeStyle=l.borderColor||r.defaultColor,s.beginPath(),h=-1,t=0;te?1:-1,r=1,l=u.borderSkipped||"left"):(e=u.x-u.width/2,n=u.x+u.width/2,i=u.y,o=1,r=(a=u.base)>i?1:-1,l=u.borderSkipped||"bottom"),d){var c=Math.min(Math.abs(e-n),Math.abs(i-a)),h=(d=d>c?c:d)/2,f=e+("left"!==l?h*o:0),g=n+("right"!==l?-h*o:0),p=i+("top"!==l?h*r:0),v=a+("bottom"!==l?-h*r:0);f!==g&&(i=p,a=v),p!==v&&(e=f,n=g)}s.beginPath(),s.fillStyle=u.backgroundColor,s.strokeStyle=u.borderColor,s.lineWidth=d;var m=[[e,a],[e,i],[n,i],[n,a]],b=["bottom","left","top","right"].indexOf(l,0);-1===b&&(b=0);var x=t(0);s.moveTo(x[0],x[1]);for(var y=1;y<4;y++)x=t(y),s.lineTo(x[0],x[1]);s.fill(),d&&s.stroke()},height:function(){var t=this._view;return t.base-t.y},inRange:function(t,e){var n=!1;if(this._view){var i=a(this);n=t>=i.left&&t<=i.right&&e>=i.top&&e<=i.bottom}return n},inLabelRange:function(t,e){var n=this;if(!n._view)return!1;var o=a(n);return i(n)?t>=o.left&&t<=o.right:e>=o.top&&e<=o.bottom},inXRange:function(t){var e=a(this);return t>=e.left&&t<=e.right},inYRange:function(t){var e=a(this);return t>=e.top&&t<=e.bottom},getCenterPoint:function(){var t,e,n=this._view;return i(this)?(t=n.x,e=(n.y+n.base)/2):(t=(n.x+n.base)/2,e=n.y),{x:t,y:e}},getArea:function(){var t=this._view;return t.width*Math.abs(t.y-t.base)},tooltipPosition:function(){var t=this._view;return{x:t.x,y:t.y}}})},{25:25,26:26}],40:[function(t,e,n){"use strict";e.exports={},e.exports.Arc=t(36),e.exports.Line=t(37),e.exports.Point=t(38),e.exports.Rectangle=t(39)},{36:36,37:37,38:38,39:39}],41:[function(t,e,n){"use strict";var i=t(42),n=e.exports={clear:function(t){t.ctx.clearRect(0,0,t.width,t.height)},roundedRect:function(t,e,n,i,a,o){if(o){var r=Math.min(o,i/2),l=Math.min(o,a/2);t.moveTo(e+r,n),t.lineTo(e+i-r,n),t.quadraticCurveTo(e+i,n,e+i,n+l),t.lineTo(e+i,n+a-l),t.quadraticCurveTo(e+i,n+a,e+i-r,n+a),t.lineTo(e+r,n+a),t.quadraticCurveTo(e,n+a,e,n+a-l),t.lineTo(e,n+l),t.quadraticCurveTo(e,n,e+r,n)}else t.rect(e,n,i,a)},drawPoint:function(t,e,n,i,a){var o,r,l,s,u,d;if(!e||"object"!=typeof e||"[object HTMLImageElement]"!==(o=e.toString())&&"[object HTMLCanvasElement]"!==o){if(!(isNaN(n)||n<=0)){switch(e){default:t.beginPath(),t.arc(i,a,n,0,2*Math.PI),t.closePath(),t.fill();break;case"triangle":t.beginPath(),u=(r=3*n/Math.sqrt(3))*Math.sqrt(3)/2,t.moveTo(i-r/2,a+u/3),t.lineTo(i+r/2,a+u/3),t.lineTo(i,a-2*u/3),t.closePath(),t.fill();break;case"rect":d=1/Math.SQRT2*n,t.beginPath(),t.fillRect(i-d,a-d,2*d,2*d),t.strokeRect(i-d,a-d,2*d,2*d);break;case"rectRounded":var c=n/Math.SQRT2,h=i-c,f=a-c,g=Math.SQRT2*n;t.beginPath(),this.roundedRect(t,h,f,g,g,n/2),t.closePath(),t.fill();break;case"rectRot":d=1/Math.SQRT2*n,t.beginPath(),t.moveTo(i-d,a),t.lineTo(i,a+d),t.lineTo(i+d,a),t.lineTo(i,a-d),t.closePath(),t.fill();break;case"cross":t.beginPath(),t.moveTo(i,a+n),t.lineTo(i,a-n),t.moveTo(i-n,a),t.lineTo(i+n,a),t.closePath();break;case"crossRot":t.beginPath(),l=Math.cos(Math.PI/4)*n,s=Math.sin(Math.PI/4)*n,t.moveTo(i-l,a-s),t.lineTo(i+l,a+s),t.moveTo(i-l,a+s),t.lineTo(i+l,a-s),t.closePath();break;case"star":t.beginPath(),t.moveTo(i,a+n),t.lineTo(i,a-n),t.moveTo(i-n,a),t.lineTo(i+n,a),l=Math.cos(Math.PI/4)*n,s=Math.sin(Math.PI/4)*n,t.moveTo(i-l,a-s),t.lineTo(i+l,a+s),t.moveTo(i-l,a+s),t.lineTo(i+l,a-s),t.closePath();break;case"line":t.beginPath(),t.moveTo(i-n,a),t.lineTo(i+n,a),t.closePath();break;case"dash":t.beginPath(),t.moveTo(i,a),t.lineTo(i+n,a),t.closePath()}t.stroke()}}else t.drawImage(e,i-e.width/2,a-e.height/2,e.width,e.height)},clipArea:function(t,e){t.save(),t.beginPath(),t.rect(e.left,e.top,e.right-e.left,e.bottom-e.top),t.clip()},unclipArea:function(t){t.restore()},lineTo:function(t,e,n,i){if(n.steppedLine)return"after"===n.steppedLine&&!i||"after"!==n.steppedLine&&i?t.lineTo(e.x,n.y):t.lineTo(n.x,e.y),void t.lineTo(n.x,n.y);n.tension?t.bezierCurveTo(i?e.controlPointPreviousX:e.controlPointNextX,i?e.controlPointPreviousY:e.controlPointNextY,i?n.controlPointNextX:n.controlPointPreviousX,i?n.controlPointNextY:n.controlPointPreviousY,n.x,n.y):t.lineTo(n.x,n.y)}};i.clear=n.clear,i.drawRoundedRectangle=function(t){t.beginPath(),n.roundedRect.apply(n,arguments),t.closePath()}},{42:42}],42:[function(t,e,n){"use strict";var i={noop:function(){},uid:function(){var t=0;return function(){return t++}}(),isNullOrUndef:function(t){return null===t||void 0===t},isArray:Array.isArray?Array.isArray:function(t){return"[object Array]"===Object.prototype.toString.call(t)},isObject:function(t){return null!==t&&"[object Object]"===Object.prototype.toString.call(t)},valueOrDefault:function(t,e){return void 0===t?e:t},valueAtIndexOrDefault:function(t,e,n){return i.valueOrDefault(i.isArray(t)?t[e]:t,n)},callback:function(t,e,n){if(t&&"function"==typeof t.call)return t.apply(n,e)},each:function(t,e,n,a){var o,r,l;if(i.isArray(t))if(r=t.length,a)for(o=r-1;o>=0;o--)e.call(n,t[o],o);else for(o=0;o=1?t:-(Math.sqrt(1-t*t)-1)},easeOutCirc:function(t){return Math.sqrt(1-(t-=1)*t)},easeInOutCirc:function(t){return(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:1===t?1:(n||(n=.3),i<1?(i=1,e=n/4):e=n/(2*Math.PI)*Math.asin(1/i),-i*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n))},easeOutElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:1===t?1:(n||(n=.3),i<1?(i=1,e=n/4):e=n/(2*Math.PI)*Math.asin(1/i),i*Math.pow(2,-10*t)*Math.sin((t-e)*(2*Math.PI)/n)+1)},easeInOutElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:2==(t/=.5)?1:(n||(n=.45),i<1?(i=1,e=n/4):e=n/(2*Math.PI)*Math.asin(1/i),t<1?i*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n)*-.5:i*Math.pow(2,-10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n)*.5+1)},easeInBack:function(t){var e=1.70158;return t*t*((e+1)*t-e)},easeOutBack:function(t){var e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},easeInOutBack:function(t){var e=1.70158;return(t/=.5)<1?t*t*((1+(e*=1.525))*t-e)*.5:.5*((t-=2)*t*((1+(e*=1.525))*t+e)+2)},easeInBounce:function(t){return 1-a.easeOutBounce(1-t)},easeOutBounce:function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},easeInOutBounce:function(t){return t<.5?.5*a.easeInBounce(2*t):.5*a.easeOutBounce(2*t-1)+.5}};e.exports={effects:a},i.easingEffects=a},{42:42}],44:[function(t,e,n){"use strict";var i=t(42);e.exports={toLineHeight:function(t,e){var n=(""+t).match(/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/);if(!n||"normal"===n[1])return 1.2*e;switch(t=+n[2],n[3]){case"px":return t;case"%":t/=100}return e*t},toPadding:function(t){var e,n,a,o;return i.isObject(t)?(e=+t.top||0,n=+t.right||0,a=+t.bottom||0,o=+t.left||0):e=n=a=o=+t||0,{top:e,right:n,bottom:a,left:o,height:e+a,width:o+n}},resolve:function(t,e,n){var a,o,r;for(a=0,o=t.length;a
    ';var a=e.childNodes[0],r=e.childNodes[1];e._reset=function(){a.scrollLeft=1e6,a.scrollTop=1e6,r.scrollLeft=1e6,r.scrollTop=1e6};var l=function(){e._reset(),t()};return o(a,"scroll",l.bind(a,"expand")),o(r,"scroll",l.bind(r,"shrink")),e}function c(t,e){var n=t[m]||(t[m]={}),i=n.renderProxy=function(t){t.animationName===y&&e()};v.each(k,function(e){o(t,e,i)}),n.reflow=!!t.offsetParent,t.classList.add(x)}function h(t){var e=t[m]||{},n=e.renderProxy;n&&(v.each(k,function(e){r(t,e,n)}),delete e.renderProxy),t.classList.remove(x)}function f(t,e,n){var i=t[m]||(t[m]={}),a=i.resizer=d(u(function(){if(i.resizer)return e(l("resize",n))}));c(t,function(){if(i.resizer){var e=t.parentNode;e&&e!==a.parentNode&&e.insertBefore(a,e.firstChild),a._reset()}})}function g(t){var e=t[m]||{},n=e.resizer;delete e.resizer,h(t),n&&n.parentNode&&n.parentNode.removeChild(n)}function p(t,e){var n=t._style||document.createElement("style");t._style||(t._style=n,e="/* Chart.js */\n"+e,n.setAttribute("type","text/css"),document.getElementsByTagName("head")[0].appendChild(n)),n.appendChild(document.createTextNode(e))}var v=t(45),m="$chartjs",b="chartjs-",x=b+"render-monitor",y=b+"render-animation",k=["animationstart","webkitAnimationStart"],w={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"},M=!!function(){var t=!1;try{var e=Object.defineProperty({},"passive",{get:function(){t=!0}});window.addEventListener("e",null,e)}catch(t){}return t}()&&{passive:!0};e.exports={_enabled:"undefined"!=typeof window&&"undefined"!=typeof document,initialize:function(){var t="from{opacity:0.99}to{opacity:1}";p(this,"@-webkit-keyframes "+y+"{"+t+"}@keyframes "+y+"{"+t+"}."+x+"{-webkit-animation:"+y+" 0.001s;animation:"+y+" 0.001s;}")},acquireContext:function(t,e){"string"==typeof t?t=document.getElementById(t):t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas);var n=t&&t.getContext&&t.getContext("2d");return n&&n.canvas===t?(a(t,e),n):null},releaseContext:function(t){var e=t.canvas;if(e[m]){var n=e[m].initial;["height","width"].forEach(function(t){var i=n[t];v.isNullOrUndef(i)?e.removeAttribute(t):e.setAttribute(t,i)}),v.each(n.style||{},function(t,n){e.style[n]=t}),e.width=e.width,delete e[m]}},addEventListener:function(t,e,n){var i=t.canvas;if("resize"!==e){var a=n[m]||(n[m]={});o(i,e,(a.proxies||(a.proxies={}))[t.id+"_"+e]=function(e){n(s(e,t))})}else f(i,n,t)},removeEventListener:function(t,e,n){var i=t.canvas;if("resize"!==e){var a=((n[m]||{}).proxies||{})[t.id+"_"+e];a&&r(i,e,a)}else g(i)}},v.addEvent=o,v.removeEvent=r},{45:45}],48:[function(t,e,n){"use strict";var i=t(45),a=t(46),o=t(47),r=o._enabled?o:a;e.exports=i.extend({initialize:function(){},acquireContext:function(){},releaseContext:function(){},addEventListener:function(){},removeEventListener:function(){}},r)},{45:45,46:46,47:47}],49:[function(t,e,n){"use strict";var i=t(25),a=t(40),o=t(45);i._set("global",{plugins:{filler:{propagate:!0}}}),e.exports=function(){function t(t,e,n){var i,a=t._model||{},o=a.fill;if(void 0===o&&(o=!!a.backgroundColor),!1===o||null===o)return!1;if(!0===o)return"origin";if(i=parseFloat(o,10),isFinite(i)&&Math.floor(i)===i)return"-"!==o[0]&&"+"!==o[0]||(i=e+i),!(i===e||i<0||i>=n)&&i;switch(o){case"bottom":return"start";case"top":return"end";case"zero":return"origin";case"origin":case"start":case"end":return o;default:return!1}}function e(t){var e,n=t.el._model||{},i=t.el._scale||{},a=t.fill,o=null;if(isFinite(a))return null;if("start"===a?o=void 0===n.scaleBottom?i.bottom:n.scaleBottom:"end"===a?o=void 0===n.scaleTop?i.top:n.scaleTop:void 0!==n.scaleZero?o=n.scaleZero:i.getBasePosition?o=i.getBasePosition():i.getBasePixel&&(o=i.getBasePixel()),void 0!==o&&null!==o){if(void 0!==o.x&&void 0!==o.y)return o;if("number"==typeof o&&isFinite(o))return e=i.isHorizontal(),{x:e?o:null,y:e?null:o}}return null}function n(t,e,n){var i,a=t[e].fill,o=[e];if(!n)return a;for(;!1!==a&&-1===o.indexOf(a);){if(!isFinite(a))return a;if(!(i=t[a]))return!1;if(i.visible)return a;o.push(a),a=i.fill}return!1}function r(t){var e=t.fill,n="dataset";return!1===e?null:(isFinite(e)||(n="boundary"),d[n](t))}function l(t){return t&&!t.skip}function s(t,e,n,i,a){var r;if(i&&a){for(t.moveTo(e[0].x,e[0].y),r=1;r0;--r)o.canvas.lineTo(t,n[r],n[r-1],!0)}}function u(t,e,n,i,a,o){var r,u,d,c,h,f,g,p=e.length,v=i.spanGaps,m=[],b=[],x=0,y=0;for(t.beginPath(),r=0,u=p+!!o;r');for(var n=0;n'),t.data.datasets[n].label&&e.push(t.data.datasets[n].label),e.push("");return e.push(""),e.join("")}}),e.exports=function(t){function e(t,e){return t.usePointStyle?e*Math.SQRT2:t.boxWidth}function n(e,n){var i=new t.Legend({ctx:e.ctx,options:n,chart:e});r.configure(e,i,n),r.addBox(e,i),e.legend=i}var r=t.layoutService,l=o.noop;return t.Legend=a.extend({initialize:function(t){o.extend(this,t),this.legendHitBoxes=[],this.doughnutMode=!1},beforeUpdate:l,update:function(t,e,n){var i=this;return i.beforeUpdate(),i.maxWidth=t,i.maxHeight=e,i.margins=n,i.beforeSetDimensions(),i.setDimensions(),i.afterSetDimensions(),i.beforeBuildLabels(),i.buildLabels(),i.afterBuildLabels(),i.beforeFit(),i.fit(),i.afterFit(),i.afterUpdate(),i.minSize},afterUpdate:l,beforeSetDimensions:l,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:l,beforeBuildLabels:l,buildLabels:function(){var t=this,e=t.options.labels||{},n=o.callback(e.generateLabels,[t.chart],t)||[];e.filter&&(n=n.filter(function(n){return e.filter(n,t.chart.data)})),t.options.reverse&&n.reverse(),t.legendItems=n},afterBuildLabels:l,beforeFit:l,fit:function(){var t=this,n=t.options,a=n.labels,r=n.display,l=t.ctx,s=i.global,u=o.valueOrDefault,d=u(a.fontSize,s.defaultFontSize),c=u(a.fontStyle,s.defaultFontStyle),h=u(a.fontFamily,s.defaultFontFamily),f=o.fontString(d,c,h),g=t.legendHitBoxes=[],p=t.minSize,v=t.isHorizontal();if(v?(p.width=t.maxWidth,p.height=r?10:0):(p.width=r?10:0,p.height=t.maxHeight),r)if(l.font=f,v){var m=t.lineWidths=[0],b=t.legendItems.length?d+a.padding:0;l.textAlign="left",l.textBaseline="top",o.each(t.legendItems,function(n,i){var o=e(a,d)+d/2+l.measureText(n.text).width;m[m.length-1]+o+a.padding>=t.width&&(b+=d+a.padding,m[m.length]=t.left),g[i]={left:0,top:0,width:o,height:d},m[m.length-1]+=o+a.padding}),p.height+=b}else{var x=a.padding,y=t.columnWidths=[],k=a.padding,w=0,M=0,S=d+x;o.each(t.legendItems,function(t,n){var i=e(a,d)+d/2+l.measureText(t.text).width;M+S>p.height&&(k+=w+a.padding,y.push(w),w=0,M=0),w=Math.max(w,i),M+=S,g[n]={left:0,top:0,width:i,height:d}}),k+=w,y.push(w),p.width+=k}t.width=p.width,t.height=p.height},afterFit:l,isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},draw:function(){var t=this,n=t.options,a=n.labels,r=i.global,l=r.elements.line,s=t.width,u=t.lineWidths;if(n.display){var d,c=t.ctx,h=o.valueOrDefault,f=h(a.fontColor,r.defaultFontColor),g=h(a.fontSize,r.defaultFontSize),p=h(a.fontStyle,r.defaultFontStyle),v=h(a.fontFamily,r.defaultFontFamily),m=o.fontString(g,p,v);c.textAlign="left",c.textBaseline="middle",c.lineWidth=.5,c.strokeStyle=f,c.fillStyle=f,c.font=m;var b=e(a,g),x=t.legendHitBoxes,y=function(t,e,i){if(!(isNaN(b)||b<=0)){c.save(),c.fillStyle=h(i.fillStyle,r.defaultColor),c.lineCap=h(i.lineCap,l.borderCapStyle),c.lineDashOffset=h(i.lineDashOffset,l.borderDashOffset),c.lineJoin=h(i.lineJoin,l.borderJoinStyle),c.lineWidth=h(i.lineWidth,l.borderWidth),c.strokeStyle=h(i.strokeStyle,r.defaultColor);var a=0===h(i.lineWidth,l.borderWidth);if(c.setLineDash&&c.setLineDash(h(i.lineDash,l.borderDash)),n.labels&&n.labels.usePointStyle){var s=g*Math.SQRT2/2,u=s/Math.SQRT2,d=t+u,f=e+u;o.canvas.drawPoint(c,i.pointStyle,s,d,f)}else a||c.strokeRect(t,e,b,g),c.fillRect(t,e,b,g);c.restore()}},k=function(t,e,n,i){var a=g/2,o=b+a+t,r=e+a;c.fillText(n.text,o,r),n.hidden&&(c.beginPath(),c.lineWidth=2,c.moveTo(o,r),c.lineTo(o+i,r),c.stroke())},w=t.isHorizontal();d=w?{x:t.left+(s-u[0])/2,y:t.top+a.padding,line:0}:{x:t.left+a.padding,y:t.top+a.padding,line:0};var M=g+a.padding;o.each(t.legendItems,function(e,n){var i=c.measureText(e.text).width,o=b+g/2+i,r=d.x,l=d.y;w?r+o>=s&&(l=d.y+=M,d.line++,r=d.x=t.left+(s-u[d.line])/2):l+M>t.bottom&&(r=d.x=r+t.columnWidths[d.line]+a.padding,l=d.y=t.top+a.padding,d.line++),y(r,l,e),x[n].left=r,x[n].top=l,k(r,l,e,i),w?d.x+=o+a.padding:d.y+=M})}},handleEvent:function(t){var e=this,n=e.options,i="mouseup"===t.type?"click":t.type,a=!1;if("mousemove"===i){if(!n.onHover)return}else{if("click"!==i)return;if(!n.onClick)return}var o=t.x,r=t.y;if(o>=e.left&&o<=e.right&&r>=e.top&&r<=e.bottom)for(var l=e.legendHitBoxes,s=0;s=u.left&&o<=u.left+u.width&&r>=u.top&&r<=u.top+u.height){if("click"===i){n.onClick.call(e,t.native,e.legendItems[s]),a=!0;break}if("mousemove"===i){n.onHover.call(e,t.native,e.legendItems[s]),a=!0;break}}}return a}}),{id:"legend",beforeInit:function(t){var e=t.options.legend;e&&n(t,e)},beforeUpdate:function(t){var e=t.options.legend,a=t.legend;e?(o.mergeIf(e,i.global.legend),a?(r.configure(t,a,e),a.options=e):n(t,e)):a&&(r.removeBox(t,a),delete t.legend)},afterEvent:function(t,e){var n=t.legend;n&&n.handleEvent(e)}}}},{25:25,26:26,45:45}],51:[function(t,e,n){"use strict";var i=t(25),a=t(26),o=t(45);i._set("global",{title:{display:!1,fontStyle:"bold",fullWidth:!0,lineHeight:1.2,padding:10,position:"top",text:"",weight:2e3}}),e.exports=function(t){function e(e,i){var a=new t.Title({ctx:e.ctx,options:i,chart:e});n.configure(e,a,i),n.addBox(e,a),e.titleBlock=a}var n=t.layoutService,r=o.noop;return t.Title=a.extend({initialize:function(t){var e=this;o.extend(e,t),e.legendHitBoxes=[]},beforeUpdate:r,update:function(t,e,n){var i=this;return i.beforeUpdate(),i.maxWidth=t,i.maxHeight=e,i.margins=n,i.beforeSetDimensions(),i.setDimensions(),i.afterSetDimensions(),i.beforeBuildLabels(),i.buildLabels(),i.afterBuildLabels(),i.beforeFit(),i.fit(),i.afterFit(),i.afterUpdate(),i.minSize},afterUpdate:r,beforeSetDimensions:r,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:r,beforeBuildLabels:r,buildLabels:r,afterBuildLabels:r,beforeFit:r,fit:function(){var t=this,e=o.valueOrDefault,n=t.options,a=n.display,r=e(n.fontSize,i.global.defaultFontSize),l=t.minSize,s=o.isArray(n.text)?n.text.length:1,u=o.options.toLineHeight(n.lineHeight,r),d=a?s*u+2*n.padding:0;t.isHorizontal()?(l.width=t.maxWidth,l.height=d):(l.width=d,l.height=t.maxHeight),t.width=l.width,t.height=l.height},afterFit:r,isHorizontal:function(){var t=this.options.position;return"top"===t||"bottom"===t},draw:function(){var t=this,e=t.ctx,n=o.valueOrDefault,a=t.options,r=i.global;if(a.display){var l,s,u,d=n(a.fontSize,r.defaultFontSize),c=n(a.fontStyle,r.defaultFontStyle),h=n(a.fontFamily,r.defaultFontFamily),f=o.fontString(d,c,h),g=o.options.toLineHeight(a.lineHeight,d),p=g/2+a.padding,v=0,m=t.top,b=t.left,x=t.bottom,y=t.right;e.fillStyle=n(a.fontColor,r.defaultFontColor),e.font=f,t.isHorizontal()?(s=b+(y-b)/2,u=m+p,l=y-b):(s="left"===a.position?b+p:y-p,u=m+(x-m)/2,l=x-m,v=Math.PI*("left"===a.position?-.5:.5)),e.save(),e.translate(s,u),e.rotate(v),e.textAlign="center",e.textBaseline="middle";var k=a.text;if(o.isArray(k))for(var w=0,M=0;Me.max&&(e.max=i))})});e.min=isFinite(e.min)&&!isNaN(e.min)?e.min:0,e.max=isFinite(e.max)&&!isNaN(e.max)?e.max:1,this.handleTickRangeOptions()},getTickLimit:function(){var t,e=this,n=e.options.ticks;if(e.isHorizontal())t=Math.min(n.maxTicksLimit?n.maxTicksLimit:11,Math.ceil(e.width/50));else{var o=a.valueOrDefault(n.fontSize,i.global.defaultFontSize);t=Math.min(n.maxTicksLimit?n.maxTicksLimit:11,Math.ceil(e.height/(2*o)))}return t},handleDirectionalChanges:function(){this.isHorizontal()||this.ticks.reverse()},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},getPixelForValue:function(t){var e,n=this,i=n.start,a=+n.getRightValue(t),o=n.end-i;return n.isHorizontal()?(e=n.left+n.width/o*(a-i),Math.round(e)):(e=n.bottom-n.height/o*(a-i),Math.round(e))},getValueForPixel:function(t){var e=this,n=e.isHorizontal(),i=n?e.width:e.height,a=(n?t-e.left:e.bottom-t)/i;return e.start+(e.end-e.start)*a},getPixelForTick:function(t){return this.getPixelForValue(this.ticksAsNumbers[t])}});t.scaleService.registerScaleType("linear",n,e)}},{25:25,34:34,45:45}],54:[function(t,e,n){"use strict";var i=t(45),a=t(34);e.exports=function(t){var e=i.noop;t.LinearScaleBase=t.Scale.extend({getRightValue:function(e){return"string"==typeof e?+e:t.Scale.prototype.getRightValue.call(this,e)},handleTickRangeOptions:function(){var t=this,e=t.options.ticks;if(e.beginAtZero){var n=i.sign(t.min),a=i.sign(t.max);n<0&&a<0?t.max=0:n>0&&a>0&&(t.min=0)}var o=void 0!==e.min||void 0!==e.suggestedMin,r=void 0!==e.max||void 0!==e.suggestedMax;void 0!==e.min?t.min=e.min:void 0!==e.suggestedMin&&(null===t.min?t.min=e.suggestedMin:t.min=Math.min(t.min,e.suggestedMin)),void 0!==e.max?t.max=e.max:void 0!==e.suggestedMax&&(null===t.max?t.max=e.suggestedMax:t.max=Math.max(t.max,e.suggestedMax)),o!==r&&t.min>=t.max&&(o?t.max=t.min+1:t.min=t.max-1),t.min===t.max&&(t.max++,e.beginAtZero||t.min--)},getTickLimit:e,handleDirectionalChanges:e,buildTicks:function(){var t=this,e=t.options.ticks,n=t.getTickLimit(),o={maxTicks:n=Math.max(2,n),min:e.min,max:e.max,stepSize:i.valueOrDefault(e.fixedStepSize,e.stepSize)},r=t.ticks=a.generators.linear(o,t);t.handleDirectionalChanges(),t.max=i.max(r),t.min=i.min(r),e.reverse?(r.reverse(),t.start=t.max,t.end=t.min):(t.start=t.min,t.end=t.max)},convertTicksToLabels:function(){var e=this;e.ticksAsNumbers=e.ticks.slice(),e.zeroLineIndex=e.ticks.indexOf(0),t.Scale.prototype.convertTicksToLabels.call(e)}})}},{34:34,45:45}],55:[function(t,e,n){"use strict";var i=t(45),a=t(34);e.exports=function(t){var e={position:"left",ticks:{callback:a.formatters.logarithmic}},n=t.Scale.extend({determineDataLimits:function(){function t(t){return s?t.xAxisID===e.id:t.yAxisID===e.id}var e=this,n=e.options,a=n.ticks,o=e.chart,r=o.data.datasets,l=i.valueOrDefault,s=e.isHorizontal();e.min=null,e.max=null,e.minNotZero=null;var u=n.stacked;if(void 0===u&&i.each(r,function(e,n){if(!u){var i=o.getDatasetMeta(n);o.isDatasetVisible(n)&&t(i)&&void 0!==i.stack&&(u=!0)}}),n.stacked||u){var d={};i.each(r,function(a,r){var l=o.getDatasetMeta(r),s=[l.type,void 0===n.stacked&&void 0===l.stack?r:"",l.stack].join(".");o.isDatasetVisible(r)&&t(l)&&(void 0===d[s]&&(d[s]=[]),i.each(a.data,function(t,i){var a=d[s],o=+e.getRightValue(t);isNaN(o)||l.data[i].hidden||(a[i]=a[i]||0,n.relativePoints?a[i]=100:a[i]+=o)}))}),i.each(d,function(t){var n=i.min(t),a=i.max(t);e.min=null===e.min?n:Math.min(e.min,n),e.max=null===e.max?a:Math.max(e.max,a)})}else i.each(r,function(n,a){var r=o.getDatasetMeta(a);o.isDatasetVisible(a)&&t(r)&&i.each(n.data,function(t,n){var i=+e.getRightValue(t);isNaN(i)||r.data[n].hidden||(null===e.min?e.min=i:ie.max&&(e.max=i),0!==i&&(null===e.minNotZero||ia?{start:e-n-5,end:e}:{start:e,end:e+n+5}}function s(t){var i,o,s,u=n(t),d=Math.min(t.height/2,t.width/2),c={r:t.width,l:0,t:t.height,b:0},h={};t.ctx.font=u.font,t._pointLabelSizes=[];var f=e(t);for(i=0;ic.r&&(c.r=v.end,h.r=g),m.startc.b&&(c.b=m.end,h.b=g)}t.setReductions(d,c,h)}function u(t){var e=Math.min(t.height/2,t.width/2);t.drawingArea=Math.round(e),t.setCenterPoint(0,0,0,0)}function d(t){return 0===t||180===t?"center":t<180?"left":"right"}function c(t,e,n,i){if(a.isArray(e))for(var o=n.y,r=1.5*i,l=0;l270||t<90)&&(n.y-=e.h)}function f(t){var i=t.ctx,o=a.valueOrDefault,r=t.options,l=r.angleLines,s=r.pointLabels;i.lineWidth=l.lineWidth,i.strokeStyle=l.color;var u=t.getDistanceFromCenterForValue(r.ticks.reverse?t.min:t.max),f=n(t);i.textBaseline="top";for(var g=e(t)-1;g>=0;g--){if(l.display){var p=t.getPointPosition(g,u);i.beginPath(),i.moveTo(t.xCenter,t.yCenter),i.lineTo(p.x,p.y),i.stroke(),i.closePath()}if(s.display){var m=t.getPointPosition(g,u+5),b=o(s.fontColor,v.defaultFontColor);i.font=f.font,i.fillStyle=b;var x=t.getIndexAngle(g),y=a.toDegrees(x);i.textAlign=d(y),h(y,t._pointLabelSizes[g],m),c(i,t.pointLabels[g]||"",m,f.size)}}}function g(t,n,i,o){var r=t.ctx;if(r.strokeStyle=a.valueAtIndexOrDefault(n.color,o-1),r.lineWidth=a.valueAtIndexOrDefault(n.lineWidth,o-1),t.options.gridLines.circular)r.beginPath(),r.arc(t.xCenter,t.yCenter,i,0,2*Math.PI),r.closePath(),r.stroke();else{var l=e(t);if(0===l)return;r.beginPath();var s=t.getPointPosition(0,i);r.moveTo(s.x,s.y);for(var u=1;u0&&n>0?e:0)},draw:function(){var t=this,e=t.options,n=e.gridLines,i=e.ticks,o=a.valueOrDefault;if(e.display){var r=t.ctx,l=this.getIndexAngle(0),s=o(i.fontSize,v.defaultFontSize),u=o(i.fontStyle,v.defaultFontStyle),d=o(i.fontFamily,v.defaultFontFamily),c=a.fontString(s,u,d);a.each(t.ticks,function(e,a){if(a>0||i.reverse){var u=t.getDistanceFromCenterForValue(t.ticksAsNumbers[a]);if(n.display&&0!==a&&g(t,n,u,a),i.display){var d=o(i.fontColor,v.defaultFontColor);if(r.font=c,r.save(),r.translate(t.xCenter,t.yCenter),r.rotate(l),i.showLabelBackdrop){var h=r.measureText(e).width;r.fillStyle=i.backdropColor,r.fillRect(-h/2-i.backdropPaddingX,-u-s/2-i.backdropPaddingY,h+2*i.backdropPaddingX,s+2*i.backdropPaddingY)}r.textAlign="center",r.textBaseline="middle",r.fillStyle=d,r.fillText(e,0,-u),r.restore()}}}),(e.angleLines.display||e.pointLabels.display)&&f(t)}}});t.scaleService.registerScaleType("radialLinear",b,m)}},{25:25,34:34,45:45}],57:[function(t,e,n){"use strict";function i(t,e){return t-e}function a(t){var e,n,i,a={},o=[];for(e=0,n=t.length;ee&&l=0&&r<=l;){if(i=r+l>>1,a=t[i-1]||null,o=t[i],!a)return{lo:null,hi:o};if(o[e]n))return{lo:a,hi:o};l=i-1}}return{lo:o,hi:null}}function l(t,e,n,i){var a=r(t,e,n),o=a.lo?a.hi?a.lo:t[t.length-2]:t[0],l=a.lo?a.hi?a.hi:t[t.length-1]:t[1],s=l[e]-o[e],u=s?(n-o[e])/s:0,d=(l[i]-o[i])*u;return o[i]+d}function s(t,e){var n=e.parser,i=e.parser||e.format;return"function"==typeof n?n(t):"string"==typeof t&&"string"==typeof i?m(t,i):(t instanceof m||(t=m(t)),t.isValid()?t:"function"==typeof i?i(t):t)}function u(t,e){if(x.isNullOrUndef(t))return null;var n=e.options.time,i=s(e.getRightValue(t),n);return i.isValid()?(n.round&&i.startOf(n.round),i.valueOf()):null}function d(t,e,n,i){var a,o,r,l=e-t,s=w[n],u=s.size,d=s.steps;if(!d)return Math.ceil(l/((i||1)*u));for(a=0,o=d.length;a=M.indexOf(e);a--)if(o=M[a],w[o].common&&r.as(o)>=t.length)return o;return M[e?M.indexOf(e):0]}function f(t){for(var e=M.indexOf(t)+1,n=M.length;e1?e[1]:i,r=e[0],s=(l(t,"time",o,"pos")-l(t,"time",r,"pos"))/2),a.time.max||(o=e[e.length-1],r=e.length>1?e[e.length-2]:n,u=(l(t,"time",o,"pos")-l(t,"time",r,"pos"))/2)),{left:s,right:u}}function v(t,e){var n,i,a,o,r=[];for(n=0,i=t.length;n=a&&n<=r&&c.push(n);return i.min=a,i.max=r,i._unit=s.unit||h(c,s.minUnit,i.min,i.max),i._majorUnit=f(i._unit),i._table=o(i._timestamps.data,a,r,l.distribution),i._offsets=p(i._table,c,a,r,l),v(c,i._majorUnit)},getLabelForIndex:function(t,e){var n=this,i=n.chart.data,a=n.options.time,o=i.labels&&t=0&&t li { + position: relative; } + +.fa-li { + left: -2em; + position: absolute; + text-align: center; + width: 2em; + line-height: inherit; } + +.fa-border { + border: solid 0.08em #eee; + border-radius: .1em; + padding: .2em .25em .15em; } + +.fa-pull-left { + float: left; } + +.fa-pull-right { + float: right; } + +.fa.fa-pull-left, +.fas.fa-pull-left, +.far.fa-pull-left, +.fal.fa-pull-left, +.fab.fa-pull-left { + margin-right: .3em; } + +.fa.fa-pull-right, +.fas.fa-pull-right, +.far.fa-pull-right, +.fal.fa-pull-right, +.fab.fa-pull-right { + margin-left: .3em; } + +.fa-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; } + +.fa-pulse { + -webkit-animation: fa-spin 1s infinite steps(8); + animation: fa-spin 1s infinite steps(8); } + +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); } + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); } } + +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); } + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); } } + +.fa-rotate-90 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; + -webkit-transform: rotate(90deg); + transform: rotate(90deg); } + +.fa-rotate-180 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; + -webkit-transform: rotate(180deg); + transform: rotate(180deg); } + +.fa-rotate-270 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; + -webkit-transform: rotate(270deg); + transform: rotate(270deg); } + +.fa-flip-horizontal { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; + -webkit-transform: scale(-1, 1); + transform: scale(-1, 1); } + +.fa-flip-vertical { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; + -webkit-transform: scale(1, -1); + transform: scale(1, -1); } + +.fa-flip-horizontal.fa-flip-vertical { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; + -webkit-transform: scale(-1, -1); + transform: scale(-1, -1); } + +:root .fa-rotate-90, +:root .fa-rotate-180, +:root .fa-rotate-270, +:root .fa-flip-horizontal, +:root .fa-flip-vertical { + -webkit-filter: none; + filter: none; } + +.fa-stack { + display: inline-block; + height: 2em; + line-height: 2em; + position: relative; + vertical-align: middle; + width: 2em; } + +.fa-stack-1x, +.fa-stack-2x { + left: 0; + position: absolute; + text-align: center; + width: 100%; } + +.fa-stack-1x { + line-height: inherit; } + +.fa-stack-2x { + font-size: 2em; } + +.fa-inverse { + color: #fff; } + +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen +readers do not read off random characters that represent icons */ +.fa-500px:before { + content: "\f26e"; } + +.fa-accessible-icon:before { + content: "\f368"; } + +.fa-accusoft:before { + content: "\f369"; } + +.fa-address-book:before { + content: "\f2b9"; } + +.fa-address-card:before { + content: "\f2bb"; } + +.fa-adjust:before { + content: "\f042"; } + +.fa-adn:before { + content: "\f170"; } + +.fa-adversal:before { + content: "\f36a"; } + +.fa-affiliatetheme:before { + content: "\f36b"; } + +.fa-algolia:before { + content: "\f36c"; } + +.fa-align-center:before { + content: "\f037"; } + +.fa-align-justify:before { + content: "\f039"; } + +.fa-align-left:before { + content: "\f036"; } + +.fa-align-right:before { + content: "\f038"; } + +.fa-amazon:before { + content: "\f270"; } + +.fa-amazon-pay:before { + content: "\f42c"; } + +.fa-ambulance:before { + content: "\f0f9"; } + +.fa-american-sign-language-interpreting:before { + content: "\f2a3"; } + +.fa-amilia:before { + content: "\f36d"; } + +.fa-anchor:before { + content: "\f13d"; } + +.fa-android:before { + content: "\f17b"; } + +.fa-angellist:before { + content: "\f209"; } + +.fa-angle-double-down:before { + content: "\f103"; } + +.fa-angle-double-left:before { + content: "\f100"; } + +.fa-angle-double-right:before { + content: "\f101"; } + +.fa-angle-double-up:before { + content: "\f102"; } + +.fa-angle-down:before { + content: "\f107"; } + +.fa-angle-left:before { + content: "\f104"; } + +.fa-angle-right:before { + content: "\f105"; } + +.fa-angle-up:before { + content: "\f106"; } + +.fa-angrycreative:before { + content: "\f36e"; } + +.fa-angular:before { + content: "\f420"; } + +.fa-app-store:before { + content: "\f36f"; } + +.fa-app-store-ios:before { + content: "\f370"; } + +.fa-apper:before { + content: "\f371"; } + +.fa-apple:before { + content: "\f179"; } + +.fa-apple-pay:before { + content: "\f415"; } + +.fa-archive:before { + content: "\f187"; } + +.fa-arrow-alt-circle-down:before { + content: "\f358"; } + +.fa-arrow-alt-circle-left:before { + content: "\f359"; } + +.fa-arrow-alt-circle-right:before { + content: "\f35a"; } + +.fa-arrow-alt-circle-up:before { + content: "\f35b"; } + +.fa-arrow-circle-down:before { + content: "\f0ab"; } + +.fa-arrow-circle-left:before { + content: "\f0a8"; } + +.fa-arrow-circle-right:before { + content: "\f0a9"; } + +.fa-arrow-circle-up:before { + content: "\f0aa"; } + +.fa-arrow-down:before { + content: "\f063"; } + +.fa-arrow-left:before { + content: "\f060"; } + +.fa-arrow-right:before { + content: "\f061"; } + +.fa-arrow-up:before { + content: "\f062"; } + +.fa-arrows-alt:before { + content: "\f0b2"; } + +.fa-arrows-alt-h:before { + content: "\f337"; } + +.fa-arrows-alt-v:before { + content: "\f338"; } + +.fa-assistive-listening-systems:before { + content: "\f2a2"; } + +.fa-asterisk:before { + content: "\f069"; } + +.fa-asymmetrik:before { + content: "\f372"; } + +.fa-at:before { + content: "\f1fa"; } + +.fa-audible:before { + content: "\f373"; } + +.fa-audio-description:before { + content: "\f29e"; } + +.fa-autoprefixer:before { + content: "\f41c"; } + +.fa-avianex:before { + content: "\f374"; } + +.fa-aviato:before { + content: "\f421"; } + +.fa-aws:before { + content: "\f375"; } + +.fa-backward:before { + content: "\f04a"; } + +.fa-balance-scale:before { + content: "\f24e"; } + +.fa-ban:before { + content: "\f05e"; } + +.fa-bandcamp:before { + content: "\f2d5"; } + +.fa-barcode:before { + content: "\f02a"; } + +.fa-bars:before { + content: "\f0c9"; } + +.fa-bath:before { + content: "\f2cd"; } + +.fa-battery-empty:before { + content: "\f244"; } + +.fa-battery-full:before { + content: "\f240"; } + +.fa-battery-half:before { + content: "\f242"; } + +.fa-battery-quarter:before { + content: "\f243"; } + +.fa-battery-three-quarters:before { + content: "\f241"; } + +.fa-bed:before { + content: "\f236"; } + +.fa-beer:before { + content: "\f0fc"; } + +.fa-behance:before { + content: "\f1b4"; } + +.fa-behance-square:before { + content: "\f1b5"; } + +.fa-bell:before { + content: "\f0f3"; } + +.fa-bell-slash:before { + content: "\f1f6"; } + +.fa-bicycle:before { + content: "\f206"; } + +.fa-bimobject:before { + content: "\f378"; } + +.fa-binoculars:before { + content: "\f1e5"; } + +.fa-birthday-cake:before { + content: "\f1fd"; } + +.fa-bitbucket:before { + content: "\f171"; } + +.fa-bitcoin:before { + content: "\f379"; } + +.fa-bity:before { + content: "\f37a"; } + +.fa-black-tie:before { + content: "\f27e"; } + +.fa-blackberry:before { + content: "\f37b"; } + +.fa-blind:before { + content: "\f29d"; } + +.fa-blogger:before { + content: "\f37c"; } + +.fa-blogger-b:before { + content: "\f37d"; } + +.fa-bluetooth:before { + content: "\f293"; } + +.fa-bluetooth-b:before { + content: "\f294"; } + +.fa-bold:before { + content: "\f032"; } + +.fa-bolt:before { + content: "\f0e7"; } + +.fa-bomb:before { + content: "\f1e2"; } + +.fa-book:before { + content: "\f02d"; } + +.fa-bookmark:before { + content: "\f02e"; } + +.fa-braille:before { + content: "\f2a1"; } + +.fa-briefcase:before { + content: "\f0b1"; } + +.fa-btc:before { + content: "\f15a"; } + +.fa-bug:before { + content: "\f188"; } + +.fa-building:before { + content: "\f1ad"; } + +.fa-bullhorn:before { + content: "\f0a1"; } + +.fa-bullseye:before { + content: "\f140"; } + +.fa-buromobelexperte:before { + content: "\f37f"; } + +.fa-bus:before { + content: "\f207"; } + +.fa-buysellads:before { + content: "\f20d"; } + +.fa-calculator:before { + content: "\f1ec"; } + +.fa-calendar:before { + content: "\f133"; } + +.fa-calendar-alt:before { + content: "\f073"; } + +.fa-calendar-check:before { + content: "\f274"; } + +.fa-calendar-minus:before { + content: "\f272"; } + +.fa-calendar-plus:before { + content: "\f271"; } + +.fa-calendar-times:before { + content: "\f273"; } + +.fa-camera:before { + content: "\f030"; } + +.fa-camera-retro:before { + content: "\f083"; } + +.fa-car:before { + content: "\f1b9"; } + +.fa-caret-down:before { + content: "\f0d7"; } + +.fa-caret-left:before { + content: "\f0d9"; } + +.fa-caret-right:before { + content: "\f0da"; } + +.fa-caret-square-down:before { + content: "\f150"; } + +.fa-caret-square-left:before { + content: "\f191"; } + +.fa-caret-square-right:before { + content: "\f152"; } + +.fa-caret-square-up:before { + content: "\f151"; } + +.fa-caret-up:before { + content: "\f0d8"; } + +.fa-cart-arrow-down:before { + content: "\f218"; } + +.fa-cart-plus:before { + content: "\f217"; } + +.fa-cc-amazon-pay:before { + content: "\f42d"; } + +.fa-cc-amex:before { + content: "\f1f3"; } + +.fa-cc-apple-pay:before { + content: "\f416"; } + +.fa-cc-diners-club:before { + content: "\f24c"; } + +.fa-cc-discover:before { + content: "\f1f2"; } + +.fa-cc-jcb:before { + content: "\f24b"; } + +.fa-cc-mastercard:before { + content: "\f1f1"; } + +.fa-cc-paypal:before { + content: "\f1f4"; } + +.fa-cc-stripe:before { + content: "\f1f5"; } + +.fa-cc-visa:before { + content: "\f1f0"; } + +.fa-centercode:before { + content: "\f380"; } + +.fa-certificate:before { + content: "\f0a3"; } + +.fa-chart-area:before { + content: "\f1fe"; } + +.fa-chart-bar:before { + content: "\f080"; } + +.fa-chart-line:before { + content: "\f201"; } + +.fa-chart-pie:before { + content: "\f200"; } + +.fa-check:before { + content: "\f00c"; } + +.fa-check-circle:before { + content: "\f058"; } + +.fa-check-square:before { + content: "\f14a"; } + +.fa-chevron-circle-down:before { + content: "\f13a"; } + +.fa-chevron-circle-left:before { + content: "\f137"; } + +.fa-chevron-circle-right:before { + content: "\f138"; } + +.fa-chevron-circle-up:before { + content: "\f139"; } + +.fa-chevron-down:before { + content: "\f078"; } + +.fa-chevron-left:before { + content: "\f053"; } + +.fa-chevron-right:before { + content: "\f054"; } + +.fa-chevron-up:before { + content: "\f077"; } + +.fa-child:before { + content: "\f1ae"; } + +.fa-chrome:before { + content: "\f268"; } + +.fa-circle:before { + content: "\f111"; } + +.fa-circle-notch:before { + content: "\f1ce"; } + +.fa-clipboard:before { + content: "\f328"; } + +.fa-clock:before { + content: "\f017"; } + +.fa-clone:before { + content: "\f24d"; } + +.fa-closed-captioning:before { + content: "\f20a"; } + +.fa-cloud:before { + content: "\f0c2"; } + +.fa-cloud-download-alt:before { + content: "\f381"; } + +.fa-cloud-upload-alt:before { + content: "\f382"; } + +.fa-cloudscale:before { + content: "\f383"; } + +.fa-cloudsmith:before { + content: "\f384"; } + +.fa-cloudversify:before { + content: "\f385"; } + +.fa-code:before { + content: "\f121"; } + +.fa-code-branch:before { + content: "\f126"; } + +.fa-codepen:before { + content: "\f1cb"; } + +.fa-codiepie:before { + content: "\f284"; } + +.fa-coffee:before { + content: "\f0f4"; } + +.fa-cog:before { + content: "\f013"; } + +.fa-cogs:before { + content: "\f085"; } + +.fa-columns:before { + content: "\f0db"; } + +.fa-comment:before { + content: "\f075"; } + +.fa-comment-alt:before { + content: "\f27a"; } + +.fa-comments:before { + content: "\f086"; } + +.fa-compass:before { + content: "\f14e"; } + +.fa-compress:before { + content: "\f066"; } + +.fa-connectdevelop:before { + content: "\f20e"; } + +.fa-contao:before { + content: "\f26d"; } + +.fa-copy:before { + content: "\f0c5"; } + +.fa-copyright:before { + content: "\f1f9"; } + +.fa-cpanel:before { + content: "\f388"; } + +.fa-creative-commons:before { + content: "\f25e"; } + +.fa-credit-card:before { + content: "\f09d"; } + +.fa-crop:before { + content: "\f125"; } + +.fa-crosshairs:before { + content: "\f05b"; } + +.fa-css3:before { + content: "\f13c"; } + +.fa-css3-alt:before { + content: "\f38b"; } + +.fa-cube:before { + content: "\f1b2"; } + +.fa-cubes:before { + content: "\f1b3"; } + +.fa-cut:before { + content: "\f0c4"; } + +.fa-cuttlefish:before { + content: "\f38c"; } + +.fa-d-and-d:before { + content: "\f38d"; } + +.fa-dashcube:before { + content: "\f210"; } + +.fa-database:before { + content: "\f1c0"; } + +.fa-deaf:before { + content: "\f2a4"; } + +.fa-delicious:before { + content: "\f1a5"; } + +.fa-deploydog:before { + content: "\f38e"; } + +.fa-deskpro:before { + content: "\f38f"; } + +.fa-desktop:before { + content: "\f108"; } + +.fa-deviantart:before { + content: "\f1bd"; } + +.fa-digg:before { + content: "\f1a6"; } + +.fa-digital-ocean:before { + content: "\f391"; } + +.fa-discord:before { + content: "\f392"; } + +.fa-discourse:before { + content: "\f393"; } + +.fa-dochub:before { + content: "\f394"; } + +.fa-docker:before { + content: "\f395"; } + +.fa-dollar-sign:before { + content: "\f155"; } + +.fa-dot-circle:before { + content: "\f192"; } + +.fa-download:before { + content: "\f019"; } + +.fa-draft2digital:before { + content: "\f396"; } + +.fa-dribbble:before { + content: "\f17d"; } + +.fa-dribbble-square:before { + content: "\f397"; } + +.fa-dropbox:before { + content: "\f16b"; } + +.fa-drupal:before { + content: "\f1a9"; } + +.fa-dyalog:before { + content: "\f399"; } + +.fa-earlybirds:before { + content: "\f39a"; } + +.fa-edge:before { + content: "\f282"; } + +.fa-edit:before { + content: "\f044"; } + +.fa-eject:before { + content: "\f052"; } + +.fa-ellipsis-h:before { + content: "\f141"; } + +.fa-ellipsis-v:before { + content: "\f142"; } + +.fa-ember:before { + content: "\f423"; } + +.fa-empire:before { + content: "\f1d1"; } + +.fa-envelope:before { + content: "\f0e0"; } + +.fa-envelope-open:before { + content: "\f2b6"; } + +.fa-envelope-square:before { + content: "\f199"; } + +.fa-envira:before { + content: "\f299"; } + +.fa-eraser:before { + content: "\f12d"; } + +.fa-erlang:before { + content: "\f39d"; } + +.fa-ethereum:before { + content: "\f42e"; } + +.fa-etsy:before { + content: "\f2d7"; } + +.fa-euro-sign:before { + content: "\f153"; } + +.fa-exchange-alt:before { + content: "\f362"; } + +.fa-exclamation:before { + content: "\f12a"; } + +.fa-exclamation-circle:before { + content: "\f06a"; } + +.fa-exclamation-triangle:before { + content: "\f071"; } + +.fa-expand:before { + content: "\f065"; } + +.fa-expand-arrows-alt:before { + content: "\f31e"; } + +.fa-expeditedssl:before { + content: "\f23e"; } + +.fa-external-link-alt:before { + content: "\f35d"; } + +.fa-external-link-square-alt:before { + content: "\f360"; } + +.fa-eye:before { + content: "\f06e"; } + +.fa-eye-dropper:before { + content: "\f1fb"; } + +.fa-eye-slash:before { + content: "\f070"; } + +.fa-facebook:before { + content: "\f09a"; } + +.fa-facebook-f:before { + content: "\f39e"; } + +.fa-facebook-messenger:before { + content: "\f39f"; } + +.fa-facebook-square:before { + content: "\f082"; } + +.fa-fast-backward:before { + content: "\f049"; } + +.fa-fast-forward:before { + content: "\f050"; } + +.fa-fax:before { + content: "\f1ac"; } + +.fa-female:before { + content: "\f182"; } + +.fa-fighter-jet:before { + content: "\f0fb"; } + +.fa-file:before { + content: "\f15b"; } + +.fa-file-alt:before { + content: "\f15c"; } + +.fa-file-archive:before { + content: "\f1c6"; } + +.fa-file-audio:before { + content: "\f1c7"; } + +.fa-file-code:before { + content: "\f1c9"; } + +.fa-file-excel:before { + content: "\f1c3"; } + +.fa-file-image:before { + content: "\f1c5"; } + +.fa-file-pdf:before { + content: "\f1c1"; } + +.fa-file-powerpoint:before { + content: "\f1c4"; } + +.fa-file-video:before { + content: "\f1c8"; } + +.fa-file-word:before { + content: "\f1c2"; } + +.fa-film:before { + content: "\f008"; } + +.fa-filter:before { + content: "\f0b0"; } + +.fa-fire:before { + content: "\f06d"; } + +.fa-fire-extinguisher:before { + content: "\f134"; } + +.fa-firefox:before { + content: "\f269"; } + +.fa-first-order:before { + content: "\f2b0"; } + +.fa-firstdraft:before { + content: "\f3a1"; } + +.fa-flag:before { + content: "\f024"; } + +.fa-flag-checkered:before { + content: "\f11e"; } + +.fa-flask:before { + content: "\f0c3"; } + +.fa-flickr:before { + content: "\f16e"; } + +.fa-fly:before { + content: "\f417"; } + +.fa-folder:before { + content: "\f07b"; } + +.fa-folder-open:before { + content: "\f07c"; } + +.fa-font:before { + content: "\f031"; } + +.fa-font-awesome:before { + content: "\f2b4"; } + +.fa-font-awesome-alt:before { + content: "\f35c"; } + +.fa-font-awesome-flag:before { + content: "\f425"; } + +.fa-fonticons:before { + content: "\f280"; } + +.fa-fonticons-fi:before { + content: "\f3a2"; } + +.fa-fort-awesome:before { + content: "\f286"; } + +.fa-fort-awesome-alt:before { + content: "\f3a3"; } + +.fa-forumbee:before { + content: "\f211"; } + +.fa-forward:before { + content: "\f04e"; } + +.fa-foursquare:before { + content: "\f180"; } + +.fa-free-code-camp:before { + content: "\f2c5"; } + +.fa-freebsd:before { + content: "\f3a4"; } + +.fa-frown:before { + content: "\f119"; } + +.fa-futbol:before { + content: "\f1e3"; } + +.fa-gamepad:before { + content: "\f11b"; } + +.fa-gavel:before { + content: "\f0e3"; } + +.fa-gem:before { + content: "\f3a5"; } + +.fa-genderless:before { + content: "\f22d"; } + +.fa-get-pocket:before { + content: "\f265"; } + +.fa-gg:before { + content: "\f260"; } + +.fa-gg-circle:before { + content: "\f261"; } + +.fa-gift:before { + content: "\f06b"; } + +.fa-git:before { + content: "\f1d3"; } + +.fa-git-square:before { + content: "\f1d2"; } + +.fa-github:before { + content: "\f09b"; } + +.fa-github-alt:before { + content: "\f113"; } + +.fa-github-square:before { + content: "\f092"; } + +.fa-gitkraken:before { + content: "\f3a6"; } + +.fa-gitlab:before { + content: "\f296"; } + +.fa-gitter:before { + content: "\f426"; } + +.fa-glass-martini:before { + content: "\f000"; } + +.fa-glide:before { + content: "\f2a5"; } + +.fa-glide-g:before { + content: "\f2a6"; } + +.fa-globe:before { + content: "\f0ac"; } + +.fa-gofore:before { + content: "\f3a7"; } + +.fa-goodreads:before { + content: "\f3a8"; } + +.fa-goodreads-g:before { + content: "\f3a9"; } + +.fa-google:before { + content: "\f1a0"; } + +.fa-google-drive:before { + content: "\f3aa"; } + +.fa-google-play:before { + content: "\f3ab"; } + +.fa-google-plus:before { + content: "\f2b3"; } + +.fa-google-plus-g:before { + content: "\f0d5"; } + +.fa-google-plus-square:before { + content: "\f0d4"; } + +.fa-google-wallet:before { + content: "\f1ee"; } + +.fa-graduation-cap:before { + content: "\f19d"; } + +.fa-gratipay:before { + content: "\f184"; } + +.fa-grav:before { + content: "\f2d6"; } + +.fa-gripfire:before { + content: "\f3ac"; } + +.fa-grunt:before { + content: "\f3ad"; } + +.fa-gulp:before { + content: "\f3ae"; } + +.fa-h-square:before { + content: "\f0fd"; } + +.fa-hacker-news:before { + content: "\f1d4"; } + +.fa-hacker-news-square:before { + content: "\f3af"; } + +.fa-hand-lizard:before { + content: "\f258"; } + +.fa-hand-paper:before { + content: "\f256"; } + +.fa-hand-peace:before { + content: "\f25b"; } + +.fa-hand-point-down:before { + content: "\f0a7"; } + +.fa-hand-point-left:before { + content: "\f0a5"; } + +.fa-hand-point-right:before { + content: "\f0a4"; } + +.fa-hand-point-up:before { + content: "\f0a6"; } + +.fa-hand-pointer:before { + content: "\f25a"; } + +.fa-hand-rock:before { + content: "\f255"; } + +.fa-hand-scissors:before { + content: "\f257"; } + +.fa-hand-spock:before { + content: "\f259"; } + +.fa-handshake:before { + content: "\f2b5"; } + +.fa-hashtag:before { + content: "\f292"; } + +.fa-hdd:before { + content: "\f0a0"; } + +.fa-heading:before { + content: "\f1dc"; } + +.fa-headphones:before { + content: "\f025"; } + +.fa-heart:before { + content: "\f004"; } + +.fa-heartbeat:before { + content: "\f21e"; } + +.fa-hire-a-helper:before { + content: "\f3b0"; } + +.fa-history:before { + content: "\f1da"; } + +.fa-home:before { + content: "\f015"; } + +.fa-hooli:before { + content: "\f427"; } + +.fa-hospital:before { + content: "\f0f8"; } + +.fa-hotjar:before { + content: "\f3b1"; } + +.fa-hourglass:before { + content: "\f254"; } + +.fa-hourglass-end:before { + content: "\f253"; } + +.fa-hourglass-half:before { + content: "\f252"; } + +.fa-hourglass-start:before { + content: "\f251"; } + +.fa-houzz:before { + content: "\f27c"; } + +.fa-html5:before { + content: "\f13b"; } + +.fa-hubspot:before { + content: "\f3b2"; } + +.fa-i-cursor:before { + content: "\f246"; } + +.fa-id-badge:before { + content: "\f2c1"; } + +.fa-id-card:before { + content: "\f2c2"; } + +.fa-image:before { + content: "\f03e"; } + +.fa-images:before { + content: "\f302"; } + +.fa-imdb:before { + content: "\f2d8"; } + +.fa-inbox:before { + content: "\f01c"; } + +.fa-indent:before { + content: "\f03c"; } + +.fa-industry:before { + content: "\f275"; } + +.fa-info:before { + content: "\f129"; } + +.fa-info-circle:before { + content: "\f05a"; } + +.fa-instagram:before { + content: "\f16d"; } + +.fa-internet-explorer:before { + content: "\f26b"; } + +.fa-ioxhost:before { + content: "\f208"; } + +.fa-italic:before { + content: "\f033"; } + +.fa-itunes:before { + content: "\f3b4"; } + +.fa-itunes-note:before { + content: "\f3b5"; } + +.fa-jenkins:before { + content: "\f3b6"; } + +.fa-joget:before { + content: "\f3b7"; } + +.fa-joomla:before { + content: "\f1aa"; } + +.fa-js:before { + content: "\f3b8"; } + +.fa-js-square:before { + content: "\f3b9"; } + +.fa-jsfiddle:before { + content: "\f1cc"; } + +.fa-key:before { + content: "\f084"; } + +.fa-keyboard:before { + content: "\f11c"; } + +.fa-keycdn:before { + content: "\f3ba"; } + +.fa-kickstarter:before { + content: "\f3bb"; } + +.fa-kickstarter-k:before { + content: "\f3bc"; } + +.fa-korvue:before { + content: "\f42f"; } + +.fa-language:before { + content: "\f1ab"; } + +.fa-laptop:before { + content: "\f109"; } + +.fa-laravel:before { + content: "\f3bd"; } + +.fa-lastfm:before { + content: "\f202"; } + +.fa-lastfm-square:before { + content: "\f203"; } + +.fa-leaf:before { + content: "\f06c"; } + +.fa-leanpub:before { + content: "\f212"; } + +.fa-lemon:before { + content: "\f094"; } + +.fa-less:before { + content: "\f41d"; } + +.fa-level-down-alt:before { + content: "\f3be"; } + +.fa-level-up-alt:before { + content: "\f3bf"; } + +.fa-life-ring:before { + content: "\f1cd"; } + +.fa-lightbulb:before { + content: "\f0eb"; } + +.fa-line:before { + content: "\f3c0"; } + +.fa-link:before { + content: "\f0c1"; } + +.fa-linkedin:before { + content: "\f08c"; } + +.fa-linkedin-in:before { + content: "\f0e1"; } + +.fa-linode:before { + content: "\f2b8"; } + +.fa-linux:before { + content: "\f17c"; } + +.fa-lira-sign:before { + content: "\f195"; } + +.fa-list:before { + content: "\f03a"; } + +.fa-list-alt:before { + content: "\f022"; } + +.fa-list-ol:before { + content: "\f0cb"; } + +.fa-list-ul:before { + content: "\f0ca"; } + +.fa-location-arrow:before { + content: "\f124"; } + +.fa-lock:before { + content: "\f023"; } + +.fa-lock-open:before { + content: "\f3c1"; } + +.fa-long-arrow-alt-down:before { + content: "\f309"; } + +.fa-long-arrow-alt-left:before { + content: "\f30a"; } + +.fa-long-arrow-alt-right:before { + content: "\f30b"; } + +.fa-long-arrow-alt-up:before { + content: "\f30c"; } + +.fa-low-vision:before { + content: "\f2a8"; } + +.fa-lyft:before { + content: "\f3c3"; } + +.fa-magento:before { + content: "\f3c4"; } + +.fa-magic:before { + content: "\f0d0"; } + +.fa-magnet:before { + content: "\f076"; } + +.fa-male:before { + content: "\f183"; } + +.fa-map:before { + content: "\f279"; } + +.fa-map-marker:before { + content: "\f041"; } + +.fa-map-marker-alt:before { + content: "\f3c5"; } + +.fa-map-pin:before { + content: "\f276"; } + +.fa-map-signs:before { + content: "\f277"; } + +.fa-mars:before { + content: "\f222"; } + +.fa-mars-double:before { + content: "\f227"; } + +.fa-mars-stroke:before { + content: "\f229"; } + +.fa-mars-stroke-h:before { + content: "\f22b"; } + +.fa-mars-stroke-v:before { + content: "\f22a"; } + +.fa-maxcdn:before { + content: "\f136"; } + +.fa-medapps:before { + content: "\f3c6"; } + +.fa-medium:before { + content: "\f23a"; } + +.fa-medium-m:before { + content: "\f3c7"; } + +.fa-medkit:before { + content: "\f0fa"; } + +.fa-medrt:before { + content: "\f3c8"; } + +.fa-meetup:before { + content: "\f2e0"; } + +.fa-meh:before { + content: "\f11a"; } + +.fa-mercury:before { + content: "\f223"; } + +.fa-microchip:before { + content: "\f2db"; } + +.fa-microphone:before { + content: "\f130"; } + +.fa-microphone-slash:before { + content: "\f131"; } + +.fa-microsoft:before { + content: "\f3ca"; } + +.fa-minus:before { + content: "\f068"; } + +.fa-minus-circle:before { + content: "\f056"; } + +.fa-minus-square:before { + content: "\f146"; } + +.fa-mix:before { + content: "\f3cb"; } + +.fa-mixcloud:before { + content: "\f289"; } + +.fa-mizuni:before { + content: "\f3cc"; } + +.fa-mobile:before { + content: "\f10b"; } + +.fa-mobile-alt:before { + content: "\f3cd"; } + +.fa-modx:before { + content: "\f285"; } + +.fa-monero:before { + content: "\f3d0"; } + +.fa-money-bill-alt:before { + content: "\f3d1"; } + +.fa-moon:before { + content: "\f186"; } + +.fa-motorcycle:before { + content: "\f21c"; } + +.fa-mouse-pointer:before { + content: "\f245"; } + +.fa-music:before { + content: "\f001"; } + +.fa-napster:before { + content: "\f3d2"; } + +.fa-neuter:before { + content: "\f22c"; } + +.fa-newspaper:before { + content: "\f1ea"; } + +.fa-nintendo-switch:before { + content: "\f418"; } + +.fa-node:before { + content: "\f419"; } + +.fa-node-js:before { + content: "\f3d3"; } + +.fa-npm:before { + content: "\f3d4"; } + +.fa-ns8:before { + content: "\f3d5"; } + +.fa-nutritionix:before { + content: "\f3d6"; } + +.fa-object-group:before { + content: "\f247"; } + +.fa-object-ungroup:before { + content: "\f248"; } + +.fa-odnoklassniki:before { + content: "\f263"; } + +.fa-odnoklassniki-square:before { + content: "\f264"; } + +.fa-opencart:before { + content: "\f23d"; } + +.fa-openid:before { + content: "\f19b"; } + +.fa-opera:before { + content: "\f26a"; } + +.fa-optin-monster:before { + content: "\f23c"; } + +.fa-osi:before { + content: "\f41a"; } + +.fa-outdent:before { + content: "\f03b"; } + +.fa-page4:before { + content: "\f3d7"; } + +.fa-pagelines:before { + content: "\f18c"; } + +.fa-paint-brush:before { + content: "\f1fc"; } + +.fa-palfed:before { + content: "\f3d8"; } + +.fa-paper-plane:before { + content: "\f1d8"; } + +.fa-paperclip:before { + content: "\f0c6"; } + +.fa-paragraph:before { + content: "\f1dd"; } + +.fa-paste:before { + content: "\f0ea"; } + +.fa-patreon:before { + content: "\f3d9"; } + +.fa-pause:before { + content: "\f04c"; } + +.fa-pause-circle:before { + content: "\f28b"; } + +.fa-paw:before { + content: "\f1b0"; } + +.fa-paypal:before { + content: "\f1ed"; } + +.fa-pen-square:before { + content: "\f14b"; } + +.fa-pencil-alt:before { + content: "\f303"; } + +.fa-percent:before { + content: "\f295"; } + +.fa-periscope:before { + content: "\f3da"; } + +.fa-phabricator:before { + content: "\f3db"; } + +.fa-phoenix-framework:before { + content: "\f3dc"; } + +.fa-phone:before { + content: "\f095"; } + +.fa-phone-square:before { + content: "\f098"; } + +.fa-phone-volume:before { + content: "\f2a0"; } + +.fa-pied-piper:before { + content: "\f2ae"; } + +.fa-pied-piper-alt:before { + content: "\f1a8"; } + +.fa-pied-piper-pp:before { + content: "\f1a7"; } + +.fa-pinterest:before { + content: "\f0d2"; } + +.fa-pinterest-p:before { + content: "\f231"; } + +.fa-pinterest-square:before { + content: "\f0d3"; } + +.fa-plane:before { + content: "\f072"; } + +.fa-play:before { + content: "\f04b"; } + +.fa-play-circle:before { + content: "\f144"; } + +.fa-playstation:before { + content: "\f3df"; } + +.fa-plug:before { + content: "\f1e6"; } + +.fa-plus:before { + content: "\f067"; } + +.fa-plus-circle:before { + content: "\f055"; } + +.fa-plus-square:before { + content: "\f0fe"; } + +.fa-podcast:before { + content: "\f2ce"; } + +.fa-pound-sign:before { + content: "\f154"; } + +.fa-power-off:before { + content: "\f011"; } + +.fa-print:before { + content: "\f02f"; } + +.fa-product-hunt:before { + content: "\f288"; } + +.fa-pushed:before { + content: "\f3e1"; } + +.fa-puzzle-piece:before { + content: "\f12e"; } + +.fa-python:before { + content: "\f3e2"; } + +.fa-qq:before { + content: "\f1d6"; } + +.fa-qrcode:before { + content: "\f029"; } + +.fa-question:before { + content: "\f128"; } + +.fa-question-circle:before { + content: "\f059"; } + +.fa-quora:before { + content: "\f2c4"; } + +.fa-quote-left:before { + content: "\f10d"; } + +.fa-quote-right:before { + content: "\f10e"; } + +.fa-random:before { + content: "\f074"; } + +.fa-ravelry:before { + content: "\f2d9"; } + +.fa-react:before { + content: "\f41b"; } + +.fa-rebel:before { + content: "\f1d0"; } + +.fa-recycle:before { + content: "\f1b8"; } + +.fa-red-river:before { + content: "\f3e3"; } + +.fa-reddit:before { + content: "\f1a1"; } + +.fa-reddit-alien:before { + content: "\f281"; } + +.fa-reddit-square:before { + content: "\f1a2"; } + +.fa-redo:before { + content: "\f01e"; } + +.fa-redo-alt:before { + content: "\f2f9"; } + +.fa-registered:before { + content: "\f25d"; } + +.fa-rendact:before { + content: "\f3e4"; } + +.fa-renren:before { + content: "\f18b"; } + +.fa-reply:before { + content: "\f3e5"; } + +.fa-reply-all:before { + content: "\f122"; } + +.fa-replyd:before { + content: "\f3e6"; } + +.fa-resolving:before { + content: "\f3e7"; } + +.fa-retweet:before { + content: "\f079"; } + +.fa-road:before { + content: "\f018"; } + +.fa-rocket:before { + content: "\f135"; } + +.fa-rocketchat:before { + content: "\f3e8"; } + +.fa-rockrms:before { + content: "\f3e9"; } + +.fa-rss:before { + content: "\f09e"; } + +.fa-rss-square:before { + content: "\f143"; } + +.fa-ruble-sign:before { + content: "\f158"; } + +.fa-rupee-sign:before { + content: "\f156"; } + +.fa-safari:before { + content: "\f267"; } + +.fa-sass:before { + content: "\f41e"; } + +.fa-save:before { + content: "\f0c7"; } + +.fa-schlix:before { + content: "\f3ea"; } + +.fa-scribd:before { + content: "\f28a"; } + +.fa-search:before { + content: "\f002"; } + +.fa-search-minus:before { + content: "\f010"; } + +.fa-search-plus:before { + content: "\f00e"; } + +.fa-searchengin:before { + content: "\f3eb"; } + +.fa-sellcast:before { + content: "\f2da"; } + +.fa-sellsy:before { + content: "\f213"; } + +.fa-server:before { + content: "\f233"; } + +.fa-servicestack:before { + content: "\f3ec"; } + +.fa-share:before { + content: "\f064"; } + +.fa-share-alt:before { + content: "\f1e0"; } + +.fa-share-alt-square:before { + content: "\f1e1"; } + +.fa-share-square:before { + content: "\f14d"; } + +.fa-shekel-sign:before { + content: "\f20b"; } + +.fa-shield-alt:before { + content: "\f3ed"; } + +.fa-ship:before { + content: "\f21a"; } + +.fa-shirtsinbulk:before { + content: "\f214"; } + +.fa-shopping-bag:before { + content: "\f290"; } + +.fa-shopping-basket:before { + content: "\f291"; } + +.fa-shopping-cart:before { + content: "\f07a"; } + +.fa-shower:before { + content: "\f2cc"; } + +.fa-sign-in-alt:before { + content: "\f2f6"; } + +.fa-sign-language:before { + content: "\f2a7"; } + +.fa-sign-out-alt:before { + content: "\f2f5"; } + +.fa-signal:before { + content: "\f012"; } + +.fa-simplybuilt:before { + content: "\f215"; } + +.fa-sistrix:before { + content: "\f3ee"; } + +.fa-sitemap:before { + content: "\f0e8"; } + +.fa-skyatlas:before { + content: "\f216"; } + +.fa-skype:before { + content: "\f17e"; } + +.fa-slack:before { + content: "\f198"; } + +.fa-slack-hash:before { + content: "\f3ef"; } + +.fa-sliders-h:before { + content: "\f1de"; } + +.fa-slideshare:before { + content: "\f1e7"; } + +.fa-smile:before { + content: "\f118"; } + +.fa-snapchat:before { + content: "\f2ab"; } + +.fa-snapchat-ghost:before { + content: "\f2ac"; } + +.fa-snapchat-square:before { + content: "\f2ad"; } + +.fa-snowflake:before { + content: "\f2dc"; } + +.fa-sort:before { + content: "\f0dc"; } + +.fa-sort-alpha-down:before { + content: "\f15d"; } + +.fa-sort-alpha-up:before { + content: "\f15e"; } + +.fa-sort-amount-down:before { + content: "\f160"; } + +.fa-sort-amount-up:before { + content: "\f161"; } + +.fa-sort-down:before { + content: "\f0dd"; } + +.fa-sort-numeric-down:before { + content: "\f162"; } + +.fa-sort-numeric-up:before { + content: "\f163"; } + +.fa-sort-up:before { + content: "\f0de"; } + +.fa-soundcloud:before { + content: "\f1be"; } + +.fa-space-shuttle:before { + content: "\f197"; } + +.fa-speakap:before { + content: "\f3f3"; } + +.fa-spinner:before { + content: "\f110"; } + +.fa-spotify:before { + content: "\f1bc"; } + +.fa-square:before { + content: "\f0c8"; } + +.fa-stack-exchange:before { + content: "\f18d"; } + +.fa-stack-overflow:before { + content: "\f16c"; } + +.fa-star:before { + content: "\f005"; } + +.fa-star-half:before { + content: "\f089"; } + +.fa-staylinked:before { + content: "\f3f5"; } + +.fa-steam:before { + content: "\f1b6"; } + +.fa-steam-square:before { + content: "\f1b7"; } + +.fa-steam-symbol:before { + content: "\f3f6"; } + +.fa-step-backward:before { + content: "\f048"; } + +.fa-step-forward:before { + content: "\f051"; } + +.fa-stethoscope:before { + content: "\f0f1"; } + +.fa-sticker-mule:before { + content: "\f3f7"; } + +.fa-sticky-note:before { + content: "\f249"; } + +.fa-stop:before { + content: "\f04d"; } + +.fa-stop-circle:before { + content: "\f28d"; } + +.fa-stopwatch:before { + content: "\f2f2"; } + +.fa-strava:before { + content: "\f428"; } + +.fa-street-view:before { + content: "\f21d"; } + +.fa-strikethrough:before { + content: "\f0cc"; } + +.fa-stripe:before { + content: "\f429"; } + +.fa-stripe-s:before { + content: "\f42a"; } + +.fa-studiovinari:before { + content: "\f3f8"; } + +.fa-stumbleupon:before { + content: "\f1a4"; } + +.fa-stumbleupon-circle:before { + content: "\f1a3"; } + +.fa-subscript:before { + content: "\f12c"; } + +.fa-subway:before { + content: "\f239"; } + +.fa-suitcase:before { + content: "\f0f2"; } + +.fa-sun:before { + content: "\f185"; } + +.fa-superpowers:before { + content: "\f2dd"; } + +.fa-superscript:before { + content: "\f12b"; } + +.fa-supple:before { + content: "\f3f9"; } + +.fa-sync:before { + content: "\f021"; } + +.fa-sync-alt:before { + content: "\f2f1"; } + +.fa-table:before { + content: "\f0ce"; } + +.fa-tablet:before { + content: "\f10a"; } + +.fa-tablet-alt:before { + content: "\f3fa"; } + +.fa-tachometer-alt:before { + content: "\f3fd"; } + +.fa-tag:before { + content: "\f02b"; } + +.fa-tags:before { + content: "\f02c"; } + +.fa-tasks:before { + content: "\f0ae"; } + +.fa-taxi:before { + content: "\f1ba"; } + +.fa-telegram:before { + content: "\f2c6"; } + +.fa-telegram-plane:before { + content: "\f3fe"; } + +.fa-tencent-weibo:before { + content: "\f1d5"; } + +.fa-terminal:before { + content: "\f120"; } + +.fa-text-height:before { + content: "\f034"; } + +.fa-text-width:before { + content: "\f035"; } + +.fa-th:before { + content: "\f00a"; } + +.fa-th-large:before { + content: "\f009"; } + +.fa-th-list:before { + content: "\f00b"; } + +.fa-themeisle:before { + content: "\f2b2"; } + +.fa-thermometer-empty:before { + content: "\f2cb"; } + +.fa-thermometer-full:before { + content: "\f2c7"; } + +.fa-thermometer-half:before { + content: "\f2c9"; } + +.fa-thermometer-quarter:before { + content: "\f2ca"; } + +.fa-thermometer-three-quarters:before { + content: "\f2c8"; } + +.fa-thumbs-down:before { + content: "\f165"; } + +.fa-thumbs-up:before { + content: "\f164"; } + +.fa-thumbtack:before { + content: "\f08d"; } + +.fa-ticket-alt:before { + content: "\f3ff"; } + +.fa-times:before { + content: "\f00d"; } + +.fa-times-circle:before { + content: "\f057"; } + +.fa-tint:before { + content: "\f043"; } + +.fa-toggle-off:before { + content: "\f204"; } + +.fa-toggle-on:before { + content: "\f205"; } + +.fa-trademark:before { + content: "\f25c"; } + +.fa-train:before { + content: "\f238"; } + +.fa-transgender:before { + content: "\f224"; } + +.fa-transgender-alt:before { + content: "\f225"; } + +.fa-trash:before { + content: "\f1f8"; } + +.fa-trash-alt:before { + content: "\f2ed"; } + +.fa-tree:before { + content: "\f1bb"; } + +.fa-trello:before { + content: "\f181"; } + +.fa-tripadvisor:before { + content: "\f262"; } + +.fa-trophy:before { + content: "\f091"; } + +.fa-truck:before { + content: "\f0d1"; } + +.fa-tty:before { + content: "\f1e4"; } + +.fa-tumblr:before { + content: "\f173"; } + +.fa-tumblr-square:before { + content: "\f174"; } + +.fa-tv:before { + content: "\f26c"; } + +.fa-twitch:before { + content: "\f1e8"; } + +.fa-twitter:before { + content: "\f099"; } + +.fa-twitter-square:before { + content: "\f081"; } + +.fa-typo3:before { + content: "\f42b"; } + +.fa-uber:before { + content: "\f402"; } + +.fa-uikit:before { + content: "\f403"; } + +.fa-umbrella:before { + content: "\f0e9"; } + +.fa-underline:before { + content: "\f0cd"; } + +.fa-undo:before { + content: "\f0e2"; } + +.fa-undo-alt:before { + content: "\f2ea"; } + +.fa-uniregistry:before { + content: "\f404"; } + +.fa-universal-access:before { + content: "\f29a"; } + +.fa-university:before { + content: "\f19c"; } + +.fa-unlink:before { + content: "\f127"; } + +.fa-unlock:before { + content: "\f09c"; } + +.fa-unlock-alt:before { + content: "\f13e"; } + +.fa-untappd:before { + content: "\f405"; } + +.fa-upload:before { + content: "\f093"; } + +.fa-usb:before { + content: "\f287"; } + +.fa-user:before { + content: "\f007"; } + +.fa-user-circle:before { + content: "\f2bd"; } + +.fa-user-md:before { + content: "\f0f0"; } + +.fa-user-plus:before { + content: "\f234"; } + +.fa-user-secret:before { + content: "\f21b"; } + +.fa-user-times:before { + content: "\f235"; } + +.fa-users:before { + content: "\f0c0"; } + +.fa-ussunnah:before { + content: "\f407"; } + +.fa-utensil-spoon:before { + content: "\f2e5"; } + +.fa-utensils:before { + content: "\f2e7"; } + +.fa-vaadin:before { + content: "\f408"; } + +.fa-venus:before { + content: "\f221"; } + +.fa-venus-double:before { + content: "\f226"; } + +.fa-venus-mars:before { + content: "\f228"; } + +.fa-viacoin:before { + content: "\f237"; } + +.fa-viadeo:before { + content: "\f2a9"; } + +.fa-viadeo-square:before { + content: "\f2aa"; } + +.fa-viber:before { + content: "\f409"; } + +.fa-video:before { + content: "\f03d"; } + +.fa-vimeo:before { + content: "\f40a"; } + +.fa-vimeo-square:before { + content: "\f194"; } + +.fa-vimeo-v:before { + content: "\f27d"; } + +.fa-vine:before { + content: "\f1ca"; } + +.fa-vk:before { + content: "\f189"; } + +.fa-vnv:before { + content: "\f40b"; } + +.fa-volume-down:before { + content: "\f027"; } + +.fa-volume-off:before { + content: "\f026"; } + +.fa-volume-up:before { + content: "\f028"; } + +.fa-vuejs:before { + content: "\f41f"; } + +.fa-weibo:before { + content: "\f18a"; } + +.fa-weixin:before { + content: "\f1d7"; } + +.fa-whatsapp:before { + content: "\f232"; } + +.fa-whatsapp-square:before { + content: "\f40c"; } + +.fa-wheelchair:before { + content: "\f193"; } + +.fa-whmcs:before { + content: "\f40d"; } + +.fa-wifi:before { + content: "\f1eb"; } + +.fa-wikipedia-w:before { + content: "\f266"; } + +.fa-window-close:before { + content: "\f410"; } + +.fa-window-maximize:before { + content: "\f2d0"; } + +.fa-window-minimize:before { + content: "\f2d1"; } + +.fa-window-restore:before { + content: "\f2d2"; } + +.fa-windows:before { + content: "\f17a"; } + +.fa-won-sign:before { + content: "\f159"; } + +.fa-wordpress:before { + content: "\f19a"; } + +.fa-wordpress-simple:before { + content: "\f411"; } + +.fa-wpbeginner:before { + content: "\f297"; } + +.fa-wpexplorer:before { + content: "\f2de"; } + +.fa-wpforms:before { + content: "\f298"; } + +.fa-wrench:before { + content: "\f0ad"; } + +.fa-xbox:before { + content: "\f412"; } + +.fa-xing:before { + content: "\f168"; } + +.fa-xing-square:before { + content: "\f169"; } + +.fa-y-combinator:before { + content: "\f23b"; } + +.fa-yahoo:before { + content: "\f19e"; } + +.fa-yandex:before { + content: "\f413"; } + +.fa-yandex-international:before { + content: "\f414"; } + +.fa-yelp:before { + content: "\f1e9"; } + +.fa-yen-sign:before { + content: "\f157"; } + +.fa-yoast:before { + content: "\f2b1"; } + +.fa-youtube:before { + content: "\f167"; } + +.sr-only { + border: 0; + clip: rect(0, 0, 0, 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; } + +.sr-only-focusable:active, .sr-only-focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; } +@font-face { + font-family: 'Font Awesome 5 Brands'; + font-style: normal; + font-weight: normal; + src: url("../webfonts/fa-brands-400.eot"); + src: url("../webfonts/fa-brands-400.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.woff") format("woff"), url("../webfonts/fa-brands-400.ttf") format("truetype"), url("../webfonts/fa-brands-400.svg#fontawesome") format("svg"); } + +.fab { + font-family: 'Font Awesome 5 Brands'; } +@font-face { + font-family: 'Font Awesome 5 Free'; + font-style: normal; + font-weight: 400; + src: url("../webfonts/fa-regular-400.eot"); + src: url("../webfonts/fa-regular-400.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.woff") format("woff"), url("../webfonts/fa-regular-400.ttf") format("truetype"), url("../webfonts/fa-regular-400.svg#fontawesome") format("svg"); } + +.far { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } +@font-face { + font-family: 'Font Awesome 5 Free'; + font-style: normal; + font-weight: 900; + src: url("../webfonts/fa-solid-900.eot"); + src: url("../webfonts/fa-solid-900.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.woff") format("woff"), url("../webfonts/fa-solid-900.ttf") format("truetype"), url("../webfonts/fa-solid-900.svg#fontawesome") format("svg"); } + +.fa, +.fas { + font-family: 'Font Awesome 5 Free'; + font-weight: 900; } diff --git a/generator-web/src/main/resources/static/vendor/font-awesome/css/fontawesome-all.min.css b/generator-web/src/main/resources/static/vendor/font-awesome/css/fontawesome-all.min.css new file mode 100644 index 0000000..4c6c943 --- /dev/null +++ b/generator-web/src/main/resources/static/vendor/font-awesome/css/fontawesome-all.min.css @@ -0,0 +1,5 @@ +/*! + * Font Awesome Free 5.0.2 by @fontawesome - http://fontawesome.com + * License - http://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +.fa,.fab,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:a 2s infinite linear;animation:a 2s infinite linear}.fa-pulse{-webkit-animation:a 1s infinite steps(8);animation:a 1s infinite steps(8)}@-webkit-keyframes a{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes a{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-aws:before{content:"\f375"}.fa-backward:before{content:"\f04a"}.fa-balance-scale:before{content:"\f24e"}.fa-ban:before{content:"\f05e"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bicycle:before{content:"\f206"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blind:before{content:"\f29d"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-braille:before{content:"\f2a1"}.fa-briefcase:before{content:"\f0b1"}.fa-btc:before{content:"\f15a"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-car:before{content:"\f1b9"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-certificate:before{content:"\f0a3"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-square:before{content:"\f14a"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-clipboard:before{content:"\f328"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comments:before{content:"\f086"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-credit-card:before{content:"\f09d"}.fa-crop:before{content:"\f125"}.fa-crosshairs:before{content:"\f05b"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-deviantart:before{content:"\f1bd"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dollar-sign:before{content:"\f155"}.fa-dot-circle:before{content:"\f192"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drupal:before{content:"\f1a9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-eject:before{content:"\f052"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-excel:before{content:"\f1c3"}.fa-file-image:before{content:"\f1c5"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fire:before{content:"\f06d"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-first-order:before{content:"\f2b0"}.fa-firstdraft:before{content:"\f3a1"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frown:before{content:"\f119"}.fa-futbol:before{content:"\f1e3"}.fa-gamepad:before{content:"\f11b"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-gift:before{content:"\f06b"}.fa-git:before{content:"\f1d3"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-martini:before{content:"\f000"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-gofore:before{content:"\f3a7"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-handshake:before{content:"\f2b5"}.fa-hashtag:before{content:"\f292"}.fa-hdd:before{content:"\f0a0"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-heart:before{content:"\f004"}.fa-heartbeat:before{content:"\f21e"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hospital:before{content:"\f0f8"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-houzz:before{content:"\f27c"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-internet-explorer:before{content:"\f26b"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-jenkins:before{content:"\f3b6"}.fa-joget:before{content:"\f3b7"}.fa-joomla:before{content:"\f1aa"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-key:before{content:"\f084"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-korvue:before{content:"\f42f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-male:before{content:"\f183"}.fa-map:before{content:"\f279"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-maxcdn:before{content:"\f136"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-meh:before{content:"\f11a"}.fa-mercury:before{content:"\f223"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-moon:before{content:"\f186"}.fa-motorcycle:before{content:"\f21c"}.fa-mouse-pointer:before{content:"\f245"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nintendo-switch:before{content:"\f418"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-osi:before{content:"\f41a"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-paint-brush:before{content:"\f1fc"}.fa-palfed:before{content:"\f3d8"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-paragraph:before{content:"\f1dd"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-percent:before{content:"\f295"}.fa-periscope:before{content:"\f3da"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phone:before{content:"\f095"}.fa-phone-square:before{content:"\f098"}.fa-phone-volume:before{content:"\f2a0"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-plane:before{content:"\f072"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-print:before{content:"\f02f"}.fa-product-hunt:before{content:"\f288"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-random:before{content:"\f074"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-rebel:before{content:"\f1d0"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-rendact:before{content:"\f3e4"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-resolving:before{content:"\f3e7"}.fa-retweet:before{content:"\f079"}.fa-road:before{content:"\f018"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-rupee-sign:before{content:"\f156"}.fa-safari:before{content:"\f267"}.fa-sass:before{content:"\f41e"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-scribd:before{content:"\f28a"}.fa-search:before{content:"\f002"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before{content:"\f21a"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shower:before{content:"\f2cc"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowflake:before{content:"\f2dc"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-spinner:before{content:"\f110"}.fa-spotify:before{content:"\f1bc"}.fa-square:before{content:"\f0c8"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-star:before{content:"\f005"}.fa-star-half:before{content:"\f089"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-strava:before{content:"\f428"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-table:before{content:"\f0ce"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-trademark:before{content:"\f25c"}.fa-train:before{content:"\f238"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-uikit:before{content:"\f403"}.fa-umbrella:before{content:"\f0e9"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-circle:before{content:"\f2bd"}.fa-user-md:before{content:"\f0f0"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-volume-down:before{content:"\f027"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vuejs:before{content:"\f41f"}.fa-weibo:before{content:"\f18a"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wrench:before{content:"\f0ad"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:Font Awesome\ 5 Brands;font-style:normal;font-weight:400;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:Font Awesome\ 5 Brands}@font-face{font-family:Font Awesome\ 5 Free;font-style:normal;font-weight:400;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}.far{font-weight:400}@font-face{font-family:Font Awesome\ 5 Free;font-style:normal;font-weight:900;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.far,.fas{font-family:Font Awesome\ 5 Free}.fa,.fas{font-weight:900} \ No newline at end of file diff --git a/generator-web/src/main/resources/static/vendor/font-awesome/css/fontawesome.css b/generator-web/src/main/resources/static/vendor/font-awesome/css/fontawesome.css new file mode 100644 index 0000000..3f52059 --- /dev/null +++ b/generator-web/src/main/resources/static/vendor/font-awesome/css/fontawesome.css @@ -0,0 +1,2573 @@ +/*! + * Font Awesome Free 5.0.2 by @fontawesome - http://fontawesome.com + * License - http://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +.fa, +.fas, +.far, +.fal, +.fab { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + display: inline-block; + font-style: normal; + font-variant: normal; + text-rendering: auto; + line-height: 1; } + +.fa-lg { + font-size: 1.33333em; + line-height: 0.75em; + vertical-align: -.0667em; } + +.fa-xs { + font-size: .75em; } + +.fa-sm { + font-size: .875em; } + +.fa-1x { + font-size: 1em; } + +.fa-2x { + font-size: 2em; } + +.fa-3x { + font-size: 3em; } + +.fa-4x { + font-size: 4em; } + +.fa-5x { + font-size: 5em; } + +.fa-6x { + font-size: 6em; } + +.fa-7x { + font-size: 7em; } + +.fa-8x { + font-size: 8em; } + +.fa-9x { + font-size: 9em; } + +.fa-10x { + font-size: 10em; } + +.fa-fw { + text-align: center; + width: 1.25em; } + +.fa-ul { + list-style-type: none; + margin-left: 2.5em; + padding-left: 0; } + .fa-ul > li { + position: relative; } + +.fa-li { + left: -2em; + position: absolute; + text-align: center; + width: 2em; + line-height: inherit; } + +.fa-border { + border: solid 0.08em #eee; + border-radius: .1em; + padding: .2em .25em .15em; } + +.fa-pull-left { + float: left; } + +.fa-pull-right { + float: right; } + +.fa.fa-pull-left, +.fas.fa-pull-left, +.far.fa-pull-left, +.fal.fa-pull-left, +.fab.fa-pull-left { + margin-right: .3em; } + +.fa.fa-pull-right, +.fas.fa-pull-right, +.far.fa-pull-right, +.fal.fa-pull-right, +.fab.fa-pull-right { + margin-left: .3em; } + +.fa-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; } + +.fa-pulse { + -webkit-animation: fa-spin 1s infinite steps(8); + animation: fa-spin 1s infinite steps(8); } + +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); } + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); } } + +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); } + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); } } + +.fa-rotate-90 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; + -webkit-transform: rotate(90deg); + transform: rotate(90deg); } + +.fa-rotate-180 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; + -webkit-transform: rotate(180deg); + transform: rotate(180deg); } + +.fa-rotate-270 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; + -webkit-transform: rotate(270deg); + transform: rotate(270deg); } + +.fa-flip-horizontal { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; + -webkit-transform: scale(-1, 1); + transform: scale(-1, 1); } + +.fa-flip-vertical { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; + -webkit-transform: scale(1, -1); + transform: scale(1, -1); } + +.fa-flip-horizontal.fa-flip-vertical { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; + -webkit-transform: scale(-1, -1); + transform: scale(-1, -1); } + +:root .fa-rotate-90, +:root .fa-rotate-180, +:root .fa-rotate-270, +:root .fa-flip-horizontal, +:root .fa-flip-vertical { + -webkit-filter: none; + filter: none; } + +.fa-stack { + display: inline-block; + height: 2em; + line-height: 2em; + position: relative; + vertical-align: middle; + width: 2em; } + +.fa-stack-1x, +.fa-stack-2x { + left: 0; + position: absolute; + text-align: center; + width: 100%; } + +.fa-stack-1x { + line-height: inherit; } + +.fa-stack-2x { + font-size: 2em; } + +.fa-inverse { + color: #fff; } + +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen +readers do not read off random characters that represent icons */ +.fa-500px:before { + content: "\f26e"; } + +.fa-accessible-icon:before { + content: "\f368"; } + +.fa-accusoft:before { + content: "\f369"; } + +.fa-address-book:before { + content: "\f2b9"; } + +.fa-address-card:before { + content: "\f2bb"; } + +.fa-adjust:before { + content: "\f042"; } + +.fa-adn:before { + content: "\f170"; } + +.fa-adversal:before { + content: "\f36a"; } + +.fa-affiliatetheme:before { + content: "\f36b"; } + +.fa-algolia:before { + content: "\f36c"; } + +.fa-align-center:before { + content: "\f037"; } + +.fa-align-justify:before { + content: "\f039"; } + +.fa-align-left:before { + content: "\f036"; } + +.fa-align-right:before { + content: "\f038"; } + +.fa-amazon:before { + content: "\f270"; } + +.fa-amazon-pay:before { + content: "\f42c"; } + +.fa-ambulance:before { + content: "\f0f9"; } + +.fa-american-sign-language-interpreting:before { + content: "\f2a3"; } + +.fa-amilia:before { + content: "\f36d"; } + +.fa-anchor:before { + content: "\f13d"; } + +.fa-android:before { + content: "\f17b"; } + +.fa-angellist:before { + content: "\f209"; } + +.fa-angle-double-down:before { + content: "\f103"; } + +.fa-angle-double-left:before { + content: "\f100"; } + +.fa-angle-double-right:before { + content: "\f101"; } + +.fa-angle-double-up:before { + content: "\f102"; } + +.fa-angle-down:before { + content: "\f107"; } + +.fa-angle-left:before { + content: "\f104"; } + +.fa-angle-right:before { + content: "\f105"; } + +.fa-angle-up:before { + content: "\f106"; } + +.fa-angrycreative:before { + content: "\f36e"; } + +.fa-angular:before { + content: "\f420"; } + +.fa-app-store:before { + content: "\f36f"; } + +.fa-app-store-ios:before { + content: "\f370"; } + +.fa-apper:before { + content: "\f371"; } + +.fa-apple:before { + content: "\f179"; } + +.fa-apple-pay:before { + content: "\f415"; } + +.fa-archive:before { + content: "\f187"; } + +.fa-arrow-alt-circle-down:before { + content: "\f358"; } + +.fa-arrow-alt-circle-left:before { + content: "\f359"; } + +.fa-arrow-alt-circle-right:before { + content: "\f35a"; } + +.fa-arrow-alt-circle-up:before { + content: "\f35b"; } + +.fa-arrow-circle-down:before { + content: "\f0ab"; } + +.fa-arrow-circle-left:before { + content: "\f0a8"; } + +.fa-arrow-circle-right:before { + content: "\f0a9"; } + +.fa-arrow-circle-up:before { + content: "\f0aa"; } + +.fa-arrow-down:before { + content: "\f063"; } + +.fa-arrow-left:before { + content: "\f060"; } + +.fa-arrow-right:before { + content: "\f061"; } + +.fa-arrow-up:before { + content: "\f062"; } + +.fa-arrows-alt:before { + content: "\f0b2"; } + +.fa-arrows-alt-h:before { + content: "\f337"; } + +.fa-arrows-alt-v:before { + content: "\f338"; } + +.fa-assistive-listening-systems:before { + content: "\f2a2"; } + +.fa-asterisk:before { + content: "\f069"; } + +.fa-asymmetrik:before { + content: "\f372"; } + +.fa-at:before { + content: "\f1fa"; } + +.fa-audible:before { + content: "\f373"; } + +.fa-audio-description:before { + content: "\f29e"; } + +.fa-autoprefixer:before { + content: "\f41c"; } + +.fa-avianex:before { + content: "\f374"; } + +.fa-aviato:before { + content: "\f421"; } + +.fa-aws:before { + content: "\f375"; } + +.fa-backward:before { + content: "\f04a"; } + +.fa-balance-scale:before { + content: "\f24e"; } + +.fa-ban:before { + content: "\f05e"; } + +.fa-bandcamp:before { + content: "\f2d5"; } + +.fa-barcode:before { + content: "\f02a"; } + +.fa-bars:before { + content: "\f0c9"; } + +.fa-bath:before { + content: "\f2cd"; } + +.fa-battery-empty:before { + content: "\f244"; } + +.fa-battery-full:before { + content: "\f240"; } + +.fa-battery-half:before { + content: "\f242"; } + +.fa-battery-quarter:before { + content: "\f243"; } + +.fa-battery-three-quarters:before { + content: "\f241"; } + +.fa-bed:before { + content: "\f236"; } + +.fa-beer:before { + content: "\f0fc"; } + +.fa-behance:before { + content: "\f1b4"; } + +.fa-behance-square:before { + content: "\f1b5"; } + +.fa-bell:before { + content: "\f0f3"; } + +.fa-bell-slash:before { + content: "\f1f6"; } + +.fa-bicycle:before { + content: "\f206"; } + +.fa-bimobject:before { + content: "\f378"; } + +.fa-binoculars:before { + content: "\f1e5"; } + +.fa-birthday-cake:before { + content: "\f1fd"; } + +.fa-bitbucket:before { + content: "\f171"; } + +.fa-bitcoin:before { + content: "\f379"; } + +.fa-bity:before { + content: "\f37a"; } + +.fa-black-tie:before { + content: "\f27e"; } + +.fa-blackberry:before { + content: "\f37b"; } + +.fa-blind:before { + content: "\f29d"; } + +.fa-blogger:before { + content: "\f37c"; } + +.fa-blogger-b:before { + content: "\f37d"; } + +.fa-bluetooth:before { + content: "\f293"; } + +.fa-bluetooth-b:before { + content: "\f294"; } + +.fa-bold:before { + content: "\f032"; } + +.fa-bolt:before { + content: "\f0e7"; } + +.fa-bomb:before { + content: "\f1e2"; } + +.fa-book:before { + content: "\f02d"; } + +.fa-bookmark:before { + content: "\f02e"; } + +.fa-braille:before { + content: "\f2a1"; } + +.fa-briefcase:before { + content: "\f0b1"; } + +.fa-btc:before { + content: "\f15a"; } + +.fa-bug:before { + content: "\f188"; } + +.fa-building:before { + content: "\f1ad"; } + +.fa-bullhorn:before { + content: "\f0a1"; } + +.fa-bullseye:before { + content: "\f140"; } + +.fa-buromobelexperte:before { + content: "\f37f"; } + +.fa-bus:before { + content: "\f207"; } + +.fa-buysellads:before { + content: "\f20d"; } + +.fa-calculator:before { + content: "\f1ec"; } + +.fa-calendar:before { + content: "\f133"; } + +.fa-calendar-alt:before { + content: "\f073"; } + +.fa-calendar-check:before { + content: "\f274"; } + +.fa-calendar-minus:before { + content: "\f272"; } + +.fa-calendar-plus:before { + content: "\f271"; } + +.fa-calendar-times:before { + content: "\f273"; } + +.fa-camera:before { + content: "\f030"; } + +.fa-camera-retro:before { + content: "\f083"; } + +.fa-car:before { + content: "\f1b9"; } + +.fa-caret-down:before { + content: "\f0d7"; } + +.fa-caret-left:before { + content: "\f0d9"; } + +.fa-caret-right:before { + content: "\f0da"; } + +.fa-caret-square-down:before { + content: "\f150"; } + +.fa-caret-square-left:before { + content: "\f191"; } + +.fa-caret-square-right:before { + content: "\f152"; } + +.fa-caret-square-up:before { + content: "\f151"; } + +.fa-caret-up:before { + content: "\f0d8"; } + +.fa-cart-arrow-down:before { + content: "\f218"; } + +.fa-cart-plus:before { + content: "\f217"; } + +.fa-cc-amazon-pay:before { + content: "\f42d"; } + +.fa-cc-amex:before { + content: "\f1f3"; } + +.fa-cc-apple-pay:before { + content: "\f416"; } + +.fa-cc-diners-club:before { + content: "\f24c"; } + +.fa-cc-discover:before { + content: "\f1f2"; } + +.fa-cc-jcb:before { + content: "\f24b"; } + +.fa-cc-mastercard:before { + content: "\f1f1"; } + +.fa-cc-paypal:before { + content: "\f1f4"; } + +.fa-cc-stripe:before { + content: "\f1f5"; } + +.fa-cc-visa:before { + content: "\f1f0"; } + +.fa-centercode:before { + content: "\f380"; } + +.fa-certificate:before { + content: "\f0a3"; } + +.fa-chart-area:before { + content: "\f1fe"; } + +.fa-chart-bar:before { + content: "\f080"; } + +.fa-chart-line:before { + content: "\f201"; } + +.fa-chart-pie:before { + content: "\f200"; } + +.fa-check:before { + content: "\f00c"; } + +.fa-check-circle:before { + content: "\f058"; } + +.fa-check-square:before { + content: "\f14a"; } + +.fa-chevron-circle-down:before { + content: "\f13a"; } + +.fa-chevron-circle-left:before { + content: "\f137"; } + +.fa-chevron-circle-right:before { + content: "\f138"; } + +.fa-chevron-circle-up:before { + content: "\f139"; } + +.fa-chevron-down:before { + content: "\f078"; } + +.fa-chevron-left:before { + content: "\f053"; } + +.fa-chevron-right:before { + content: "\f054"; } + +.fa-chevron-up:before { + content: "\f077"; } + +.fa-child:before { + content: "\f1ae"; } + +.fa-chrome:before { + content: "\f268"; } + +.fa-circle:before { + content: "\f111"; } + +.fa-circle-notch:before { + content: "\f1ce"; } + +.fa-clipboard:before { + content: "\f328"; } + +.fa-clock:before { + content: "\f017"; } + +.fa-clone:before { + content: "\f24d"; } + +.fa-closed-captioning:before { + content: "\f20a"; } + +.fa-cloud:before { + content: "\f0c2"; } + +.fa-cloud-download-alt:before { + content: "\f381"; } + +.fa-cloud-upload-alt:before { + content: "\f382"; } + +.fa-cloudscale:before { + content: "\f383"; } + +.fa-cloudsmith:before { + content: "\f384"; } + +.fa-cloudversify:before { + content: "\f385"; } + +.fa-code:before { + content: "\f121"; } + +.fa-code-branch:before { + content: "\f126"; } + +.fa-codepen:before { + content: "\f1cb"; } + +.fa-codiepie:before { + content: "\f284"; } + +.fa-coffee:before { + content: "\f0f4"; } + +.fa-cog:before { + content: "\f013"; } + +.fa-cogs:before { + content: "\f085"; } + +.fa-columns:before { + content: "\f0db"; } + +.fa-comment:before { + content: "\f075"; } + +.fa-comment-alt:before { + content: "\f27a"; } + +.fa-comments:before { + content: "\f086"; } + +.fa-compass:before { + content: "\f14e"; } + +.fa-compress:before { + content: "\f066"; } + +.fa-connectdevelop:before { + content: "\f20e"; } + +.fa-contao:before { + content: "\f26d"; } + +.fa-copy:before { + content: "\f0c5"; } + +.fa-copyright:before { + content: "\f1f9"; } + +.fa-cpanel:before { + content: "\f388"; } + +.fa-creative-commons:before { + content: "\f25e"; } + +.fa-credit-card:before { + content: "\f09d"; } + +.fa-crop:before { + content: "\f125"; } + +.fa-crosshairs:before { + content: "\f05b"; } + +.fa-css3:before { + content: "\f13c"; } + +.fa-css3-alt:before { + content: "\f38b"; } + +.fa-cube:before { + content: "\f1b2"; } + +.fa-cubes:before { + content: "\f1b3"; } + +.fa-cut:before { + content: "\f0c4"; } + +.fa-cuttlefish:before { + content: "\f38c"; } + +.fa-d-and-d:before { + content: "\f38d"; } + +.fa-dashcube:before { + content: "\f210"; } + +.fa-database:before { + content: "\f1c0"; } + +.fa-deaf:before { + content: "\f2a4"; } + +.fa-delicious:before { + content: "\f1a5"; } + +.fa-deploydog:before { + content: "\f38e"; } + +.fa-deskpro:before { + content: "\f38f"; } + +.fa-desktop:before { + content: "\f108"; } + +.fa-deviantart:before { + content: "\f1bd"; } + +.fa-digg:before { + content: "\f1a6"; } + +.fa-digital-ocean:before { + content: "\f391"; } + +.fa-discord:before { + content: "\f392"; } + +.fa-discourse:before { + content: "\f393"; } + +.fa-dochub:before { + content: "\f394"; } + +.fa-docker:before { + content: "\f395"; } + +.fa-dollar-sign:before { + content: "\f155"; } + +.fa-dot-circle:before { + content: "\f192"; } + +.fa-download:before { + content: "\f019"; } + +.fa-draft2digital:before { + content: "\f396"; } + +.fa-dribbble:before { + content: "\f17d"; } + +.fa-dribbble-square:before { + content: "\f397"; } + +.fa-dropbox:before { + content: "\f16b"; } + +.fa-drupal:before { + content: "\f1a9"; } + +.fa-dyalog:before { + content: "\f399"; } + +.fa-earlybirds:before { + content: "\f39a"; } + +.fa-edge:before { + content: "\f282"; } + +.fa-edit:before { + content: "\f044"; } + +.fa-eject:before { + content: "\f052"; } + +.fa-ellipsis-h:before { + content: "\f141"; } + +.fa-ellipsis-v:before { + content: "\f142"; } + +.fa-ember:before { + content: "\f423"; } + +.fa-empire:before { + content: "\f1d1"; } + +.fa-envelope:before { + content: "\f0e0"; } + +.fa-envelope-open:before { + content: "\f2b6"; } + +.fa-envelope-square:before { + content: "\f199"; } + +.fa-envira:before { + content: "\f299"; } + +.fa-eraser:before { + content: "\f12d"; } + +.fa-erlang:before { + content: "\f39d"; } + +.fa-ethereum:before { + content: "\f42e"; } + +.fa-etsy:before { + content: "\f2d7"; } + +.fa-euro-sign:before { + content: "\f153"; } + +.fa-exchange-alt:before { + content: "\f362"; } + +.fa-exclamation:before { + content: "\f12a"; } + +.fa-exclamation-circle:before { + content: "\f06a"; } + +.fa-exclamation-triangle:before { + content: "\f071"; } + +.fa-expand:before { + content: "\f065"; } + +.fa-expand-arrows-alt:before { + content: "\f31e"; } + +.fa-expeditedssl:before { + content: "\f23e"; } + +.fa-external-link-alt:before { + content: "\f35d"; } + +.fa-external-link-square-alt:before { + content: "\f360"; } + +.fa-eye:before { + content: "\f06e"; } + +.fa-eye-dropper:before { + content: "\f1fb"; } + +.fa-eye-slash:before { + content: "\f070"; } + +.fa-facebook:before { + content: "\f09a"; } + +.fa-facebook-f:before { + content: "\f39e"; } + +.fa-facebook-messenger:before { + content: "\f39f"; } + +.fa-facebook-square:before { + content: "\f082"; } + +.fa-fast-backward:before { + content: "\f049"; } + +.fa-fast-forward:before { + content: "\f050"; } + +.fa-fax:before { + content: "\f1ac"; } + +.fa-female:before { + content: "\f182"; } + +.fa-fighter-jet:before { + content: "\f0fb"; } + +.fa-file:before { + content: "\f15b"; } + +.fa-file-alt:before { + content: "\f15c"; } + +.fa-file-archive:before { + content: "\f1c6"; } + +.fa-file-audio:before { + content: "\f1c7"; } + +.fa-file-code:before { + content: "\f1c9"; } + +.fa-file-excel:before { + content: "\f1c3"; } + +.fa-file-image:before { + content: "\f1c5"; } + +.fa-file-pdf:before { + content: "\f1c1"; } + +.fa-file-powerpoint:before { + content: "\f1c4"; } + +.fa-file-video:before { + content: "\f1c8"; } + +.fa-file-word:before { + content: "\f1c2"; } + +.fa-film:before { + content: "\f008"; } + +.fa-filter:before { + content: "\f0b0"; } + +.fa-fire:before { + content: "\f06d"; } + +.fa-fire-extinguisher:before { + content: "\f134"; } + +.fa-firefox:before { + content: "\f269"; } + +.fa-first-order:before { + content: "\f2b0"; } + +.fa-firstdraft:before { + content: "\f3a1"; } + +.fa-flag:before { + content: "\f024"; } + +.fa-flag-checkered:before { + content: "\f11e"; } + +.fa-flask:before { + content: "\f0c3"; } + +.fa-flickr:before { + content: "\f16e"; } + +.fa-fly:before { + content: "\f417"; } + +.fa-folder:before { + content: "\f07b"; } + +.fa-folder-open:before { + content: "\f07c"; } + +.fa-font:before { + content: "\f031"; } + +.fa-font-awesome:before { + content: "\f2b4"; } + +.fa-font-awesome-alt:before { + content: "\f35c"; } + +.fa-font-awesome-flag:before { + content: "\f425"; } + +.fa-fonticons:before { + content: "\f280"; } + +.fa-fonticons-fi:before { + content: "\f3a2"; } + +.fa-fort-awesome:before { + content: "\f286"; } + +.fa-fort-awesome-alt:before { + content: "\f3a3"; } + +.fa-forumbee:before { + content: "\f211"; } + +.fa-forward:before { + content: "\f04e"; } + +.fa-foursquare:before { + content: "\f180"; } + +.fa-free-code-camp:before { + content: "\f2c5"; } + +.fa-freebsd:before { + content: "\f3a4"; } + +.fa-frown:before { + content: "\f119"; } + +.fa-futbol:before { + content: "\f1e3"; } + +.fa-gamepad:before { + content: "\f11b"; } + +.fa-gavel:before { + content: "\f0e3"; } + +.fa-gem:before { + content: "\f3a5"; } + +.fa-genderless:before { + content: "\f22d"; } + +.fa-get-pocket:before { + content: "\f265"; } + +.fa-gg:before { + content: "\f260"; } + +.fa-gg-circle:before { + content: "\f261"; } + +.fa-gift:before { + content: "\f06b"; } + +.fa-git:before { + content: "\f1d3"; } + +.fa-git-square:before { + content: "\f1d2"; } + +.fa-github:before { + content: "\f09b"; } + +.fa-github-alt:before { + content: "\f113"; } + +.fa-github-square:before { + content: "\f092"; } + +.fa-gitkraken:before { + content: "\f3a6"; } + +.fa-gitlab:before { + content: "\f296"; } + +.fa-gitter:before { + content: "\f426"; } + +.fa-glass-martini:before { + content: "\f000"; } + +.fa-glide:before { + content: "\f2a5"; } + +.fa-glide-g:before { + content: "\f2a6"; } + +.fa-globe:before { + content: "\f0ac"; } + +.fa-gofore:before { + content: "\f3a7"; } + +.fa-goodreads:before { + content: "\f3a8"; } + +.fa-goodreads-g:before { + content: "\f3a9"; } + +.fa-google:before { + content: "\f1a0"; } + +.fa-google-drive:before { + content: "\f3aa"; } + +.fa-google-play:before { + content: "\f3ab"; } + +.fa-google-plus:before { + content: "\f2b3"; } + +.fa-google-plus-g:before { + content: "\f0d5"; } + +.fa-google-plus-square:before { + content: "\f0d4"; } + +.fa-google-wallet:before { + content: "\f1ee"; } + +.fa-graduation-cap:before { + content: "\f19d"; } + +.fa-gratipay:before { + content: "\f184"; } + +.fa-grav:before { + content: "\f2d6"; } + +.fa-gripfire:before { + content: "\f3ac"; } + +.fa-grunt:before { + content: "\f3ad"; } + +.fa-gulp:before { + content: "\f3ae"; } + +.fa-h-square:before { + content: "\f0fd"; } + +.fa-hacker-news:before { + content: "\f1d4"; } + +.fa-hacker-news-square:before { + content: "\f3af"; } + +.fa-hand-lizard:before { + content: "\f258"; } + +.fa-hand-paper:before { + content: "\f256"; } + +.fa-hand-peace:before { + content: "\f25b"; } + +.fa-hand-point-down:before { + content: "\f0a7"; } + +.fa-hand-point-left:before { + content: "\f0a5"; } + +.fa-hand-point-right:before { + content: "\f0a4"; } + +.fa-hand-point-up:before { + content: "\f0a6"; } + +.fa-hand-pointer:before { + content: "\f25a"; } + +.fa-hand-rock:before { + content: "\f255"; } + +.fa-hand-scissors:before { + content: "\f257"; } + +.fa-hand-spock:before { + content: "\f259"; } + +.fa-handshake:before { + content: "\f2b5"; } + +.fa-hashtag:before { + content: "\f292"; } + +.fa-hdd:before { + content: "\f0a0"; } + +.fa-heading:before { + content: "\f1dc"; } + +.fa-headphones:before { + content: "\f025"; } + +.fa-heart:before { + content: "\f004"; } + +.fa-heartbeat:before { + content: "\f21e"; } + +.fa-hire-a-helper:before { + content: "\f3b0"; } + +.fa-history:before { + content: "\f1da"; } + +.fa-home:before { + content: "\f015"; } + +.fa-hooli:before { + content: "\f427"; } + +.fa-hospital:before { + content: "\f0f8"; } + +.fa-hotjar:before { + content: "\f3b1"; } + +.fa-hourglass:before { + content: "\f254"; } + +.fa-hourglass-end:before { + content: "\f253"; } + +.fa-hourglass-half:before { + content: "\f252"; } + +.fa-hourglass-start:before { + content: "\f251"; } + +.fa-houzz:before { + content: "\f27c"; } + +.fa-html5:before { + content: "\f13b"; } + +.fa-hubspot:before { + content: "\f3b2"; } + +.fa-i-cursor:before { + content: "\f246"; } + +.fa-id-badge:before { + content: "\f2c1"; } + +.fa-id-card:before { + content: "\f2c2"; } + +.fa-image:before { + content: "\f03e"; } + +.fa-images:before { + content: "\f302"; } + +.fa-imdb:before { + content: "\f2d8"; } + +.fa-inbox:before { + content: "\f01c"; } + +.fa-indent:before { + content: "\f03c"; } + +.fa-industry:before { + content: "\f275"; } + +.fa-info:before { + content: "\f129"; } + +.fa-info-circle:before { + content: "\f05a"; } + +.fa-instagram:before { + content: "\f16d"; } + +.fa-internet-explorer:before { + content: "\f26b"; } + +.fa-ioxhost:before { + content: "\f208"; } + +.fa-italic:before { + content: "\f033"; } + +.fa-itunes:before { + content: "\f3b4"; } + +.fa-itunes-note:before { + content: "\f3b5"; } + +.fa-jenkins:before { + content: "\f3b6"; } + +.fa-joget:before { + content: "\f3b7"; } + +.fa-joomla:before { + content: "\f1aa"; } + +.fa-js:before { + content: "\f3b8"; } + +.fa-js-square:before { + content: "\f3b9"; } + +.fa-jsfiddle:before { + content: "\f1cc"; } + +.fa-key:before { + content: "\f084"; } + +.fa-keyboard:before { + content: "\f11c"; } + +.fa-keycdn:before { + content: "\f3ba"; } + +.fa-kickstarter:before { + content: "\f3bb"; } + +.fa-kickstarter-k:before { + content: "\f3bc"; } + +.fa-korvue:before { + content: "\f42f"; } + +.fa-language:before { + content: "\f1ab"; } + +.fa-laptop:before { + content: "\f109"; } + +.fa-laravel:before { + content: "\f3bd"; } + +.fa-lastfm:before { + content: "\f202"; } + +.fa-lastfm-square:before { + content: "\f203"; } + +.fa-leaf:before { + content: "\f06c"; } + +.fa-leanpub:before { + content: "\f212"; } + +.fa-lemon:before { + content: "\f094"; } + +.fa-less:before { + content: "\f41d"; } + +.fa-level-down-alt:before { + content: "\f3be"; } + +.fa-level-up-alt:before { + content: "\f3bf"; } + +.fa-life-ring:before { + content: "\f1cd"; } + +.fa-lightbulb:before { + content: "\f0eb"; } + +.fa-line:before { + content: "\f3c0"; } + +.fa-link:before { + content: "\f0c1"; } + +.fa-linkedin:before { + content: "\f08c"; } + +.fa-linkedin-in:before { + content: "\f0e1"; } + +.fa-linode:before { + content: "\f2b8"; } + +.fa-linux:before { + content: "\f17c"; } + +.fa-lira-sign:before { + content: "\f195"; } + +.fa-list:before { + content: "\f03a"; } + +.fa-list-alt:before { + content: "\f022"; } + +.fa-list-ol:before { + content: "\f0cb"; } + +.fa-list-ul:before { + content: "\f0ca"; } + +.fa-location-arrow:before { + content: "\f124"; } + +.fa-lock:before { + content: "\f023"; } + +.fa-lock-open:before { + content: "\f3c1"; } + +.fa-long-arrow-alt-down:before { + content: "\f309"; } + +.fa-long-arrow-alt-left:before { + content: "\f30a"; } + +.fa-long-arrow-alt-right:before { + content: "\f30b"; } + +.fa-long-arrow-alt-up:before { + content: "\f30c"; } + +.fa-low-vision:before { + content: "\f2a8"; } + +.fa-lyft:before { + content: "\f3c3"; } + +.fa-magento:before { + content: "\f3c4"; } + +.fa-magic:before { + content: "\f0d0"; } + +.fa-magnet:before { + content: "\f076"; } + +.fa-male:before { + content: "\f183"; } + +.fa-map:before { + content: "\f279"; } + +.fa-map-marker:before { + content: "\f041"; } + +.fa-map-marker-alt:before { + content: "\f3c5"; } + +.fa-map-pin:before { + content: "\f276"; } + +.fa-map-signs:before { + content: "\f277"; } + +.fa-mars:before { + content: "\f222"; } + +.fa-mars-double:before { + content: "\f227"; } + +.fa-mars-stroke:before { + content: "\f229"; } + +.fa-mars-stroke-h:before { + content: "\f22b"; } + +.fa-mars-stroke-v:before { + content: "\f22a"; } + +.fa-maxcdn:before { + content: "\f136"; } + +.fa-medapps:before { + content: "\f3c6"; } + +.fa-medium:before { + content: "\f23a"; } + +.fa-medium-m:before { + content: "\f3c7"; } + +.fa-medkit:before { + content: "\f0fa"; } + +.fa-medrt:before { + content: "\f3c8"; } + +.fa-meetup:before { + content: "\f2e0"; } + +.fa-meh:before { + content: "\f11a"; } + +.fa-mercury:before { + content: "\f223"; } + +.fa-microchip:before { + content: "\f2db"; } + +.fa-microphone:before { + content: "\f130"; } + +.fa-microphone-slash:before { + content: "\f131"; } + +.fa-microsoft:before { + content: "\f3ca"; } + +.fa-minus:before { + content: "\f068"; } + +.fa-minus-circle:before { + content: "\f056"; } + +.fa-minus-square:before { + content: "\f146"; } + +.fa-mix:before { + content: "\f3cb"; } + +.fa-mixcloud:before { + content: "\f289"; } + +.fa-mizuni:before { + content: "\f3cc"; } + +.fa-mobile:before { + content: "\f10b"; } + +.fa-mobile-alt:before { + content: "\f3cd"; } + +.fa-modx:before { + content: "\f285"; } + +.fa-monero:before { + content: "\f3d0"; } + +.fa-money-bill-alt:before { + content: "\f3d1"; } + +.fa-moon:before { + content: "\f186"; } + +.fa-motorcycle:before { + content: "\f21c"; } + +.fa-mouse-pointer:before { + content: "\f245"; } + +.fa-music:before { + content: "\f001"; } + +.fa-napster:before { + content: "\f3d2"; } + +.fa-neuter:before { + content: "\f22c"; } + +.fa-newspaper:before { + content: "\f1ea"; } + +.fa-nintendo-switch:before { + content: "\f418"; } + +.fa-node:before { + content: "\f419"; } + +.fa-node-js:before { + content: "\f3d3"; } + +.fa-npm:before { + content: "\f3d4"; } + +.fa-ns8:before { + content: "\f3d5"; } + +.fa-nutritionix:before { + content: "\f3d6"; } + +.fa-object-group:before { + content: "\f247"; } + +.fa-object-ungroup:before { + content: "\f248"; } + +.fa-odnoklassniki:before { + content: "\f263"; } + +.fa-odnoklassniki-square:before { + content: "\f264"; } + +.fa-opencart:before { + content: "\f23d"; } + +.fa-openid:before { + content: "\f19b"; } + +.fa-opera:before { + content: "\f26a"; } + +.fa-optin-monster:before { + content: "\f23c"; } + +.fa-osi:before { + content: "\f41a"; } + +.fa-outdent:before { + content: "\f03b"; } + +.fa-page4:before { + content: "\f3d7"; } + +.fa-pagelines:before { + content: "\f18c"; } + +.fa-paint-brush:before { + content: "\f1fc"; } + +.fa-palfed:before { + content: "\f3d8"; } + +.fa-paper-plane:before { + content: "\f1d8"; } + +.fa-paperclip:before { + content: "\f0c6"; } + +.fa-paragraph:before { + content: "\f1dd"; } + +.fa-paste:before { + content: "\f0ea"; } + +.fa-patreon:before { + content: "\f3d9"; } + +.fa-pause:before { + content: "\f04c"; } + +.fa-pause-circle:before { + content: "\f28b"; } + +.fa-paw:before { + content: "\f1b0"; } + +.fa-paypal:before { + content: "\f1ed"; } + +.fa-pen-square:before { + content: "\f14b"; } + +.fa-pencil-alt:before { + content: "\f303"; } + +.fa-percent:before { + content: "\f295"; } + +.fa-periscope:before { + content: "\f3da"; } + +.fa-phabricator:before { + content: "\f3db"; } + +.fa-phoenix-framework:before { + content: "\f3dc"; } + +.fa-phone:before { + content: "\f095"; } + +.fa-phone-square:before { + content: "\f098"; } + +.fa-phone-volume:before { + content: "\f2a0"; } + +.fa-pied-piper:before { + content: "\f2ae"; } + +.fa-pied-piper-alt:before { + content: "\f1a8"; } + +.fa-pied-piper-pp:before { + content: "\f1a7"; } + +.fa-pinterest:before { + content: "\f0d2"; } + +.fa-pinterest-p:before { + content: "\f231"; } + +.fa-pinterest-square:before { + content: "\f0d3"; } + +.fa-plane:before { + content: "\f072"; } + +.fa-play:before { + content: "\f04b"; } + +.fa-play-circle:before { + content: "\f144"; } + +.fa-playstation:before { + content: "\f3df"; } + +.fa-plug:before { + content: "\f1e6"; } + +.fa-plus:before { + content: "\f067"; } + +.fa-plus-circle:before { + content: "\f055"; } + +.fa-plus-square:before { + content: "\f0fe"; } + +.fa-podcast:before { + content: "\f2ce"; } + +.fa-pound-sign:before { + content: "\f154"; } + +.fa-power-off:before { + content: "\f011"; } + +.fa-print:before { + content: "\f02f"; } + +.fa-product-hunt:before { + content: "\f288"; } + +.fa-pushed:before { + content: "\f3e1"; } + +.fa-puzzle-piece:before { + content: "\f12e"; } + +.fa-python:before { + content: "\f3e2"; } + +.fa-qq:before { + content: "\f1d6"; } + +.fa-qrcode:before { + content: "\f029"; } + +.fa-question:before { + content: "\f128"; } + +.fa-question-circle:before { + content: "\f059"; } + +.fa-quora:before { + content: "\f2c4"; } + +.fa-quote-left:before { + content: "\f10d"; } + +.fa-quote-right:before { + content: "\f10e"; } + +.fa-random:before { + content: "\f074"; } + +.fa-ravelry:before { + content: "\f2d9"; } + +.fa-react:before { + content: "\f41b"; } + +.fa-rebel:before { + content: "\f1d0"; } + +.fa-recycle:before { + content: "\f1b8"; } + +.fa-red-river:before { + content: "\f3e3"; } + +.fa-reddit:before { + content: "\f1a1"; } + +.fa-reddit-alien:before { + content: "\f281"; } + +.fa-reddit-square:before { + content: "\f1a2"; } + +.fa-redo:before { + content: "\f01e"; } + +.fa-redo-alt:before { + content: "\f2f9"; } + +.fa-registered:before { + content: "\f25d"; } + +.fa-rendact:before { + content: "\f3e4"; } + +.fa-renren:before { + content: "\f18b"; } + +.fa-reply:before { + content: "\f3e5"; } + +.fa-reply-all:before { + content: "\f122"; } + +.fa-replyd:before { + content: "\f3e6"; } + +.fa-resolving:before { + content: "\f3e7"; } + +.fa-retweet:before { + content: "\f079"; } + +.fa-road:before { + content: "\f018"; } + +.fa-rocket:before { + content: "\f135"; } + +.fa-rocketchat:before { + content: "\f3e8"; } + +.fa-rockrms:before { + content: "\f3e9"; } + +.fa-rss:before { + content: "\f09e"; } + +.fa-rss-square:before { + content: "\f143"; } + +.fa-ruble-sign:before { + content: "\f158"; } + +.fa-rupee-sign:before { + content: "\f156"; } + +.fa-safari:before { + content: "\f267"; } + +.fa-sass:before { + content: "\f41e"; } + +.fa-save:before { + content: "\f0c7"; } + +.fa-schlix:before { + content: "\f3ea"; } + +.fa-scribd:before { + content: "\f28a"; } + +.fa-search:before { + content: "\f002"; } + +.fa-search-minus:before { + content: "\f010"; } + +.fa-search-plus:before { + content: "\f00e"; } + +.fa-searchengin:before { + content: "\f3eb"; } + +.fa-sellcast:before { + content: "\f2da"; } + +.fa-sellsy:before { + content: "\f213"; } + +.fa-server:before { + content: "\f233"; } + +.fa-servicestack:before { + content: "\f3ec"; } + +.fa-share:before { + content: "\f064"; } + +.fa-share-alt:before { + content: "\f1e0"; } + +.fa-share-alt-square:before { + content: "\f1e1"; } + +.fa-share-square:before { + content: "\f14d"; } + +.fa-shekel-sign:before { + content: "\f20b"; } + +.fa-shield-alt:before { + content: "\f3ed"; } + +.fa-ship:before { + content: "\f21a"; } + +.fa-shirtsinbulk:before { + content: "\f214"; } + +.fa-shopping-bag:before { + content: "\f290"; } + +.fa-shopping-basket:before { + content: "\f291"; } + +.fa-shopping-cart:before { + content: "\f07a"; } + +.fa-shower:before { + content: "\f2cc"; } + +.fa-sign-in-alt:before { + content: "\f2f6"; } + +.fa-sign-language:before { + content: "\f2a7"; } + +.fa-sign-out-alt:before { + content: "\f2f5"; } + +.fa-signal:before { + content: "\f012"; } + +.fa-simplybuilt:before { + content: "\f215"; } + +.fa-sistrix:before { + content: "\f3ee"; } + +.fa-sitemap:before { + content: "\f0e8"; } + +.fa-skyatlas:before { + content: "\f216"; } + +.fa-skype:before { + content: "\f17e"; } + +.fa-slack:before { + content: "\f198"; } + +.fa-slack-hash:before { + content: "\f3ef"; } + +.fa-sliders-h:before { + content: "\f1de"; } + +.fa-slideshare:before { + content: "\f1e7"; } + +.fa-smile:before { + content: "\f118"; } + +.fa-snapchat:before { + content: "\f2ab"; } + +.fa-snapchat-ghost:before { + content: "\f2ac"; } + +.fa-snapchat-square:before { + content: "\f2ad"; } + +.fa-snowflake:before { + content: "\f2dc"; } + +.fa-sort:before { + content: "\f0dc"; } + +.fa-sort-alpha-down:before { + content: "\f15d"; } + +.fa-sort-alpha-up:before { + content: "\f15e"; } + +.fa-sort-amount-down:before { + content: "\f160"; } + +.fa-sort-amount-up:before { + content: "\f161"; } + +.fa-sort-down:before { + content: "\f0dd"; } + +.fa-sort-numeric-down:before { + content: "\f162"; } + +.fa-sort-numeric-up:before { + content: "\f163"; } + +.fa-sort-up:before { + content: "\f0de"; } + +.fa-soundcloud:before { + content: "\f1be"; } + +.fa-space-shuttle:before { + content: "\f197"; } + +.fa-speakap:before { + content: "\f3f3"; } + +.fa-spinner:before { + content: "\f110"; } + +.fa-spotify:before { + content: "\f1bc"; } + +.fa-square:before { + content: "\f0c8"; } + +.fa-stack-exchange:before { + content: "\f18d"; } + +.fa-stack-overflow:before { + content: "\f16c"; } + +.fa-star:before { + content: "\f005"; } + +.fa-star-half:before { + content: "\f089"; } + +.fa-staylinked:before { + content: "\f3f5"; } + +.fa-steam:before { + content: "\f1b6"; } + +.fa-steam-square:before { + content: "\f1b7"; } + +.fa-steam-symbol:before { + content: "\f3f6"; } + +.fa-step-backward:before { + content: "\f048"; } + +.fa-step-forward:before { + content: "\f051"; } + +.fa-stethoscope:before { + content: "\f0f1"; } + +.fa-sticker-mule:before { + content: "\f3f7"; } + +.fa-sticky-note:before { + content: "\f249"; } + +.fa-stop:before { + content: "\f04d"; } + +.fa-stop-circle:before { + content: "\f28d"; } + +.fa-stopwatch:before { + content: "\f2f2"; } + +.fa-strava:before { + content: "\f428"; } + +.fa-street-view:before { + content: "\f21d"; } + +.fa-strikethrough:before { + content: "\f0cc"; } + +.fa-stripe:before { + content: "\f429"; } + +.fa-stripe-s:before { + content: "\f42a"; } + +.fa-studiovinari:before { + content: "\f3f8"; } + +.fa-stumbleupon:before { + content: "\f1a4"; } + +.fa-stumbleupon-circle:before { + content: "\f1a3"; } + +.fa-subscript:before { + content: "\f12c"; } + +.fa-subway:before { + content: "\f239"; } + +.fa-suitcase:before { + content: "\f0f2"; } + +.fa-sun:before { + content: "\f185"; } + +.fa-superpowers:before { + content: "\f2dd"; } + +.fa-superscript:before { + content: "\f12b"; } + +.fa-supple:before { + content: "\f3f9"; } + +.fa-sync:before { + content: "\f021"; } + +.fa-sync-alt:before { + content: "\f2f1"; } + +.fa-table:before { + content: "\f0ce"; } + +.fa-tablet:before { + content: "\f10a"; } + +.fa-tablet-alt:before { + content: "\f3fa"; } + +.fa-tachometer-alt:before { + content: "\f3fd"; } + +.fa-tag:before { + content: "\f02b"; } + +.fa-tags:before { + content: "\f02c"; } + +.fa-tasks:before { + content: "\f0ae"; } + +.fa-taxi:before { + content: "\f1ba"; } + +.fa-telegram:before { + content: "\f2c6"; } + +.fa-telegram-plane:before { + content: "\f3fe"; } + +.fa-tencent-weibo:before { + content: "\f1d5"; } + +.fa-terminal:before { + content: "\f120"; } + +.fa-text-height:before { + content: "\f034"; } + +.fa-text-width:before { + content: "\f035"; } + +.fa-th:before { + content: "\f00a"; } + +.fa-th-large:before { + content: "\f009"; } + +.fa-th-list:before { + content: "\f00b"; } + +.fa-themeisle:before { + content: "\f2b2"; } + +.fa-thermometer-empty:before { + content: "\f2cb"; } + +.fa-thermometer-full:before { + content: "\f2c7"; } + +.fa-thermometer-half:before { + content: "\f2c9"; } + +.fa-thermometer-quarter:before { + content: "\f2ca"; } + +.fa-thermometer-three-quarters:before { + content: "\f2c8"; } + +.fa-thumbs-down:before { + content: "\f165"; } + +.fa-thumbs-up:before { + content: "\f164"; } + +.fa-thumbtack:before { + content: "\f08d"; } + +.fa-ticket-alt:before { + content: "\f3ff"; } + +.fa-times:before { + content: "\f00d"; } + +.fa-times-circle:before { + content: "\f057"; } + +.fa-tint:before { + content: "\f043"; } + +.fa-toggle-off:before { + content: "\f204"; } + +.fa-toggle-on:before { + content: "\f205"; } + +.fa-trademark:before { + content: "\f25c"; } + +.fa-train:before { + content: "\f238"; } + +.fa-transgender:before { + content: "\f224"; } + +.fa-transgender-alt:before { + content: "\f225"; } + +.fa-trash:before { + content: "\f1f8"; } + +.fa-trash-alt:before { + content: "\f2ed"; } + +.fa-tree:before { + content: "\f1bb"; } + +.fa-trello:before { + content: "\f181"; } + +.fa-tripadvisor:before { + content: "\f262"; } + +.fa-trophy:before { + content: "\f091"; } + +.fa-truck:before { + content: "\f0d1"; } + +.fa-tty:before { + content: "\f1e4"; } + +.fa-tumblr:before { + content: "\f173"; } + +.fa-tumblr-square:before { + content: "\f174"; } + +.fa-tv:before { + content: "\f26c"; } + +.fa-twitch:before { + content: "\f1e8"; } + +.fa-twitter:before { + content: "\f099"; } + +.fa-twitter-square:before { + content: "\f081"; } + +.fa-typo3:before { + content: "\f42b"; } + +.fa-uber:before { + content: "\f402"; } + +.fa-uikit:before { + content: "\f403"; } + +.fa-umbrella:before { + content: "\f0e9"; } + +.fa-underline:before { + content: "\f0cd"; } + +.fa-undo:before { + content: "\f0e2"; } + +.fa-undo-alt:before { + content: "\f2ea"; } + +.fa-uniregistry:before { + content: "\f404"; } + +.fa-universal-access:before { + content: "\f29a"; } + +.fa-university:before { + content: "\f19c"; } + +.fa-unlink:before { + content: "\f127"; } + +.fa-unlock:before { + content: "\f09c"; } + +.fa-unlock-alt:before { + content: "\f13e"; } + +.fa-untappd:before { + content: "\f405"; } + +.fa-upload:before { + content: "\f093"; } + +.fa-usb:before { + content: "\f287"; } + +.fa-user:before { + content: "\f007"; } + +.fa-user-circle:before { + content: "\f2bd"; } + +.fa-user-md:before { + content: "\f0f0"; } + +.fa-user-plus:before { + content: "\f234"; } + +.fa-user-secret:before { + content: "\f21b"; } + +.fa-user-times:before { + content: "\f235"; } + +.fa-users:before { + content: "\f0c0"; } + +.fa-ussunnah:before { + content: "\f407"; } + +.fa-utensil-spoon:before { + content: "\f2e5"; } + +.fa-utensils:before { + content: "\f2e7"; } + +.fa-vaadin:before { + content: "\f408"; } + +.fa-venus:before { + content: "\f221"; } + +.fa-venus-double:before { + content: "\f226"; } + +.fa-venus-mars:before { + content: "\f228"; } + +.fa-viacoin:before { + content: "\f237"; } + +.fa-viadeo:before { + content: "\f2a9"; } + +.fa-viadeo-square:before { + content: "\f2aa"; } + +.fa-viber:before { + content: "\f409"; } + +.fa-video:before { + content: "\f03d"; } + +.fa-vimeo:before { + content: "\f40a"; } + +.fa-vimeo-square:before { + content: "\f194"; } + +.fa-vimeo-v:before { + content: "\f27d"; } + +.fa-vine:before { + content: "\f1ca"; } + +.fa-vk:before { + content: "\f189"; } + +.fa-vnv:before { + content: "\f40b"; } + +.fa-volume-down:before { + content: "\f027"; } + +.fa-volume-off:before { + content: "\f026"; } + +.fa-volume-up:before { + content: "\f028"; } + +.fa-vuejs:before { + content: "\f41f"; } + +.fa-weibo:before { + content: "\f18a"; } + +.fa-weixin:before { + content: "\f1d7"; } + +.fa-whatsapp:before { + content: "\f232"; } + +.fa-whatsapp-square:before { + content: "\f40c"; } + +.fa-wheelchair:before { + content: "\f193"; } + +.fa-whmcs:before { + content: "\f40d"; } + +.fa-wifi:before { + content: "\f1eb"; } + +.fa-wikipedia-w:before { + content: "\f266"; } + +.fa-window-close:before { + content: "\f410"; } + +.fa-window-maximize:before { + content: "\f2d0"; } + +.fa-window-minimize:before { + content: "\f2d1"; } + +.fa-window-restore:before { + content: "\f2d2"; } + +.fa-windows:before { + content: "\f17a"; } + +.fa-won-sign:before { + content: "\f159"; } + +.fa-wordpress:before { + content: "\f19a"; } + +.fa-wordpress-simple:before { + content: "\f411"; } + +.fa-wpbeginner:before { + content: "\f297"; } + +.fa-wpexplorer:before { + content: "\f2de"; } + +.fa-wpforms:before { + content: "\f298"; } + +.fa-wrench:before { + content: "\f0ad"; } + +.fa-xbox:before { + content: "\f412"; } + +.fa-xing:before { + content: "\f168"; } + +.fa-xing-square:before { + content: "\f169"; } + +.fa-y-combinator:before { + content: "\f23b"; } + +.fa-yahoo:before { + content: "\f19e"; } + +.fa-yandex:before { + content: "\f413"; } + +.fa-yandex-international:before { + content: "\f414"; } + +.fa-yelp:before { + content: "\f1e9"; } + +.fa-yen-sign:before { + content: "\f157"; } + +.fa-yoast:before { + content: "\f2b1"; } + +.fa-youtube:before { + content: "\f167"; } + +.sr-only { + border: 0; + clip: rect(0, 0, 0, 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; } + +.sr-only-focusable:active, .sr-only-focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; } diff --git a/generator-web/src/main/resources/static/vendor/font-awesome/css/fontawesome.min.css b/generator-web/src/main/resources/static/vendor/font-awesome/css/fontawesome.min.css new file mode 100644 index 0000000..2683476 --- /dev/null +++ b/generator-web/src/main/resources/static/vendor/font-awesome/css/fontawesome.min.css @@ -0,0 +1,5 @@ +/*! + * Font Awesome Free 5.0.2 by @fontawesome - http://fontawesome.com + * License - http://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +.fa,.fab,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:a 2s infinite linear;animation:a 2s infinite linear}.fa-pulse{-webkit-animation:a 1s infinite steps(8);animation:a 1s infinite steps(8)}@-webkit-keyframes a{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes a{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-aws:before{content:"\f375"}.fa-backward:before{content:"\f04a"}.fa-balance-scale:before{content:"\f24e"}.fa-ban:before{content:"\f05e"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bicycle:before{content:"\f206"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blind:before{content:"\f29d"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-braille:before{content:"\f2a1"}.fa-briefcase:before{content:"\f0b1"}.fa-btc:before{content:"\f15a"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-car:before{content:"\f1b9"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-certificate:before{content:"\f0a3"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-square:before{content:"\f14a"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-clipboard:before{content:"\f328"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comments:before{content:"\f086"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-credit-card:before{content:"\f09d"}.fa-crop:before{content:"\f125"}.fa-crosshairs:before{content:"\f05b"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-deviantart:before{content:"\f1bd"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dollar-sign:before{content:"\f155"}.fa-dot-circle:before{content:"\f192"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drupal:before{content:"\f1a9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-eject:before{content:"\f052"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-excel:before{content:"\f1c3"}.fa-file-image:before{content:"\f1c5"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fire:before{content:"\f06d"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-first-order:before{content:"\f2b0"}.fa-firstdraft:before{content:"\f3a1"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frown:before{content:"\f119"}.fa-futbol:before{content:"\f1e3"}.fa-gamepad:before{content:"\f11b"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-gift:before{content:"\f06b"}.fa-git:before{content:"\f1d3"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-martini:before{content:"\f000"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-gofore:before{content:"\f3a7"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-handshake:before{content:"\f2b5"}.fa-hashtag:before{content:"\f292"}.fa-hdd:before{content:"\f0a0"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-heart:before{content:"\f004"}.fa-heartbeat:before{content:"\f21e"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hospital:before{content:"\f0f8"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-houzz:before{content:"\f27c"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-internet-explorer:before{content:"\f26b"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-jenkins:before{content:"\f3b6"}.fa-joget:before{content:"\f3b7"}.fa-joomla:before{content:"\f1aa"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-key:before{content:"\f084"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-korvue:before{content:"\f42f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-male:before{content:"\f183"}.fa-map:before{content:"\f279"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-maxcdn:before{content:"\f136"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-meh:before{content:"\f11a"}.fa-mercury:before{content:"\f223"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-moon:before{content:"\f186"}.fa-motorcycle:before{content:"\f21c"}.fa-mouse-pointer:before{content:"\f245"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nintendo-switch:before{content:"\f418"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-osi:before{content:"\f41a"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-paint-brush:before{content:"\f1fc"}.fa-palfed:before{content:"\f3d8"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-paragraph:before{content:"\f1dd"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-percent:before{content:"\f295"}.fa-periscope:before{content:"\f3da"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phone:before{content:"\f095"}.fa-phone-square:before{content:"\f098"}.fa-phone-volume:before{content:"\f2a0"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-plane:before{content:"\f072"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-print:before{content:"\f02f"}.fa-product-hunt:before{content:"\f288"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-random:before{content:"\f074"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-rebel:before{content:"\f1d0"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-rendact:before{content:"\f3e4"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-resolving:before{content:"\f3e7"}.fa-retweet:before{content:"\f079"}.fa-road:before{content:"\f018"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-rupee-sign:before{content:"\f156"}.fa-safari:before{content:"\f267"}.fa-sass:before{content:"\f41e"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-scribd:before{content:"\f28a"}.fa-search:before{content:"\f002"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before{content:"\f21a"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shower:before{content:"\f2cc"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowflake:before{content:"\f2dc"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-spinner:before{content:"\f110"}.fa-spotify:before{content:"\f1bc"}.fa-square:before{content:"\f0c8"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-star:before{content:"\f005"}.fa-star-half:before{content:"\f089"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-strava:before{content:"\f428"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-table:before{content:"\f0ce"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-trademark:before{content:"\f25c"}.fa-train:before{content:"\f238"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-uikit:before{content:"\f403"}.fa-umbrella:before{content:"\f0e9"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-circle:before{content:"\f2bd"}.fa-user-md:before{content:"\f0f0"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-volume-down:before{content:"\f027"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vuejs:before{content:"\f41f"}.fa-weibo:before{content:"\f18a"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wrench:before{content:"\f0ad"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto} \ No newline at end of file diff --git a/generator-web/src/main/resources/static/vendor/font-awesome/webfonts/fa-brands-400.eot b/generator-web/src/main/resources/static/vendor/font-awesome/webfonts/fa-brands-400.eot new file mode 100644 index 0000000000000000000000000000000000000000..b5abfeb4321c0e0aaada15a29463bf3c5f5c6b38 GIT binary patch literal 97180 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%0DWf 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 PN~nc5l(~UC@r?Qp2LGi} literal 0 HcmV?d00001 diff --git a/generator-web/src/main/resources/static/vendor/font-awesome/webfonts/fa-brands-400.svg b/generator-web/src/main/resources/static/vendor/font-awesome/webfonts/fa-brands-400.svg new file mode 100644 index 0000000..2b28036 --- /dev/null +++ b/generator-web/src/main/resources/static/vendor/font-awesome/webfonts/fa-brands-400.svg @@ -0,0 +1,990 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/generator-web/src/main/resources/static/vendor/font-awesome/webfonts/fa-brands-400.ttf b/generator-web/src/main/resources/static/vendor/font-awesome/webfonts/fa-brands-400.ttf new file mode 100644 index 0000000000000000000000000000000000000000..9afb0bee9c665dfc614b574482878154fb02ea61 GIT binary patch literal 96944 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 literal 0 HcmV?d00001 diff --git a/generator-web/src/main/resources/static/vendor/font-awesome/webfonts/fa-brands-400.woff b/generator-web/src/main/resources/static/vendor/font-awesome/webfonts/fa-brands-400.woff new file mode 100644 index 0000000000000000000000000000000000000000..0bd6662f0209d6d8d2573c9baf3c85897c91c2a6 GIT binary patch literal 62811 zcmV)&K#ae4Pew)n0RR910QFn|3jhEB0eY|i0RR91000000000000000000000000- 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�)|P-9pN5i1^$`+zw02p%fWY%C*t0A5US(B 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 UQ&bkgOx2eBxozA303KNYc2ICDO#lD@ literal 0 HcmV?d00001 diff --git a/generator-web/src/main/resources/static/vendor/font-awesome/webfonts/fa-brands-400.woff2 b/generator-web/src/main/resources/static/vendor/font-awesome/webfonts/fa-brands-400.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..1b30dc51faf9204501ad1a002714aa844c655d1f GIT binary patch literal 53794 zcmV(~K+nH-Pew8T0RR910MaA?3jhEB0eY|i0MXC@0RR9100000000000000000000 z0000SR0dW6t3nEelLUkK8UZ!}Bm;^R3xx~-1Rw>5DhHi6Tl6V$L)rF)LZzMv+_mkN zCkY=`AUEBV$3YbMteMeZ<6sP)d{FlP|DTs2MaD`CUOEOaK~>)unM-ZKU1Y0Pt0iQc z*t2a9M~{_^DWt2Mk>BT7&c3Sm3G3EQ!qKdYY$5Jis;RA3Yb|!)c{B|w97E5NN5XR4 z9sCk?YMi0%a^eZ^l;ET@+i>h;Tf%gcf2Mvxf6+4U=-dKgPhPWL*9&ktHAzJv9_3IF z5P)qEM9VEug774m03;v~03?uCvkGx~&{(R?@EFc4ZsnUF7mwfh3H|nda&mc1cKJ-d z^Lt9A|F^opwqY+C9qr{ofqU|G6aw8u#|j{2`)zjvA>jE_@1>Z)bW%E)1@KcyX*#Mx zGKiU+PRin(Q8GexJD@vz^o4Zelt#pVjM4U;s330Hq?v~z7D*%$(Wg@x@|A>S+E3{J z+O(v0)Fy1A89R2+7$5^L2y*Mj$>h$}9lzeba;7|}7b+t7l7{Ek=DYrvTtsoy-EjeZ zP1F$;5@}PS7=;yJVQ!*Wh?UbJ>U6qUIiu%N5!^(GYt-vB0-&-D6A02FoT+n2`^&aG zf4vR=BUCCE2X&bS%-MWwD37x*T=yHSUk@VHs0aVcYz&wnSLY-q~a` zmt}hpl7+cJ$n;7`<-UtMBGU8m^6>As4Blgz1qK*)VEgsGR(@^O{hm^7UR;EUGEuS$ znddV+Keyh`{qHyq^yV@BT}g{h_Vq-z$6TeQxF>yBkx4aJUcJcGp}6c#>)vt z<*;LhZm|2yYW=Is_5YbMyUhQ0dGeHz5T;BUNjS;Fc;GtI)y0f9h`#r;dv>v@+E&Hi zRc5upjA<{>IANT?&v=-jO#p1ET7YyFV0TIvLk1SI*;vP)SNTQDZFgIeD_b9;?>^+z zIsE^*wEx#hX6Ga`f$egfhBCwsP-6g_SkN6mO6R?m*@OQF6KN_%-nrxlx_h&0=sF&W17KvA?KaqzAfvU*A*ap)n6`G z&$8dHvMoS`Ex9F`gr0wMwRYxGggtY$7}={d7p>3Mrm-mhzy&@mVc5iAV%LaR@Gs67 zVyY~CRx!;S=*<}afMLcsAI=k&W;mK)3bD$evZ$^s!3c&}l%=JB~eF3o4;4nDn-i` z*K@sgBkMG4a$|#NlVF3W-}~qm|NlUf0Gb*CXz~a&ITE@l4FNPY4S+KzQD?|rV@!0$ z7=D0~*l0~HyIaz!IaXZnv)Rec7#m%BL3ZJ$>4nD_a6C*H5za7_nK-RYAH2|=Y$a(^ zhGNdQ&y2Izk++w7ncxPm5n>R+h~S^E(qU}&FX*<5^3Wkhf;B4^rLJE8Ka5RRuF5EM z+88)2O1%3bPNkl>8y7H8SQfgQe*Dt6wW80wvzh{iQ zw+8#D=4}V#gBe3jf@$S^^TSIfh*$XuhUD9PD6Irx7$%Lji?zmfn2eG1VW$!{3Wq!ZLSrb+eHjtK&qL z+2xo^ekltox}?&|ET=scRoR8YmhHM~7b>XHqH#J{lyF1+P0grgn)4$^fp8w*X zdh+6xIaj_U!NSB!l|f~jBPwWcBpOSm)Y;g}bly8YOdcF|1^^CZT`+yu=#tcytaHdY z&!lBwIGv$BxBSXGm(|#|gEkqFSPP4_sHS!8ZIyg3J?M!~`S$Prp=F5^_n)`5;K5&@ zbfkFcvZ?Kmzt~s;g?4PU!H$OUkF8%%zFrPcd|e`j0}fpl%vVa6OKF^P#yL0KS_VF% zb?U$7SN@TShWLb}#?u?IESgX{67%;g)-J zezx{vt1D|*KJ8-jYEVOHbL;dju3OU_v`)T#+|wonJlt_xkU)F6IV_Pv4`DV&ND^a2 zij9nEFT_Nl3E$v3V6LCJpJwSzU*37{LdZnV{9{NC+)H(WPgwzlvD zMVJV|6ozS^1Tx@>C0w|QNt4`-f%#V}hm>uXg&1U@{`!zJv(pY~>gr{b32g21nXi1~ z2e+~*5&2nn)+s9u(9c-ToPz136CA_fy&={)Bh_d^EeSDoV&$1dMk-?y68Dt&q`Pjs zA|ORe`SKYC<6k1`KY#hhP3yxRx?mRed&EAdS_`*Avd5}LWT!%#$rv$Vs)pL?X{dol znrfznR@&*Hqt3eOqNl-z8fLgL#xXbEB$G`u-3&9$GTR&rEVRrjt8HM(ngdUMB>t2F zM2Hk6TC8|UGNj9tMJ0#YR(ZDD}0isDLVT2cq!=3}jsQ!qj;LMFD4IMwh4AE<>uT3gxEcj}~ZXY62 zUuUr`yu}3zC#;yJrjzBiAuXfr(q%;N0k;&Sj$ojCCnhimz~&f4;U)|cus;Ur#3Tk8 z*aCx09Du^5( zEsLI618X8}h(@F>&OzE?8>9nm_$X$37xf^RC_uyh=J|;sJU{Yiu(TXf0nvvy1 zkQEq$ti=BSd5&0(JdcHu7h-u=fX|Uvu|Dz|_Ca39zQ`Lm6?u~wMBc*3$lJsQ`+WVjY(glkYWaUQA`Mnl!Z z%&7WU6x9&Rpc-LURAXF+YJ!4lieI6cVJK8{{0=3@J1DavZy1OrsFAn}HHz4W8ja^s zWAF@WEH**Sz?`U=m>sn`ZCeZMjarAjQ0s{i)CN3_+K8u6o3JNpGqDA=1wWxIFh9yN z8nXhPLs{colr0uR*&$F47#Zb*Gf=+7N|Ya_MoGbxz?Y~1tcwc5BB)?Ihzh|jsL(=g zVZaBdaNLiIz%Qso%z#S5^r#dZgi0lLpwft4sB~+cOkt!D6qZ2e^C4I z57d7A3v~c*qYhy!)M4T<>IgA}I*MaZ`Pczf9NC=!K0%$t?x<750O}?tLEXX$sN2{W zbq8mo?&4F_JtWjaq8Igu*oo5N9`s6Vhqk~lXiE%>w!-jeYm9)l!H8&EjDohq=xBS4 zg?7N0Xh)2VcEWgQXN-?_!Gvg6OpNxx=bYZ`ZVrDpTXVebK%>01iOGR?Fz!NYY287cocmD zkE3tm3G}V-?KYyZJHX56yLbhCFM7KVypDbl?L9_%_5^9$Qv`d4?DrhUH)wo^eueMR zuki!=4Sqzw#n0$>7(l;ALx03?(4X)p^cMp98_|URPPCwZ5N+t6L>KxO(T9$l|C9bu z8JP|x$xJ99v!QY_7fO>wp$u6Z3d!DYkZMy-uh`RBKHy}qr!wZ@}aeo0kI$ez0$fkOrUr+_)uCO8O|3N4rE6)hVPOKy|JD!H8IiYEp6 zAxmA(t1idpp_Dy`m7|{=4jJ5MNaSbu9^ipB2ey84djy9$vm7~+E}!Oh-) zyi+A9m1Z25V=RdVY%HI4Ho@NRtr^>d+uMzDj)jKYd!A^iz_jVt>c$HnCsP8W6+=-L zMnj``UNX?xxyVd&(2f(KJEauUu=kRC9czE1v+z|WS;vC6*Ts7AYg6i(pDiUc+E+57 z)M(jkT^~s)uAO49F-|PF;5}D0Bj#uwvzhuPkuQ8)Z$rdrJ=c9(b%e+p4gegrVGm1- zmG|h}#1dh=>1O7<1Rw$RiE;dd1gB&!Avd7&T;|&7u1$BFdb;iou1ZavC!XDS_suW- zIS*kG5>5egsV{k@z;GtO6rKk$JwYr>0Mjy%HJ&jiXihQVAr^?V&p1@=eoj8;FO}%w zmj4l@NP)mLg~N1;G0QZ-leA!85jCaS?fwg&3Lkl^42QvHg*|oioj!3Y3piH0_t!7p z^WIsByY2R^nJuvAp8VHkDa}WN^P|EA8aj2vujibkC*Ip_*8T=jDQOBY^|`v_M+SF8 zQ}QM4186N*o_kLd@5%Cp+PFv1^wV{>w#AwX`?tas_J^RH3jXhH)~5(O3V#Rimfv{` zTAd|;%=vB%mH~=vepV2N%LNrJ=l)T;i|OIIeYN-22ANNi>TD3*wse@PNwMhquH#}4 ze4>Z#oo&;#1&KA!qSjXqo}YO!_RV2+>#9^^AE#UccAR7PD16;*4+fn3po;DKh1EC= zOY7>3wGZ!LTbA)Ax{5cT0{8=1XPM&DFTU_}lM<4v6~E0A2fTCJ-C>Ns_u@7ylhPJQ2alif zIB~^5}kU=Y17>jpzq?ZW`l6?cW-`g#X0E7~sv-Mg{SBHq03uqvX^<(dc;& z9*Q?a#)vVzySxw5R_{iS;w>G1!=KWpHU#&C7S-y2$HYxkc6|U~2KT0c^NF{Jwo7&s z5dWdnC8>x2f!DXuB9=o%iI41!x-@e`J=M(?U&Z8~Za-PUGp6o?hv0W?x}HHJoRwYc-?~r?$mqhnC7{xS5{U+C;#Z-htJgdGD(l310=j1jrX4`(osy%wB^Bh#fGpVgz1yfs+ zPK2JnwCV%5PBM1yN|}iQ;oS5z8-#czw2)cpNCx+PNF9qb~%L^0hyr@pW`?Pe|a`~{@MNbbok^09>C};)^mHSmA@lcsZ8jrzw0jL zY{M+Qm6dI7PKT_>9o-}rAuDn-o)Lx7Uajm*yRcHv{5rtu#WY4DUI{&-jb~AcX0qXN zymCKUIKj1!zKR>}`IX zq_NK&Q2`p7FJNy-=~t@`I4!4}Y^-e57Uf|4dF54AX)MPAbZ=ijNlSVtsn_eM`c}B~ zEDxY1fC@XSeeQvYgiX46#}lKnnVA&Z+^hYvhH1I#`49`f{g=If68rk@_I+)Y$)Zs6 zv!qMmdub=|2RxzZ^eBu^N8F(xBmXRZm~uE&rS1_{;$ZQF2Rg|jmFA)41Yw)xps6x~ z@78uOhfK%fV*}>4p*}G%i0L{?nwIOaap3{?=K8cfx>xUW6D#`rZjb}cI%cA{Ft=$` zOw42i&8t-JlAQ;?8JeV1@nqvOt4Wer;r&#`M?B?Frqr@N zITFekN1_6!lx>De9M4z|HJ$h$>}fxUc5F`yInowntkR+_aOR)o zlFQcvF4tbkw3H{_3e!9(jG2qydw!LEPkeNFu6#N(_n-d^-=6Sox=DA$3tirlunCU) z^B23HmzV#z?mvUXL-O))`MlcSTRo^QKJ^{t-mM%y-(B&XH~&-nk0&^=(@PTvQr45H zq#f?N=Be}t=MDd-*kN1D`095a6WQ!+U+=SVPS7HQRqnB0?VdBZ+@Gd?j@kKjel<+!s%prA1xx)L^0BK|h?bEAm!*u{S%tyqU z!Hr5Ws!3pE^(PV@MYutE>p!^g?HTsxvmS(*)2l}g$&umfGsZAvY>;KSl!J=EQIy?Wj^ia@<`d8edY>h-hi?1o9G4nZvt2|jX z$I31xhY=vMmMczf#QE~x!${;CCW-jw&B{)JdpnC$wqJ_$R4;@iEg+Pmp8cP?mR? z_G!BDPC76-)^5-HB6e~X!6Qp*gbY0PE1uCUOe9BoE-;J22P6T>Wyr{RB`^I}aGJIJ zSvsCq1v87h{bR#wf1eH*$a>-}!?Z#A-oPirqx(l!(Vkz~^BdLQ;wtCOca1`GVeB|x zfUPIf^7A#!GWmD{tI%zJgn3iGRw~T8EpCh@d!u!Tx*6OYK@IAv%4rnBg2dMf@@vF* z60fw%?TUFU}lGR*0O1HRwKtQaJidDXHST1Ya}qtW?s#S0hQR zukC@Ruivg$=xn&>n1{LEP2r6A3YMtujIJ*A{>QFjP`6hc03zNu!yP^w>xg1qxrsL%DA@)R4Zo6@Mj3nc}Jj8VWZk!?}C zuCg4f__N5D%ZQ}eN@5o9HcG9B=%NIn&v5rckq3}asuFU6O8$eGLSRXLX50K^hq=>T zDZP!x7zxezGb@%0ceL^q?{5mu^(JZlWkSdxbRFs< zi-=kDhNQ-;2bG9u`jp18hc=BlRIS110e6+5L|a*%RIT_2Y%PLSZx%u=?|IK(Ju2F% z2Z=ILd|rkXRHQSdSEI*!s+nY4p->@(42KZU{Uj5)Fwv9@B#g(zMn?@rT4HRyj%O*@ zsD{$QJy-EOtQ_RMLIEApWJl^UjCrnAL#_lqC0o!q5*9UUCXm1Z3J+4!+yy+4m3u`= zN9u0Xz*P>{18CQT6ufgvMU_eUyLgFh$ANP&oSL7p{rwtM;4AK&VoT1ux43{iGRy=7 zfy@#@MIMQn4F*w@?$WvQRHeu*^nziL4dl2J$S?avkkITBJG~`|qjHPG0;*5do>C5I zS}xt3xFgd31S7GX9~j&o7Kb6G_{!T611+EPPZ{w;*Ms1IKNDup9?# z*bWNl>Nrn9P`iIBlsa~LlsxYe?14qyHc@p{_J{9sBJxS&#Nf@}ZBpU#TEo7ywj`&~ zx3~A2hzymAG7+-f@b~+@c0TqC5S?5>$_=i?fVm7z#x}m?=+>AfT<5XYcI*hW%|iXoCJDWl%LRRFY9wY4G~6*!Aa=tUnb-X3B86EcLX~fwsWsrShm{ zN(~8q6Z20$8CrWVhC0Rl>bbzv`KmIIfr|2${=YU6ersaH2)Zn>i?4Xb92*QO+6g~` zf|5RQaN_WLzoaDL8GQ zW=ryZsWiD=LCangi&KD*F+|GI@JJbUisBbogRK_OIzh&S4Ck!a5$yvf*kuYzIWCYJ zvoP5G^NfoGkpL!3{TMRRs>d%iG3EXMt=$v;<&ij7>V->91B&?#(s|AYVC*lM?p$6+ zMKB+i=5XOg_X8In*REEp!E5n@mygaodhu{?yYm+%Zcm$U%FpG(Q?|AF8{BvH{^RQF z#={YNu7&&Kl=#noX6_e(zlDUOZ_XFnet(>@x4QErz3<9_D`naHY%Bq%M?`qq2 zP1>@7V$o(#P8Y-d0PB&_t$6IBWm!Lb4qrW#bK05H+Bs)JI<+)~5=P}NdaPYtch!b> zm7vuJJi9gNIV}(2rny*@!?pi>X0&EzW|KqL<@?9&)GM95FJkgK7F`y0{D1luysaZj z#8{!~VOXy>jwxgy!(BVu2|R4a2PW40ELJm+o@>oQ%8WIh4thjGE7lTkK~CB%k+*C@ z=piq4tg)3en>Jqi z$!DA8h-Y?PooMGZj%O1#xw(4fqwk!1yYUzI)9m;O`psetvs-t`oPt?__ILhpmVe&h-V3h7ppUdmH8cC0ekDL zp3)EytmQW=XcI)))h?x}w+cDaQ-4;rC{W)Sb_--TSU#L#j79uu(NKg&`f)q}M zHT_iVuvcx^>l96}91H+!}>M{O0u4kRl0 zuZ?JO1W~eB!I2`DT4#avNU5O#2K6mxZo|~$Pt2T6zc@R)&;+4?7c0B*-lc2807HQn5dKY7UO(BZDfLSHurkj%%Y^i8Vo z)y&4v;)@HDC-Y(ba`}u_Wv;Zxxmzc;hyN9aB)cExp5~wKl-Gm1v(*9 zMG!4VDu?_Z9gxpPmK@d|druxmT28GurOp9xR@b(-Ur73ty`)|CW=aF{A7D;8o{W8kAsE-E~%?@3yWG4YTNg;rs~2q(9e*^6nZ zJP&(bDJkc5g}}5i^$$)}LqJ~6QX(viP2?by^O_dv+RW*e%FoLkZWpBi`bzE~b2l#c z-%^9j^#|jl6k}~w56JoJo2C1d6YKHBc$9hv$q?j#q$;~u^KSwHffQI_k3F}+Bk#uR z-O<8lUy;P$!`xFU6PEHkFPiz1(xiczmVTybF{NEJWSu)Q)Hy%+;x}I|@+R`8#dzdY zx@km%W@VE@)hDZQ!faoje7@F$!Zae#IaB38EE3ab176J9BD7y^Rljlt@TOno*Z!Q8 zDP`$ki0JLp@Xhd~l8@G+k(FEAM!sfe(hDdC{=~hBq2H|@TR8Yf^RHsGSWR9sBQrb0 zm#I5}Kd$$zOFmz;M%k5#M)BVNsbwg1=t@Ehf*KK0jCCd;RjoR-B}vh>Q?hsT){M5q zIXo$NRfI7QdmJ!8H%&XJLq>^>EY_Pa0cx^N2W-YP8(ARA80aSj3sKvY^b^K6#x!Bb z)JcEz0}-Gr5* zXNRaa2?=#NQhIn>lo=T9VzOY|U3gmPrE;uXTv{}jEU$02&>yeK-TdC@SGh=i(k_la zB@UhU=9R>0l<<>B&F$B0mo=PPULL$5wyEe=$n-zv;Z%}m3biQWgTvCClc|B%?fK(T zjszOYR_bhFkCjXx`^i0<=NhdLqdLJELjEt{OJ(A;W;>`T?vMZaOZfk~dhCJhqg{^kmHOwx9RY~_%VaH}^Egum< z7*JRc&hc@k!7t{OGgX$L>0aMuJhDCexb6z{bFo?>7-cN zU(H#ce>dlyKT&!|JqmV-YnnO%$EFo*7v`CTY1$IR2O_fr&-*~WH=b`S>x|Y_6u?iV z52FYCF%Uj5H0bLBqh@8n`BuHLk}T<~^9zS=29N%3AXpKKzwYe#H)VZQmKN_FNbPyM z<2y6&E}Xi5^!{`w9_ba^v&p4M#WI_*>3r^V@1UYeC~_uQN@7tPf(?!~$zX1vXmk;A z-Cjbh0b@uFKNGpLdn$RQESW00=J(5*RX6Erhlq}5z3BzX9=c!Eh;vzHX#NC23u|?u zLDo3P1ZU%neQrP(_lKt@9&eDkb=Cn$+|D_LXAPzBYOYPf`a0)l|K2pXe1E^v02GW~ z*{6T}p}GICrH-gW%CM8fXLya&iU{6|>m?%T(bJ(I$5aV!OgYv7Pw*pNx?__Q(&TtU z4Yqii&!VjDhj|2I@~qzT&j;+}`x`1fIW#g7gcf6a9$Y_HrS9`Wt!X!nE!6Sp%rMP` zk?7bc5`lWp@nB=((CXi06h0AVL4s$_v* zS8em&lB5@uY)74HVs{hly0i(jUEI-ZdF~}__BUUZZ-uF4Ggi3JKr{g}lz=!Yx~<5z zH$SYX(k#nKVkNE47;`mYLzxDfjIBGt&ErWC0eKt#(y9;4Q63%YnSa?bBLSjiH~}DK zr)E&fXJF7M_VN@NpaM9N0JnVxh!j>|EMDDbigU&?Q&BHqPa8(g{mpkGlbiq)1@BE&S(Xjrb#Fx0d?)L{X@q8=0wSTp`=B@N+lZE@+iGX|i zR@!nI*H}lw7we3|jD`W~kVtn3Aw)6POF3^U@12S3J<7nYot-dkXZMd&j&p9x@Z23g zOt_w!FkJj7O`4CLx&764e^S{samMpv#1w~qO4)6jj@+ER-$N`@KtR0#T9;U>Cn*ML zVzr~Y7~^-ciiD#02wR6rm%AyEAR&Pg2n8hED1eEAt+?T8iR~{+o>Y#-`Tj>##9Mp* zfSs5cb_D=;3H981p^abi(yXQ`Rg{84@n zd3P*=x8kiWE>XUdQX<>Y3$xF?-1(M_3f?guRe~B1IC`FVW^bv@+#FJgWZZniLnF?^ zFFCb2w$cu*4K#(96^dqfl2rU1h%#};N&$cXb)t#xXaNC|EK?>psX{$>YR%84gB2_h zbVH7KsB^`hBylQ$bduA8Z-stVeKijRGuO*Yi4zqw?wDat*K}y#<-xqH*~B1m(a&(j zmRzT7A%ua7VP=)O7Gnj80RmIj3h_zBAO*o!xT7)O|6T2Y%C(%@3lI?uis?uIB$Dj* zzofGa7KtO+6$$qxA%He%*jNf)oljOxq*kouyv^82!*Ni+llgpWlsukPcowp#0a_L$ znw)DbUINP76cuP2#via5&%_;3@KiEUp|+!UR#2-%N}W|Jc<-=T_=~GGPE#Umg;SZj zzNP%**GZ!$D>XR#mjj&FOb$4@nayRnXa3@>?rdR|GW41{W5f=0DL0vN&>Ayh`lLMs zJ4ZWnnav15kBZwJjdIGTd@}&-0?b%vZn?~_wP?#Hc#tN8EV8$gDqUFFRVz}3Zn8a3 zc`qrn4wCzjXC%Z1v^Aw~1*vm@@SJjIZhy>U$YWr5H3{Fb%O55E3lM*A{!}A$@y+#j zQmd{?pz5IUoV^p{$e(9=t1p%^`a+s|>!;;S#RL2Hlz6>uA_~E$Wf9b;v6&@7!3y-9SK^hRGNV9CDpFA=7 z{k2-%w=DxdG2*4%Td@Kbv(R2XSC?;J;i(y!wCDSpdMPW$`!?=XFLW%$+i1ob$Xp%eqF(>bLqb{^p;rU7K0m?<)=k1OJ9!A?YP2(kvj zMP`yhQB+UYY?bPLd-t~(iOFb?EwUTOZdr4s>~Qd|3>j=O_4?wyMGCi=I<>@Qc(rMq z!Q4;U!K_|;3tC{0DezH6!(6hea&~|YvuFs~S~%gK&0=tS$L9hq6HvoQ&`hLBF#~FP zj5}ZEOmCfQorGkiU*Lb=uZZ_Ppe$2)9w>L2EJ@2$lEbLlt++I~h1srGVzy@Dl68=@ zY)TNEqZKq0A;3(`Ygpvwg_el`S)_V9Xp&$Ha9d(B+cUlw(H}-KNw!4XDR-u`Rhcn) zcryr)DXVK%-J8?0cb?cCO4RshLV+dfFgckaY zY$I4q`%*As)IMO6(tk5{P#K4p4r*Vos$z;PK?Lc5@JO-T$ju6CK% z=0u~U=rB!E=hIWWYmgk7M-P4~C$$}YmDyJ;PiUp$J zsT)3dt1Qe|wa0#?OF&)#pV87&`nqO^)$@Wt1&NLqy+&g`RLaX*i=Twy#OQ&u zt9WSc%^vx?%l-3VH)%7)SfOA$J1`V*+Z%%!GXbrt8nKOb&TDMS$Y?3$qy%98tr9XP z_~0|yO{N3axAf$MgLVXAeLPfPM5?CnhJwN;7@$b#b*c13bLIIM9cj{TQPfu1?@_Hc zwRX`EK}u-5OzzgU5Jjyr)8a_8G^i)SH4 za|8TE@&9X63y4`FX-)*GBDJT~tQB+01E^9U{LTh*&YC%>Y3E0?4g8)@Ro~; zGCjTbrN*Y`glBb5@0yfnM7kFSO**)SEa$^&xmUbh zqBihN8m2irN<_+X%b;7LlDW=p1BouYs3ctt7!`@Y%vpr=PQw&YdaSLmD=kFs@vb;1 z%WR@lCSAIR=pyv9N^1Qz$EJbnD;UN2L|`{S%V>artgWS)N|7Q%;lhLlnTX&U$&fXg zb)0uf0rE0H?!Y-Pq(xeCEJ<*V2*MA$a&}j(#L7Gc+(R=(Wh4OY?n%2wl#p%*G67wT z0QmqN#O0~=vXwMznbHAh$?2^qsfz`VnpHErOj-a| zmd63KlvkU#>eQB5{8zqOo$H@drC1mll2`6eW&O`G;I7;&SHH}zvw37;W^Nk#4J1hp zuAAv?XvA7e!aFTUOLB6@RcPIJwh7&t2D5g1*Q{Qcrzz=2;GA~r&+KwHIOB0Th{T!B z=N7(kXZDjjM)^De6=(ce$vy30)KBE;_KSFO*9a)6p0yzv#(1_h)>yqxWZ?Hxe47OI za_%rKo!*_1X-V=*MIye>-7!BT@zeyPcrm=gT>i0-#B1eYNB1TwzdCQO zje>qAS|j;!rQq!RT=YgOy0Fx(%7S&miFBIeT+U4k(NBuYo9pAXM~8d`#aEwH<2y+M z)*cV*(T)Z;;p`qt#CLA((ifZ6O=zEP49(kLTpcC@zd&Pl`|gdu{`CIOW4rwvcv;!* z@TufF(~xqfSG#-gWJoY>m#&xOe}qeR*nEW)^Cp6W+kuMwF}>!G zL4ns@atS>K{5vXUMyW*Cc$XIosl?{S2MRJpg}HsoqLBcCPvd4eyp7M?vnNwlCZs|O zkNZG!h##}uNnLz}$qV-2TCz5!6|>aw&dq`O*>=PVtHc}2M(-1Rz-Ux#=$^IY)l6^$ zYLrpD?$96kHKubQ15U4VpMLUDxboW2smDye>$1q+)s(?@X>9&{<(rAN_VXa0{C&l8 z@t?sp${H0YvhWpXP$$il=%|qI3-M~4a|B%>N$WGG>Lg9d^7khs-UQxUxKDY3X6E*Z zSN3(IiY{joO)J=Dj47K^aEq?dI)3#EZX5~27~N|4U|fahP}X}KP$E(8SGdPbZp>J3 zDbHH73^;TTU|MKI@yanESoP=B5CB&rqJGxHIbZ?zsd9kAcgZp;LxU#Tl=&4vB(QCUi*rK&7!1lqvWH7$ZK@XgSa|>k&7|Hi5HLCS39MBusfxDhaQ-lLg<9VV8E7bk5;s#o0iWxrkl^A7i3KBuL}j(=tmkJd4ymcN zkkIZnrSzj2K4mT>x66#&L&iW}33!ta_=0oRk5d!*LS#~+-byG;gaXU*s7dc3Bfb2K zT(wY?xkW^_eXk>Ci4pWg&CfIiK@mUc(+y}V^N!Y=K6l#fuyF^S=)I;*?U>yCbwjOr zuaT3bCW}60{~~TOe*f^4;Xw;I&6G_395X%$40K14SW?X1Rw`|fWSKIQB|1^Ae7%L@ zPY_hfEL$u~$HcgYPIIj_PYX@6a?Je&YCcy%(zqcYuR0Q;*W zWhLgKv>{5T-r@)jKp(XuwvM^H1QYZG~zx=siHaQUb?5^mL2~niJpsnst9=J?W0kaR6@k|xjTFOv3np?|q zXps|GqQ_H80j8=?xLKi=Oow6M9!K%CbQng9uTgk8_gj{d06Ty_fThUwAe3JUvcBUi#4n)|BO<9cTSMFPpYVN^G z+(%D!Fr-vlmYx~kN=*L*(Ej24+dtOoQ5Uf8QHDD%+v*nvr;m?qq^%#QU^zY6=(n`W zi35??(0AOP9Q3}EVa@G_J#;spO&$b&{3c8uNkMG^k>VE1-$SE==gxFRclpP@Um@34 zKXj_gd(ySbTUXKBuxd#*BfAECN*t4qCju_ASYgVfBGRbTEV8v~*k=#-dnv4LH`d-B zOrX8~;LMiTS?K{9uv_cWGCF_#XL6a2C${~E8msYiReJ`9hQsZ)hPl)AirA{3x*q=N z;V5|X^kR^QrPYxUOFfn^coR;X;9bc4->nHh-%-)g#Y`^#9WRX?3UmN(SAdJuO|rdvdg= zug+0s-EdI}8|2Eyn&6oj_euBW>8JIuIsLC4$)3HA7GD`NYXA=7n~fcQYtnd4FM7Q3 zP9W`U{hta^6n1vpEu#myEvrKRnB2W6IoF*0la%{42>}N?!g5C)=T2H&ao7Ut*lmB>#Ky(tt62;yCnWO^HRR(|F6m}m;0U|Ew* z_r}`L=%N%eGqdrc7Oa#@o2Z~KPF4wcxV;+nWJozJWxWpcUp#b(^vC>J;b+-LJiL7* zFSLl&GPZ;~wQ>X~q2xxx_cC1U&6R2v8VGGI$Ov*vF6fV7cxwT!@GB2hldP9Dy`PclNL`Z{A%_Qy|c(PcVEtP;ews31)un~-#M z8PXXa3{3|*i@u>Dj7DW;Am5H?WvPhI2l7kow};K0-XL^AWVvH@9=Xn=vEJ~i_(DC= z-?jWI;R`4cVc4-F=A!`2>2JHmk4ZhhEE(4L#M~s)c+DP;nfq9LTv}UMS?U&agP|87 z@$3W85AkszMdd@LKgu`ON+wC=p@I=7AORu;8g#l@lB)w@KtEvBPDDu6Nxkwr6|E&G zHn=MPZCQ?DwldRaHE7)3*%w zliiJS8!V(Yc`^x@rP)ZT`BLpk6;DVru#V+)C_b5}sU3sg@7R3QvZ~n|?drL33Pi#r zEyvWlbK&!`eb1Zby(%RcD+iB_AHS|^qW_Ea_(S0n(RJ!ZZpq}#ic#=m)cbwprjF|= zXC+dSxi}Bm-ONfuZx?N$&13tagTI=Qs7Z{l0&Ct9{_E|g6`5!zv$M4v*nbl@Yxygh zHRJ>|am}V-z32&gA;H{(0MNj`X>BtL8J#62M{3ux3Z5HmC|b^!0QaN+T`lNhx-mn7 zFm*Uq=a*Q^f7h(=gLS{Z+CO8oN}-M2ZeBIJzw?<=s8}$^CM*8b=Gjs_-6Vq~V&svsX`%*Y_@z!x*bo zPqWLca~n@-n>O1SYH1B(y84^9`Ch*nxa+yu75@Qs_ys#X^t=@7Dl2i&wd))lTS_gj zI3}i*+B!?Zfwu1$afTD}CjmzX@I!B-6{#rGI?e;lf56@X%w$Td^#bD*&}4clwr;Uw z%2A*OC6dC~$tj?ymsEb2sp+#{TPfXX$xssXk#@4Nz4M2=^^^|YwcRWTs7VfiVXZr% zkf1tHV(xp7##I|W2z5J?Zb%=kFbEG9(FARxavnoodcFIs1{Cf3!-ESmh*7}A-y24f ztmO_34JpJ*m@IcTUa@g6RG< z{J3Ha%zS$H$C70{`2N23nO6VR=o9bU?|eF=udLK1+s5zrvM{wOpQp1WG^AanZgRtn zuN!&drMm%RV&;xR$==AqjjM@SI$4#!H;q=IyJXINexBq?iLBuM>iDb~2Yqip^x2%% zTW%LEvM|Lshy`qLyLQU`RU?`4fQ_we&ge~hDpetQA>P>z{gESG5lJ>$#!XdFA_O9W z^i(VY9h>^B8~kisxCZF*@Ziqg!Gc!eF5$lk%K@^+B%Lm2w?BbyY4-`0qjJb1!z4iuBzpto@6~oYQ74lws0vE_GXLN`|DR+AcvktSzX(`An!MW z)<{_a4Z>cJFJ4b_s-nZd=&Bk<0`_jn4M%R?&IDTvM-%ACN?Q<$wX@z;k0d&R!_V?p z)V~6I9N1L*`wF;5i*5pZYZ1*9az~3-t80HLRT4`6P>id3aO?>KG^Xhj1#Y zb|21zfMIESVyKuV*T?K$;R_2H}+7wb;+7t_)kX(nG5R+o+}W9HbiqO0F+RTjho zQa;7B3c~w^Yfrc6iZfKtAJL^YYpD85_(R96%*`He%zP=f6~^y}tER5<>|zYfRY`t| zIPPKo##ox;afGmn1F7t7S}Js9Q+r>4ll>=p=%SF^N`tc+NV4cLs%3bY93e?dwsW?B z8StvxZZR6AbqjDaqoQ*AQ^@DVEYlo*3f<%_;eQA3I{edOA z<}lx2AIX%;)az10S9r zncC-04Ne>#8Xx?8d|$IUt~I}Cj*NeRmN_Ti`M^82x;U=8?oJ>2{Mc8Hm;vLR!y#4r z{Z}v64g2FGf1%-bQ!S#xezE;Yp)cmw=$2DHATP!CDl4Lh!v}cQxsPpQ7xl@A{QfKd z{G?~2+=eTyxAMoxCo9^@FKVPe{|K2beM~>j8G7dG(uw{v%-^!2SA*C*AcJRpnt7%@jw-5bL`Lm0z@vB-6QCMlKW-WqX;QLMKmMRIMTb;06J z<3HhbpP^BpW>LCA{&?&YrOnFe)OX-|Q>NL->F2-SYX3dB=K$+UeRI|J*z@4@pVyuS z)i(eA*gqPtZ3W)DI?_i~AJk+2xUTm4TdlE=0QKJ0nHSG7#!U|%wAW92^d5acZzO#% zVWe1`fXOE-Ns{QchG8wp=r}@2IZ$w86?>#32BlC62&$p?*%JAPMmk`OoQ_9@m{fTw zFY+P2Uy+FanPFzn;m34*+x?Js0zZlP9mfsMS~ngSuf4x(G?@@?(pqD)&HZEC;@4uP*KW?7GNeAgH|tY$G@p*{jM}Ts z9l4wKG>h^ajIdV;ELN%-48sNV=D~8YswxGUt9pKa)1^wUdKB;1;txR(TxE6%GGAap z*cmuS0BoP!o(XdPSh%_^Sj&hua?hDMZqCt(eSfp!{?LJi#PnzMWibYUL`Mf7e;Ha* ze6)O z=lFv7%=1rtuZ}h)NMxU4^xEEiMcDI>dmCN*qwbF- zH}8M3d(RogM!g*#oNvobu1>Us{B=6$G$^%%WGJ2~%W_I#Vzd^|`qViaFcZU^w$}N) zh+k7))hK+VCiFF>mMMztkrRV^2Hl>4zo`Do>sa{=n72}rl}gd#T)pcMB}bF*x@q`? z@xC%lX#rZY>amVC9|*lA02nhih9$yBrpV}*kkxEQ_vvEbM2j;|(P2Uez_GLK^hBIrTlL;k@R4rjLFDvemFLuM7;MP~(Cs;*q=a@vUM zRqdqE7|7Lhfkpy^CXvZ<2`B(jgJei?-1Z@#7113gPdL(H*I5MpY}>Vx>C&Kf(9Rw2 z(Dg>fH$D5#4&Adxy`M~0yPi{RyU%g=e(CBZ?N09h;DDh=hXIFmVt<>#R+#&acM9PnhGT9Dgj}*M5pfh@L9$FYy_T} zv1xl>PW8T@Z8S`f*9Qq(f9|2%3-_v=ysYb@zZ*zSDGzs3Xi9RJAsb^_SCyDjW5yM$B~V5a4^ z*f~zuJfki%>hF1fqno|()Wd@}j$@k3rMda3y&s0`S7j+v@VvRMe3q4}#I`>(^I#N_ z!pOXqkQgrsPPHaAXO|euQgIvq;iGuY1FHgLA;e`EFyP!s=r}bW1#CIizBrCgAPD9b z#$N?0jZ*l?XR)#}=Ik4L`GqxMO=8+un_${^LazroPZcnq8Y#T8J5xbewC)(2e7avM zH=xn^hIIHwotLr8`e>zw1Q3YBK6toQ;Vzv_OKN>uejy90Wwgg|P<2Zc_HJ#@Kl_~9 z2HN}iDNFZXzIkxc6v@LE?;oGJAlg^8z{P)$bf>mho}9y#j4%urN;Sn1G8{onKFLYK zwWUJQ@maw>+y+PIWi?g4bVeHXZyY?w*8A>WnS)z)gMlBjHAUzFQgc$wPir1Ut>Tlh zWqjI*xHq>a`H1B%MFrH1u{~Z%uZ@W3RDSHBWtWgx*_6Og6}kT!{xY-d16Q76yycd= zvHet*iSirfoV(C3&#YB`s|HN(!yvtp@mc<50*K?SE#hfULJrK#JT|nr>23FT2K|KY zHrPz9$`YF&qmU+Oqs*hFa(` zjx)RbLx{vPQPkW6K%oO@zHpIrd@v3T^Qm%D5UYsR0h4mC|CehzDLPF{Gf2qaybi?Z zDsr%c)vH-<{-?hJno$3iK-E`}@C@t+PCq=9Xfc&3i@$L?fTgM^pi1u`9;ESzlpJn7xuZ^ILY^%2%h~GT(YZ>&X0ZfHT~*=8B?EK<`?_q zGNAax#dtQR(VyG;3OLrZyYhI*Srw3`7_rft_OH_s2IY`^&`6jRqYhbQNpe#bt7em? zZVUimCOVaqC{#Qe-BKwI9-*xaGoJ4dLHd!Je}@Hekb_HbKRWT`y$x1}r)h}qGD%)) z$Yj{=98(`0RF}fjVm|`tnba6*_1lp{RoiGiSEu+lV?Pn^y7bq`hi?DmJSBa8f*F#~ zW{DN~`5T}1ZIYRpFqG>y)8QS5!fqiu8>T1G^-J0|Z!av)Ithl@YSe$#m?s))V?$w1 zN4f}RcFF#(u2LV+P8oP|t5p0F%=GU}A{9 zqsng|x>@xTI`+bxe>J|+^f#k$PvT?eP!v@@y)x59c_&70S!o8Y`_NPeE9@WInofGpCNqzm9rk>%NjEED z^_}gRIi|wo)DyqszhGP5+1}CdFwHBy-=M8HU%`93vbCIjoo^LdBEMI9T;1ksk==do z$;q|JNC&2KXJ!mt88oxF8Ew=jZ~x3#1Y_@Wx>YD^II**+!K+%8G3_rd9Ux9vcQaX7 zJpEJ>BTErrke8H=H=uj8WLmBG0WL4w%VFZ6mjkHV4ytmBzZ{~lXCEZ6_WIj)A|M!! zf&YPEPAA#_8nDsw98qJBNE}UNGu1q`KO7Go&@HU)-tacp&xg)gT{zXH^=~hF03-S* z#kvBoI6>{DNcSfIPfj&Ofqs4h>J9AweAP|s;Tia@8*As|(YtHce|&kBQ@h?6pqOr! z*_$i$r3mJJqX2lpQP1e{#BGZo6M5Wj+^bCSm9h=p$pBJf)%xO{PPtQkR}tKx@+Vtm zTOnW*MPv9gqrEDiJ@@PVdjY>U-t|@%MIEEa7z+k*LO3yK+i`Q{8vCy8kWk;Sy$@Ij zE5Cnul{f;cG_h*ShmmjT|QnDS2KrZE-)wJX$uC_pSGLI=B+OUP3~ix>Rj$^Sxwm2THS{^t}Q zU$k=40^P)^od7X>GOqanJm$M(pEypf9KLupj$5h+72zRhtI9Jl{2N=zg6GcorIzTI zU8K87Sk0=-Y7I)LcKbgxiW~o%4uRDUB#h*JBR&|D<=wK>01X^lj#oR^WYj-WQpnfl zL8&FBF(SWYbNz>L=p0L*i=%Nf)xe%_@CaV$WWP8-bxH1nQX;eHKRDsOVd0;A5!^pA zfTFhZI&m0HLq8IZ#ADDl#r1WjeBT)#OSRtwIv(I0ip{c`B+qSw>ku1bwErKAt&(kM zc%0Oj<6gw~%N)g?zC6V-n6=Q@!TX02kr{u?Jm3g z^-*2DcdNdtoZP&5>C)o40nyvu8~XfPFllha$EqtcrpMQJR~}JoS{pyUkD#2WQ358sgxgg`i`}r%3cw-3Vc_MS&tj5?FJsr^<1Uubo*JzL4CD*oHfW zA$jgxVWih+b82{ePNgn1W@>cQ^jHRX4ykl8+`|i^?8~;pq>u?gq{t$8oWhIIY$+QV z`!EIC33)2}|M6P9am;D3ayxDyWpURPv0s(#0GHcd>KV1Se-Pn5rm# zchp9rpFMkDKb%61lUh5~smbJZoiVAW*&RdmgEJ@OE*3j|pzlu@1d#?pkp!dAF*$Yv z!vrWA%ULfx@p~7+Xub5py$J^6;EnOBkOdIW6TmM_2N3-DI6V3PagLLYicmxl)GZLqjv2_Ws=_cDQPoZ9I+^Jbu@^&7 zKF)Wa4nW&uJqCNDD&6?)!uP7=_J-w|)0n;NuD#hutv@aqrlZiSE7#Ki=Qn#cT3~-^ zn{*CWdNB*MpD(i;_-A|mvpk#LkLFaZ#=_q}5(|=5)(COiL4PAXE3CwrR{R(Sctbs> z(u2Uee$9QatYw}^W}wrsX<)&aGrw7FW9MXoqFD*7wIxa=PSzZ$`l6BEU-?)9SLr*P zx@st{Vb`z&kuc1Wgq?JQf}U2Ey2zib0GXfa7(c`!MjhQz#HMa!k_>(*_sBL%s8bho z>k(=wpFuKrfBQ=P?kK+`rxn1pD+1?g;R2rg5`Vi0O{1m}snpae1WhAKh+-mjoIjn- zsAaH4ktu?#7e3QOf~j=LzW-tioc#8`{~Q?4a&)ba-9zO(lgk^&^`xXgWsqfgjQEhd&=2 zvU(bQi8@Etd+t3N+J+Df=AFU^#f1}{DnnrkVpEMK`U(DtT^{v$jeItKrS5^^R2$;r--T1Bsa)fcC(Y4{K@sllNbTRJcfGaL(mbuTA38-I`~ zSUeQ-;oO8Ln)sMwv48UfOASiDUEbUUbN;Jpx#QnSY2>~5$LB=LKwWs#iGo{|T<2%> zC&iiqbbpe^2wC3(HXn^uWiPrM?a14aFR&lRcsw`IajdmmtF}`P7Og4ZkJ1rYdA|A6 zuL-6XZI9Y$2cW~0!;sF>pf`p8`pL9#f$7upa8v5iFpsxc1cBC^U{kQ@j*Uji)}T@Y zbciwvez+Ezkhc>e(w2vNysH_(9;S?9eXNcC5ec`De$JN?*XP&a<`=DpG)DWdz0N#8 zCDC2OM%^~SX8U^8NoK$FYfxZuQD94PU|>-TSCqi>3gv775K$Yrsc0om;_osr*lm5} zSQQl({G7rftF(2v5_Yqoh18sxr$jtGO}c2_f|ESkhcj<=Z- z7_UTv@t&hrwvI=B;RTCuZsks>$3B@GsH2G6N5`jBV}B*Py~bA?mQ&TXJsl8))Xly_vLcx--H^+gmIY(+ z3mGr;f5C0p|KM5g2=t`xhey}PbA-28cqawVG^9nb8fP1pilmJ&S))ilU!@trHM0@m z%a9&2?!b2YzaPuu=UW7t7#^KlMlJQE>3-W9pq3T%U*{9jJB4DB{qa+JRphH**m*Hh{IvEr7qfI#&eg@1eKqVd*AeSl z5$D36cmCuAaeAvhCQ{>w2!|-K)((gZEegAQ^^C}c&c_T8x?|veJlj1n?BXxaR(HX9 z4Bz!zJ^cO5T+r(E5IE5vAb{cm{A1Yygp@`9=CoQ8);!mP3 z=db8>oD}cl?-TD&=~(dwU-Ll4VBKwGHr!<~RCf#Uxw)N#XHY*fDVUz3hX5tjT#!T+ zhn|-)EnF87HL1{)DuOC6? zD0#{N1!JICCPf(-rJyh(S%k4Lmva`6V(K((aeomtO^qcII2smJ@^8rt=|OH>iU=V6 zt80c(9mYnre5YBiiYfv{Xj=&rmof_>0@I?~@9=r!8Adb%l_M@~PFjM7Ytglck40Z( zLzOus1Y>-X(5=G*(K0wjmFu3YQ1k^cNeBwm>mDv?Uzql$Z=@DO(#fy;uMDima`pAt zfimNt-=)e7h6{qoo7XH|g-KLJoHg(DWEO9itq0%AY?{A_Y@uuM`Mqo6iOP+-+J8#}t-6w|1S*4v^CE2Jp3L zeetZLI`^ln+z$?|;D~*UzT-S}l2D-b@#4-Pv6*2$HLEsupVhmkCeY$F9W*ZT)D@CC zH2XxZfFHkHBMu6mWT_DA-%3;*ECn>z~9gN{UXI8^R?hV)j`T(qEm<~DkO)O8kPW~3SrWbLtgCv{f}_Knl&9nIT3x> zj0J*mjhU0YDI)CmBuHj?VTpmsGg&-}_oS$MjlSdlC<98AntkYuka!7%&u-g+`@@;A3TgLHqiZ7O75uRP-oa8=(t<{*e^xa^z%W zXM`UNPd#L$zb1H zUTo`L+H_i<9rU_@fq(qFSRACRiCRLoaQNZ|tu0**OL0a=)EM4(6gs8={bSF2o%CZ4 zeSx^%vNvwj3yCXOblY~hCCZI{jZmTpTFb`NovbACi6KOt6XZBsl4c=`8#YJmNX4*f zyh~|rf1Eoio2#g&kIRCm{zf_C?S37%so+2+jBVAj>BxQ?bBxh6#lB4}k5 zT{83c$XCn6puZUlrm z#4=SgW?38Q6tomUP!i)Q%N6A`l!u_xi)F8GI^O{?g0N6D8^g$3g#*omD{F7)F)C(J za<4Yeg@n+xk@v&s30d=#cOWRr_4iR2X+7J#e-VRHy}7NvA9|BQ!Eh?Zo%>E|wb(>L zNtV32!6ozAKN*#@N89=8pi7>=4~YZghc<`ioLHiWtd$Y?Kx3wG_gV zNKi(5k}U?|BPcFa#$z!b_K4@5?4Gzv!s!f=_zzQ&~ zpz1_%R_;@|V4FvqXr#y3$KX38G>H+riD!{C2!DmqGe=F^=*5^JDaT&kA*@T7XH_8S zK6=-eF+*Ki>(^9=^8k^9$U`u^?!+hzkt7f)R0>2oRXi#>^9Y8{C)4qJJse0f+#MWq zv5i@uk3tCp)6e2NMEHf|%kn&hcaRiIAvw+Jawk0y5{Njmo^pN4t;qG}& zVq$7gblPe-$}-fFaG5krgP3Qvaj$48PWEGiG*6aClQ^a1Us*eo=@ciWuE-2ANenHL zM&%?VJ%Y6jk7ru*F?fN80RM}Jztc=|j%|vQrWTJDzo22Nz!9DSyu2`;b1HvyC#{rn zy^)R)NlY%A({6Mc`SlW-CqYTltCEY=ch20e5KTZ~;DF}~;_oD}iB0<5F9y8=qTk07 z`Ra$UbEI{d`RME+1q0uwTM?QDz?+V`kMe!A_WH1t=-uk=*y zsM{=Gemh^+A@H{6_hlk%i^4+SVH*iPhv>4}GQHU}!XJ?N#YF;fBFq7%;=~AL;UvJ2 z%p~w(ko(nF&p(m*(GzB0uxGs z8>h5aGw9UL((J}})R}ydl_mUnO9g2quamE-h*8Aw3goFC-FOGSr$@@?Ja5qxR#FCA zz>f1$PXt&hn57no-wN{u3IU(AOk_6Y9!y{1JG%qf4s_@PkN42-mIb)F{q6Fi?2-gX z-Dd2GxH8{WO4v=K;aZ$GjlVyGsfWPT_XMUIOzfD-tp-mOsI=+1sZ#wgES08dtlCFv zwUws@OwP1Nbd+=yUmXV;`qL;RcqH-^Nh!ogywTB_X~6#8uSoc;a#Mz|Q#q;LDvjbx z{G-JjcA|n@u6!}8%P?)E$>iaKBvcTU;X0%yPzeGXdjdku?A4UjWFv~0g4?8zFifke zISGe0a6UlnWK~O(T&aU_4w1s76C*_m!6Cp>9*Y94fY=Soj42P->N;tm>Jvb-bQhr$ zC8n7ZnYe>whq2_0l?&a&Q6KhZ?jcslYw@LBEO?X_%~FEr!#c=4#8zPhWd;Ueuu+II z6@p~a+%maT2M}x~jPM{FU_6M2K}f1o!k6sXdq~pQsUc44KP7;J71$%3cJcx_tIP#M z;20`(y{wH(Zp9#iwx33^s?W{pG5x%nA&%Jr)Gx2p{gB5Xs>M2pl3y&Dp0ma}&#Bc)iM#D>H$ zxRCq{O}LasK2-X-N0x-bvN$nP7M-=(QO*;o8a*7cCP8Dt9-@vHB}lAaoM|JPCQo%O zDliPm&o{7LCV^>kg775W;}Baks8U}b2(CP+6ACuze&LJW^F)ySSDFporNwN)EAcD9 zueV%A$v=SaS~EK}c!Q)dtG$$!lpL@37P!<+Hgh(6wc6M9VI7yee=Bw){{2m@8%-1D zkaU|@qA0HzAD0@fm?2TkJdS9!h#VU{U(;%Efylj{9S&+rvy;fcT*%7SfN79(W^~Eq zou7uw^^ehz9*PLjOtMZmaQ2L+U4b`lA|K+kcr6G5tuJGny-NMe_C=q?hRe8JQJ$1| z8HfGinWlCPo`$7Qsw?8Cn(`TsC=v_D?3fkan*qjV3B>fZ~$kd3}k+Hf|vF4AesTSJffxb3TT z%C4J>hZiOHO+N2}+P(DeCSTZx=%ut|wlxPBMgT5!;6WZ1~DLcaWre*yN`zaSWezAm)e)&lI^hS*{-$zkI?a-IoNDv$HwT+0+=W z%Kotff9B}?Lkfd}3PEFV;RCy&Fc2s&Y13#3-h}(-!eP9F8D0_2DqLSy2M)vjdEGR~ zH``K5FVp*tgTvSe>oO1w%Q07&S>{R|Qv}jwTFNjO_8Ui~($l-IxW{-C9`I#`O5>jk zgHc^3Ql_9i#4qkK&H^Cc5N0eaK0G=kTxv~COtz*+rza$tBC@CD8l@nx2+7MY zv8Go}uWFjVKDg1q@QGdGtJ({Zs$^*IFYzgJX}-RURY|E(C0-(zf~?}Kam_E0{OoZ~ zCiKoE$;_^eyTF9_K9Ii5FHaXP9rR2<0*{3-a%mNFn}wxgO+#}u$oN-6xIQXya2J&I zUfXMTh8F*V))iYNV%c^6JmdFeFL^h99kA`NM@#M-=<@*#Z(Pze3@)Rkg+NDqkjV_m z*9y}fRk?JQ8(qcQry28eFGZS$tjFloZDaayz9d%*9yhPkhzC*T3Oy4%aL?RdCs;0vfNVJ(>j4}mO*cg&X z@@8XW+{9-HUyq0r3lSKCxv-34j#jjNqKHj?cnkP`dQCu2k%ULa;5DIP#s&k$)oj&Q z=l6tr1pRkOms9DR^ZUQ%{e+k0kw?J+emOb5fde4mEg|>d5gb9=AKiR`yfLc7(QB>Z z{SvCfBC_`AzBn+@dEP32f&CsDk(f}UnMCN$w=3Xd(Hd1;Ug(C<2Hn&=@Tfm*(!GR{ z1m3u$rds#e?%cdMc2fMh1TqPvFE~9e@So!WNB;@TJI6@0$W`MszD@TJD&KJ$m0l`H z0@fV+s|@E3Q4r2)Pu}~~WS(|+!t<`9j{i9Z4rhC*DqI{meAGGRUAg<&*-peGBp4GhqsP$cm5e^BAv=k=Qt$VhP z_uDpR-@jZzw+$&3)K0%dIkTr{2Wm~?5Uf-p+RnGN!)jh$aT(P#Xq%B0TuDQD_-e= zLsZD-i*^?|2cPucjm50A4OK8y`))?w(E0;e-}BIJ^Q6D)ZfR0i3nu<8L+Ev=D-6pa zg4-eM_&*(RK|bZ24(&LWM)%rUR+LKq<^Th|wOcB@(36l#r|zl>Kty>TwI7nmnk0U@ zT_eNuagzA3^I)JHl$dj$J=`+8y1{)w#&~=JwW9FbT`x4|05v~F`m$f881d->+Y8NA zz;WD9a=PM{f}r|UNl4{#)O!)??I(E1QElWs+TUcB%zPtwt!~vX31u4 zbQ_XjL}i#>%+3=hhL(i^)6ItW2Elleo)yrdEel{tir)QA;tFJ38DG}1)c?J|V7y4m z3h2?6MPejH-xYx*Ip1YE`w^m?2nJgm7@g_Z!A<1?G!axj_&NM(!Hp@icsH(c~e?#&&WGhC6@vG$fGxwi-;(vo)f{Of;Blq*uJ zcPH5;dG>tP&o*?v>Jf(bxDcFt)!=X77 zv^bud#I8=ViuM-;@$Bf1oWx&pzo?k>qUVeW9Rt)C7>|Vy#P5Xf8rbwd#hN@kaDMi? z{jx_2#vj5g<{yHLqiCWiI>Cx&P%t=31)$5OxFu$AU=uX@s&wgIwlBB;*a_voOSfe& zRr;p2Y&wqf(Cho_Q^VJDTSu#&-!_&t?|+W)@Z+26)5bn!LQ8@|i$b114Ji!?E}3Z1 z@}aqcc@~}^=9NTdGY~Og6Y)g`%}X~_W-b}EOZsE@P#ZCV7Tn9%+xX7`8d@3P}Zsk%}2 zjk3GV|Bfy?cX1eD$K4N5oW!}|-JZcs<-F=jkrA0ZY(Cl3ipW);S}^EXEHc|R_d@nB zP@h6S?!b(;U7_)@n-RpZCmuKQy7MQxzSzEsAC)+R-}CCYD2Wi~TSGW&i;u8NTz<1h zQ0W&9D6y?6t;ym9nN1$AFpKsR&y$>*0T329I5_z7Gc6}_&VTdwKjVzBE403cmuF~7 z(!4r`Oxm39dpzjD%kSp5oKr-iOtsy|*}Uh+o3+l(R>{(;LXrb3#JkiSX#fc5A_`9=S~qBiQ-;-+3-Hm|qv`^B>kUiYzU$-h zK2{&IgVnJCBSEIF5%FJ}YrIP@(m zgy_V9r(*2smw1$V^Cs5!SRY|KatukEIg|GE-QgMYuUaqPUnO`;CCc4!d%AGfRsx2i zpi1kr5AE_lQ%b|*ID59JR5zq-cT>twzcuocsu2Jz)=(IU9M4PcN&408?4|VU9v~Omxef_s-proYQ zZz@$LklX`VZ_ax}9=}l@q_>ax_xjPPI`5ki5HNkM*nL|u6xf@0dG&Aa!FZFYP&ZNU zeyDt5`LEf$^)L6oWdwotS-2jS&fWt&C^(C0sO~GT2!cqUd{1YlX43Ecy`)qNgBxF0 z-xF<_eXUyyPM1;k-^ve&;d;3x+}g4~MF~!PDcKq^A#Gi8YV`PoLRCU#QPD_9hWb0x zeb*LgxW{iGAWldal|}S-I+R^qFyN!KRZC%uC3-!LDydR%5kT{@Eq~UC$JDe#61%};6k}~0 zNG@(!J7nrSVFJF9B^$0-T-(e5MIx;=<5j{aIAQCb)itbYEs`sZfIWCimttRXCyAWO zP~{j>4So5ihN&|h#y88TH7F*cCnR4judLj&An5er|BIEIB3kr;S;Mn<*OY6=H zc=WA*wQ#}t7oW;jg{~~go$-C3ap3!ezH#RlIQ~5C+vWU#ZXR1+<96@%e?%<^haDH5 zkCe0f3ltpZq$cWR);kkw7-KGqulasW^T#K&{ZXt>EHSrueR4g?);7~ zLG0kqy>xe|j$s@X>|MgT55e?~&+cq@2TSmiwo1Lmy$1S|GM!^3o;w_ob|q#>vI%z? zKkKEhr?`I)!=LT^lM`bDnX+YbPEQ)m@_oCfZLbi&6Y6u$5~=VT4lN!5jQ=gpmFY!G z(qBjlE89~vCipmltk3x9ACayv&-GsYAt?#Ki@`Ij!c(~gy$JjdEz1$@(3#7!m)$on zm|08|rLl&v6PV4Dy|qg?kTGW>A8Jdv@rZ-^mr_O-sk}uVOJ?jBc2X4hp!%wXwIR?c zLT7^{LWwqBS*}W{wBK!>vu7s%VOQnVW#H@5puE7qyk>*;*AcZV+SDDE4i{V0jBrsi zYHKfb&^k!%jfl4 zq_KP)eB_KZFwgiPtTHsTe5yhFrxEoaHvC0=c6?Oe|3}eb`LJ zwx@bD{YzSQCC0dhQ;iG*qjrlqAb4DT@I)-+hF0Ne9HiXxmI zOaMZdpia$4X5r4TAaD)`@wm4j6Yq;$G{tciY9l$i>+go3XyS*kYG3 zT61r70{`x4kWZ|)cWjP9`?JW#VCHv4M{*~)gEE`7MzRcYPb67=A}fn)v9urWfZKD` zMT{!sIgFyOM=4csmL@WGtAt_P1L~TWc`$h_W13I9ENXWa@ z*R(z%Aa=u#eqOnf7Mp*ay>Y>+EhRV0yXX~ALig$Jz8$UA6Tt#+yb;eq!6pnJWws)R z{(ukkCd`FfS9(ya_`qLmiHC-JfWwsAa#^giH=x6;Wr7<1VC4aWJRTXPWD4&WqV2E= z9A1j07Odbe6|$er!kyRhcv=HLDW25Y>DY}M_mM;#Z;r@*l30CD!>xZ@zL~*^I2}nr z@OB(5P_0xN+m|59377*%^7d$Lm?RXD0tRf`uKf$b9$iNJL*4n zp5XeJ0f7qDs1J$?(Hi?ueSb+Q0J9~3x_nfb=%cTg+{i92HvZ&R=ilbKU0a{x z__WMZpTL5kG53F5JCx*OiqqbV3S$G*#=Z*=wRxrq*kPE8eWY8u5e}ESO+(fWciFB5Rz;=636?6C3gS|ts=&&vY!tPVuEGh1+DT9$*)R>`((?w= z{s`ih7D9nj2hdv1&6|{_B8UndaPX>g8R<_Eo^>7(rVNarKM=DgK;Gv}e_a${otZW# z4rNyw94c|R+J{wAw@{hHVQMzMLRe@* zIw;Zfw$hABkPXlR^jyk4$`oMsy9V^ck=yl`A2M*PS6YBzA&UA1RB?=$Il0$WOi z^Eyg*AHM;>R#R9ChOJhM=w-fELphF!l%WXzAO=SnufAXqHxxo9Pvf$u`7bX;lanhS zia0M}3WBL}@M$hQ?Yp0Lkesx+{<9KWSx&`A??S!5hIsjlt1JZ&#u$TpRMV{ zwxg`Fx%e2h+r9z*E2h?nqD*FX;21*+{Bp~7a{K71J3GaUAMx&u14`~PTJi8?*+@pL zp>g@H3yW{f(=KUy;S*dC7+BD1(C&INyXJnd!haH{kwNcU2tZ)pL zM_B)OywQj0JN(!G`CNa0Lw}=$?e1J9W4A8%bIa&v$*WYsY)Qj}um;&oDf{>?quMxd zgDsx~r+w9E_lb^Tt>&z4RxTQp^)6C2_iSDM*jU)EPeB6&n`(Be7VH!-qntX01Z!-I z>*6}#dPMv9homiWN6}X$rc% zI!2t+m24K{wPCk1IH~@rXJLhW>l1)-baH@@t1pmrQU)XnND7S6wAPjY9z$&ksji6r zI&ENgMO=!>yCBfys9vP$@psXLgqDPc$4$DOGk8_lU#srV++P@uvw7YLV=x&Z`*80x z2aS!VChsrrQrGqiuMXzij++<}8d?&faq;ibEHYP{0=)}TOmStq*G~Cb79CP;S2K74 zEv+=tH%@Lym=PZX_v{?%+u%x&s5Hd++^M8J;EUa}yg?M$e|@OB-bp-IP>L3^ocy=9 zfn3E{zdzkB-2g{GxW5TWBRH{y0RrDTO>5K_#c21eTn_8@=n99mU-e-5`&L|(ai)JU z5Lf4V2Jn3+)pW%sx_cTUBa9eI!cfk?XK1e{vmHCN5Yd^z5Z&`9QC)FX;Mc8*EfJ9( zD$O=Q35VHcM6@vOyeE|vaS3IS5~$6Y9($K-)W_?^{wfFXp9U93CfDh`h`gVX&6Uhv z?paHU8Vx?zq3sfyBuhfFey#bI3~bCzJej>|Q__P`JD2;eXeh;lyJrT!pz_ynu=5o5 z%Xm_9Q7qjyxwjsc5^JBciI1a@9N62L@??YZcqoYUKB45I+&_MF9gonW;GmL8{wyyE z2~`i?knoSwy{oD+8zjZUj@~Oe!7iCIf~-lX=(8b*oT*g6XBTkd;n`VGhHBB5gs@;Y zeD^sRgnGt>m#)iMkh6Wo#)ZB7>FfV>^pbw&HdY-2Rm}URCzM`%2;4#FWc%0V|E-rk zTRXZ<Ll_ zwxE(QQJiV>0M;3sxEnWeJ(=$LrV%M+ts-sAH6&oZ@%tUtK;pJ6@nLor_`X%J(UKa% z_uR%z!&w8PVAegchrdrsvY*M2;jd4x7@#>rjPnX1;FBebFlzLaGY>L z#ciDNjmtSbC|jJQE<)zi5Cu;8vdkdM0`sxi(~*h#BD_dcbaWfpDbA}ZahL#JjYI@b zs0odnJNeuC{1>W!EIQen~O|b=oLbU-LT!)*Wr&f7RVm^2{?H@z((}yR%Nk;v0 zCUnn3`>YEteGuJJc|!jur(ptamVKjc+IL=2(m~*epj1V{*MG5Ro+yAGO!&L6F>qwr z*)h{dP1IQh5qs5YW|bft78n$_uQ0XkkCnfy>n-1+MdjKd@>G^OQfDkceVPp%f(Goi zo(Dv^R_*^i@n~^m0P0t{fBVQXea!3`+($Fky_pJzhQR_C+#%jfzZxQO?RYg+ushKn z!({We7tR*gG5U8b=zmE8Rhif4294j(l{DY8Bbbcg5C=m3C3ftt->g`~yx9*uMBlLp z=X6~JlIG{%D=UV=KnP3`Dyb^;NaHiZVQ04lP*F{#o+Fa-EZt?7{`z4{Vm`1QxZRpw zN99 zLd3aEk*&8~6h$jW@@fIZI4-9LE;BRDodHNV?qJFLcG~WIM;`=;zU{L;4M7T8q_4cz zv*C9STDqc`EQeI|w1A0e>*^RdAEt7m_O&8*O@^$+HM=FdH`cbej?2L?YioOx#XUF~ zfuO$!X5*74Zrn}azOFS*-i5U8jo=UnitVgjmp0Mghf7z%T27HH9ml@c;94i~jl?N} z+E3Y)PYSUbN~ib2KPvhPT!6ZEvGiW`jM8{;4rJGBn2lKC9;;D{A`ktMy&t=h0+eF; zUSn#QfJieM_7SNy;n@AzZx4|zZKaC6a+X3$VA>uf+raabSrn6AO5hlbtQZ31u0RtU zxgyeQGmfQNk(+Fc?4?G!pl>Pv6XDU+-bml%+!YEEZJk$u(w_q1P8!HASfwz)?4)`Z zWkt%X=Hd-_vF&NSiLrBsDT`>qTW~is+keMShN=Fkjg21=%$p{Jn;Wau9dmXTbHC+O zFUrke6^X*?5{}VYX~*J)7F9+bcJaxz)Bfic?ws7ro>FF~Bf-^xTgXI8q)#LUmH7H~ zFF1aC^0{fwRQG?Q=GU6F852I6ZBfqWVjOL5=AA4sF;kBfX+T; zJk`RdjU~72*@N4vG^45-<_Gw%oO^aQ4@>R{!0Gw zqx>d`+g)3`n}(aH>aLN?z#?ss%22hy>VnXjS-va_wdT@ zvl%uxlORPNCH8KjIfTAL9wO3oH{7vEMkMNr7ZFAH0f!hSc_D`zk9YNV(68R<#=}Lt zRmxzC|K$+GfN-_Z;wQ-!ESZzw7}ElhCaZE#V0C+Htm_0PH=qWrRMjoR?9VU)?zmN~ zlEu}s<%#V2u;abE<18BI&yVT3>$~Tqi84refPS<$r8gA?QikkFm1(ez@n%C}XCBb+ zU@XqJDdb|YYSq}du^Z{#A3*JQG7Hb6n^S-RB~p=U063rH>Y*5RQ>w>AJqtVglEgpk zJj7?cJQf?$e@ zl0tDJ_MK}`?k&Hab&1T7%bI0X?e3KzQtIAppNdZr(526`bbeYA49*e?J~#0A9Uk(| zy&ASC6(SqW1G6=v4k4z48>u8I!6UsW{z=%A_%JypJSrLuOL`q0 zu9k!@+*{((r8cgrJwl)M%+c3h67`;9wcCpNeauZqxro&$LH@B(o%OfKUP`QuEz9>oCzEbK!qFQ%)*Cj-q{-KgyaJ^nJKsJfId&J_XXm(# z2fn+)Sx2%X5?1D$jM>@7+T4KkZ12N%OJ~1zXvY<&Y+5iqc-F7>6R^7^Tha>oreE9} zoIpxpf=;4-)*(ql8g!c^f@MuTmwM7ZopEHhxdl?KyaN&f#7yktV& zuai9cBVtmXKuo7vD(vnv8DhF&;^6aR+eNA091u*5Qc}AkeFuK&CQbBPZ-fWsEO;qt zTI!!F>nYxVE|DxGOOZ)Z>Fu=0MHZEp(h9uh9?5YS-R8b;X*vm z=ZFT~r<9}aSSUA6!P&(h`m-W^Es@Z4Dz=dz<$N+q*S0E$_8%!fn)WQ#YX^Tqq!2=A zHnik8*M=GS4Y$fKrd+O*5~gJwnf!Te*B<4DQ^t9duidVZE<(2TA^0%avO`6KNk(rD zo*glg3demWB6BEB0|o2RhK5KuQi!bIOYGF>9S7;>cvm1q4|1k_=&{ z%-QT67Do%nOQHBv=}cI?^z@4b$mWqWu5`F1hLn4_hwe6=Fmsv5~tL{($iaAm?i{R5Ebd0_cI)$r?3rC9!_4_Mzi#qa- z6c_FgrV8I&PP;xSd7QWj(;|kU6mFUUn(x%AxstCJ7S!+!oX#4q#V|G zrTIv4;cAgnc=t%^wM_p-433n;!1~Pek%Ap-3izXRzF@m^q#}V2la^&qWgPZcq$wKX z2lM)9e{-1s(CY21rL&LR*NXUzD~plQr>Wa1+n+7DeEA-SU%MmTTQ2!*mcCs}#Nb?G zKw?NK`c`Xi)6-b98?GRqW7_DBAG8I&SyN7^hA2@&J7M;zf%-(Chpb7!vGXp~cB(jv z-Rkg7))%28B3u5c;F>b=XuqT*R|Bg8Om#ZRsvSpeJiH_H{ISK+>5!BRMve|0-NI48 zsM0@{nBTRIF7v8%G#ylY^A9IC&o+Gd@%#$I^9)O6+49lrM|7bjJ7@!_c_FkoTEiifLvF`W7a8SRK_ zl!iCF(^}$S56YaR(A0VMFd^QN(F#gu@h<`gHuj!V5DSqvI#;RNiD>2EUTumVd@qxb zwd8)#6Yt{m7t1Edc#2xNSmxBk*3CW|)$~>-f0Wf2U3Fcr|JJ+aNm2_~=vaeu^miX- znLLWNh8{_yrZF|aF{{aCgvqQ)Q+V4iTlX9XEk8v_r0htxloP?m{|so-3YtTk>fGH& zHq5nFHx_iCNbdsEKgz$>r8T-UNgpc1vQGM}hWi#{hsr4@V6Cx5w^lAKU0-Dz*08p+ z%5nzQQXngpHyMoaRcXw567jvi6h29I!uI(u)ym;G^e{@{sQx^m=309};m z>7Stp=D!-LJ3Hz7?Vnwf6Gfk{ta`%SD7!Ckcepu&=;(1i8<3vDF99D_>)AB&J(1@O z-QH4kGi>`qe~UfVWw$!R1S=S~K#PU-7ryGZOF`o2%LGE$ur_pc@4I-psKOZ5+Z$%A z@RPz^bH*JMsb%e2i<~MO2i`K)6H{1EPnhY6q+3}1C1ORuZ@&e|#3i8U2~Nt8D1>}5 zPA_BfxI2d7!~GN9$ zNsQlY%W||6%DX*~aLRD3j}bC%_XS?GbC*`m6hkyl|1f-4KNV({(O66U+*!Rz$nzkw z;k3RO!{D;*Vwd>a2p!hQ!fZK6XB&3X>TnUnj4B+u-$^KnqsI5JPd zaaCyo={IS0y_14$gszc~Mkz9*WutOkT-4URK~jXb@09oDLQp8m^~$}){O&D2cAAoN z`{emMET2ejv39Er z;upe;v^FHfiYN6B5>7S(*nU5UV>AFb8A_6sFc@ES0Y-$IoU9OHUe0Ue^l}reCpelj zH9$075C6deyL)qB?j_lOKEjy{F(32EB52)1r zr-$56mz3}YFbYahMx7CF^iR*wo7cYCcswBl2B4DNEEm)d9)jZgf?F z?uCxt`*gTSbBlBNpA-kAZe4O&xl5YTrQ1|vkMLxI0<*l+`sCWpbw#ag%(RH({;i^>0keNUraFEGbHS#WpFeiDl~BDOF1og- z+ch?* zvwPmzt*J2w7*=gH?P1w?eJ3nJt*cT_> zgEH+xrJI%nElCCq$3t}G8TO0=LdTF^F*t+=GBWJCa&>=p1~Ex;xB1koTumvI8luUA z%I{wDa6+WJCxBZ3kQw=oe{ZBG-yCH}K#@5MV{B6h_PGc%qDEdV-ccGMP#{4@R28!# z8cG(%7p44$Uv}@ilf99b zrzxJIh4x4C(xvilT@x4e^(aicW6U}vb<)z^9b6Rb&+@%V`W;y%G6sAUMQrCIZ}FZtVdH5|EY$|eDjOH zJ)(lOzv_O?oyo(+Q=Klmc58Z>sBg zc>MW5&8kt;)yT~|`iuoPr(OWL;Wg-b{S0r6u4yhW)6KyoTv@+< zVEuT^InOi2M%X>i0oUl1Ll^A}&%dnP5YBm4#4X}I<%Vs@eDg!adj9JqIvQUuTXvvi z-?A+k0_Vw)(39x!?NzH6G&)qRLz}^#xL>~%oQqngHHhj(^JX4}J$~S^Pf3edk2KMr+qIyCp(-Ou&X&ujyFTgtIma8k_X|Z=vj$dFkN( zs9YT5KK0;&Sp^G%=irm^5{`F*6nUVBwSLmJi^OsEe?5liKo+A0Wv- zDYkwL;Z!irfzUtEw6C%xT0s0 zW9z0KlDNHT>n$mvh}MS-u_uw*ZI(W`yJpASr5JC)J@w2&TZ0k;}mgz9mzPl;p1DZvYNq?c%r@u=@s! z5Q0su!yt%2foIFS1MTZ+M5$bQ9d4F{VSyv-O(j-LEvBI;A59_5qH>A>Mj!~r5C(=~ zv%Vp?n@+??ChEr?cKVKFp|0T@80S`gF<5Twc_{l&2JrJrlC0bSxh(P1VPp9#Gdl*x zk%#g(kiSNq#JG08oFMBPB*e^byOxD!1XR}YE0P;?SfKOlpjLWykDJdTnw&BDWa)&R2GXfr2}d; zvZo;L@(|%dY-~)-W!})8f`TodHUz~j$tP1)j5MuJzQxTGik<%9|C!$h?y66Uq(m3H`e&& zPxsB={X880sFuy<=&2^)1W^NbcNfk)wP+-MR|Nt7*k98I8yKvzyB-EL@c69!nfqR{ zaFjJ&v2$A1L2NmeHLYJa{rL|cKVglrRQsyFhR!g5*hpvG{=5CmpNP($7L*eJX*CsO z`2Dj_Z7Ty$-${Of!5EG2&)*uVt^7Bwmgl<|LNOrd&d8Xe6TVO(LA z@)~74@W(IyACHMKi=lQ?J5fbo&E`_g7|9f_QCu*m+yBN}pyW0l()aFxWqEkyq1B~E z>4mT(VTZ%cFKgC`>{Qk*)R%wq+#7pzj7}zi> zl9GwLdA=@F$6l|)I(wC%Z;n6_LleXNBrR2X>^Un*Hv)f}#N>`$B(A19aaWiYE=prn zvKA^wCV3#`35nZg`!2768hEN0%Y_tp2thpD8&b5xLu>lp9&)H3#$hIs_t&RQAuuhD&`qh9V_9ys=7 z;tH-MH*oXdGg?0Q8SBmAT;oO~aeG-}!L}8m@iED%1vSn-b7S`C(-QL5jRpl&R2KL< z`OXU(TtoJnoq%XlFNE*FD=bzUZZ?a3C(yj>C zvScg=xtP07nP2np5;q%3c&pi-VYVY**gQp3m9{Jfy>bJab_7a0*u)Yk6f7`v=8Ina zaMEm^_~!2gk%5%TY(i}b8r>O_Xd4+}@8n>9T>XR$t97ophL)L|ewHl?1@gXgE3f9y zQMtJk{QdJX|M37~@}}*6>s@;G4{pqoX3JAhcBc2xuWs`C;`LzS|5DWA5ID*kV{yxW zOnPzo09ZcCNc}8}q)G!K51{r=HbJ+dGM{qd^?~QH2tqm z7j&&HT@GG;_4SF1^~kcG6ffWjc1N5IX$|4R~c-_4nDI`XX!>kzkdA^Gb|pV%UmQJ0l&Fz8Y&m1R&D#R^`Y zFAxeYf-a7zJl&c>SwPuFj&#a_ ztMR{3usqTqOTe70axNqrm=kUP;^_w7Xmzn`?dB?d5ASZOj~dfl=`HC02hgow`=z2Y zjtzhr5oEML_gR&I1Ic=wN*0t+>rE^E+~~P@^vaM0NS|*h+G^IF&RKh<#!x7SYLJu{BOQOfE&@zRTKa4;u54@=i|-a~PFtmg{xQNGBt3Q(~M zzyC^f2KJN7(~?TZTUYstl*peTFXf*j^+SRpz{`<(EzbC=W!Jp?} zS*B2AwqD>bkKSjf`@n6JWXJN~hXDYMBv~4s(82bi0oG9L(e)*9=)OY-5cE6D1PLk_h9&S3`-qFa{$Kizk6fSMD zs&9LEFZ?q(?T_sDT>T2MGf8D}$~FEeGKF2uKbTd3u0o`f)_d3uOj{%MS>df4lTb5t z+>%WsUgEPKc5|4uw_a1^dU56*677FJ3hT1km72DUf3klxk#7?_lT}uy+{?d2rgW$U z7cz@b)nQU(YQb`RS9x-2V(YEet%{xd-JP6#o-sRP0nP-Rv+waKU0B} z{=Oa8C6GY)6OUB3E5_xKvdeI(5Kg;5E|pLGOB>^oOTp5_eCTRW>FXr9?>XaLk>jbh zM@Zd&JZodzYYP(l(=a(5I zXEkvNJEU@gUv0$^rb5SU<5e@?G0PZllPk7Bhbg1)4`b8`x0ct&t!BPwme9Zb-nxRr zJ)f`itR@XG$5zjssB6EeE{0);C}LP8!7kf^z;#mr=j`Pfzs~6I%MDh4naph65Olya z9p@@)UqmsSzgTCwMO*6EHJ_6jP3W35SX;;>1A#)DqNyAf7( zuDQke9f_=Jg_!6`p7bXEVC>ZBRk z*>YPGap!5eby|%*P#zX(|E%8(qw}N3ABZL0X`37ZrZ3k^R6ZI0x(s7L&{!}~zq-b4 zKHb=`hjG5q;dATHbHyz!>o^{)CR#(kozR;fB9fm(@!| zaBx}6t{K@2%d1mTsL`{F%`FS6r<;5BF20`cm47mAeQ(`<`w%SMDyy-6vVO6^Y2|KOZc5=00TiaaSP$u_vG2+9g5-bG(=(vZmkv}@Nl%_$pEQT)7ebAk@GZ&`X}-R9P&NJef@Wya{9 zUFq&rFhj7k@G|2;QzW=eWxMY9c$T|zdBVEnNPk1Uah znkaPl=mLQ{1@6$90Jr~O4%}KaU&C|@Fz36}8nl##J|{zIa!vVEU8G#O2~vNh{!%P*I%G=g&teC|yYO&YU@$jLOjAe{`SdTjsYc z6`{W!*1J`QHqTPU{iMxR7HY~5`2Rh%{J=x|O;!?F59j5CF)?ckn;U5PD#F@LwAjS^ zF*%M;b^7WK1Q!?3AMo!9?(y#`v}*>bRtal)0Edj9LVrM!v3qpNe$_=-3vp8^0iA5p zW$be%WD|TK>P#?~LV20soYK^hn%V)Sxo^w;ZgL6p5d>)9bw{1u^2W9Z6Zs9r%@*l-OpF z4menRLVZhf!zxkCC(O1{u4$&DcS z6R&VnajE=E^q=U5>8Ns!rWJ$+#G9ec^2DtPqo1M=8+nCWTtOvTXX?4T;VY<;&4*CrZ2o>=z) z%si)WEozAF9=QkBo%m==T01X>z0NMANEHDFrGEL5oO)f|&$m-p?R=Vn^Lvu9RE71VFKSr6$ z+QdTpOQW>?4}S+{#Sj@Wu9ASo=`b;#=KlsX7tPAZr# z@@{pbJU7WC4F4D|W%WnS&UIh6DJY13O6bcC#p5O}`CFCorCWKTM8`3zfU>>siC~X9 z;gv`E&0}e)_U7g1nU^-IWABiw>gO2ejf+}RO){@n-#SG5>VRv8d@P>qJ?#!&iD7(u z4P?)D4HXUp>YCqs53fLrU4;_@vNL%uDK`3*fMsI{daiQU=^m$_|1+rPM4qb@mWrj- z7%gs#qUY~3IWdIS8zZXEZ$Hnm%sA6^(U#lx|Bk^~ zs;P#2=DNlOwBIo;$Q)(`TvU3-Z8CJ(-Bm7)_TtN;W9ZhWC5Ntcuv7_Hgc%o|Ykp>} zzYSE7j9`bG?!UO>Y}P;i2o)?2em!w4*z*7@^gs`6wt?XWJ5>=2D2}T|%V3LR?oT`x z<2s0OPQk%ZH(A{k6haQjvr4s}STOFAH#m%%o5 zHM#@sh#Ax*3&s&0%$R6mfVT~IWwv^b97J2uX=`bF?g_dRfSCu7{`~Bl2#Mg}@4dGF zWDzM9u#rhZC+gt|m(TLU1fnkbHPA)q|hFiC~{(+VK z!K>KA#LK04(Ra@4z&o0|QE#s6Sn(2EUkBXPya{~Mu8q1In63zT9q1Ik!6<3DucNSy za-2LDJH-*K3@4jU2IQrA(6Ibr;oZXJ8=L2lMpDkCl+6s9ndVN(c)*uRKG9EtfjBXnrV98OvY?8hj4GlK(`!+eDdi7cNCLHe^M*g&m`QF{qzB;)< z7b}^Nnl`pBF4b&vOg^A5^2A|DIUYQ2ufo5@yBt=_;DX<5LA8(KSgL|wW){0fcnS)R zgPz6zn(HbQq6xOOS#?-5!e6E zWj-cR>x{E6&v>Dl&fb!oVlY4L{c)V{skoX>@?(=A7Ex#@-&TB*qG1wFc0d0(G5!~+ zr|L8Kc~|JJCu4%lE7yOTx9gX&Z*kj3ZpVKc>+mgf+r^(kzm5I!Tb#xluTK1CpE-8@ zxA;IGytMG`|8YNE_yoT*AR()7Ukv;9{xrd*f~*{&FcW-w88{qRdOx03jJL%3uEiI| zS=Rb$DZ+NCp_YrD7rGjfFr63IsUcN^dfhOVuJ>Gbp{rBPJXnvIuDf=2c&b}i$AXld z>UEnw=l%H?y6eGT@7X$komT6w{TB7K^K{;q$#td4u2=#_6@Ja4!Z6|@l1rN>eTmX> z$2*_;^4As>o?`6cmD08fP9+zuwbSmC@I;|v*ydQ<-o8Xa{pT6Z2TXp?uS=(om*};I zD8F2QZ>EMrki^}E3eZ_k>AXF)wxK7T-MZ+rcwk$*k4OKj3Z=TZ*+3>LhDM z8ry0e%s=nPE^qo3himA39xKms{fHyY6;+DzNIV`xgVFXb-VB})Su66}1D wFtgX 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 literal 0 HcmV?d00001 diff --git a/generator-web/src/main/resources/static/vendor/font-awesome/webfonts/fa-regular-400.eot b/generator-web/src/main/resources/static/vendor/font-awesome/webfonts/fa-regular-400.eot new file mode 100644 index 0000000000000000000000000000000000000000..acd09edf88322a326d9f8415a643d0d07a87cb30 GIT binary patch literal 31004 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 literal 0 HcmV?d00001 diff --git a/generator-web/src/main/resources/static/vendor/font-awesome/webfonts/fa-regular-400.svg b/generator-web/src/main/resources/static/vendor/font-awesome/webfonts/fa-regular-400.svg new file mode 100644 index 0000000..fdaf256 --- /dev/null +++ b/generator-web/src/main/resources/static/vendor/font-awesome/webfonts/fa-regular-400.svg @@ -0,0 +1,363 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/generator-web/src/main/resources/static/vendor/font-awesome/webfonts/fa-regular-400.ttf b/generator-web/src/main/resources/static/vendor/font-awesome/webfonts/fa-regular-400.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1a09a74feb12d5fb4af504f829923cfa2c61bc6d GIT binary patch literal 30776 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 literal 0 HcmV?d00001 diff --git a/generator-web/src/main/resources/static/vendor/font-awesome/webfonts/fa-regular-400.woff2 b/generator-web/src/main/resources/static/vendor/font-awesome/webfonts/fa-regular-400.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..4cd7573f573d95f5006f021946d34971c67e1412 GIT binary patch literal 12176 zcmV;BFK^IyPew8T0RR91056aL3jhEB0C+e6053cM0RR9100000000000000000000 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 SA5u;qalMIESQEuF0002MZLOIA literal 0 HcmV?d00001 diff --git a/generator-web/src/main/resources/static/vendor/font-awesome/webfonts/fa-solid-900.eot b/generator-web/src/main/resources/static/vendor/font-awesome/webfonts/fa-solid-900.eot new file mode 100644 index 0000000000000000000000000000000000000000..6154a9c68cfe075077941446be87e07194d2f90e GIT binary patch literal 97828 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 NdTNmc3vjks|2L{AwOjxI literal 0 HcmV?d00001 diff --git a/generator-web/src/main/resources/static/vendor/font-awesome/webfonts/fa-solid-900.svg b/generator-web/src/main/resources/static/vendor/font-awesome/webfonts/fa-solid-900.svg new file mode 100644 index 0000000..516446c --- /dev/null +++ b/generator-web/src/main/resources/static/vendor/font-awesome/webfonts/fa-solid-900.svg @@ -0,0 +1,1413 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/generator-web/src/main/resources/static/vendor/font-awesome/webfonts/fa-solid-900.ttf b/generator-web/src/main/resources/static/vendor/font-awesome/webfonts/fa-solid-900.ttf new file mode 100644 index 0000000000000000000000000000000000000000..e2b9c72d1fca3149f7ea99ef0a2181ea62386804 GIT binary patch literal 97608 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 G*8dHOkDTuS literal 0 HcmV?d00001 diff --git a/generator-web/src/main/resources/static/vendor/font-awesome/webfonts/fa-solid-900.woff b/generator-web/src/main/resources/static/vendor/font-awesome/webfonts/fa-solid-900.woff new file mode 100644 index 0000000000000000000000000000000000000000..1730c2d2dc342b47726a5d09029c19832d8c7c16 GIT binary patch literal 46284 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�OelHRIVW`^d4pKypylzU|P}lZO(`#EC!C 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 0 && j < len ? [ this[ j ] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: arr.sort, + splice: arr.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[ 0 ] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // Skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction( target ) ) { + target = {}; + } + + // Extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + + // Only deal with non-null/undefined values + if ( ( options = arguments[ i ] ) != null ) { + + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject( copy ) || + ( copyIsArray = Array.isArray( copy ) ) ) ) { + + if ( copyIsArray ) { + copyIsArray = false; + clone = src && Array.isArray( src ) ? src : []; + + } else { + clone = src && jQuery.isPlainObject( src ) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend( { + + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + isFunction: function( obj ) { + return jQuery.type( obj ) === "function"; + }, + + isWindow: function( obj ) { + return obj != null && obj === obj.window; + }, + + isNumeric: function( obj ) { + + // As of jQuery 3.0, isNumeric is limited to + // strings and numbers (primitives or objects) + // that can be coerced to finite numbers (gh-2662) + var type = jQuery.type( obj ); + return ( type === "number" || type === "string" ) && + + // parseFloat NaNs numeric-cast false positives ("") + // ...but misinterprets leading-number strings, particularly hex literals ("0x...") + // subtraction forces infinities to NaN + !isNaN( obj - parseFloat( obj ) ); + }, + + isPlainObject: function( obj ) { + var proto, Ctor; + + // Detect obvious negatives + // Use toString instead of jQuery.type to catch host objects + if ( !obj || toString.call( obj ) !== "[object Object]" ) { + return false; + } + + proto = getProto( obj ); + + // Objects with no prototype (e.g., `Object.create( null )`) are plain + if ( !proto ) { + return true; + } + + // Objects with prototype are plain iff they were constructed by a global Object function + Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; + return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; + }, + + isEmptyObject: function( obj ) { + + /* eslint-disable no-unused-vars */ + // See https://github.com/eslint/eslint/issues/6125 + var name; + + for ( name in obj ) { + return false; + } + return true; + }, + + type: function( obj ) { + if ( obj == null ) { + return obj + ""; + } + + // Support: Android <=2.3 only (functionish RegExp) + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call( obj ) ] || "object" : + typeof obj; + }, + + // Evaluates a script in a global context + globalEval: function( code ) { + DOMEval( code ); + }, + + // Convert dashed to camelCase; used by the css and data modules + // Support: IE <=9 - 11, Edge 12 - 13 + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + each: function( obj, callback ) { + var length, i = 0; + + if ( isArrayLike( obj ) ) { + length = obj.length; + for ( ; i < length; i++ ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } else { + for ( i in obj ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } + + return obj; + }, + + // Support: Android <=4.0 only + trim: function( text ) { + return text == null ? + "" : + ( text + "" ).replace( rtrim, "" ); + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArrayLike( Object( arr ) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + return arr == null ? -1 : indexOf.call( arr, elem, i ); + }, + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + for ( ; j < len; j++ ) { + first[ i++ ] = second[ j ]; + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var length, value, + i = 0, + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArrayLike( elems ) ) { + length = elems.length; + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + var tmp, args, proxy; + + if ( typeof context === "string" ) { + tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + args = slice.call( arguments, 2 ); + proxy = function() { + return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || jQuery.guid++; + + return proxy; + }, + + now: Date.now, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +} ); + +if ( typeof Symbol === "function" ) { + jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; +} + +// Populate the class2type map +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), +function( i, name ) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +} ); + +function isArrayLike( obj ) { + + // Support: real iOS 8.2 only (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = !!obj && "length" in obj && obj.length, + type = jQuery.type( obj ); + + if ( type === "function" || jQuery.isWindow( obj ) ) { + return false; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v2.3.3 + * https://sizzlejs.com/ + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2016-08-08 + */ +(function( window ) { + +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + 1 * new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // Instance methods + hasOwn = ({}).hasOwnProperty, + arr = [], + pop = arr.pop, + push_native = arr.push, + push = arr.push, + slice = arr.slice, + // Use a stripped-down indexOf as it's faster than native + // https://jsperf.com/thor-indexof-vs-for/5 + indexOf = function( list, elem ) { + var i = 0, + len = list.length; + for ( ; i < len; i++ ) { + if ( list[i] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + + // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+", + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + + "*\\]", + + pseudos = ":(" + identifier + ")(?:\\((" + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), + + rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + identifier + ")" ), + "CLASS": new RegExp( "^\\.(" + identifier + ")" ), + "TAG": new RegExp( "^(" + identifier + "|[*])" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + + // CSS escapes + // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), + funescape = function( _, escaped, escapedWhitespace ) { + var high = "0x" + escaped - 0x10000; + // NaN means non-codepoint + // Support: Firefox<24 + // Workaround erroneous numeric interpretation of +"0x" + return high !== high || escapedWhitespace ? + escaped : + high < 0 ? + // BMP codepoint + String.fromCharCode( high + 0x10000 ) : + // Supplemental Plane codepoint (surrogate pair) + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // CSS string/identifier serialization + // https://drafts.csswg.org/cssom/#common-serializing-idioms + rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, + fcssescape = function( ch, asCodePoint ) { + if ( asCodePoint ) { + + // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER + if ( ch === "\0" ) { + return "\uFFFD"; + } + + // Control characters and (dependent upon position) numbers get escaped as code points + return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; + } + + // Other potentially-special ASCII characters get backslash-escaped + return "\\" + ch; + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); + }, + + disabledAncestor = addCombinator( + function( elem ) { + return elem.disabled === true && ("form" in elem || "label" in elem); + }, + { dir: "parentNode", next: "legend" } + ); + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + (arr = slice.call( preferredDoc.childNodes )), + preferredDoc.childNodes + ); + // Support: Android<4.0 + // Detect silently failing push.apply + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + push_native.apply( target, slice.call(els) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + // Can't trust NodeList.length + while ( (target[j++] = els[i++]) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var m, i, elem, nid, match, groups, newSelector, + newContext = context && context.ownerDocument, + + // nodeType defaults to 9, since context defaults to document + nodeType = context ? context.nodeType : 9; + + results = results || []; + + // Return early from calls with invalid selector or context + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + // Try to shortcut find operations (as opposed to filters) in HTML documents + if ( !seed ) { + + if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { + setDocument( context ); + } + context = context || document; + + if ( documentIsHTML ) { + + // If the selector is sufficiently simple, try using a "get*By*" DOM method + // (excepting DocumentFragment context, where the methods don't exist) + if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { + + // ID selector + if ( (m = match[1]) ) { + + // Document context + if ( nodeType === 9 ) { + if ( (elem = context.getElementById( m )) ) { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + + // Element context + } else { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( newContext && (elem = newContext.getElementById( m )) && + contains( context, elem ) && + elem.id === m ) { + + results.push( elem ); + return results; + } + } + + // Type selector + } else if ( match[2] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Class selector + } else if ( (m = match[3]) && support.getElementsByClassName && + context.getElementsByClassName ) { + + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // Take advantage of querySelectorAll + if ( support.qsa && + !compilerCache[ selector + " " ] && + (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { + + if ( nodeType !== 1 ) { + newContext = context; + newSelector = selector; + + // qSA looks outside Element context, which is not what we want + // Thanks to Andrew Dupont for this workaround technique + // Support: IE <=8 + // Exclude object elements + } else if ( context.nodeName.toLowerCase() !== "object" ) { + + // Capture the context ID, setting it first if necessary + if ( (nid = context.getAttribute( "id" )) ) { + nid = nid.replace( rcssescape, fcssescape ); + } else { + context.setAttribute( "id", (nid = expando) ); + } + + // Prefix every selector in the list + groups = tokenize( selector ); + i = groups.length; + while ( i-- ) { + groups[i] = "#" + nid + " " + toSelector( groups[i] ); + } + newSelector = groups.join( "," ); + + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || + context; + } + + if ( newSelector ) { + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + } finally { + if ( nid === expando ) { + context.removeAttribute( "id" ); + } + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {function(string, object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return (cache[ key + " " ] = value); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created element and returns a boolean result + */ +function assert( fn ) { + var el = document.createElement("fieldset"); + + try { + return !!fn( el ); + } catch (e) { + return false; + } finally { + // Remove from its parent by default + if ( el.parentNode ) { + el.parentNode.removeChild( el ); + } + // release memory in IE + el = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split("|"), + i = arr.length; + + while ( i-- ) { + Expr.attrHandle[ arr[i] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + a.sourceIndex - b.sourceIndex; + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( (cur = cur.nextSibling) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for :enabled/:disabled + * @param {Boolean} disabled true for :disabled; false for :enabled + */ +function createDisabledPseudo( disabled ) { + + // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable + return function( elem ) { + + // Only certain elements can match :enabled or :disabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled + if ( "form" in elem ) { + + // Check for inherited disabledness on relevant non-disabled elements: + // * listed form-associated elements in a disabled fieldset + // https://html.spec.whatwg.org/multipage/forms.html#category-listed + // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled + // * option elements in a disabled optgroup + // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled + // All such elements have a "form" property. + if ( elem.parentNode && elem.disabled === false ) { + + // Option elements defer to a parent optgroup if present + if ( "label" in elem ) { + if ( "label" in elem.parentNode ) { + return elem.parentNode.disabled === disabled; + } else { + return elem.disabled === disabled; + } + } + + // Support: IE 6 - 11 + // Use the isDisabled shortcut property to check for disabled fieldset ancestors + return elem.isDisabled === disabled || + + // Where there is no isDisabled, check manually + /* jshint -W018 */ + elem.isDisabled !== !disabled && + disabledAncestor( elem ) === disabled; + } + + return elem.disabled === disabled; + + // Try to winnow out elements that can't be disabled before trusting the disabled property. + // Some victims get caught in our net (label, legend, menu, track), but it shouldn't + // even exist on them, let alone have a boolean value. + } else if ( "label" in elem ) { + return elem.disabled === disabled; + } + + // Remaining elements are neither :enabled nor :disabled + return false; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction(function( argument ) { + argument = +argument; + return markFunction(function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ (j = matchIndexes[i]) ] ) { + seed[j] = !(matches[j] = seed[j]); + } + } + }); + }); +} + +/** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== "undefined" && context; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = elem && (elem.ownerDocument || elem).documentElement; + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, subWindow, + doc = node ? node.ownerDocument || node : preferredDoc; + + // Return early if doc is invalid or already selected + if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Update global variables + document = doc; + docElem = document.documentElement; + documentIsHTML = !isXML( document ); + + // Support: IE 9-11, Edge + // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) + if ( preferredDoc !== document && + (subWindow = document.defaultView) && subWindow.top !== subWindow ) { + + // Support: IE 11, Edge + if ( subWindow.addEventListener ) { + subWindow.addEventListener( "unload", unloadHandler, false ); + + // Support: IE 9 - 10 only + } else if ( subWindow.attachEvent ) { + subWindow.attachEvent( "onunload", unloadHandler ); + } + } + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) + support.attributes = assert(function( el ) { + el.className = "i"; + return !el.getAttribute("className"); + }); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert(function( el ) { + el.appendChild( document.createComment("") ); + return !el.getElementsByTagName("*").length; + }); + + // Support: IE<9 + support.getElementsByClassName = rnative.test( document.getElementsByClassName ); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programmatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert(function( el ) { + docElem.appendChild( el ).id = expando; + return !document.getElementsByName || !document.getElementsByName( expando ).length; + }); + + // ID filter and find + if ( support.getById ) { + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute("id") === attrId; + }; + }; + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var elem = context.getElementById( id ); + return elem ? [ elem ] : []; + } + }; + } else { + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== "undefined" && + elem.getAttributeNode("id"); + return node && node.value === attrId; + }; + }; + + // Support: IE 6 - 7 only + // getElementById is not reliable as a find shortcut + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var node, i, elems, + elem = context.getElementById( id ); + + if ( elem ) { + + // Verify the id attribute + node = elem.getAttributeNode("id"); + if ( node && node.value === id ) { + return [ elem ]; + } + + // Fall back on getElementsByName + elems = context.getElementsByName( id ); + i = 0; + while ( (elem = elems[i++]) ) { + node = elem.getAttributeNode("id"); + if ( node && node.value === id ) { + return [ elem ]; + } + } + } + + return []; + } + }; + } + + // Tag + Expr.find["TAG"] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else if ( support.qsa ) { + return context.querySelectorAll( tag ); + } + } : + + function( tag, context ) { + var elem, + tmp = [], + i = 0, + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( (elem = results[i++]) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See https://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( (support.qsa = rnative.test( document.querySelectorAll )) ) { + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert(function( el ) { + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // https://bugs.jquery.com/ticket/12359 + docElem.appendChild( el ).innerHTML = "" + + ""; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( el.querySelectorAll("[msallowcapture^='']").length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !el.querySelectorAll("[selected]").length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ + if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push("~="); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !el.querySelectorAll(":checked").length ) { + rbuggyQSA.push(":checked"); + } + + // Support: Safari 8+, iOS 8+ + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibling-combinator selector` fails + if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push(".#.+[+~]"); + } + }); + + assert(function( el ) { + el.innerHTML = "" + + ""; + + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = document.createElement("input"); + input.setAttribute( "type", "hidden" ); + el.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( el.querySelectorAll("[name=d]").length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( el.querySelectorAll(":enabled").length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: IE9-11+ + // IE's :disabled selector does not pick up the children of disabled fieldsets + docElem.appendChild( el ).disabled = true; + if ( el.querySelectorAll(":disabled").length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Opera 10-11 does not throw on post-comma invalid pseudos + el.querySelectorAll("*,:x"); + rbuggyQSA.push(",.*:"); + }); + } + + if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector) )) ) { + + assert(function( el ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( el, "*" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( el, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + }); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully self-exclusive + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + )); + } : + function( a, b ) { + if ( b ) { + while ( (b = b.parentNode) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { + + // Choose the first element that is related to our preferred document + if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { + return -1; + } + if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + return a === document ? -1 : + b === document ? 1 : + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( (cur = cur.parentNode) ) { + ap.unshift( cur ); + } + cur = b; + while ( (cur = cur.parentNode) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[i] === bp[i] ) { + i++; + } + + return i ? + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[i], bp[i] ) : + + // Otherwise nodes in our document sort first + ap[i] === preferredDoc ? -1 : + bp[i] === preferredDoc ? 1 : + 0; + }; + + return document; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + // Make sure that attribute selectors are quoted + expr = expr.replace( rattributeQuotes, "='$1']" ); + + if ( support.matchesSelector && documentIsHTML && + !compilerCache[ expr + " " ] && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch (e) {} + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + // Set document vars if needed + if ( ( context.ownerDocument || context ) !== document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + (val = elem.getAttributeNode(name)) && val.specified ? + val.value : + null; +}; + +Sizzle.escape = function( sel ) { + return (sel + "").replace( rcssescape, fcssescape ); +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( (elem = results[i++]) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + // If no nodeType, this is expected to be an array + while ( (node = elem[i++]) ) { + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[1] = match[1].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); + + if ( match[2] === "~=" ) { + match[3] = " " + match[3] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[1] = match[1].toLowerCase(); + + if ( match[1].slice( 0, 3 ) === "nth" ) { + // nth-* requires argument + if ( !match[3] ) { + Sizzle.error( match[0] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); + match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); + + // other types prohibit arguments + } else if ( match[3] ) { + Sizzle.error( match[0] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[6] && match[2]; + + if ( matchExpr["CHILD"].test( match[0] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[3] ) { + match[2] = match[4] || match[5] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + // Get excess from tokenize (recursively) + (excess = tokenize( unquoted, true )) && + // advance to the next closing parenthesis + (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { + + // excess is a negative index + match[0] = match[0].slice( 0, excess ); + match[2] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { return true; } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && + classCache( className, function( elem ) { + return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); + }); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + }; + }, + + "CHILD": function( type, what, argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, context, xml ) { + var cache, uniqueCache, outerCache, node, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType, + diff = false; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( (node = node[ dir ]) ) { + if ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) { + + return false; + } + } + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + + // Seek `elem` from a previously-cached index + + // ...in a gzip-friendly way + node = parent; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex && cache[ 2 ]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( (node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + (diff = nodeIndex = 0) || start.pop()) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + } else { + // Use previously-cached element index if available + if ( useCache ) { + // ...in a gzip-friendly way + node = elem; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex; + } + + // xml :nth-child(...) + // or :nth-last-child(...) or :nth(-last)?-of-type(...) + if ( diff === false ) { + // Use the same loop as above to seek `elem` from the start + while ( (node = ++nodeIndex && node && node[ dir ] || + (diff = nodeIndex = 0) || start.pop()) ) { + + if ( ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) && + ++diff ) { + + // Cache the index of each encountered element + if ( useCache ) { + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + uniqueCache[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction(function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf( seed, matched[i] ); + seed[ idx ] = !( matches[ idx ] = matched[i] ); + } + }) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + // Potentially complex pseudos + "not": markFunction(function( selector ) { + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction(function( seed, matches, context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( (elem = unmatched[i]) ) { + seed[i] = !(matches[i] = elem); + } + } + }) : + function( elem, context, xml ) { + input[0] = elem; + matcher( input, null, xml, results ); + // Don't keep the element (issue #299) + input[0] = null; + return !results.pop(); + }; + }), + + "has": markFunction(function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + }), + + "contains": markFunction(function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; + }; + }), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + // lang value must be a valid identifier + if ( !ridentifier.test(lang || "") ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( (elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); + return false; + }; + }), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); + }, + + // Boolean properties + "enabled": createDisabledPseudo( false ), + "disabled": createDisabledPseudo( true ), + + "checked": function( elem ) { + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); + }, + + "selected": function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos["empty"]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + "first": createPositionalPseudo(function() { + return [ 0 ]; + }), + + "last": createPositionalPseudo(function( matchIndexes, length ) { + return [ length - 1 ]; + }), + + "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + }), + + "even": createPositionalPseudo(function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "odd": createPositionalPseudo(function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }) + } +}; + +Expr.pseudos["nth"] = Expr.pseudos["eq"]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +tokenize = Sizzle.tokenize = function( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || (match = rcomma.exec( soFar )) ) { + if ( match ) { + // Don't consume trailing commas as valid + soFar = soFar.slice( match[0].length ) || soFar; + } + groups.push( (tokens = []) ); + } + + matched = false; + + // Combinators + if ( (match = rcombinators.exec( soFar )) ) { + matched = match.shift(); + tokens.push({ + value: matched, + // Cast descendant combinators to space + type: match[0].replace( rtrim, " " ) + }); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || + (match = preFilters[ type ]( match ))) ) { + matched = match.shift(); + tokens.push({ + value: matched, + type: type, + matches: match + }); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[i].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + skip = combinator.next, + key = skip || dir, + checkNonElements = base && key === "parentNode", + doneName = done++; + + return combinator.first ? + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + return false; + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, uniqueCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching + if ( xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || (elem[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {}); + + if ( skip && skip === elem.nodeName.toLowerCase() ) { + elem = elem[ dir ] || elem; + } else if ( (oldCache = uniqueCache[ key ]) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return (newCache[ 2 ] = oldCache[ 2 ]); + } else { + // Reuse newcache so results back-propagate to previous elements + uniqueCache[ key ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { + return true; + } + } + } + } + } + return false; + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[i]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[0]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[i], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( (elem = unmatched[i]) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction(function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( (elem = temp[i]) ) { + matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) ) { + // Restore matcherIn since elem is not yet a final match + temp.push( (matcherIn[i] = elem) ); + } + } + postFinder( null, (matcherOut = []), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) && + (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { + + seed[temp] = !(results[temp] = elem); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + }); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[0].type ], + implicitRelative = leadingRelative || Expr.relative[" "], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + (checkContext = context).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + // Avoid hanging onto element (issue #299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( (matcher = Expr.relative[ tokens[i].type ]) ) { + matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; + } else { + matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[j].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), + len = elems.length; + + if ( outermost ) { + outermostContext = context === document || context || outermost; + } + + // Add elements passing elementMatchers directly to results + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + for ( ; i !== len && (elem = elems[i]) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + if ( !context && elem.ownerDocument !== document ) { + setDocument( elem ); + xml = !documentIsHTML; + } + while ( (matcher = elementMatchers[j++]) ) { + if ( matcher( elem, context || document, xml) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + // They will have gone through all possible matchers + if ( (elem = !matcher && elem) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // `i` is now the count of elements visited above, and adding it to `matchedCount` + // makes the latter nonnegative. + matchedCount += i; + + // Apply set filters to unmatched elements + // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` + // equals `i`), unless we didn't visit _any_ elements in the above loop because we have + // no element matchers and no seed. + // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that + // case, which will result in a "00" `matchedCount` that differs from `i` but is also + // numerically zero. + if ( bySet && i !== matchedCount ) { + j = 0; + while ( (matcher = setMatchers[j++]) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !(unmatched[i] || setMatched[i]) ) { + setMatched[i] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[i] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +}; + +/** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +select = Sizzle.select = function( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( (selector = compiled.selector || selector) ); + + results = results || []; + + // Try to minimize operations if there is only one selector in the list and no seed + // (the latter of which guarantees us context) + if ( match.length === 1 ) { + + // Reduce context if the leading compound selector is an ID + tokens = match[0] = match[0].slice( 0 ); + if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && + context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) { + + context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[i]; + + // Abort if we hit a combinator + if ( Expr.relative[ (type = token.type) ] ) { + break; + } + if ( (find = Expr.find[ type ]) ) { + // Search, expanding context for leading sibling combinators + if ( (seed = find( + token.matches[0].replace( runescape, funescape ), + rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context + )) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + !context || rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +}; + +// One-time assignments + +// Sort stability +support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; + +// Support: Chrome 14-35+ +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert(function( el ) { + // Should return 1, but returns 4 (following) + return el.compareDocumentPosition( document.createElement("fieldset") ) & 1; +}); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert(function( el ) { + el.innerHTML = ""; + return el.firstChild.getAttribute("href") === "#" ; +}) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + }); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert(function( el ) { + el.innerHTML = ""; + el.firstChild.setAttribute( "value", "" ); + return el.firstChild.getAttribute( "value" ) === ""; +}) ) { + addHandle( "value", function( elem, name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + }); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert(function( el ) { + return el.getAttribute("disabled") == null; +}) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + (val = elem.getAttributeNode( name )) && val.specified ? + val.value : + null; + } + }); +} + +return Sizzle; + +})( window ); + + + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; + +// Deprecated +jQuery.expr[ ":" ] = jQuery.expr.pseudos; +jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; +jQuery.escapeSelector = Sizzle.escape; + + + + +var dir = function( elem, dir, until ) { + var matched = [], + truncate = until !== undefined; + + while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); + } + } + return matched; +}; + + +var siblings = function( n, elem ) { + var matched = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + matched.push( n ); + } + } + + return matched; +}; + + +var rneedsContext = jQuery.expr.match.needsContext; + + + +function nodeName( elem, name ) { + + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + +}; +var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); + + + +var risSimple = /^.[^:#\[\.,]*$/; + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + return !!qualifier.call( elem, i, elem ) !== not; + } ); + } + + // Single element + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + } ); + } + + // Arraylike of elements (jQuery, arguments, Array) + if ( typeof qualifier !== "string" ) { + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) > -1 ) !== not; + } ); + } + + // Simple selector that can be filtered directly, removing non-Elements + if ( risSimple.test( qualifier ) ) { + return jQuery.filter( qualifier, elements, not ); + } + + // Complex selector, compare the two sets, removing non-Elements + qualifier = jQuery.filter( qualifier, elements ); + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) > -1 ) !== not && elem.nodeType === 1; + } ); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + if ( elems.length === 1 && elem.nodeType === 1 ) { + return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; + } + + return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + } ) ); +}; + +jQuery.fn.extend( { + find: function( selector ) { + var i, ret, + len = this.length, + self = this; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + } ) ); + } + + ret = this.pushStack( [] ); + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + return len > 1 ? jQuery.uniqueSort( ret ) : ret; + }, + filter: function( selector ) { + return this.pushStack( winnow( this, selector || [], false ) ); + }, + not: function( selector ) { + return this.pushStack( winnow( this, selector || [], true ) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +} ); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + // Shortcut simple #id case for speed + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, + + init = jQuery.fn.init = function( selector, context, root ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Method init() accepts an alternate rootjQuery + // so migrate can support jQuery.sub (gh-2101) + root = root || rootjQuery; + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector[ 0 ] === "<" && + selector[ selector.length - 1 ] === ">" && + selector.length >= 3 ) { + + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && ( match[ 1 ] || !context ) ) { + + // HANDLE: $(html) -> $(array) + if ( match[ 1 ] ) { + context = context instanceof jQuery ? context[ 0 ] : context; + + // Option to run scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[ 1 ], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + + // Properties of context are called as methods if possible + if ( jQuery.isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[ 2 ] ); + + if ( elem ) { + + // Inject the element directly into the jQuery object + this[ 0 ] = elem; + this.length = 1; + } + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || root ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this[ 0 ] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return root.ready !== undefined ? + root.ready( selector ) : + + // Execute immediately if ready is not present + selector( jQuery ); + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + + // Methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend( { + has: function( target ) { + var targets = jQuery( target, this ), + l = targets.length; + + return this.filter( function() { + var i = 0; + for ( ; i < l; i++ ) { + if ( jQuery.contains( this, targets[ i ] ) ) { + return true; + } + } + } ); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + targets = typeof selectors !== "string" && jQuery( selectors ); + + // Positional selectors never match, since there's no _selection_ context + if ( !rneedsContext.test( selectors ) ) { + for ( ; i < l; i++ ) { + for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { + + // Always skip document fragments + if ( cur.nodeType < 11 && ( targets ? + targets.index( cur ) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector( cur, selectors ) ) ) { + + matched.push( cur ); + break; + } + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); + }, + + // Determine the position of an element within the set + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; + } + + // Index in selector + if ( typeof elem === "string" ) { + return indexOf.call( jQuery( elem ), this[ 0 ] ); + } + + // Locate the position of the desired element + return indexOf.call( this, + + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[ 0 ] : elem + ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.uniqueSort( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + } +} ); + +function sibling( cur, dir ) { + while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} + return cur; +} + +jQuery.each( { + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return siblings( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return siblings( elem.firstChild ); + }, + contents: function( elem ) { + if ( nodeName( elem, "iframe" ) ) { + return elem.contentDocument; + } + + // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only + // Treat the templates element as a regular one in browsers that + // don't support it. + if ( nodeName( elem, "template" ) ) { + elem = elem.content || elem; + } + + return jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var matched = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + matched = jQuery.filter( selector, matched ); + } + + if ( this.length > 1 ) { + + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + jQuery.uniqueSort( matched ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + matched.reverse(); + } + } + + return this.pushStack( matched ); + }; +} ); +var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); + + + +// Convert String-formatted options into Object-formatted ones +function createOptions( options ) { + var object = {}; + jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { + object[ flag ] = true; + } ); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + createOptions( options ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + + // Last fire value for non-forgettable lists + memory, + + // Flag to know if list was already fired + fired, + + // Flag to prevent firing + locked, + + // Actual callback list + list = [], + + // Queue of execution data for repeatable lists + queue = [], + + // Index of currently firing callback (modified by add/remove as needed) + firingIndex = -1, + + // Fire callbacks + fire = function() { + + // Enforce single-firing + locked = locked || options.once; + + // Execute callbacks for all pending executions, + // respecting firingIndex overrides and runtime changes + fired = firing = true; + for ( ; queue.length; firingIndex = -1 ) { + memory = queue.shift(); + while ( ++firingIndex < list.length ) { + + // Run callback and check for early termination + if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && + options.stopOnFalse ) { + + // Jump to end and forget the data so .add doesn't re-fire + firingIndex = list.length; + memory = false; + } + } + } + + // Forget the data if we're done with it + if ( !options.memory ) { + memory = false; + } + + firing = false; + + // Clean up if we're done firing for good + if ( locked ) { + + // Keep an empty list if we have data for future add calls + if ( memory ) { + list = []; + + // Otherwise, this object is spent + } else { + list = ""; + } + } + }, + + // Actual Callbacks object + self = { + + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + + // If we have memory from a past run, we should fire after adding + if ( memory && !firing ) { + firingIndex = list.length - 1; + queue.push( memory ); + } + + ( function add( args ) { + jQuery.each( args, function( _, arg ) { + if ( jQuery.isFunction( arg ) ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) { + + // Inspect recursively + add( arg ); + } + } ); + } )( arguments ); + + if ( memory && !firing ) { + fire(); + } + } + return this; + }, + + // Remove a callback from the list + remove: function() { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + + // Handle firing indexes + if ( index <= firingIndex ) { + firingIndex--; + } + } + } ); + return this; + }, + + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? + jQuery.inArray( fn, list ) > -1 : + list.length > 0; + }, + + // Remove all callbacks from the list + empty: function() { + if ( list ) { + list = []; + } + return this; + }, + + // Disable .fire and .add + // Abort any current/pending executions + // Clear all callbacks and values + disable: function() { + locked = queue = []; + list = memory = ""; + return this; + }, + disabled: function() { + return !list; + }, + + // Disable .fire + // Also disable .add unless we have memory (since it would have no effect) + // Abort any pending executions + lock: function() { + locked = queue = []; + if ( !memory && !firing ) { + list = memory = ""; + } + return this; + }, + locked: function() { + return !!locked; + }, + + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( !locked ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + queue.push( args ); + if ( !firing ) { + fire(); + } + } + return this; + }, + + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + +function Identity( v ) { + return v; +} +function Thrower( ex ) { + throw ex; +} + +function adoptValue( value, resolve, reject, noValue ) { + var method; + + try { + + // Check for promise aspect first to privilege synchronous behavior + if ( value && jQuery.isFunction( ( method = value.promise ) ) ) { + method.call( value ).done( resolve ).fail( reject ); + + // Other thenables + } else if ( value && jQuery.isFunction( ( method = value.then ) ) ) { + method.call( value, resolve, reject ); + + // Other non-thenables + } else { + + // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: + // * false: [ value ].slice( 0 ) => resolve( value ) + // * true: [ value ].slice( 1 ) => resolve() + resolve.apply( undefined, [ value ].slice( noValue ) ); + } + + // For Promises/A+, convert exceptions into rejections + // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in + // Deferred#then to conditionally suppress rejection. + } catch ( value ) { + + // Support: Android 4.0 only + // Strict mode functions invoked without .call/.apply get global-object context + reject.apply( undefined, [ value ] ); + } +} + +jQuery.extend( { + + Deferred: function( func ) { + var tuples = [ + + // action, add listener, callbacks, + // ... .then handlers, argument index, [final state] + [ "notify", "progress", jQuery.Callbacks( "memory" ), + jQuery.Callbacks( "memory" ), 2 ], + [ "resolve", "done", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 0, "resolved" ], + [ "reject", "fail", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 1, "rejected" ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + "catch": function( fn ) { + return promise.then( null, fn ); + }, + + // Keep pipe for back-compat + pipe: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + + return jQuery.Deferred( function( newDefer ) { + jQuery.each( tuples, function( i, tuple ) { + + // Map tuples (progress, done, fail) to arguments (done, fail, progress) + var fn = jQuery.isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; + + // deferred.progress(function() { bind to newDefer or newDefer.notify }) + // deferred.done(function() { bind to newDefer or newDefer.resolve }) + // deferred.fail(function() { bind to newDefer or newDefer.reject }) + deferred[ tuple[ 1 ] ]( function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise() + .progress( newDefer.notify ) + .done( newDefer.resolve ) + .fail( newDefer.reject ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( + this, + fn ? [ returned ] : arguments + ); + } + } ); + } ); + fns = null; + } ).promise(); + }, + then: function( onFulfilled, onRejected, onProgress ) { + var maxDepth = 0; + function resolve( depth, deferred, handler, special ) { + return function() { + var that = this, + args = arguments, + mightThrow = function() { + var returned, then; + + // Support: Promises/A+ section 2.3.3.3.3 + // https://promisesaplus.com/#point-59 + // Ignore double-resolution attempts + if ( depth < maxDepth ) { + return; + } + + returned = handler.apply( that, args ); + + // Support: Promises/A+ section 2.3.1 + // https://promisesaplus.com/#point-48 + if ( returned === deferred.promise() ) { + throw new TypeError( "Thenable self-resolution" ); + } + + // Support: Promises/A+ sections 2.3.3.1, 3.5 + // https://promisesaplus.com/#point-54 + // https://promisesaplus.com/#point-75 + // Retrieve `then` only once + then = returned && + + // Support: Promises/A+ section 2.3.4 + // https://promisesaplus.com/#point-64 + // Only check objects and functions for thenability + ( typeof returned === "object" || + typeof returned === "function" ) && + returned.then; + + // Handle a returned thenable + if ( jQuery.isFunction( then ) ) { + + // Special processors (notify) just wait for resolution + if ( special ) { + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ) + ); + + // Normal processors (resolve) also hook into progress + } else { + + // ...and disregard older resolution values + maxDepth++; + + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ), + resolve( maxDepth, deferred, Identity, + deferred.notifyWith ) + ); + } + + // Handle all other returned values + } else { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Identity ) { + that = undefined; + args = [ returned ]; + } + + // Process the value(s) + // Default process is resolve + ( special || deferred.resolveWith )( that, args ); + } + }, + + // Only normal processors (resolve) catch and reject exceptions + process = special ? + mightThrow : + function() { + try { + mightThrow(); + } catch ( e ) { + + if ( jQuery.Deferred.exceptionHook ) { + jQuery.Deferred.exceptionHook( e, + process.stackTrace ); + } + + // Support: Promises/A+ section 2.3.3.3.4.1 + // https://promisesaplus.com/#point-61 + // Ignore post-resolution exceptions + if ( depth + 1 >= maxDepth ) { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Thrower ) { + that = undefined; + args = [ e ]; + } + + deferred.rejectWith( that, args ); + } + } + }; + + // Support: Promises/A+ section 2.3.3.3.1 + // https://promisesaplus.com/#point-57 + // Re-resolve promises immediately to dodge false rejection from + // subsequent errors + if ( depth ) { + process(); + } else { + + // Call an optional hook to record the stack, in case of exception + // since it's otherwise lost when execution goes async + if ( jQuery.Deferred.getStackHook ) { + process.stackTrace = jQuery.Deferred.getStackHook(); + } + window.setTimeout( process ); + } + }; + } + + return jQuery.Deferred( function( newDefer ) { + + // progress_handlers.add( ... ) + tuples[ 0 ][ 3 ].add( + resolve( + 0, + newDefer, + jQuery.isFunction( onProgress ) ? + onProgress : + Identity, + newDefer.notifyWith + ) + ); + + // fulfilled_handlers.add( ... ) + tuples[ 1 ][ 3 ].add( + resolve( + 0, + newDefer, + jQuery.isFunction( onFulfilled ) ? + onFulfilled : + Identity + ) + ); + + // rejected_handlers.add( ... ) + tuples[ 2 ][ 3 ].add( + resolve( + 0, + newDefer, + jQuery.isFunction( onRejected ) ? + onRejected : + Thrower + ) + ); + } ).promise(); + }, + + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 5 ]; + + // promise.progress = list.add + // promise.done = list.add + // promise.fail = list.add + promise[ tuple[ 1 ] ] = list.add; + + // Handle state + if ( stateString ) { + list.add( + function() { + + // state = "resolved" (i.e., fulfilled) + // state = "rejected" + state = stateString; + }, + + // rejected_callbacks.disable + // fulfilled_callbacks.disable + tuples[ 3 - i ][ 2 ].disable, + + // progress_callbacks.lock + tuples[ 0 ][ 2 ].lock + ); + } + + // progress_handlers.fire + // fulfilled_handlers.fire + // rejected_handlers.fire + list.add( tuple[ 3 ].fire ); + + // deferred.notify = function() { deferred.notifyWith(...) } + // deferred.resolve = function() { deferred.resolveWith(...) } + // deferred.reject = function() { deferred.rejectWith(...) } + deferred[ tuple[ 0 ] ] = function() { + deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); + return this; + }; + + // deferred.notifyWith = list.fireWith + // deferred.resolveWith = list.fireWith + // deferred.rejectWith = list.fireWith + deferred[ tuple[ 0 ] + "With" ] = list.fireWith; + } ); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( singleValue ) { + var + + // count of uncompleted subordinates + remaining = arguments.length, + + // count of unprocessed arguments + i = remaining, + + // subordinate fulfillment data + resolveContexts = Array( i ), + resolveValues = slice.call( arguments ), + + // the master Deferred + master = jQuery.Deferred(), + + // subordinate callback factory + updateFunc = function( i ) { + return function( value ) { + resolveContexts[ i ] = this; + resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( !( --remaining ) ) { + master.resolveWith( resolveContexts, resolveValues ); + } + }; + }; + + // Single- and empty arguments are adopted like Promise.resolve + if ( remaining <= 1 ) { + adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, + !remaining ); + + // Use .then() to unwrap secondary thenables (cf. gh-3000) + if ( master.state() === "pending" || + jQuery.isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { + + return master.then(); + } + } + + // Multiple arguments are aggregated like Promise.all array elements + while ( i-- ) { + adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); + } + + return master.promise(); + } +} ); + + +// These usually indicate a programmer mistake during development, +// warn about them ASAP rather than swallowing them by default. +var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; + +jQuery.Deferred.exceptionHook = function( error, stack ) { + + // Support: IE 8 - 9 only + // Console exists when dev tools are open, which can happen at any time + if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { + window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); + } +}; + + + + +jQuery.readyException = function( error ) { + window.setTimeout( function() { + throw error; + } ); +}; + + + + +// The deferred used on DOM ready +var readyList = jQuery.Deferred(); + +jQuery.fn.ready = function( fn ) { + + readyList + .then( fn ) + + // Wrap jQuery.readyException in a function so that the lookup + // happens at the time of error handling instead of callback + // registration. + .catch( function( error ) { + jQuery.readyException( error ); + } ); + + return this; +}; + +jQuery.extend( { + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + } +} ); + +jQuery.ready.then = readyList.then; + +// The ready event handler and self cleanup method +function completed() { + document.removeEventListener( "DOMContentLoaded", completed ); + window.removeEventListener( "load", completed ); + jQuery.ready(); +} + +// Catch cases where $(document).ready() is called +// after the browser event has already occurred. +// Support: IE <=9 - 10 only +// Older IE sometimes signals "interactive" too soon +if ( document.readyState === "complete" || + ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { + + // Handle it asynchronously to allow scripts the opportunity to delay ready + window.setTimeout( jQuery.ready ); + +} else { + + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed ); +} + + + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + len = elems.length, + bulk = key == null; + + // Sets many values + if ( jQuery.type( key ) === "object" ) { + chainable = true; + for ( i in key ) { + access( elems, fn, i, key[ i ], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !jQuery.isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < len; i++ ) { + fn( + elems[ i ], key, raw ? + value : + value.call( elems[ i ], i, fn( elems[ i ], key ) ) + ); + } + } + } + + if ( chainable ) { + return elems; + } + + // Gets + if ( bulk ) { + return fn.call( elems ); + } + + return len ? fn( elems[ 0 ], key ) : emptyGet; +}; +var acceptData = function( owner ) { + + // Accepts only: + // - Node + // - Node.ELEMENT_NODE + // - Node.DOCUMENT_NODE + // - Object + // - Any + return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); +}; + + + + +function Data() { + this.expando = jQuery.expando + Data.uid++; +} + +Data.uid = 1; + +Data.prototype = { + + cache: function( owner ) { + + // Check if the owner object already has a cache + var value = owner[ this.expando ]; + + // If not, create one + if ( !value ) { + value = {}; + + // We can accept data for non-element nodes in modern browsers, + // but we should not, see #8335. + // Always return an empty object. + if ( acceptData( owner ) ) { + + // If it is a node unlikely to be stringify-ed or looped over + // use plain assignment + if ( owner.nodeType ) { + owner[ this.expando ] = value; + + // Otherwise secure it in a non-enumerable property + // configurable must be true to allow the property to be + // deleted when data is removed + } else { + Object.defineProperty( owner, this.expando, { + value: value, + configurable: true + } ); + } + } + } + + return value; + }, + set: function( owner, data, value ) { + var prop, + cache = this.cache( owner ); + + // Handle: [ owner, key, value ] args + // Always use camelCase key (gh-2257) + if ( typeof data === "string" ) { + cache[ jQuery.camelCase( data ) ] = value; + + // Handle: [ owner, { properties } ] args + } else { + + // Copy the properties one-by-one to the cache object + for ( prop in data ) { + cache[ jQuery.camelCase( prop ) ] = data[ prop ]; + } + } + return cache; + }, + get: function( owner, key ) { + return key === undefined ? + this.cache( owner ) : + + // Always use camelCase key (gh-2257) + owner[ this.expando ] && owner[ this.expando ][ jQuery.camelCase( key ) ]; + }, + access: function( owner, key, value ) { + + // In cases where either: + // + // 1. No key was specified + // 2. A string key was specified, but no value provided + // + // Take the "read" path and allow the get method to determine + // which value to return, respectively either: + // + // 1. The entire cache object + // 2. The data stored at the key + // + if ( key === undefined || + ( ( key && typeof key === "string" ) && value === undefined ) ) { + + return this.get( owner, key ); + } + + // When the key is not a string, or both a key and value + // are specified, set or extend (existing objects) with either: + // + // 1. An object of properties + // 2. A key and value + // + this.set( owner, key, value ); + + // Since the "set" path can have two possible entry points + // return the expected data based on which path was taken[*] + return value !== undefined ? value : key; + }, + remove: function( owner, key ) { + var i, + cache = owner[ this.expando ]; + + if ( cache === undefined ) { + return; + } + + if ( key !== undefined ) { + + // Support array or space separated string of keys + if ( Array.isArray( key ) ) { + + // If key is an array of keys... + // We always set camelCase keys, so remove that. + key = key.map( jQuery.camelCase ); + } else { + key = jQuery.camelCase( key ); + + // If a key with the spaces exists, use it. + // Otherwise, create an array by matching non-whitespace + key = key in cache ? + [ key ] : + ( key.match( rnothtmlwhite ) || [] ); + } + + i = key.length; + + while ( i-- ) { + delete cache[ key[ i ] ]; + } + } + + // Remove the expando if there's no more data + if ( key === undefined || jQuery.isEmptyObject( cache ) ) { + + // Support: Chrome <=35 - 45 + // Webkit & Blink performance suffers when deleting properties + // from DOM nodes, so set to undefined instead + // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) + if ( owner.nodeType ) { + owner[ this.expando ] = undefined; + } else { + delete owner[ this.expando ]; + } + } + }, + hasData: function( owner ) { + var cache = owner[ this.expando ]; + return cache !== undefined && !jQuery.isEmptyObject( cache ); + } +}; +var dataPriv = new Data(); + +var dataUser = new Data(); + + + +// Implementation Summary +// +// 1. Enforce API surface and semantic compatibility with 1.9.x branch +// 2. Improve the module's maintainability by reducing the storage +// paths to a single mechanism. +// 3. Use the same single mechanism to support "private" and "user" data. +// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) +// 5. Avoid exposing implementation details on user objects (eg. expando properties) +// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /[A-Z]/g; + +function getData( data ) { + if ( data === "true" ) { + return true; + } + + if ( data === "false" ) { + return false; + } + + if ( data === "null" ) { + return null; + } + + // Only convert to a number if it doesn't change the string + if ( data === +data + "" ) { + return +data; + } + + if ( rbrace.test( data ) ) { + return JSON.parse( data ); + } + + return data; +} + +function dataAttr( elem, key, data ) { + var name; + + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = getData( data ); + } catch ( e ) {} + + // Make sure we set the data so it isn't changed later + dataUser.set( elem, key, data ); + } else { + data = undefined; + } + } + return data; +} + +jQuery.extend( { + hasData: function( elem ) { + return dataUser.hasData( elem ) || dataPriv.hasData( elem ); + }, + + data: function( elem, name, data ) { + return dataUser.access( elem, name, data ); + }, + + removeData: function( elem, name ) { + dataUser.remove( elem, name ); + }, + + // TODO: Now that all calls to _data and _removeData have been replaced + // with direct calls to dataPriv methods, these can be deprecated. + _data: function( elem, name, data ) { + return dataPriv.access( elem, name, data ); + }, + + _removeData: function( elem, name ) { + dataPriv.remove( elem, name ); + } +} ); + +jQuery.fn.extend( { + data: function( key, value ) { + var i, name, data, + elem = this[ 0 ], + attrs = elem && elem.attributes; + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = dataUser.get( elem ); + + if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE 11 only + // The attrs elements can be null (#14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = jQuery.camelCase( name.slice( 5 ) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + dataPriv.set( elem, "hasDataAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each( function() { + dataUser.set( this, key ); + } ); + } + + return access( this, function( value ) { + var data; + + // The calling jQuery object (element matches) is not empty + // (and therefore has an element appears at this[ 0 ]) and the + // `value` parameter was not undefined. An empty jQuery object + // will result in `undefined` for elem = this[ 0 ] which will + // throw an exception if an attempt to read a data cache is made. + if ( elem && value === undefined ) { + + // Attempt to get data from the cache + // The key will always be camelCased in Data + data = dataUser.get( elem, key ); + if ( data !== undefined ) { + return data; + } + + // Attempt to "discover" the data in + // HTML5 custom data-* attrs + data = dataAttr( elem, key ); + if ( data !== undefined ) { + return data; + } + + // We tried really hard, but the data doesn't exist. + return; + } + + // Set the data... + this.each( function() { + + // We always store the camelCased key + dataUser.set( this, key, value ); + } ); + }, null, value, arguments.length > 1, null, true ); + }, + + removeData: function( key ) { + return this.each( function() { + dataUser.remove( this, key ); + } ); + } +} ); + + +jQuery.extend( { + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = dataPriv.get( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || Array.isArray( data ) ) { + queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // Clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // Not public - generate a queueHooks object, or return the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { + empty: jQuery.Callbacks( "once memory" ).add( function() { + dataPriv.remove( elem, [ type + "queue", key ] ); + } ) + } ); + } +} ); + +jQuery.fn.extend( { + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[ 0 ], type ); + } + + return data === undefined ? + this : + this.each( function() { + var queue = jQuery.queue( this, type, data ); + + // Ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + } ); + }, + dequeue: function( type ) { + return this.each( function() { + jQuery.dequeue( this, type ); + } ); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +} ); +var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; + +var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); + + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var isHiddenWithinTree = function( elem, el ) { + + // isHiddenWithinTree might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + + // Inline style trumps all + return elem.style.display === "none" || + elem.style.display === "" && + + // Otherwise, check computed style + // Support: Firefox <=43 - 45 + // Disconnected elements can have computed display: none, so first confirm that elem is + // in the document. + jQuery.contains( elem.ownerDocument, elem ) && + + jQuery.css( elem, "display" ) === "none"; + }; + +var swap = function( elem, options, callback, args ) { + var ret, name, + old = {}; + + // Remember the old values, and insert the new ones + for ( name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + ret = callback.apply( elem, args || [] ); + + // Revert the old values + for ( name in options ) { + elem.style[ name ] = old[ name ]; + } + + return ret; +}; + + + + +function adjustCSS( elem, prop, valueParts, tween ) { + var adjusted, + scale = 1, + maxIterations = 20, + currentValue = tween ? + function() { + return tween.cur(); + } : + function() { + return jQuery.css( elem, prop, "" ); + }, + initial = currentValue(), + unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), + + // Starting value computation is required for potential unit mismatches + initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && + rcssNum.exec( jQuery.css( elem, prop ) ); + + if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { + + // Trust units reported by jQuery.css + unit = unit || initialInUnit[ 3 ]; + + // Make sure we update the tween properties later on + valueParts = valueParts || []; + + // Iteratively approximate from a nonzero starting point + initialInUnit = +initial || 1; + + do { + + // If previous iteration zeroed out, double until we get *something*. + // Use string for doubling so we don't accidentally see scale as unchanged below + scale = scale || ".5"; + + // Adjust and apply + initialInUnit = initialInUnit / scale; + jQuery.style( elem, prop, initialInUnit + unit ); + + // Update scale, tolerating zero or NaN from tween.cur() + // Break the loop if scale is unchanged or perfect, or if we've just had enough. + } while ( + scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations + ); + } + + if ( valueParts ) { + initialInUnit = +initialInUnit || +initial || 0; + + // Apply relative offset (+=/-=) if specified + adjusted = valueParts[ 1 ] ? + initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : + +valueParts[ 2 ]; + if ( tween ) { + tween.unit = unit; + tween.start = initialInUnit; + tween.end = adjusted; + } + } + return adjusted; +} + + +var defaultDisplayMap = {}; + +function getDefaultDisplay( elem ) { + var temp, + doc = elem.ownerDocument, + nodeName = elem.nodeName, + display = defaultDisplayMap[ nodeName ]; + + if ( display ) { + return display; + } + + temp = doc.body.appendChild( doc.createElement( nodeName ) ); + display = jQuery.css( temp, "display" ); + + temp.parentNode.removeChild( temp ); + + if ( display === "none" ) { + display = "block"; + } + defaultDisplayMap[ nodeName ] = display; + + return display; +} + +function showHide( elements, show ) { + var display, elem, + values = [], + index = 0, + length = elements.length; + + // Determine new display value for elements that need to change + for ( ; index < length; index++ ) { + elem = elements[ index ]; + if ( !elem.style ) { + continue; + } + + display = elem.style.display; + if ( show ) { + + // Since we force visibility upon cascade-hidden elements, an immediate (and slow) + // check is required in this first loop unless we have a nonempty display value (either + // inline or about-to-be-restored) + if ( display === "none" ) { + values[ index ] = dataPriv.get( elem, "display" ) || null; + if ( !values[ index ] ) { + elem.style.display = ""; + } + } + if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { + values[ index ] = getDefaultDisplay( elem ); + } + } else { + if ( display !== "none" ) { + values[ index ] = "none"; + + // Remember what we're overwriting + dataPriv.set( elem, "display", display ); + } + } + } + + // Set the display of the elements in a second loop to avoid constant reflow + for ( index = 0; index < length; index++ ) { + if ( values[ index ] != null ) { + elements[ index ].style.display = values[ index ]; + } + } + + return elements; +} + +jQuery.fn.extend( { + show: function() { + return showHide( this, true ); + }, + hide: function() { + return showHide( this ); + }, + toggle: function( state ) { + if ( typeof state === "boolean" ) { + return state ? this.show() : this.hide(); + } + + return this.each( function() { + if ( isHiddenWithinTree( this ) ) { + jQuery( this ).show(); + } else { + jQuery( this ).hide(); + } + } ); + } +} ); +var rcheckableType = ( /^(?:checkbox|radio)$/i ); + +var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i ); + +var rscriptType = ( /^$|\/(?:java|ecma)script/i ); + + + +// We have to close these tags to support XHTML (#13200) +var wrapMap = { + + // Support: IE <=9 only + option: [ 1, "" ], + + // XHTML parsers do not magically insert elements in the + // same way that tag soup parsers do. So we cannot shorten + // this by omitting or other required elements. + thead: [ 1, "", "
    " ], + col: [ 2, "", "
    " ], + tr: [ 2, "", "
    " ], + td: [ 3, "", "
    " ], + + _default: [ 0, "", "" ] +}; + +// Support: IE <=9 only +wrapMap.optgroup = wrapMap.option; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + + +function getAll( context, tag ) { + + // Support: IE <=9 - 11 only + // Use typeof to avoid zero-argument method invocation on host objects (#15151) + var ret; + + if ( typeof context.getElementsByTagName !== "undefined" ) { + ret = context.getElementsByTagName( tag || "*" ); + + } else if ( typeof context.querySelectorAll !== "undefined" ) { + ret = context.querySelectorAll( tag || "*" ); + + } else { + ret = []; + } + + if ( tag === undefined || tag && nodeName( context, tag ) ) { + return jQuery.merge( [ context ], ret ); + } + + return ret; +} + + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + dataPriv.set( + elems[ i ], + "globalEval", + !refElements || dataPriv.get( refElements[ i ], "globalEval" ) + ); + } +} + + +var rhtml = /<|&#?\w+;/; + +function buildFragment( elems, context, scripts, selection, ignored ) { + var elem, tmp, tag, wrap, contains, j, + fragment = context.createDocumentFragment(), + nodes = [], + i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( jQuery.type( elem ) === "object" ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); + + // Deserialize a standard representation + tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; + + // Descend through wrappers to the right content + j = wrap[ 0 ]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, tmp.childNodes ); + + // Remember the top-level container + tmp = fragment.firstChild; + + // Ensure the created nodes are orphaned (#12392) + tmp.textContent = ""; + } + } + } + + // Remove wrapper from fragment + fragment.textContent = ""; + + i = 0; + while ( ( elem = nodes[ i++ ] ) ) { + + // Skip elements already in the context collection (trac-4087) + if ( selection && jQuery.inArray( elem, selection ) > -1 ) { + if ( ignored ) { + ignored.push( elem ); + } + continue; + } + + contains = jQuery.contains( elem.ownerDocument, elem ); + + // Append to fragment + tmp = getAll( fragment.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( contains ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( ( elem = tmp[ j++ ] ) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + return fragment; +} + + +( function() { + var fragment = document.createDocumentFragment(), + div = fragment.appendChild( document.createElement( "div" ) ), + input = document.createElement( "input" ); + + // Support: Android 4.0 - 4.3 only + // Check state lost if the name is set (#11217) + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#14901) + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + + // Support: Android <=4.1 only + // Older WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE <=11 only + // Make sure textarea (and checkbox) defaultValue is properly cloned + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; +} )(); +var documentElement = document.documentElement; + + + +var + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +// Support: IE <=9 only +// See #13393 for more info +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +function on( elem, types, selector, data, fn, one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + on( elem, type, selector, data, types[ type ], one ); + } + return elem; + } + + if ( data == null && fn == null ) { + + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return elem; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return elem.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + } ); +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + + var handleObjIn, eventHandle, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.get( elem ); + + // Don't attach events to noData or text/comment nodes (but allow plain objects) + if ( !elemData ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Ensure that invalid selectors throw exceptions at attach time + // Evaluate against documentElement in case elem is a non-element node (e.g., document) + if ( selector ) { + jQuery.find.matchesSelector( documentElement, selector ); + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !( events = elemData.events ) ) { + events = elemData.events = {}; + } + if ( !( eventHandle = elemData.handle ) ) { + eventHandle = elemData.handle = function( e ) { + + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? + jQuery.event.dispatch.apply( elem, arguments ) : undefined; + }; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend( { + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join( "." ) + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !( handlers = events[ type ] ) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener if the special events handler returns false + if ( !special.setup || + special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var j, origCount, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); + + if ( !elemData || !( events = elemData.events ) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[ 2 ] && + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || + selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || + special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove data and the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + dataPriv.remove( elem, "handle events" ); + } + }, + + dispatch: function( nativeEvent ) { + + // Make a writable jQuery.Event from the native event object + var event = jQuery.event.fix( nativeEvent ); + + var i, j, ret, matched, handleObj, handlerQueue, + args = new Array( arguments.length ), + handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[ 0 ] = event; + + for ( i = 1; i < arguments.length; i++ ) { + args[ i ] = arguments[ i ]; + } + + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( ( handleObj = matched.handlers[ j++ ] ) && + !event.isImmediatePropagationStopped() ) { + + // Triggered event must either 1) have no namespace, or 2) have namespace(s) + // a subset or equal to those in the bound event (both can have no namespace). + if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || + handleObj.handler ).apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( ( event.result = ret ) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var i, handleObj, sel, matchedHandlers, matchedSelectors, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Find delegate handlers + if ( delegateCount && + + // Support: IE <=9 + // Black-hole SVG instance trees (trac-13180) + cur.nodeType && + + // Support: Firefox <=42 + // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) + // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click + // Support: IE 11 only + // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) + !( event.type === "click" && event.button >= 1 ) ) { + + for ( ; cur !== this; cur = cur.parentNode || this ) { + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { + matchedHandlers = []; + matchedSelectors = {}; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matchedSelectors[ sel ] === undefined ) { + matchedSelectors[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) > -1 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matchedSelectors[ sel ] ) { + matchedHandlers.push( handleObj ); + } + } + if ( matchedHandlers.length ) { + handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); + } + } + } + } + + // Add the remaining (directly-bound) handlers + cur = this; + if ( delegateCount < handlers.length ) { + handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); + } + + return handlerQueue; + }, + + addProp: function( name, hook ) { + Object.defineProperty( jQuery.Event.prototype, name, { + enumerable: true, + configurable: true, + + get: jQuery.isFunction( hook ) ? + function() { + if ( this.originalEvent ) { + return hook( this.originalEvent ); + } + } : + function() { + if ( this.originalEvent ) { + return this.originalEvent[ name ]; + } + }, + + set: function( value ) { + Object.defineProperty( this, name, { + enumerable: true, + configurable: true, + writable: true, + value: value + } ); + } + } ); + }, + + fix: function( originalEvent ) { + return originalEvent[ jQuery.expando ] ? + originalEvent : + new jQuery.Event( originalEvent ); + }, + + special: { + load: { + + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + focus: { + + // Fire native event if possible so blur/focus sequence is correct + trigger: function() { + if ( this !== safeActiveElement() && this.focus ) { + this.focus(); + return false; + } + }, + delegateType: "focusin" + }, + blur: { + trigger: function() { + if ( this === safeActiveElement() && this.blur ) { + this.blur(); + return false; + } + }, + delegateType: "focusout" + }, + click: { + + // For checkbox, fire native event so checked state will be right + trigger: function() { + if ( this.type === "checkbox" && this.click && nodeName( this, "input" ) ) { + this.click(); + return false; + } + }, + + // For cross-browser consistency, don't fire native .click() on links + _default: function( event ) { + return nodeName( event.target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + } +}; + +jQuery.removeEvent = function( elem, type, handle ) { + + // This "if" is needed for plain objects + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle ); + } +}; + +jQuery.Event = function( src, props ) { + + // Allow instantiation without the 'new' keyword + if ( !( this instanceof jQuery.Event ) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + + // Support: Android <=2.3 only + src.returnValue === false ? + returnTrue : + returnFalse; + + // Create target properties + // Support: Safari <=6 - 7 only + // Target should not be a text node (#504, #13143) + this.target = ( src.target && src.target.nodeType === 3 ) ? + src.target.parentNode : + src.target; + + this.currentTarget = src.currentTarget; + this.relatedTarget = src.relatedTarget; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + constructor: jQuery.Event, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + isSimulated: false, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + + if ( e && !this.isSimulated ) { + e.preventDefault(); + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopPropagation(); + } + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Includes all common event props including KeyEvent and MouseEvent specific props +jQuery.each( { + altKey: true, + bubbles: true, + cancelable: true, + changedTouches: true, + ctrlKey: true, + detail: true, + eventPhase: true, + metaKey: true, + pageX: true, + pageY: true, + shiftKey: true, + view: true, + "char": true, + charCode: true, + key: true, + keyCode: true, + button: true, + buttons: true, + clientX: true, + clientY: true, + offsetX: true, + offsetY: true, + pointerId: true, + pointerType: true, + screenX: true, + screenY: true, + targetTouches: true, + toElement: true, + touches: true, + + which: function( event ) { + var button = event.button; + + // Add which for key events + if ( event.which == null && rkeyEvent.test( event.type ) ) { + return event.charCode != null ? event.charCode : event.keyCode; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { + if ( button & 1 ) { + return 1; + } + + if ( button & 2 ) { + return 3; + } + + if ( button & 4 ) { + return 2; + } + + return 0; + } + + return event.which; + } +}, jQuery.event.addProp ); + +// Create mouseenter/leave events using mouseover/out and event-time checks +// so that event delegation works in jQuery. +// Do the same for pointerenter/pointerleave and pointerover/pointerout +// +// Support: Safari 7 only +// Safari sends mouseenter too often; see: +// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 +// for the description of the bug (it existed in older Chrome versions as well). +jQuery.each( { + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mouseenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +} ); + +jQuery.fn.extend( { + + on: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn ); + }, + one: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? + handleObj.origType + "." + handleObj.namespace : + handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each( function() { + jQuery.event.remove( this, types, fn, selector ); + } ); + } +} ); + + +var + + /* eslint-disable max-len */ + + // See https://github.com/eslint/eslint/issues/3229 + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi, + + /* eslint-enable */ + + // Support: IE <=10 - 11, Edge 12 - 13 + // In IE/Edge using regex groups here causes severe slowdowns. + // See https://connect.microsoft.com/IE/feedback/details/1736512/ + rnoInnerhtml = /\s*$/g; + +// Prefer a tbody over its parent table for containing new rows +function manipulationTarget( elem, content ) { + if ( nodeName( elem, "table" ) && + nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { + + return jQuery( ">tbody", elem )[ 0 ] || elem; + } + + return elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + var match = rscriptTypeMasked.exec( elem.type ); + + if ( match ) { + elem.type = match[ 1 ]; + } else { + elem.removeAttribute( "type" ); + } + + return elem; +} + +function cloneCopyEvent( src, dest ) { + var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; + + if ( dest.nodeType !== 1 ) { + return; + } + + // 1. Copy private data: events, handlers, etc. + if ( dataPriv.hasData( src ) ) { + pdataOld = dataPriv.access( src ); + pdataCur = dataPriv.set( dest, pdataOld ); + events = pdataOld.events; + + if ( events ) { + delete pdataCur.handle; + pdataCur.events = {}; + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + } + + // 2. Copy user data + if ( dataUser.hasData( src ) ) { + udataOld = dataUser.access( src ); + udataCur = jQuery.extend( {}, udataOld ); + + dataUser.set( dest, udataCur ); + } +} + +// Fix IE bugs, see support tests +function fixInput( src, dest ) { + var nodeName = dest.nodeName.toLowerCase(); + + // Fails to persist the checked state of a cloned checkbox or radio button. + if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + dest.checked = src.checked; + + // Fails to return the selected option to the default selected state when cloning options + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +function domManip( collection, args, callback, ignored ) { + + // Flatten any nested arrays + args = concat.apply( [], args ); + + var fragment, first, scripts, hasScripts, node, doc, + i = 0, + l = collection.length, + iNoClone = l - 1, + value = args[ 0 ], + isFunction = jQuery.isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( isFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return collection.each( function( index ) { + var self = collection.eq( index ); + if ( isFunction ) { + args[ 0 ] = value.call( this, index, self.html() ); + } + domManip( self, args, callback, ignored ); + } ); + } + + if ( l ) { + fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + // Require either new content or an interest in ignored elements to invoke the callback + if ( first || ignored ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item + // instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( collection[ i ], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !dataPriv.access( node, "globalEval" ) && + jQuery.contains( doc, node ) ) { + + if ( node.src ) { + + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl ) { + jQuery._evalUrl( node.src ); + } + } else { + DOMEval( node.textContent.replace( rcleanScript, "" ), doc ); + } + } + } + } + } + } + + return collection; +} + +function remove( elem, selector, keepData ) { + var node, + nodes = selector ? jQuery.filter( selector, elem ) : elem, + i = 0; + + for ( ; ( node = nodes[ i ] ) != null; i++ ) { + if ( !keepData && node.nodeType === 1 ) { + jQuery.cleanData( getAll( node ) ); + } + + if ( node.parentNode ) { + if ( keepData && jQuery.contains( node.ownerDocument, node ) ) { + setGlobalEval( getAll( node, "script" ) ); + } + node.parentNode.removeChild( node ); + } + } + + return elem; +} + +jQuery.extend( { + htmlPrefilter: function( html ) { + return html.replace( rxhtmlTag, "<$1>" ); + }, + + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var i, l, srcElements, destElements, + clone = elem.cloneNode( true ), + inPage = jQuery.contains( elem.ownerDocument, elem ); + + // Fix IE cloning issues + if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && + !jQuery.isXMLDoc( elem ) ) { + + // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + fixInput( srcElements[ i ], destElements[ i ] ); + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + cloneCopyEvent( srcElements[ i ], destElements[ i ] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + // Return the cloned set + return clone; + }, + + cleanData: function( elems ) { + var data, elem, type, + special = jQuery.event.special, + i = 0; + + for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { + if ( acceptData( elem ) ) { + if ( ( data = elem[ dataPriv.expando ] ) ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataPriv.expando ] = undefined; + } + if ( elem[ dataUser.expando ] ) { + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataUser.expando ] = undefined; + } + } + } + } +} ); + +jQuery.fn.extend( { + detach: function( selector ) { + return remove( this, selector, true ); + }, + + remove: function( selector ) { + return remove( this, selector ); + }, + + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().each( function() { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + this.textContent = value; + } + } ); + }, null, value, arguments.length ); + }, + + append: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + } ); + }, + + prepend: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + } ); + }, + + before: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + } ); + }, + + after: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + } ); + }, + + empty: function() { + var elem, + i = 0; + + for ( ; ( elem = this[ i ] ) != null; i++ ) { + if ( elem.nodeType === 1 ) { + + // Prevent memory leaks + jQuery.cleanData( getAll( elem, false ) ); + + // Remove any remaining nodes + elem.textContent = ""; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + } ); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined && elem.nodeType === 1 ) { + return elem.innerHTML; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + + value = jQuery.htmlPrefilter( value ); + + try { + for ( ; i < l; i++ ) { + elem = this[ i ] || {}; + + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch ( e ) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var ignored = []; + + // Make the changes, replacing each non-ignored context element with the new content + return domManip( this, arguments, function( elem ) { + var parent = this.parentNode; + + if ( jQuery.inArray( this, ignored ) < 0 ) { + jQuery.cleanData( getAll( this ) ); + if ( parent ) { + parent.replaceChild( elem, this ); + } + } + + // Force callback invocation + }, ignored ); + } +} ); + +jQuery.each( { + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1, + i = 0; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); + + // Support: Android <=4.0 only, PhantomJS 1 only + // .get() because push.apply(_, arraylike) throws on ancient WebKit + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +} ); +var rmargin = ( /^margin/ ); + +var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); + +var getStyles = function( elem ) { + + // Support: IE <=11 only, Firefox <=30 (#15098, #14150) + // IE throws on elements created in popups + // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" + var view = elem.ownerDocument.defaultView; + + if ( !view || !view.opener ) { + view = window; + } + + return view.getComputedStyle( elem ); + }; + + + +( function() { + + // Executing both pixelPosition & boxSizingReliable tests require only one layout + // so they're executed at the same time to save the second computation. + function computeStyleTests() { + + // This is a singleton, we need to execute it only once + if ( !div ) { + return; + } + + div.style.cssText = + "box-sizing:border-box;" + + "position:relative;display:block;" + + "margin:auto;border:1px;padding:1px;" + + "top:1%;width:50%"; + div.innerHTML = ""; + documentElement.appendChild( container ); + + var divStyle = window.getComputedStyle( div ); + pixelPositionVal = divStyle.top !== "1%"; + + // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 + reliableMarginLeftVal = divStyle.marginLeft === "2px"; + boxSizingReliableVal = divStyle.width === "4px"; + + // Support: Android 4.0 - 4.3 only + // Some styles come back with percentage values, even though they shouldn't + div.style.marginRight = "50%"; + pixelMarginRightVal = divStyle.marginRight === "4px"; + + documentElement.removeChild( container ); + + // Nullify the div so it wouldn't be stored in the memory and + // it will also be a sign that checks already performed + div = null; + } + + var pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal, + container = document.createElement( "div" ), + div = document.createElement( "div" ); + + // Finish early in limited (non-browser) environments + if ( !div.style ) { + return; + } + + // Support: IE <=9 - 11 only + // Style of cloned element affects source element cloned (#8908) + div.style.backgroundClip = "content-box"; + div.cloneNode( true ).style.backgroundClip = ""; + support.clearCloneStyle = div.style.backgroundClip === "content-box"; + + container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" + + "padding:0;margin-top:1px;position:absolute"; + container.appendChild( div ); + + jQuery.extend( support, { + pixelPosition: function() { + computeStyleTests(); + return pixelPositionVal; + }, + boxSizingReliable: function() { + computeStyleTests(); + return boxSizingReliableVal; + }, + pixelMarginRight: function() { + computeStyleTests(); + return pixelMarginRightVal; + }, + reliableMarginLeft: function() { + computeStyleTests(); + return reliableMarginLeftVal; + } + } ); +} )(); + + +function curCSS( elem, name, computed ) { + var width, minWidth, maxWidth, ret, + + // Support: Firefox 51+ + // Retrieving style before computed somehow + // fixes an issue with getting wrong values + // on detached elements + style = elem.style; + + computed = computed || getStyles( elem ); + + // getPropertyValue is needed for: + // .css('filter') (IE 9 only, #12537) + // .css('--customProperty) (#3144) + if ( computed ) { + ret = computed.getPropertyValue( name ) || computed[ name ]; + + if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) { + ret = jQuery.style( elem, name ); + } + + // A tribute to the "awesome hack by Dean Edwards" + // Android Browser returns percentage for some values, + // but width seems to be reliably pixels. + // This is against the CSSOM draft spec: + // https://drafts.csswg.org/cssom/#resolved-values + if ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) { + + // Remember the original values + width = style.width; + minWidth = style.minWidth; + maxWidth = style.maxWidth; + + // Put in the new values to get a computed value out + style.minWidth = style.maxWidth = style.width = ret; + ret = computed.width; + + // Revert the changed values + style.width = width; + style.minWidth = minWidth; + style.maxWidth = maxWidth; + } + } + + return ret !== undefined ? + + // Support: IE <=9 - 11 only + // IE returns zIndex value as an integer. + ret + "" : + ret; +} + + +function addGetHookIf( conditionFn, hookFn ) { + + // Define the hook, we'll check on the first run if it's really needed. + return { + get: function() { + if ( conditionFn() ) { + + // Hook not needed (or it's not possible to use it due + // to missing dependency), remove it. + delete this.get; + return; + } + + // Hook needed; redefine it so that the support test is not executed again. + return ( this.get = hookFn ).apply( this, arguments ); + } + }; +} + + +var + + // Swappable if display is none or starts with table + // except "table", "table-cell", or "table-caption" + // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display + rdisplayswap = /^(none|table(?!-c[ea]).+)/, + rcustomProp = /^--/, + cssShow = { position: "absolute", visibility: "hidden", display: "block" }, + cssNormalTransform = { + letterSpacing: "0", + fontWeight: "400" + }, + + cssPrefixes = [ "Webkit", "Moz", "ms" ], + emptyStyle = document.createElement( "div" ).style; + +// Return a css property mapped to a potentially vendor prefixed property +function vendorPropName( name ) { + + // Shortcut for names that are not vendor prefixed + if ( name in emptyStyle ) { + return name; + } + + // Check for vendor prefixed names + var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), + i = cssPrefixes.length; + + while ( i-- ) { + name = cssPrefixes[ i ] + capName; + if ( name in emptyStyle ) { + return name; + } + } +} + +// Return a property mapped along what jQuery.cssProps suggests or to +// a vendor prefixed property. +function finalPropName( name ) { + var ret = jQuery.cssProps[ name ]; + if ( !ret ) { + ret = jQuery.cssProps[ name ] = vendorPropName( name ) || name; + } + return ret; +} + +function setPositiveNumber( elem, value, subtract ) { + + // Any relative (+/-) values have already been + // normalized at this point + var matches = rcssNum.exec( value ); + return matches ? + + // Guard against undefined "subtract", e.g., when used as in cssHooks + Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : + value; +} + +function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) { + var i, + val = 0; + + // If we already have the right measurement, avoid augmentation + if ( extra === ( isBorderBox ? "border" : "content" ) ) { + i = 4; + + // Otherwise initialize for horizontal or vertical properties + } else { + i = name === "width" ? 1 : 0; + } + + for ( ; i < 4; i += 2 ) { + + // Both box models exclude margin, so add it if we want it + if ( extra === "margin" ) { + val += jQuery.css( elem, extra + cssExpand[ i ], true, styles ); + } + + if ( isBorderBox ) { + + // border-box includes padding, so remove it if we want content + if ( extra === "content" ) { + val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + } + + // At this point, extra isn't border nor margin, so remove border + if ( extra !== "margin" ) { + val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } else { + + // At this point, extra isn't content, so add padding + val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + + // At this point, extra isn't content nor padding, so add border + if ( extra !== "padding" ) { + val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } + } + + return val; +} + +function getWidthOrHeight( elem, name, extra ) { + + // Start with computed style + var valueIsBorderBox, + styles = getStyles( elem ), + val = curCSS( elem, name, styles ), + isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; + + // Computed unit is not pixels. Stop here and return. + if ( rnumnonpx.test( val ) ) { + return val; + } + + // Check for style in case a browser which returns unreliable values + // for getComputedStyle silently falls back to the reliable elem.style + valueIsBorderBox = isBorderBox && + ( support.boxSizingReliable() || val === elem.style[ name ] ); + + // Fall back to offsetWidth/Height when value is "auto" + // This happens for inline elements with no explicit setting (gh-3571) + if ( val === "auto" ) { + val = elem[ "offset" + name[ 0 ].toUpperCase() + name.slice( 1 ) ]; + } + + // Normalize "", auto, and prepare for extra + val = parseFloat( val ) || 0; + + // Use the active box-sizing model to add/subtract irrelevant styles + return ( val + + augmentWidthOrHeight( + elem, + name, + extra || ( isBorderBox ? "border" : "content" ), + valueIsBorderBox, + styles + ) + ) + "px"; +} + +jQuery.extend( { + + // Add in style property hooks for overriding the default + // behavior of getting and setting a style property + cssHooks: { + opacity: { + get: function( elem, computed ) { + if ( computed ) { + + // We should always get a number back from opacity + var ret = curCSS( elem, "opacity" ); + return ret === "" ? "1" : ret; + } + } + } + }, + + // Don't automatically add "px" to these possibly-unitless properties + cssNumber: { + "animationIterationCount": true, + "columnCount": true, + "fillOpacity": true, + "flexGrow": true, + "flexShrink": true, + "fontWeight": true, + "lineHeight": true, + "opacity": true, + "order": true, + "orphans": true, + "widows": true, + "zIndex": true, + "zoom": true + }, + + // Add in properties whose names you wish to fix before + // setting or getting the value + cssProps: { + "float": "cssFloat" + }, + + // Get and set the style property on a DOM Node + style: function( elem, name, value, extra ) { + + // Don't set styles on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { + return; + } + + // Make sure that we're working with the right name + var ret, type, hooks, + origName = jQuery.camelCase( name ), + isCustomProp = rcustomProp.test( name ), + style = elem.style; + + // Make sure that we're working with the right name. We don't + // want to query the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Gets hook for the prefixed version, then unprefixed version + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // Check if we're setting a value + if ( value !== undefined ) { + type = typeof value; + + // Convert "+=" or "-=" to relative numbers (#7345) + if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { + value = adjustCSS( elem, name, ret ); + + // Fixes bug #9237 + type = "number"; + } + + // Make sure that null and NaN values aren't set (#7116) + if ( value == null || value !== value ) { + return; + } + + // If a number was passed in, add the unit (except for certain CSS properties) + if ( type === "number" ) { + value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); + } + + // background-* props affect original clone's values + if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { + style[ name ] = "inherit"; + } + + // If a hook was provided, use that value, otherwise just set the specified value + if ( !hooks || !( "set" in hooks ) || + ( value = hooks.set( elem, value, extra ) ) !== undefined ) { + + if ( isCustomProp ) { + style.setProperty( name, value ); + } else { + style[ name ] = value; + } + } + + } else { + + // If a hook was provided get the non-computed value from there + if ( hooks && "get" in hooks && + ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { + + return ret; + } + + // Otherwise just get the value from the style object + return style[ name ]; + } + }, + + css: function( elem, name, extra, styles ) { + var val, num, hooks, + origName = jQuery.camelCase( name ), + isCustomProp = rcustomProp.test( name ); + + // Make sure that we're working with the right name. We don't + // want to modify the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Try prefixed name followed by the unprefixed name + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // If a hook was provided get the computed value from there + if ( hooks && "get" in hooks ) { + val = hooks.get( elem, true, extra ); + } + + // Otherwise, if a way to get the computed value exists, use that + if ( val === undefined ) { + val = curCSS( elem, name, styles ); + } + + // Convert "normal" to computed value + if ( val === "normal" && name in cssNormalTransform ) { + val = cssNormalTransform[ name ]; + } + + // Make numeric if forced or a qualifier was provided and val looks numeric + if ( extra === "" || extra ) { + num = parseFloat( val ); + return extra === true || isFinite( num ) ? num || 0 : val; + } + + return val; + } +} ); + +jQuery.each( [ "height", "width" ], function( i, name ) { + jQuery.cssHooks[ name ] = { + get: function( elem, computed, extra ) { + if ( computed ) { + + // Certain elements can have dimension info if we invisibly show them + // but it must have a current display style that would benefit + return rdisplayswap.test( jQuery.css( elem, "display" ) ) && + + // Support: Safari 8+ + // Table columns in Safari have non-zero offsetWidth & zero + // getBoundingClientRect().width unless display is changed. + // Support: IE <=11 only + // Running getBoundingClientRect on a disconnected node + // in IE throws an error. + ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? + swap( elem, cssShow, function() { + return getWidthOrHeight( elem, name, extra ); + } ) : + getWidthOrHeight( elem, name, extra ); + } + }, + + set: function( elem, value, extra ) { + var matches, + styles = extra && getStyles( elem ), + subtract = extra && augmentWidthOrHeight( + elem, + name, + extra, + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + styles + ); + + // Convert to pixels if value adjustment is needed + if ( subtract && ( matches = rcssNum.exec( value ) ) && + ( matches[ 3 ] || "px" ) !== "px" ) { + + elem.style[ name ] = value; + value = jQuery.css( elem, name ); + } + + return setPositiveNumber( elem, value, subtract ); + } + }; +} ); + +jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, + function( elem, computed ) { + if ( computed ) { + return ( parseFloat( curCSS( elem, "marginLeft" ) ) || + elem.getBoundingClientRect().left - + swap( elem, { marginLeft: 0 }, function() { + return elem.getBoundingClientRect().left; + } ) + ) + "px"; + } + } +); + +// These hooks are used by animate to expand properties +jQuery.each( { + margin: "", + padding: "", + border: "Width" +}, function( prefix, suffix ) { + jQuery.cssHooks[ prefix + suffix ] = { + expand: function( value ) { + var i = 0, + expanded = {}, + + // Assumes a single number if not a string + parts = typeof value === "string" ? value.split( " " ) : [ value ]; + + for ( ; i < 4; i++ ) { + expanded[ prefix + cssExpand[ i ] + suffix ] = + parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; + } + + return expanded; + } + }; + + if ( !rmargin.test( prefix ) ) { + jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; + } +} ); + +jQuery.fn.extend( { + css: function( name, value ) { + return access( this, function( elem, name, value ) { + var styles, len, + map = {}, + i = 0; + + if ( Array.isArray( name ) ) { + styles = getStyles( elem ); + len = name.length; + + for ( ; i < len; i++ ) { + map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); + } + + return map; + } + + return value !== undefined ? + jQuery.style( elem, name, value ) : + jQuery.css( elem, name ); + }, name, value, arguments.length > 1 ); + } +} ); + + +function Tween( elem, options, prop, end, easing ) { + return new Tween.prototype.init( elem, options, prop, end, easing ); +} +jQuery.Tween = Tween; + +Tween.prototype = { + constructor: Tween, + init: function( elem, options, prop, end, easing, unit ) { + this.elem = elem; + this.prop = prop; + this.easing = easing || jQuery.easing._default; + this.options = options; + this.start = this.now = this.cur(); + this.end = end; + this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); + }, + cur: function() { + var hooks = Tween.propHooks[ this.prop ]; + + return hooks && hooks.get ? + hooks.get( this ) : + Tween.propHooks._default.get( this ); + }, + run: function( percent ) { + var eased, + hooks = Tween.propHooks[ this.prop ]; + + if ( this.options.duration ) { + this.pos = eased = jQuery.easing[ this.easing ]( + percent, this.options.duration * percent, 0, 1, this.options.duration + ); + } else { + this.pos = eased = percent; + } + this.now = ( this.end - this.start ) * eased + this.start; + + if ( this.options.step ) { + this.options.step.call( this.elem, this.now, this ); + } + + if ( hooks && hooks.set ) { + hooks.set( this ); + } else { + Tween.propHooks._default.set( this ); + } + return this; + } +}; + +Tween.prototype.init.prototype = Tween.prototype; + +Tween.propHooks = { + _default: { + get: function( tween ) { + var result; + + // Use a property on the element directly when it is not a DOM element, + // or when there is no matching style property that exists. + if ( tween.elem.nodeType !== 1 || + tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { + return tween.elem[ tween.prop ]; + } + + // Passing an empty string as a 3rd parameter to .css will automatically + // attempt a parseFloat and fallback to a string if the parse fails. + // Simple values such as "10px" are parsed to Float; + // complex values such as "rotate(1rad)" are returned as-is. + result = jQuery.css( tween.elem, tween.prop, "" ); + + // Empty strings, null, undefined and "auto" are converted to 0. + return !result || result === "auto" ? 0 : result; + }, + set: function( tween ) { + + // Use step hook for back compat. + // Use cssHook if its there. + // Use .style if available and use plain properties where available. + if ( jQuery.fx.step[ tween.prop ] ) { + jQuery.fx.step[ tween.prop ]( tween ); + } else if ( tween.elem.nodeType === 1 && + ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || + jQuery.cssHooks[ tween.prop ] ) ) { + jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); + } else { + tween.elem[ tween.prop ] = tween.now; + } + } + } +}; + +// Support: IE <=9 only +// Panic based approach to setting things on disconnected nodes +Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { + set: function( tween ) { + if ( tween.elem.nodeType && tween.elem.parentNode ) { + tween.elem[ tween.prop ] = tween.now; + } + } +}; + +jQuery.easing = { + linear: function( p ) { + return p; + }, + swing: function( p ) { + return 0.5 - Math.cos( p * Math.PI ) / 2; + }, + _default: "swing" +}; + +jQuery.fx = Tween.prototype.init; + +// Back compat <1.8 extension point +jQuery.fx.step = {}; + + + + +var + fxNow, inProgress, + rfxtypes = /^(?:toggle|show|hide)$/, + rrun = /queueHooks$/; + +function schedule() { + if ( inProgress ) { + if ( document.hidden === false && window.requestAnimationFrame ) { + window.requestAnimationFrame( schedule ); + } else { + window.setTimeout( schedule, jQuery.fx.interval ); + } + + jQuery.fx.tick(); + } +} + +// Animations created synchronously will run synchronously +function createFxNow() { + window.setTimeout( function() { + fxNow = undefined; + } ); + return ( fxNow = jQuery.now() ); +} + +// Generate parameters to create a standard animation +function genFx( type, includeWidth ) { + var which, + i = 0, + attrs = { height: type }; + + // If we include width, step value is 1 to do all cssExpand values, + // otherwise step value is 2 to skip over Left and Right + includeWidth = includeWidth ? 1 : 0; + for ( ; i < 4; i += 2 - includeWidth ) { + which = cssExpand[ i ]; + attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; + } + + if ( includeWidth ) { + attrs.opacity = attrs.width = type; + } + + return attrs; +} + +function createTween( value, prop, animation ) { + var tween, + collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), + index = 0, + length = collection.length; + for ( ; index < length; index++ ) { + if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { + + // We're done with this property + return tween; + } + } +} + +function defaultPrefilter( elem, props, opts ) { + var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, + isBox = "width" in props || "height" in props, + anim = this, + orig = {}, + style = elem.style, + hidden = elem.nodeType && isHiddenWithinTree( elem ), + dataShow = dataPriv.get( elem, "fxshow" ); + + // Queue-skipping animations hijack the fx hooks + if ( !opts.queue ) { + hooks = jQuery._queueHooks( elem, "fx" ); + if ( hooks.unqueued == null ) { + hooks.unqueued = 0; + oldfire = hooks.empty.fire; + hooks.empty.fire = function() { + if ( !hooks.unqueued ) { + oldfire(); + } + }; + } + hooks.unqueued++; + + anim.always( function() { + + // Ensure the complete handler is called before this completes + anim.always( function() { + hooks.unqueued--; + if ( !jQuery.queue( elem, "fx" ).length ) { + hooks.empty.fire(); + } + } ); + } ); + } + + // Detect show/hide animations + for ( prop in props ) { + value = props[ prop ]; + if ( rfxtypes.test( value ) ) { + delete props[ prop ]; + toggle = toggle || value === "toggle"; + if ( value === ( hidden ? "hide" : "show" ) ) { + + // Pretend to be hidden if this is a "show" and + // there is still data from a stopped show/hide + if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { + hidden = true; + + // Ignore all other no-op show/hide data + } else { + continue; + } + } + orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); + } + } + + // Bail out if this is a no-op like .hide().hide() + propTween = !jQuery.isEmptyObject( props ); + if ( !propTween && jQuery.isEmptyObject( orig ) ) { + return; + } + + // Restrict "overflow" and "display" styles during box animations + if ( isBox && elem.nodeType === 1 ) { + + // Support: IE <=9 - 11, Edge 12 - 13 + // Record all 3 overflow attributes because IE does not infer the shorthand + // from identically-valued overflowX and overflowY + opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; + + // Identify a display type, preferring old show/hide data over the CSS cascade + restoreDisplay = dataShow && dataShow.display; + if ( restoreDisplay == null ) { + restoreDisplay = dataPriv.get( elem, "display" ); + } + display = jQuery.css( elem, "display" ); + if ( display === "none" ) { + if ( restoreDisplay ) { + display = restoreDisplay; + } else { + + // Get nonempty value(s) by temporarily forcing visibility + showHide( [ elem ], true ); + restoreDisplay = elem.style.display || restoreDisplay; + display = jQuery.css( elem, "display" ); + showHide( [ elem ] ); + } + } + + // Animate inline elements as inline-block + if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { + if ( jQuery.css( elem, "float" ) === "none" ) { + + // Restore the original display value at the end of pure show/hide animations + if ( !propTween ) { + anim.done( function() { + style.display = restoreDisplay; + } ); + if ( restoreDisplay == null ) { + display = style.display; + restoreDisplay = display === "none" ? "" : display; + } + } + style.display = "inline-block"; + } + } + } + + if ( opts.overflow ) { + style.overflow = "hidden"; + anim.always( function() { + style.overflow = opts.overflow[ 0 ]; + style.overflowX = opts.overflow[ 1 ]; + style.overflowY = opts.overflow[ 2 ]; + } ); + } + + // Implement show/hide animations + propTween = false; + for ( prop in orig ) { + + // General show/hide setup for this element animation + if ( !propTween ) { + if ( dataShow ) { + if ( "hidden" in dataShow ) { + hidden = dataShow.hidden; + } + } else { + dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); + } + + // Store hidden/visible for toggle so `.stop().toggle()` "reverses" + if ( toggle ) { + dataShow.hidden = !hidden; + } + + // Show elements before animating them + if ( hidden ) { + showHide( [ elem ], true ); + } + + /* eslint-disable no-loop-func */ + + anim.done( function() { + + /* eslint-enable no-loop-func */ + + // The final step of a "hide" animation is actually hiding the element + if ( !hidden ) { + showHide( [ elem ] ); + } + dataPriv.remove( elem, "fxshow" ); + for ( prop in orig ) { + jQuery.style( elem, prop, orig[ prop ] ); + } + } ); + } + + // Per-property setup + propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); + if ( !( prop in dataShow ) ) { + dataShow[ prop ] = propTween.start; + if ( hidden ) { + propTween.end = propTween.start; + propTween.start = 0; + } + } + } +} + +function propFilter( props, specialEasing ) { + var index, name, easing, value, hooks; + + // camelCase, specialEasing and expand cssHook pass + for ( index in props ) { + name = jQuery.camelCase( index ); + easing = specialEasing[ name ]; + value = props[ index ]; + if ( Array.isArray( value ) ) { + easing = value[ 1 ]; + value = props[ index ] = value[ 0 ]; + } + + if ( index !== name ) { + props[ name ] = value; + delete props[ index ]; + } + + hooks = jQuery.cssHooks[ name ]; + if ( hooks && "expand" in hooks ) { + value = hooks.expand( value ); + delete props[ name ]; + + // Not quite $.extend, this won't overwrite existing keys. + // Reusing 'index' because we have the correct "name" + for ( index in value ) { + if ( !( index in props ) ) { + props[ index ] = value[ index ]; + specialEasing[ index ] = easing; + } + } + } else { + specialEasing[ name ] = easing; + } + } +} + +function Animation( elem, properties, options ) { + var result, + stopped, + index = 0, + length = Animation.prefilters.length, + deferred = jQuery.Deferred().always( function() { + + // Don't match elem in the :animated selector + delete tick.elem; + } ), + tick = function() { + if ( stopped ) { + return false; + } + var currentTime = fxNow || createFxNow(), + remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), + + // Support: Android 2.3 only + // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) + temp = remaining / animation.duration || 0, + percent = 1 - temp, + index = 0, + length = animation.tweens.length; + + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( percent ); + } + + deferred.notifyWith( elem, [ animation, percent, remaining ] ); + + // If there's more to do, yield + if ( percent < 1 && length ) { + return remaining; + } + + // If this was an empty animation, synthesize a final progress notification + if ( !length ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + } + + // Resolve the animation and report its conclusion + deferred.resolveWith( elem, [ animation ] ); + return false; + }, + animation = deferred.promise( { + elem: elem, + props: jQuery.extend( {}, properties ), + opts: jQuery.extend( true, { + specialEasing: {}, + easing: jQuery.easing._default + }, options ), + originalProperties: properties, + originalOptions: options, + startTime: fxNow || createFxNow(), + duration: options.duration, + tweens: [], + createTween: function( prop, end ) { + var tween = jQuery.Tween( elem, animation.opts, prop, end, + animation.opts.specialEasing[ prop ] || animation.opts.easing ); + animation.tweens.push( tween ); + return tween; + }, + stop: function( gotoEnd ) { + var index = 0, + + // If we are going to the end, we want to run all the tweens + // otherwise we skip this part + length = gotoEnd ? animation.tweens.length : 0; + if ( stopped ) { + return this; + } + stopped = true; + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( 1 ); + } + + // Resolve when we played the last frame; otherwise, reject + if ( gotoEnd ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + deferred.resolveWith( elem, [ animation, gotoEnd ] ); + } else { + deferred.rejectWith( elem, [ animation, gotoEnd ] ); + } + return this; + } + } ), + props = animation.props; + + propFilter( props, animation.opts.specialEasing ); + + for ( ; index < length; index++ ) { + result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); + if ( result ) { + if ( jQuery.isFunction( result.stop ) ) { + jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = + jQuery.proxy( result.stop, result ); + } + return result; + } + } + + jQuery.map( props, createTween, animation ); + + if ( jQuery.isFunction( animation.opts.start ) ) { + animation.opts.start.call( elem, animation ); + } + + // Attach callbacks from options + animation + .progress( animation.opts.progress ) + .done( animation.opts.done, animation.opts.complete ) + .fail( animation.opts.fail ) + .always( animation.opts.always ); + + jQuery.fx.timer( + jQuery.extend( tick, { + elem: elem, + anim: animation, + queue: animation.opts.queue + } ) + ); + + return animation; +} + +jQuery.Animation = jQuery.extend( Animation, { + + tweeners: { + "*": [ function( prop, value ) { + var tween = this.createTween( prop, value ); + adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); + return tween; + } ] + }, + + tweener: function( props, callback ) { + if ( jQuery.isFunction( props ) ) { + callback = props; + props = [ "*" ]; + } else { + props = props.match( rnothtmlwhite ); + } + + var prop, + index = 0, + length = props.length; + + for ( ; index < length; index++ ) { + prop = props[ index ]; + Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; + Animation.tweeners[ prop ].unshift( callback ); + } + }, + + prefilters: [ defaultPrefilter ], + + prefilter: function( callback, prepend ) { + if ( prepend ) { + Animation.prefilters.unshift( callback ); + } else { + Animation.prefilters.push( callback ); + } + } +} ); + +jQuery.speed = function( speed, easing, fn ) { + var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { + complete: fn || !fn && easing || + jQuery.isFunction( speed ) && speed, + duration: speed, + easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing + }; + + // Go to the end state if fx are off + if ( jQuery.fx.off ) { + opt.duration = 0; + + } else { + if ( typeof opt.duration !== "number" ) { + if ( opt.duration in jQuery.fx.speeds ) { + opt.duration = jQuery.fx.speeds[ opt.duration ]; + + } else { + opt.duration = jQuery.fx.speeds._default; + } + } + } + + // Normalize opt.queue - true/undefined/null -> "fx" + if ( opt.queue == null || opt.queue === true ) { + opt.queue = "fx"; + } + + // Queueing + opt.old = opt.complete; + + opt.complete = function() { + if ( jQuery.isFunction( opt.old ) ) { + opt.old.call( this ); + } + + if ( opt.queue ) { + jQuery.dequeue( this, opt.queue ); + } + }; + + return opt; +}; + +jQuery.fn.extend( { + fadeTo: function( speed, to, easing, callback ) { + + // Show any hidden elements after setting opacity to 0 + return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() + + // Animate to the value specified + .end().animate( { opacity: to }, speed, easing, callback ); + }, + animate: function( prop, speed, easing, callback ) { + var empty = jQuery.isEmptyObject( prop ), + optall = jQuery.speed( speed, easing, callback ), + doAnimation = function() { + + // Operate on a copy of prop so per-property easing won't be lost + var anim = Animation( this, jQuery.extend( {}, prop ), optall ); + + // Empty animations, or finishing resolves immediately + if ( empty || dataPriv.get( this, "finish" ) ) { + anim.stop( true ); + } + }; + doAnimation.finish = doAnimation; + + return empty || optall.queue === false ? + this.each( doAnimation ) : + this.queue( optall.queue, doAnimation ); + }, + stop: function( type, clearQueue, gotoEnd ) { + var stopQueue = function( hooks ) { + var stop = hooks.stop; + delete hooks.stop; + stop( gotoEnd ); + }; + + if ( typeof type !== "string" ) { + gotoEnd = clearQueue; + clearQueue = type; + type = undefined; + } + if ( clearQueue && type !== false ) { + this.queue( type || "fx", [] ); + } + + return this.each( function() { + var dequeue = true, + index = type != null && type + "queueHooks", + timers = jQuery.timers, + data = dataPriv.get( this ); + + if ( index ) { + if ( data[ index ] && data[ index ].stop ) { + stopQueue( data[ index ] ); + } + } else { + for ( index in data ) { + if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { + stopQueue( data[ index ] ); + } + } + } + + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && + ( type == null || timers[ index ].queue === type ) ) { + + timers[ index ].anim.stop( gotoEnd ); + dequeue = false; + timers.splice( index, 1 ); + } + } + + // Start the next in the queue if the last step wasn't forced. + // Timers currently will call their complete callbacks, which + // will dequeue but only if they were gotoEnd. + if ( dequeue || !gotoEnd ) { + jQuery.dequeue( this, type ); + } + } ); + }, + finish: function( type ) { + if ( type !== false ) { + type = type || "fx"; + } + return this.each( function() { + var index, + data = dataPriv.get( this ), + queue = data[ type + "queue" ], + hooks = data[ type + "queueHooks" ], + timers = jQuery.timers, + length = queue ? queue.length : 0; + + // Enable finishing flag on private data + data.finish = true; + + // Empty the queue first + jQuery.queue( this, type, [] ); + + if ( hooks && hooks.stop ) { + hooks.stop.call( this, true ); + } + + // Look for any active animations, and finish them + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && timers[ index ].queue === type ) { + timers[ index ].anim.stop( true ); + timers.splice( index, 1 ); + } + } + + // Look for any animations in the old queue and finish them + for ( index = 0; index < length; index++ ) { + if ( queue[ index ] && queue[ index ].finish ) { + queue[ index ].finish.call( this ); + } + } + + // Turn off finishing flag + delete data.finish; + } ); + } +} ); + +jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) { + var cssFn = jQuery.fn[ name ]; + jQuery.fn[ name ] = function( speed, easing, callback ) { + return speed == null || typeof speed === "boolean" ? + cssFn.apply( this, arguments ) : + this.animate( genFx( name, true ), speed, easing, callback ); + }; +} ); + +// Generate shortcuts for custom animations +jQuery.each( { + slideDown: genFx( "show" ), + slideUp: genFx( "hide" ), + slideToggle: genFx( "toggle" ), + fadeIn: { opacity: "show" }, + fadeOut: { opacity: "hide" }, + fadeToggle: { opacity: "toggle" } +}, function( name, props ) { + jQuery.fn[ name ] = function( speed, easing, callback ) { + return this.animate( props, speed, easing, callback ); + }; +} ); + +jQuery.timers = []; +jQuery.fx.tick = function() { + var timer, + i = 0, + timers = jQuery.timers; + + fxNow = jQuery.now(); + + for ( ; i < timers.length; i++ ) { + timer = timers[ i ]; + + // Run the timer and safely remove it when done (allowing for external removal) + if ( !timer() && timers[ i ] === timer ) { + timers.splice( i--, 1 ); + } + } + + if ( !timers.length ) { + jQuery.fx.stop(); + } + fxNow = undefined; +}; + +jQuery.fx.timer = function( timer ) { + jQuery.timers.push( timer ); + jQuery.fx.start(); +}; + +jQuery.fx.interval = 13; +jQuery.fx.start = function() { + if ( inProgress ) { + return; + } + + inProgress = true; + schedule(); +}; + +jQuery.fx.stop = function() { + inProgress = null; +}; + +jQuery.fx.speeds = { + slow: 600, + fast: 200, + + // Default speed + _default: 400 +}; + + +// Based off of the plugin by Clint Helfers, with permission. +// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ +jQuery.fn.delay = function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; + type = type || "fx"; + + return this.queue( type, function( next, hooks ) { + var timeout = window.setTimeout( next, time ); + hooks.stop = function() { + window.clearTimeout( timeout ); + }; + } ); +}; + + +( function() { + var input = document.createElement( "input" ), + select = document.createElement( "select" ), + opt = select.appendChild( document.createElement( "option" ) ); + + input.type = "checkbox"; + + // Support: Android <=4.3 only + // Default value for a checkbox should be "on" + support.checkOn = input.value !== ""; + + // Support: IE <=11 only + // Must access selectedIndex to make default options select + support.optSelected = opt.selected; + + // Support: IE <=11 only + // An input loses its value after becoming a radio + input = document.createElement( "input" ); + input.value = "t"; + input.type = "radio"; + support.radioValue = input.value === "t"; +} )(); + + +var boolHook, + attrHandle = jQuery.expr.attrHandle; + +jQuery.fn.extend( { + attr: function( name, value ) { + return access( this, jQuery.attr, name, value, arguments.length > 1 ); + }, + + removeAttr: function( name ) { + return this.each( function() { + jQuery.removeAttr( this, name ); + } ); + } +} ); + +jQuery.extend( { + attr: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set attributes on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + // Fallback to prop when attributes are not supported + if ( typeof elem.getAttribute === "undefined" ) { + return jQuery.prop( elem, name, value ); + } + + // Attribute hooks are determined by the lowercase version + // Grab necessary hook if one is defined + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + hooks = jQuery.attrHooks[ name.toLowerCase() ] || + ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); + } + + if ( value !== undefined ) { + if ( value === null ) { + jQuery.removeAttr( elem, name ); + return; + } + + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + elem.setAttribute( name, value + "" ); + return value; + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + ret = jQuery.find.attr( elem, name ); + + // Non-existent attributes return null, we normalize to undefined + return ret == null ? undefined : ret; + }, + + attrHooks: { + type: { + set: function( elem, value ) { + if ( !support.radioValue && value === "radio" && + nodeName( elem, "input" ) ) { + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + } + }, + + removeAttr: function( elem, value ) { + var name, + i = 0, + + // Attribute names can contain non-HTML whitespace characters + // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 + attrNames = value && value.match( rnothtmlwhite ); + + if ( attrNames && elem.nodeType === 1 ) { + while ( ( name = attrNames[ i++ ] ) ) { + elem.removeAttribute( name ); + } + } + } +} ); + +// Hooks for boolean attributes +boolHook = { + set: function( elem, value, name ) { + if ( value === false ) { + + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else { + elem.setAttribute( name, name ); + } + return name; + } +}; + +jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) { + var getter = attrHandle[ name ] || jQuery.find.attr; + + attrHandle[ name ] = function( elem, name, isXML ) { + var ret, handle, + lowercaseName = name.toLowerCase(); + + if ( !isXML ) { + + // Avoid an infinite loop by temporarily removing this function from the getter + handle = attrHandle[ lowercaseName ]; + attrHandle[ lowercaseName ] = ret; + ret = getter( elem, name, isXML ) != null ? + lowercaseName : + null; + attrHandle[ lowercaseName ] = handle; + } + return ret; + }; +} ); + + + + +var rfocusable = /^(?:input|select|textarea|button)$/i, + rclickable = /^(?:a|area)$/i; + +jQuery.fn.extend( { + prop: function( name, value ) { + return access( this, jQuery.prop, name, value, arguments.length > 1 ); + }, + + removeProp: function( name ) { + return this.each( function() { + delete this[ jQuery.propFix[ name ] || name ]; + } ); + } +} ); + +jQuery.extend( { + prop: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set properties on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + return ( elem[ name ] = value ); + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + return elem[ name ]; + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + + // Support: IE <=9 - 11 only + // elem.tabIndex doesn't always return the + // correct value when it hasn't been explicitly set + // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + // Use proper attribute retrieval(#12072) + var tabindex = jQuery.find.attr( elem, "tabindex" ); + + if ( tabindex ) { + return parseInt( tabindex, 10 ); + } + + if ( + rfocusable.test( elem.nodeName ) || + rclickable.test( elem.nodeName ) && + elem.href + ) { + return 0; + } + + return -1; + } + } + }, + + propFix: { + "for": "htmlFor", + "class": "className" + } +} ); + +// Support: IE <=11 only +// Accessing the selectedIndex property +// forces the browser to respect setting selected +// on the option +// The getter ensures a default option is selected +// when in an optgroup +// eslint rule "no-unused-expressions" is disabled for this code +// since it considers such accessions noop +if ( !support.optSelected ) { + jQuery.propHooks.selected = { + get: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent && parent.parentNode ) { + parent.parentNode.selectedIndex; + } + return null; + }, + set: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent ) { + parent.selectedIndex; + + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + } + }; +} + +jQuery.each( [ + "tabIndex", + "readOnly", + "maxLength", + "cellSpacing", + "cellPadding", + "rowSpan", + "colSpan", + "useMap", + "frameBorder", + "contentEditable" +], function() { + jQuery.propFix[ this.toLowerCase() ] = this; +} ); + + + + + // Strip and collapse whitespace according to HTML spec + // https://html.spec.whatwg.org/multipage/infrastructure.html#strip-and-collapse-whitespace + function stripAndCollapse( value ) { + var tokens = value.match( rnothtmlwhite ) || []; + return tokens.join( " " ); + } + + +function getClass( elem ) { + return elem.getAttribute && elem.getAttribute( "class" ) || ""; +} + +jQuery.fn.extend( { + addClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( jQuery.isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + if ( typeof value === "string" && value ) { + classes = value.match( rnothtmlwhite ) || []; + + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + if ( cur.indexOf( " " + clazz + " " ) < 0 ) { + cur += clazz + " "; + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( jQuery.isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + if ( !arguments.length ) { + return this.attr( "class", "" ); + } + + if ( typeof value === "string" && value ) { + classes = value.match( rnothtmlwhite ) || []; + + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + + // This expression is here for better compressibility (see addClass) + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + + // Remove *all* instances + while ( cur.indexOf( " " + clazz + " " ) > -1 ) { + cur = cur.replace( " " + clazz + " ", " " ); + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value; + + if ( typeof stateVal === "boolean" && type === "string" ) { + return stateVal ? this.addClass( value ) : this.removeClass( value ); + } + + if ( jQuery.isFunction( value ) ) { + return this.each( function( i ) { + jQuery( this ).toggleClass( + value.call( this, i, getClass( this ), stateVal ), + stateVal + ); + } ); + } + + return this.each( function() { + var className, i, self, classNames; + + if ( type === "string" ) { + + // Toggle individual class names + i = 0; + self = jQuery( this ); + classNames = value.match( rnothtmlwhite ) || []; + + while ( ( className = classNames[ i++ ] ) ) { + + // Check each className given, space separated list + if ( self.hasClass( className ) ) { + self.removeClass( className ); + } else { + self.addClass( className ); + } + } + + // Toggle whole class name + } else if ( value === undefined || type === "boolean" ) { + className = getClass( this ); + if ( className ) { + + // Store className if set + dataPriv.set( this, "__className__", className ); + } + + // If the element has a class name or if we're passed `false`, + // then remove the whole classname (if there was one, the above saved it). + // Otherwise bring back whatever was previously saved (if anything), + // falling back to the empty string if nothing was stored. + if ( this.setAttribute ) { + this.setAttribute( "class", + className || value === false ? + "" : + dataPriv.get( this, "__className__" ) || "" + ); + } + } + } ); + }, + + hasClass: function( selector ) { + var className, elem, + i = 0; + + className = " " + selector + " "; + while ( ( elem = this[ i++ ] ) ) { + if ( elem.nodeType === 1 && + ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { + return true; + } + } + + return false; + } +} ); + + + + +var rreturn = /\r/g; + +jQuery.fn.extend( { + val: function( value ) { + var hooks, ret, isFunction, + elem = this[ 0 ]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.type ] || + jQuery.valHooks[ elem.nodeName.toLowerCase() ]; + + if ( hooks && + "get" in hooks && + ( ret = hooks.get( elem, "value" ) ) !== undefined + ) { + return ret; + } + + ret = elem.value; + + // Handle most common string cases + if ( typeof ret === "string" ) { + return ret.replace( rreturn, "" ); + } + + // Handle cases where value is null/undef or number + return ret == null ? "" : ret; + } + + return; + } + + isFunction = jQuery.isFunction( value ); + + return this.each( function( i ) { + var val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( isFunction ) { + val = value.call( this, i, jQuery( this ).val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + + } else if ( typeof val === "number" ) { + val += ""; + + } else if ( Array.isArray( val ) ) { + val = jQuery.map( val, function( value ) { + return value == null ? "" : value + ""; + } ); + } + + hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + } ); + } +} ); + +jQuery.extend( { + valHooks: { + option: { + get: function( elem ) { + + var val = jQuery.find.attr( elem, "value" ); + return val != null ? + val : + + // Support: IE <=10 - 11 only + // option.text throws exceptions (#14686, #14858) + // Strip and collapse whitespace + // https://html.spec.whatwg.org/#strip-and-collapse-whitespace + stripAndCollapse( jQuery.text( elem ) ); + } + }, + select: { + get: function( elem ) { + var value, option, i, + options = elem.options, + index = elem.selectedIndex, + one = elem.type === "select-one", + values = one ? null : [], + max = one ? index + 1 : options.length; + + if ( index < 0 ) { + i = max; + + } else { + i = one ? index : 0; + } + + // Loop through all the selected options + for ( ; i < max; i++ ) { + option = options[ i ]; + + // Support: IE <=9 only + // IE8-9 doesn't update selected after form reset (#2551) + if ( ( option.selected || i === index ) && + + // Don't return options that are disabled or in a disabled optgroup + !option.disabled && + ( !option.parentNode.disabled || + !nodeName( option.parentNode, "optgroup" ) ) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + }, + + set: function( elem, value ) { + var optionSet, option, + options = elem.options, + values = jQuery.makeArray( value ), + i = options.length; + + while ( i-- ) { + option = options[ i ]; + + /* eslint-disable no-cond-assign */ + + if ( option.selected = + jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 + ) { + optionSet = true; + } + + /* eslint-enable no-cond-assign */ + } + + // Force browsers to behave consistently when non-matching value is set + if ( !optionSet ) { + elem.selectedIndex = -1; + } + return values; + } + } + } +} ); + +// Radios and checkboxes getter/setter +jQuery.each( [ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + set: function( elem, value ) { + if ( Array.isArray( value ) ) { + return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); + } + } + }; + if ( !support.checkOn ) { + jQuery.valHooks[ this ].get = function( elem ) { + return elem.getAttribute( "value" ) === null ? "on" : elem.value; + }; + } +} ); + + + + +// Return jQuery for attributes-only inclusion + + +var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/; + +jQuery.extend( jQuery.event, { + + trigger: function( event, data, elem, onlyHandlers ) { + + var i, cur, tmp, bubbleType, ontype, handle, special, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; + + cur = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "." ) > -1 ) { + + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split( "." ); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf( ":" ) < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join( "." ); + event.rnamespace = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === ( elem.ownerDocument || document ) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { + + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] && + dataPriv.get( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( ( !special._default || + special._default.apply( eventPath.pop(), data ) === false ) && + acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name as the event. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + elem[ type ](); + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + // Piggyback on a donor event to simulate a different one + // Used only for `focus(in | out)` events + simulate: function( type, elem, event ) { + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true + } + ); + + jQuery.event.trigger( e, null, elem ); + } + +} ); + +jQuery.fn.extend( { + + trigger: function( type, data ) { + return this.each( function() { + jQuery.event.trigger( type, data, this ); + } ); + }, + triggerHandler: function( type, data ) { + var elem = this[ 0 ]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +} ); + + +jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " + + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + + "change select submit keydown keypress keyup contextmenu" ).split( " " ), + function( i, name ) { + + // Handle event binding + jQuery.fn[ name ] = function( data, fn ) { + return arguments.length > 0 ? + this.on( name, null, data, fn ) : + this.trigger( name ); + }; +} ); + +jQuery.fn.extend( { + hover: function( fnOver, fnOut ) { + return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); + } +} ); + + + + +support.focusin = "onfocusin" in window; + + +// Support: Firefox <=44 +// Firefox doesn't have focus(in | out) events +// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 +// +// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 +// focus(in | out) events fire after focus & blur events, +// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order +// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 +if ( !support.focusin ) { + jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler on the document while someone wants focusin/focusout + var handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + var doc = this.ownerDocument || this, + attaches = dataPriv.access( doc, fix ); + + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); + } + dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this, + attaches = dataPriv.access( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + dataPriv.remove( doc, fix ); + + } else { + dataPriv.access( doc, fix, attaches ); + } + } + }; + } ); +} +var location = window.location; + +var nonce = jQuery.now(); + +var rquery = ( /\?/ ); + + + +// Cross-browser xml parsing +jQuery.parseXML = function( data ) { + var xml; + if ( !data || typeof data !== "string" ) { + return null; + } + + // Support: IE 9 - 11 only + // IE throws on parseFromString with invalid input. + try { + xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); + } catch ( e ) { + xml = undefined; + } + + if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { + jQuery.error( "Invalid XML: " + data ); + } + return xml; +}; + + +var + rbracket = /\[\]$/, + rCRLF = /\r?\n/g, + rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, + rsubmittable = /^(?:input|select|textarea|keygen)/i; + +function buildParams( prefix, obj, traditional, add ) { + var name; + + if ( Array.isArray( obj ) ) { + + // Serialize array item. + jQuery.each( obj, function( i, v ) { + if ( traditional || rbracket.test( prefix ) ) { + + // Treat each array item as a scalar. + add( prefix, v ); + + } else { + + // Item is non-scalar (array or object), encode its numeric index. + buildParams( + prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", + v, + traditional, + add + ); + } + } ); + + } else if ( !traditional && jQuery.type( obj ) === "object" ) { + + // Serialize object item. + for ( name in obj ) { + buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); + } + + } else { + + // Serialize scalar item. + add( prefix, obj ); + } +} + +// Serialize an array of form elements or a set of +// key/values into a query string +jQuery.param = function( a, traditional ) { + var prefix, + s = [], + add = function( key, valueOrFunction ) { + + // If value is a function, invoke it and use its return value + var value = jQuery.isFunction( valueOrFunction ) ? + valueOrFunction() : + valueOrFunction; + + s[ s.length ] = encodeURIComponent( key ) + "=" + + encodeURIComponent( value == null ? "" : value ); + }; + + // If an array was passed in, assume that it is an array of form elements. + if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { + + // Serialize the form elements + jQuery.each( a, function() { + add( this.name, this.value ); + } ); + + } else { + + // If traditional, encode the "old" way (the way 1.3.2 or older + // did it), otherwise encode params recursively. + for ( prefix in a ) { + buildParams( prefix, a[ prefix ], traditional, add ); + } + } + + // Return the resulting serialization + return s.join( "&" ); +}; + +jQuery.fn.extend( { + serialize: function() { + return jQuery.param( this.serializeArray() ); + }, + serializeArray: function() { + return this.map( function() { + + // Can add propHook for "elements" to filter or add form elements + var elements = jQuery.prop( this, "elements" ); + return elements ? jQuery.makeArray( elements ) : this; + } ) + .filter( function() { + var type = this.type; + + // Use .is( ":disabled" ) so that fieldset[disabled] works + return this.name && !jQuery( this ).is( ":disabled" ) && + rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && + ( this.checked || !rcheckableType.test( type ) ); + } ) + .map( function( i, elem ) { + var val = jQuery( this ).val(); + + if ( val == null ) { + return null; + } + + if ( Array.isArray( val ) ) { + return jQuery.map( val, function( val ) { + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ); + } + + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ).get(); + } +} ); + + +var + r20 = /%20/g, + rhash = /#.*$/, + rantiCache = /([?&])_=[^&]*/, + rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, + + // #7653, #8125, #8152: local protocol detection + rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, + rnoContent = /^(?:GET|HEAD)$/, + rprotocol = /^\/\//, + + /* Prefilters + * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) + * 2) These are called: + * - BEFORE asking for a transport + * - AFTER param serialization (s.data is a string if s.processData is true) + * 3) key is the dataType + * 4) the catchall symbol "*" can be used + * 5) execution will start with transport dataType and THEN continue down to "*" if needed + */ + prefilters = {}, + + /* Transports bindings + * 1) key is the dataType + * 2) the catchall symbol "*" can be used + * 3) selection will start with transport dataType and THEN go to "*" if needed + */ + transports = {}, + + // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression + allTypes = "*/".concat( "*" ), + + // Anchor tag for parsing the document origin + originAnchor = document.createElement( "a" ); + originAnchor.href = location.href; + +// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport +function addToPrefiltersOrTransports( structure ) { + + // dataTypeExpression is optional and defaults to "*" + return function( dataTypeExpression, func ) { + + if ( typeof dataTypeExpression !== "string" ) { + func = dataTypeExpression; + dataTypeExpression = "*"; + } + + var dataType, + i = 0, + dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; + + if ( jQuery.isFunction( func ) ) { + + // For each dataType in the dataTypeExpression + while ( ( dataType = dataTypes[ i++ ] ) ) { + + // Prepend if requested + if ( dataType[ 0 ] === "+" ) { + dataType = dataType.slice( 1 ) || "*"; + ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); + + // Otherwise append + } else { + ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); + } + } + } + }; +} + +// Base inspection function for prefilters and transports +function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { + + var inspected = {}, + seekingTransport = ( structure === transports ); + + function inspect( dataType ) { + var selected; + inspected[ dataType ] = true; + jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { + var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); + if ( typeof dataTypeOrTransport === "string" && + !seekingTransport && !inspected[ dataTypeOrTransport ] ) { + + options.dataTypes.unshift( dataTypeOrTransport ); + inspect( dataTypeOrTransport ); + return false; + } else if ( seekingTransport ) { + return !( selected = dataTypeOrTransport ); + } + } ); + return selected; + } + + return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); +} + +// A special extend for ajax options +// that takes "flat" options (not to be deep extended) +// Fixes #9887 +function ajaxExtend( target, src ) { + var key, deep, + flatOptions = jQuery.ajaxSettings.flatOptions || {}; + + for ( key in src ) { + if ( src[ key ] !== undefined ) { + ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; + } + } + if ( deep ) { + jQuery.extend( true, target, deep ); + } + + return target; +} + +/* Handles responses to an ajax request: + * - finds the right dataType (mediates between content-type and expected dataType) + * - returns the corresponding response + */ +function ajaxHandleResponses( s, jqXHR, responses ) { + + var ct, type, finalDataType, firstDataType, + contents = s.contents, + dataTypes = s.dataTypes; + + // Remove auto dataType and get content-type in the process + while ( dataTypes[ 0 ] === "*" ) { + dataTypes.shift(); + if ( ct === undefined ) { + ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); + } + } + + // Check if we're dealing with a known content-type + if ( ct ) { + for ( type in contents ) { + if ( contents[ type ] && contents[ type ].test( ct ) ) { + dataTypes.unshift( type ); + break; + } + } + } + + // Check to see if we have a response for the expected dataType + if ( dataTypes[ 0 ] in responses ) { + finalDataType = dataTypes[ 0 ]; + } else { + + // Try convertible dataTypes + for ( type in responses ) { + if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { + finalDataType = type; + break; + } + if ( !firstDataType ) { + firstDataType = type; + } + } + + // Or just use first one + finalDataType = finalDataType || firstDataType; + } + + // If we found a dataType + // We add the dataType to the list if needed + // and return the corresponding response + if ( finalDataType ) { + if ( finalDataType !== dataTypes[ 0 ] ) { + dataTypes.unshift( finalDataType ); + } + return responses[ finalDataType ]; + } +} + +/* Chain conversions given the request and the original response + * Also sets the responseXXX fields on the jqXHR instance + */ +function ajaxConvert( s, response, jqXHR, isSuccess ) { + var conv2, current, conv, tmp, prev, + converters = {}, + + // Work with a copy of dataTypes in case we need to modify it for conversion + dataTypes = s.dataTypes.slice(); + + // Create converters map with lowercased keys + if ( dataTypes[ 1 ] ) { + for ( conv in s.converters ) { + converters[ conv.toLowerCase() ] = s.converters[ conv ]; + } + } + + current = dataTypes.shift(); + + // Convert to each sequential dataType + while ( current ) { + + if ( s.responseFields[ current ] ) { + jqXHR[ s.responseFields[ current ] ] = response; + } + + // Apply the dataFilter if provided + if ( !prev && isSuccess && s.dataFilter ) { + response = s.dataFilter( response, s.dataType ); + } + + prev = current; + current = dataTypes.shift(); + + if ( current ) { + + // There's only work to do if current dataType is non-auto + if ( current === "*" ) { + + current = prev; + + // Convert response if prev dataType is non-auto and differs from current + } else if ( prev !== "*" && prev !== current ) { + + // Seek a direct converter + conv = converters[ prev + " " + current ] || converters[ "* " + current ]; + + // If none found, seek a pair + if ( !conv ) { + for ( conv2 in converters ) { + + // If conv2 outputs current + tmp = conv2.split( " " ); + if ( tmp[ 1 ] === current ) { + + // If prev can be converted to accepted input + conv = converters[ prev + " " + tmp[ 0 ] ] || + converters[ "* " + tmp[ 0 ] ]; + if ( conv ) { + + // Condense equivalence converters + if ( conv === true ) { + conv = converters[ conv2 ]; + + // Otherwise, insert the intermediate dataType + } else if ( converters[ conv2 ] !== true ) { + current = tmp[ 0 ]; + dataTypes.unshift( tmp[ 1 ] ); + } + break; + } + } + } + } + + // Apply converter (if not an equivalence) + if ( conv !== true ) { + + // Unless errors are allowed to bubble, catch and return them + if ( conv && s.throws ) { + response = conv( response ); + } else { + try { + response = conv( response ); + } catch ( e ) { + return { + state: "parsererror", + error: conv ? e : "No conversion from " + prev + " to " + current + }; + } + } + } + } + } + } + + return { state: "success", data: response }; +} + +jQuery.extend( { + + // Counter for holding the number of active queries + active: 0, + + // Last-Modified header cache for next request + lastModified: {}, + etag: {}, + + ajaxSettings: { + url: location.href, + type: "GET", + isLocal: rlocalProtocol.test( location.protocol ), + global: true, + processData: true, + async: true, + contentType: "application/x-www-form-urlencoded; charset=UTF-8", + + /* + timeout: 0, + data: null, + dataType: null, + username: null, + password: null, + cache: null, + throws: false, + traditional: false, + headers: {}, + */ + + accepts: { + "*": allTypes, + text: "text/plain", + html: "text/html", + xml: "application/xml, text/xml", + json: "application/json, text/javascript" + }, + + contents: { + xml: /\bxml\b/, + html: /\bhtml/, + json: /\bjson\b/ + }, + + responseFields: { + xml: "responseXML", + text: "responseText", + json: "responseJSON" + }, + + // Data converters + // Keys separate source (or catchall "*") and destination types with a single space + converters: { + + // Convert anything to text + "* text": String, + + // Text to html (true = no transformation) + "text html": true, + + // Evaluate text as a json expression + "text json": JSON.parse, + + // Parse text as xml + "text xml": jQuery.parseXML + }, + + // For options that shouldn't be deep extended: + // you can add your own custom options here if + // and when you create one that shouldn't be + // deep extended (see ajaxExtend) + flatOptions: { + url: true, + context: true + } + }, + + // Creates a full fledged settings object into target + // with both ajaxSettings and settings fields. + // If target is omitted, writes into ajaxSettings. + ajaxSetup: function( target, settings ) { + return settings ? + + // Building a settings object + ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : + + // Extending ajaxSettings + ajaxExtend( jQuery.ajaxSettings, target ); + }, + + ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), + ajaxTransport: addToPrefiltersOrTransports( transports ), + + // Main method + ajax: function( url, options ) { + + // If url is an object, simulate pre-1.5 signature + if ( typeof url === "object" ) { + options = url; + url = undefined; + } + + // Force options to be an object + options = options || {}; + + var transport, + + // URL without anti-cache param + cacheURL, + + // Response headers + responseHeadersString, + responseHeaders, + + // timeout handle + timeoutTimer, + + // Url cleanup var + urlAnchor, + + // Request state (becomes false upon send and true upon completion) + completed, + + // To know if global events are to be dispatched + fireGlobals, + + // Loop variable + i, + + // uncached part of the url + uncached, + + // Create the final options object + s = jQuery.ajaxSetup( {}, options ), + + // Callbacks context + callbackContext = s.context || s, + + // Context for global events is callbackContext if it is a DOM node or jQuery collection + globalEventContext = s.context && + ( callbackContext.nodeType || callbackContext.jquery ) ? + jQuery( callbackContext ) : + jQuery.event, + + // Deferreds + deferred = jQuery.Deferred(), + completeDeferred = jQuery.Callbacks( "once memory" ), + + // Status-dependent callbacks + statusCode = s.statusCode || {}, + + // Headers (they are sent all at once) + requestHeaders = {}, + requestHeadersNames = {}, + + // Default abort message + strAbort = "canceled", + + // Fake xhr + jqXHR = { + readyState: 0, + + // Builds headers hashtable if needed + getResponseHeader: function( key ) { + var match; + if ( completed ) { + if ( !responseHeaders ) { + responseHeaders = {}; + while ( ( match = rheaders.exec( responseHeadersString ) ) ) { + responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ]; + } + } + match = responseHeaders[ key.toLowerCase() ]; + } + return match == null ? null : match; + }, + + // Raw string + getAllResponseHeaders: function() { + return completed ? responseHeadersString : null; + }, + + // Caches the header + setRequestHeader: function( name, value ) { + if ( completed == null ) { + name = requestHeadersNames[ name.toLowerCase() ] = + requestHeadersNames[ name.toLowerCase() ] || name; + requestHeaders[ name ] = value; + } + return this; + }, + + // Overrides response content-type header + overrideMimeType: function( type ) { + if ( completed == null ) { + s.mimeType = type; + } + return this; + }, + + // Status-dependent callbacks + statusCode: function( map ) { + var code; + if ( map ) { + if ( completed ) { + + // Execute the appropriate callbacks + jqXHR.always( map[ jqXHR.status ] ); + } else { + + // Lazy-add the new callbacks in a way that preserves old ones + for ( code in map ) { + statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; + } + } + } + return this; + }, + + // Cancel the request + abort: function( statusText ) { + var finalText = statusText || strAbort; + if ( transport ) { + transport.abort( finalText ); + } + done( 0, finalText ); + return this; + } + }; + + // Attach deferreds + deferred.promise( jqXHR ); + + // Add protocol if not provided (prefilters might expect it) + // Handle falsy url in the settings object (#10093: consistency with old signature) + // We also use the url parameter if available + s.url = ( ( url || s.url || location.href ) + "" ) + .replace( rprotocol, location.protocol + "//" ); + + // Alias method option to type as per ticket #12004 + s.type = options.method || options.type || s.method || s.type; + + // Extract dataTypes list + s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; + + // A cross-domain request is in order when the origin doesn't match the current origin. + if ( s.crossDomain == null ) { + urlAnchor = document.createElement( "a" ); + + // Support: IE <=8 - 11, Edge 12 - 13 + // IE throws exception on accessing the href property if url is malformed, + // e.g. http://example.com:80x/ + try { + urlAnchor.href = s.url; + + // Support: IE <=8 - 11 only + // Anchor's host property isn't correctly set when s.url is relative + urlAnchor.href = urlAnchor.href; + s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== + urlAnchor.protocol + "//" + urlAnchor.host; + } catch ( e ) { + + // If there is an error parsing the URL, assume it is crossDomain, + // it can be rejected by the transport if it is invalid + s.crossDomain = true; + } + } + + // Convert data if not already a string + if ( s.data && s.processData && typeof s.data !== "string" ) { + s.data = jQuery.param( s.data, s.traditional ); + } + + // Apply prefilters + inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); + + // If request was aborted inside a prefilter, stop there + if ( completed ) { + return jqXHR; + } + + // We can fire global events as of now if asked to + // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) + fireGlobals = jQuery.event && s.global; + + // Watch for a new set of requests + if ( fireGlobals && jQuery.active++ === 0 ) { + jQuery.event.trigger( "ajaxStart" ); + } + + // Uppercase the type + s.type = s.type.toUpperCase(); + + // Determine if request has content + s.hasContent = !rnoContent.test( s.type ); + + // Save the URL in case we're toying with the If-Modified-Since + // and/or If-None-Match header later on + // Remove hash to simplify url manipulation + cacheURL = s.url.replace( rhash, "" ); + + // More options handling for requests with no content + if ( !s.hasContent ) { + + // Remember the hash so we can put it back + uncached = s.url.slice( cacheURL.length ); + + // If data is available, append data to url + if ( s.data ) { + cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; + + // #9682: remove data so that it's not used in an eventual retry + delete s.data; + } + + // Add or update anti-cache param if needed + if ( s.cache === false ) { + cacheURL = cacheURL.replace( rantiCache, "$1" ); + uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached; + } + + // Put hash and anti-cache on the URL that will be requested (gh-1732) + s.url = cacheURL + uncached; + + // Change '%20' to '+' if this is encoded form body content (gh-2658) + } else if ( s.data && s.processData && + ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { + s.data = s.data.replace( r20, "+" ); + } + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + if ( jQuery.lastModified[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); + } + if ( jQuery.etag[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); + } + } + + // Set the correct header, if data is being sent + if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { + jqXHR.setRequestHeader( "Content-Type", s.contentType ); + } + + // Set the Accepts header for the server, depending on the dataType + jqXHR.setRequestHeader( + "Accept", + s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? + s.accepts[ s.dataTypes[ 0 ] ] + + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : + s.accepts[ "*" ] + ); + + // Check for headers option + for ( i in s.headers ) { + jqXHR.setRequestHeader( i, s.headers[ i ] ); + } + + // Allow custom headers/mimetypes and early abort + if ( s.beforeSend && + ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { + + // Abort if not done already and return + return jqXHR.abort(); + } + + // Aborting is no longer a cancellation + strAbort = "abort"; + + // Install callbacks on deferreds + completeDeferred.add( s.complete ); + jqXHR.done( s.success ); + jqXHR.fail( s.error ); + + // Get transport + transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); + + // If no transport, we auto-abort + if ( !transport ) { + done( -1, "No Transport" ); + } else { + jqXHR.readyState = 1; + + // Send global event + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); + } + + // If request was aborted inside ajaxSend, stop there + if ( completed ) { + return jqXHR; + } + + // Timeout + if ( s.async && s.timeout > 0 ) { + timeoutTimer = window.setTimeout( function() { + jqXHR.abort( "timeout" ); + }, s.timeout ); + } + + try { + completed = false; + transport.send( requestHeaders, done ); + } catch ( e ) { + + // Rethrow post-completion exceptions + if ( completed ) { + throw e; + } + + // Propagate others as results + done( -1, e ); + } + } + + // Callback for when everything is done + function done( status, nativeStatusText, responses, headers ) { + var isSuccess, success, error, response, modified, + statusText = nativeStatusText; + + // Ignore repeat invocations + if ( completed ) { + return; + } + + completed = true; + + // Clear timeout if it exists + if ( timeoutTimer ) { + window.clearTimeout( timeoutTimer ); + } + + // Dereference transport for early garbage collection + // (no matter how long the jqXHR object will be used) + transport = undefined; + + // Cache response headers + responseHeadersString = headers || ""; + + // Set readyState + jqXHR.readyState = status > 0 ? 4 : 0; + + // Determine if successful + isSuccess = status >= 200 && status < 300 || status === 304; + + // Get response data + if ( responses ) { + response = ajaxHandleResponses( s, jqXHR, responses ); + } + + // Convert no matter what (that way responseXXX fields are always set) + response = ajaxConvert( s, response, jqXHR, isSuccess ); + + // If successful, handle type chaining + if ( isSuccess ) { + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + modified = jqXHR.getResponseHeader( "Last-Modified" ); + if ( modified ) { + jQuery.lastModified[ cacheURL ] = modified; + } + modified = jqXHR.getResponseHeader( "etag" ); + if ( modified ) { + jQuery.etag[ cacheURL ] = modified; + } + } + + // if no content + if ( status === 204 || s.type === "HEAD" ) { + statusText = "nocontent"; + + // if not modified + } else if ( status === 304 ) { + statusText = "notmodified"; + + // If we have data, let's convert it + } else { + statusText = response.state; + success = response.data; + error = response.error; + isSuccess = !error; + } + } else { + + // Extract error from statusText and normalize for non-aborts + error = statusText; + if ( status || !statusText ) { + statusText = "error"; + if ( status < 0 ) { + status = 0; + } + } + } + + // Set data for the fake xhr object + jqXHR.status = status; + jqXHR.statusText = ( nativeStatusText || statusText ) + ""; + + // Success/Error + if ( isSuccess ) { + deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); + } else { + deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); + } + + // Status-dependent callbacks + jqXHR.statusCode( statusCode ); + statusCode = undefined; + + if ( fireGlobals ) { + globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", + [ jqXHR, s, isSuccess ? success : error ] ); + } + + // Complete + completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); + + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); + + // Handle the global AJAX counter + if ( !( --jQuery.active ) ) { + jQuery.event.trigger( "ajaxStop" ); + } + } + } + + return jqXHR; + }, + + getJSON: function( url, data, callback ) { + return jQuery.get( url, data, callback, "json" ); + }, + + getScript: function( url, callback ) { + return jQuery.get( url, undefined, callback, "script" ); + } +} ); + +jQuery.each( [ "get", "post" ], function( i, method ) { + jQuery[ method ] = function( url, data, callback, type ) { + + // Shift arguments if data argument was omitted + if ( jQuery.isFunction( data ) ) { + type = type || callback; + callback = data; + data = undefined; + } + + // The url can be an options object (which then must have .url) + return jQuery.ajax( jQuery.extend( { + url: url, + type: method, + dataType: type, + data: data, + success: callback + }, jQuery.isPlainObject( url ) && url ) ); + }; +} ); + + +jQuery._evalUrl = function( url ) { + return jQuery.ajax( { + url: url, + + // Make this explicit, since user can override this through ajaxSetup (#11264) + type: "GET", + dataType: "script", + cache: true, + async: false, + global: false, + "throws": true + } ); +}; + + +jQuery.fn.extend( { + wrapAll: function( html ) { + var wrap; + + if ( this[ 0 ] ) { + if ( jQuery.isFunction( html ) ) { + html = html.call( this[ 0 ] ); + } + + // The elements to wrap the target around + wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); + + if ( this[ 0 ].parentNode ) { + wrap.insertBefore( this[ 0 ] ); + } + + wrap.map( function() { + var elem = this; + + while ( elem.firstElementChild ) { + elem = elem.firstElementChild; + } + + return elem; + } ).append( this ); + } + + return this; + }, + + wrapInner: function( html ) { + if ( jQuery.isFunction( html ) ) { + return this.each( function( i ) { + jQuery( this ).wrapInner( html.call( this, i ) ); + } ); + } + + return this.each( function() { + var self = jQuery( this ), + contents = self.contents(); + + if ( contents.length ) { + contents.wrapAll( html ); + + } else { + self.append( html ); + } + } ); + }, + + wrap: function( html ) { + var isFunction = jQuery.isFunction( html ); + + return this.each( function( i ) { + jQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html ); + } ); + }, + + unwrap: function( selector ) { + this.parent( selector ).not( "body" ).each( function() { + jQuery( this ).replaceWith( this.childNodes ); + } ); + return this; + } +} ); + + +jQuery.expr.pseudos.hidden = function( elem ) { + return !jQuery.expr.pseudos.visible( elem ); +}; +jQuery.expr.pseudos.visible = function( elem ) { + return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); +}; + + + + +jQuery.ajaxSettings.xhr = function() { + try { + return new window.XMLHttpRequest(); + } catch ( e ) {} +}; + +var xhrSuccessStatus = { + + // File protocol always yields status code 0, assume 200 + 0: 200, + + // Support: IE <=9 only + // #1450: sometimes IE returns 1223 when it should be 204 + 1223: 204 + }, + xhrSupported = jQuery.ajaxSettings.xhr(); + +support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); +support.ajax = xhrSupported = !!xhrSupported; + +jQuery.ajaxTransport( function( options ) { + var callback, errorCallback; + + // Cross domain only allowed if supported through XMLHttpRequest + if ( support.cors || xhrSupported && !options.crossDomain ) { + return { + send: function( headers, complete ) { + var i, + xhr = options.xhr(); + + xhr.open( + options.type, + options.url, + options.async, + options.username, + options.password + ); + + // Apply custom fields if provided + if ( options.xhrFields ) { + for ( i in options.xhrFields ) { + xhr[ i ] = options.xhrFields[ i ]; + } + } + + // Override mime type if needed + if ( options.mimeType && xhr.overrideMimeType ) { + xhr.overrideMimeType( options.mimeType ); + } + + // X-Requested-With header + // For cross-domain requests, seeing as conditions for a preflight are + // akin to a jigsaw puzzle, we simply never set it to be sure. + // (it can always be set on a per-request basis or even using ajaxSetup) + // For same-domain requests, won't change header if already provided. + if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { + headers[ "X-Requested-With" ] = "XMLHttpRequest"; + } + + // Set headers + for ( i in headers ) { + xhr.setRequestHeader( i, headers[ i ] ); + } + + // Callback + callback = function( type ) { + return function() { + if ( callback ) { + callback = errorCallback = xhr.onload = + xhr.onerror = xhr.onabort = xhr.onreadystatechange = null; + + if ( type === "abort" ) { + xhr.abort(); + } else if ( type === "error" ) { + + // Support: IE <=9 only + // On a manual native abort, IE9 throws + // errors on any property access that is not readyState + if ( typeof xhr.status !== "number" ) { + complete( 0, "error" ); + } else { + complete( + + // File: protocol always yields status 0; see #8605, #14207 + xhr.status, + xhr.statusText + ); + } + } else { + complete( + xhrSuccessStatus[ xhr.status ] || xhr.status, + xhr.statusText, + + // Support: IE <=9 only + // IE9 has no XHR2 but throws on binary (trac-11426) + // For XHR2 non-text, let the caller handle it (gh-2498) + ( xhr.responseType || "text" ) !== "text" || + typeof xhr.responseText !== "string" ? + { binary: xhr.response } : + { text: xhr.responseText }, + xhr.getAllResponseHeaders() + ); + } + } + }; + }; + + // Listen to events + xhr.onload = callback(); + errorCallback = xhr.onerror = callback( "error" ); + + // Support: IE 9 only + // Use onreadystatechange to replace onabort + // to handle uncaught aborts + if ( xhr.onabort !== undefined ) { + xhr.onabort = errorCallback; + } else { + xhr.onreadystatechange = function() { + + // Check readyState before timeout as it changes + if ( xhr.readyState === 4 ) { + + // Allow onerror to be called first, + // but that will not handle a native abort + // Also, save errorCallback to a variable + // as xhr.onerror cannot be accessed + window.setTimeout( function() { + if ( callback ) { + errorCallback(); + } + } ); + } + }; + } + + // Create the abort callback + callback = callback( "abort" ); + + try { + + // Do send the request (this may raise an exception) + xhr.send( options.hasContent && options.data || null ); + } catch ( e ) { + + // #14683: Only rethrow if this hasn't been notified as an error yet + if ( callback ) { + throw e; + } + } + }, + + abort: function() { + if ( callback ) { + callback(); + } + } + }; + } +} ); + + + + +// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) +jQuery.ajaxPrefilter( function( s ) { + if ( s.crossDomain ) { + s.contents.script = false; + } +} ); + +// Install script dataType +jQuery.ajaxSetup( { + accepts: { + script: "text/javascript, application/javascript, " + + "application/ecmascript, application/x-ecmascript" + }, + contents: { + script: /\b(?:java|ecma)script\b/ + }, + converters: { + "text script": function( text ) { + jQuery.globalEval( text ); + return text; + } + } +} ); + +// Handle cache's special case and crossDomain +jQuery.ajaxPrefilter( "script", function( s ) { + if ( s.cache === undefined ) { + s.cache = false; + } + if ( s.crossDomain ) { + s.type = "GET"; + } +} ); + +// Bind script tag hack transport +jQuery.ajaxTransport( "script", function( s ) { + + // This transport only deals with cross domain requests + if ( s.crossDomain ) { + var script, callback; + return { + send: function( _, complete ) { + script = jQuery( " + + + + + + + diff --git a/generator-web/src/main/resources/templates/html/common/footer.html b/generator-web/src/main/resources/templates/html/common/footer.html new file mode 100644 index 0000000..e243af7 --- /dev/null +++ b/generator-web/src/main/resources/templates/html/common/footer.html @@ -0,0 +1,22 @@ + + + + + Title + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/generator-web/src/main/resources/templates/html/common/header.html b/generator-web/src/main/resources/templates/html/common/header.html new file mode 100644 index 0000000..58b9deb --- /dev/null +++ b/generator-web/src/main/resources/templates/html/common/header.html @@ -0,0 +1,15 @@ + + + + + Title + + + + + + + + + + \ No newline at end of file diff --git a/generator-web/src/main/resources/templates/html/index.html b/generator-web/src/main/resources/templates/html/index.html new file mode 100644 index 0000000..5ddcec6 --- /dev/null +++ b/generator-web/src/main/resources/templates/html/index.html @@ -0,0 +1,208 @@ + + + + + 代码生成器 + + +
    + + +
    +
    +
    +
    +
    +
    +
    +
    +
    + 代码生成器: +
    + +
    +
    +
    +
    + + +
    +
    + +
    +
    + +
    + +
    +
    +
    + + + 使用前给当前用户或者IP授权访问 使用完成可取消授权 +
    +
    + +
    +
    + + + 密码不会记录,请放心使用 +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    +
    + 无法连接到数据库,请检查配置 + +
    +
    +
    + +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    +
    + +
    + +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + + java包名 +
    +
    +
    + +
    +
    +
    + + +
    +
    + +
    +
    + + +
    +
    +
    + +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + + + + + diff --git a/generator-web/src/main/resources/templates/html/layout.html b/generator-web/src/main/resources/templates/html/layout.html new file mode 100644 index 0000000..6ff06ee --- /dev/null +++ b/generator-web/src/main/resources/templates/html/layout.html @@ -0,0 +1,27 @@ + + + + + + layout + + + + + + + + +
    header
    +
    footer
    +
    + + + + \ No newline at end of file diff --git a/generator-web/src/main/resources/template/java/api/pagination.vm b/generator-web/src/main/resources/templates/java/api/pagination.vm similarity index 100% rename from generator-web/src/main/resources/template/java/api/pagination.vm rename to generator-web/src/main/resources/templates/java/api/pagination.vm diff --git a/generator-web/src/main/resources/template/java/api/pom.vm b/generator-web/src/main/resources/templates/java/api/pom.vm similarity index 100% rename from generator-web/src/main/resources/template/java/api/pom.vm rename to generator-web/src/main/resources/templates/java/api/pom.vm diff --git a/generator-web/src/main/resources/template/java/app/pom.vm b/generator-web/src/main/resources/templates/java/app/pom.vm similarity index 100% rename from generator-web/src/main/resources/template/java/app/pom.vm rename to generator-web/src/main/resources/templates/java/app/pom.vm diff --git a/generator-web/src/main/resources/template/java/app/readme.vm b/generator-web/src/main/resources/templates/java/app/readme.vm similarity index 100% rename from generator-web/src/main/resources/template/java/app/readme.vm rename to generator-web/src/main/resources/templates/java/app/readme.vm diff --git a/generator-web/src/main/resources/template/java/common/pom.vm b/generator-web/src/main/resources/templates/java/common/pom.vm similarity index 100% rename from generator-web/src/main/resources/template/java/common/pom.vm rename to generator-web/src/main/resources/templates/java/common/pom.vm diff --git a/generator-web/src/main/resources/template/java/domain/condition.vm b/generator-web/src/main/resources/templates/java/domain/condition.vm similarity index 100% rename from generator-web/src/main/resources/template/java/domain/condition.vm rename to generator-web/src/main/resources/templates/java/domain/condition.vm diff --git a/generator-web/src/main/resources/template/java/domain/entity.vm b/generator-web/src/main/resources/templates/java/domain/entity.vm similarity index 100% rename from generator-web/src/main/resources/template/java/domain/entity.vm rename to generator-web/src/main/resources/templates/java/domain/entity.vm diff --git a/generator-web/src/main/resources/template/java/domain/pom.vm b/generator-web/src/main/resources/templates/java/domain/pom.vm similarity index 100% rename from generator-web/src/main/resources/template/java/domain/pom.vm rename to generator-web/src/main/resources/templates/java/domain/pom.vm diff --git a/generator-web/src/main/resources/template/java/orm/dao.vm b/generator-web/src/main/resources/templates/java/orm/dao.vm similarity index 100% rename from generator-web/src/main/resources/template/java/orm/dao.vm rename to generator-web/src/main/resources/templates/java/orm/dao.vm diff --git a/generator-web/src/main/resources/template/java/orm/mapper.vm b/generator-web/src/main/resources/templates/java/orm/mapper.vm similarity index 100% rename from generator-web/src/main/resources/template/java/orm/mapper.vm rename to generator-web/src/main/resources/templates/java/orm/mapper.vm diff --git a/generator-web/src/main/resources/template/java/orm/pom.vm b/generator-web/src/main/resources/templates/java/orm/pom.vm similarity index 100% rename from generator-web/src/main/resources/template/java/orm/pom.vm rename to generator-web/src/main/resources/templates/java/orm/pom.vm diff --git a/generator-web/src/main/resources/template/java/provider/pom.vm b/generator-web/src/main/resources/templates/java/provider/pom.vm similarity index 100% rename from generator-web/src/main/resources/template/java/provider/pom.vm rename to generator-web/src/main/resources/templates/java/provider/pom.vm diff --git a/generator-web/src/main/resources/template/java/rpc/pom.vm b/generator-web/src/main/resources/templates/java/rpc/pom.vm similarity index 100% rename from generator-web/src/main/resources/template/java/rpc/pom.vm rename to generator-web/src/main/resources/templates/java/rpc/pom.vm diff --git a/generator-web/src/main/resources/template/java/service/pom.vm b/generator-web/src/main/resources/templates/java/service/pom.vm similarity index 100% rename from generator-web/src/main/resources/template/java/service/pom.vm rename to generator-web/src/main/resources/templates/java/service/pom.vm diff --git a/generator-web/src/main/resources/template/java/service/service.vm b/generator-web/src/main/resources/templates/java/service/service.vm similarity index 100% rename from generator-web/src/main/resources/template/java/service/service.vm rename to generator-web/src/main/resources/templates/java/service/service.vm diff --git a/generator-web/src/main/resources/template/java/service/serviceImpl.vm b/generator-web/src/main/resources/templates/java/service/serviceImpl.vm similarity index 100% rename from generator-web/src/main/resources/template/java/service/serviceImpl.vm rename to generator-web/src/main/resources/templates/java/service/serviceImpl.vm diff --git a/generator-web/src/main/resources/template/java/web/application-dev.vm b/generator-web/src/main/resources/templates/java/web/application-dev.vm similarity index 100% rename from generator-web/src/main/resources/template/java/web/application-dev.vm rename to generator-web/src/main/resources/templates/java/web/application-dev.vm diff --git a/generator-web/src/main/resources/template/java/web/application.vm b/generator-web/src/main/resources/templates/java/web/application.vm similarity index 100% rename from generator-web/src/main/resources/template/java/web/application.vm rename to generator-web/src/main/resources/templates/java/web/application.vm diff --git a/generator-web/src/main/resources/template/java/web/log-back.vm b/generator-web/src/main/resources/templates/java/web/log-back.vm similarity index 100% rename from generator-web/src/main/resources/template/java/web/log-back.vm rename to generator-web/src/main/resources/templates/java/web/log-back.vm diff --git a/generator-web/src/main/resources/template/java/web/pom.vm b/generator-web/src/main/resources/templates/java/web/pom.vm similarity index 100% rename from generator-web/src/main/resources/template/java/web/pom.vm rename to generator-web/src/main/resources/templates/java/web/pom.vm diff --git a/generator-web/src/main/resources/template/java/web/webApplication.vm b/generator-web/src/main/resources/templates/java/web/webApplication.vm similarity index 100% rename from generator-web/src/main/resources/template/java/web/webApplication.vm rename to generator-web/src/main/resources/templates/java/web/webApplication.vm diff --git a/generator-web/target/classes/config/application-dev.yml b/generator-web/target/classes/config/application-dev.yml index 0c4c4ae..9846788 100644 --- a/generator-web/target/classes/config/application-dev.yml +++ b/generator-web/target/classes/config/application-dev.yml @@ -1,7 +1,7 @@ server: tomcat: uri-encoding: UTF-8 - port: 80 + port: 8080 spring: http: @@ -9,6 +9,10 @@ spring: force: true charset: UTF-8 enabled: true + thymeleaf: + cache: false + check-template: false + mode: LEGACYHTML5 datasource: name: c2c url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8 diff --git a/generator-web/target/classes/static/404.html b/generator-web/target/classes/static/404.html new file mode 100644 index 0000000..95c486f --- /dev/null +++ b/generator-web/target/classes/static/404.html @@ -0,0 +1,25 @@ + + + + + + + Carbon - Admin Template + + + + + +
    +
    +
    +
    + 404 +
    The page you are looking for was not found.
    + Back to Home +
    +
    +
    +
    + + diff --git a/generator-web/target/classes/static/500.html b/generator-web/target/classes/static/500.html new file mode 100644 index 0000000..063375f --- /dev/null +++ b/generator-web/target/classes/static/500.html @@ -0,0 +1,24 @@ + + + + + + + Carbon - Admin Template + + + + + +
    +
    +
    +
    +

    500

    +
    There was an error. Please try again later.
    +
    +
    +
    +
    + + diff --git a/generator-web/target/classes/static/alerts.html b/generator-web/target/classes/static/alerts.html new file mode 100644 index 0000000..346495f --- /dev/null +++ b/generator-web/target/classes/static/alerts.html @@ -0,0 +1,343 @@ + + + + + + + Carbon - Admin Template + + + + + +
    + + +
    + + +
    +
    +
    +
    +
    +
    + Normal Alerts +
    + +
    +
    .alert .alert-primary
    +
    .alert .alert-secondary
    +
    .alert .alert-danger
    +
    .alert .alert-success
    +
    .alert .alert-warning
    +
    .alert .alert-info
    +
    +
    +
    + +
    +
    +
    + Dismissible Alerts +
    + +
    +
    + .alert .alert-dismissible .alert-primary + + +
    + +
    + .alert .alert-dismissible .alert-secondary + + +
    + +
    + .alert .alert-dismissible .alert-danger + + +
    + +
    + .alert .alert-dismissible .alert-success + + +
    + +
    + .alert .alert-dismissible .alert-warning + + +
    + +
    + .alert .alert-dismissible .alert-info + + +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + diff --git a/generator-web/target/classes/static/blank.html b/generator-web/target/classes/static/blank.html new file mode 100644 index 0000000..af7cbc1 --- /dev/null +++ b/generator-web/target/classes/static/blank.html @@ -0,0 +1,316 @@ + + + + + + + Carbon - Admin Template + + + + + +
    + + +
    + + +
    +
      + +
    +
    +
    +
    + + + + + + + + + + + + diff --git a/generator-web/target/classes/static/buttons.html b/generator-web/target/classes/static/buttons.html new file mode 100644 index 0000000..c3dd0cd --- /dev/null +++ b/generator-web/target/classes/static/buttons.html @@ -0,0 +1,355 @@ + + + + + + + Carbon - Admin Template + + + + + +
    + + +
    + + +
    +
    +
    +
    +
    + Buttons +
    + +
    +
    +

    Normal Buttons

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

    Outline Buttons

    +

    Add .btn-outline-* to your buttons to mak

    + + + + + + +
    + +
    +
    +

    Button Sizes

    +

    To make different size buttons add one of the classes .btn-sm, + .btn-lg

    + + + +
    + +
    +
    +

    Button with Icons

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

    Rounded Buttons

    +

    Add .btn-rounded class to your buttons to make them rounded.

    + + + + + + +
    + +
    +
    +

    Block Buttons

    +

    Add .btn-block class to your buttons to make them full width.

    + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + diff --git a/generator-web/target/classes/static/cards.html b/generator-web/target/classes/static/cards.html new file mode 100644 index 0000000..2c46ca6 --- /dev/null +++ b/generator-web/target/classes/static/cards.html @@ -0,0 +1,424 @@ + + + + + + + Carbon - Admin Template + + + + + +
    + + +
    + + +
    +
    +
    +
    +
    + Default Card +
    + +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. Alias architecto atque deleniti dolor dolores doloribus ducimus ea, eveniet facere hic illo illum laborum maiores nemo optio quas quis tenetur totam. +
    +
    +
    + +
    +
    +
    + Light Header +
    + +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. Alias architecto atque deleniti dolor dolores doloribus ducimus ea, eveniet facere hic illo illum laborum maiores nemo optio quas quis tenetur totam. +
    +
    +
    + +
    +
    +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. Alias architecto atque deleniti dolor dolores doloribus ducimus ea, eveniet facere hic illo illum laborum maiores nemo optio quas quis tenetur totam. +
    + + +
    +
    +
    + +
    +
    +
    +
    + Card with Actions + +
    + + + + + + + +
    +
    + +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
    +
    +
    + +
    +
    +
    + Card Divded Header +
    + +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
    +
    +
    + +
    +
    +
    + Light Card +
    + +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
    +
    +
    +
    + +
    +
    +
    +
    + Primary Card +
    + +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
    +
    +
    + +
    +
    +
    + Info Card +
    + +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
    +
    +
    + +
    +
    +
    + Danger Card +
    + +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
    +
    +
    +
    + +
    +
    +
    +
    + Success Card +
    + +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
    +
    +
    + +
    +
    +
    + Warning Card +
    + +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
    +
    +
    + +
    +
    +
    + Dark Card +
    + +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
    +
    +
    +
    +
    +
    +
    + + + + + + + + diff --git a/generator-web/target/classes/static/chartjs.html b/generator-web/target/classes/static/chartjs.html new file mode 100644 index 0000000..b01485b --- /dev/null +++ b/generator-web/target/classes/static/chartjs.html @@ -0,0 +1,314 @@ + + + + + + + Carbon - Admin Template + + + + + +
    + + +
    + + +
    +
    +
    +
    +
    + Bar Charts +
    + +
    + +
    +
    +
    + +
    +
    +
    + Line Charts +
    + +
    + +
    +
    +
    +
    + +
    +
    +
    +
    + Radar Chart +
    + +
    + +
    +
    +
    + +
    +
    +
    + Pie Chart +
    + +
    + +
    +
    +
    +
    +
    +
    +
    + + + + + + + + diff --git a/generator-web/target/classes/static/css/bootstrap-datetimepicker.min.css b/generator-web/target/classes/static/css/bootstrap-datetimepicker.min.css new file mode 100755 index 0000000..78485fe --- /dev/null +++ b/generator-web/target/classes/static/css/bootstrap-datetimepicker.min.css @@ -0,0 +1,9 @@ +/*! + * Datetimepicker for Bootstrap + * + * Copyright 2012 Stefan Petre + * Improvements by Andrew Rowls + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + */.datetimepicker{padding:4px;margin-top:1px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;direction:ltr}.datetimepicker-inline{width:220px}.datetimepicker.datetimepicker-rtl{direction:rtl}.datetimepicker.datetimepicker-rtl table tr td span{float:right}.datetimepicker-dropdown,.datetimepicker-dropdown-left{top:0;left:0}[class*=" datetimepicker-dropdown"]:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0,0,0,0.2);position:absolute}[class*=" datetimepicker-dropdown"]:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff;position:absolute}[class*=" datetimepicker-dropdown-top"]:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-top:7px solid #ccc;border-top-color:rgba(0,0,0,0.2);border-bottom:0}[class*=" datetimepicker-dropdown-top"]:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-top:6px solid #fff;border-bottom:0}.datetimepicker-dropdown-bottom-left:before{top:-7px;right:6px}.datetimepicker-dropdown-bottom-left:after{top:-6px;right:7px}.datetimepicker-dropdown-bottom-right:before{top:-7px;left:6px}.datetimepicker-dropdown-bottom-right:after{top:-6px;left:7px}.datetimepicker-dropdown-top-left:before{bottom:-7px;right:6px}.datetimepicker-dropdown-top-left:after{bottom:-6px;right:7px}.datetimepicker-dropdown-top-right:before{bottom:-7px;left:6px}.datetimepicker-dropdown-top-right:after{bottom:-6px;left:7px}.datetimepicker>div{display:none}.datetimepicker.minutes div.datetimepicker-minutes{display:block}.datetimepicker.hours div.datetimepicker-hours{display:block}.datetimepicker.days div.datetimepicker-days{display:block}.datetimepicker.months div.datetimepicker-months{display:block}.datetimepicker.years div.datetimepicker-years{display:block}.datetimepicker table{margin:0}.datetimepicker td,.datetimepicker th{text-align:center;width:20px;height:20px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;border:0}.table-striped .datetimepicker table tr td,.table-striped .datetimepicker table tr th{background-color:transparent}.datetimepicker table tr td.minute:hover{background:#eee;cursor:pointer}.datetimepicker table tr td.hour:hover{background:#eee;cursor:pointer}.datetimepicker table tr td.day:hover{background:#eee;cursor:pointer}.datetimepicker table tr td.old,.datetimepicker table tr td.new{color:#999}.datetimepicker table tr td.disabled,.datetimepicker table tr td.disabled:hover{background:0;color:#999;cursor:default}.datetimepicker table tr td.today,.datetimepicker table tr td.today:hover,.datetimepicker table tr td.today.disabled,.datetimepicker table tr td.today.disabled:hover{background-color:#fde19a;background-image:-moz-linear-gradient(top,#fdd49a,#fdf59a);background-image:-ms-linear-gradient(top,#fdd49a,#fdf59a);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fdd49a),to(#fdf59a));background-image:-webkit-linear-gradient(top,#fdd49a,#fdf59a);background-image:-o-linear-gradient(top,#fdd49a,#fdf59a);background-image:linear-gradient(to bottom,#fdd49a,#fdf59a);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fdd49a',endColorstr='#fdf59a',GradientType=0);border-color:#fdf59a #fdf59a #fbed50;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.datetimepicker table tr td.today:hover,.datetimepicker table tr td.today:hover:hover,.datetimepicker table tr td.today.disabled:hover,.datetimepicker table tr td.today.disabled:hover:hover,.datetimepicker table tr td.today:active,.datetimepicker table tr td.today:hover:active,.datetimepicker table tr td.today.disabled:active,.datetimepicker table tr td.today.disabled:hover:active,.datetimepicker table tr td.today.active,.datetimepicker table tr td.today:hover.active,.datetimepicker table tr td.today.disabled.active,.datetimepicker table tr td.today.disabled:hover.active,.datetimepicker table tr td.today.disabled,.datetimepicker table tr td.today:hover.disabled,.datetimepicker table tr td.today.disabled.disabled,.datetimepicker table tr td.today.disabled:hover.disabled,.datetimepicker table tr td.today[disabled],.datetimepicker table tr td.today:hover[disabled],.datetimepicker table tr td.today.disabled[disabled],.datetimepicker table tr td.today.disabled:hover[disabled]{background-color:#fdf59a}.datetimepicker table tr td.today:active,.datetimepicker table tr td.today:hover:active,.datetimepicker table tr td.today.disabled:active,.datetimepicker table tr td.today.disabled:hover:active,.datetimepicker table tr td.today.active,.datetimepicker table tr td.today:hover.active,.datetimepicker table tr td.today.disabled.active,.datetimepicker table tr td.today.disabled:hover.active{background-color:#fbf069}.datetimepicker table tr td.active,.datetimepicker table tr td.active:hover,.datetimepicker table tr td.active.disabled,.datetimepicker table tr td.active.disabled:hover{background-color:#006dcc;background-image:-moz-linear-gradient(top,#08c,#04c);background-image:-ms-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc',endColorstr='#0044cc',GradientType=0);border-color:#04c #04c #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.datetimepicker table tr td.active:hover,.datetimepicker table tr td.active:hover:hover,.datetimepicker table tr td.active.disabled:hover,.datetimepicker table tr td.active.disabled:hover:hover,.datetimepicker table tr td.active:active,.datetimepicker table tr td.active:hover:active,.datetimepicker table tr td.active.disabled:active,.datetimepicker table tr td.active.disabled:hover:active,.datetimepicker table tr td.active.active,.datetimepicker table tr td.active:hover.active,.datetimepicker table tr td.active.disabled.active,.datetimepicker table tr td.active.disabled:hover.active,.datetimepicker table tr td.active.disabled,.datetimepicker table tr td.active:hover.disabled,.datetimepicker table tr td.active.disabled.disabled,.datetimepicker table tr td.active.disabled:hover.disabled,.datetimepicker table tr td.active[disabled],.datetimepicker table tr td.active:hover[disabled],.datetimepicker table tr td.active.disabled[disabled],.datetimepicker table tr td.active.disabled:hover[disabled]{background-color:#04c}.datetimepicker table tr td.active:active,.datetimepicker table tr td.active:hover:active,.datetimepicker table tr td.active.disabled:active,.datetimepicker table tr td.active.disabled:hover:active,.datetimepicker table tr td.active.active,.datetimepicker table tr td.active:hover.active,.datetimepicker table tr td.active.disabled.active,.datetimepicker table tr td.active.disabled:hover.active{background-color:#039}.datetimepicker table tr td span{display:block;width:23%;height:54px;line-height:54px;float:left;margin:1%;cursor:pointer;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.datetimepicker .datetimepicker-hours span{height:26px;line-height:26px}.datetimepicker .datetimepicker-hours table tr td span.hour_am,.datetimepicker .datetimepicker-hours table tr td span.hour_pm{width:14.6%}.datetimepicker .datetimepicker-hours fieldset legend,.datetimepicker .datetimepicker-minutes fieldset legend{margin-bottom:inherit;line-height:30px}.datetimepicker .datetimepicker-minutes span{height:26px;line-height:26px}.datetimepicker table tr td span:hover{background:#eee}.datetimepicker table tr td span.disabled,.datetimepicker table tr td span.disabled:hover{background:0;color:#999;cursor:default}.datetimepicker table tr td span.active,.datetimepicker table tr td span.active:hover,.datetimepicker table tr td span.active.disabled,.datetimepicker table tr td span.active.disabled:hover{background-color:#006dcc;background-image:-moz-linear-gradient(top,#08c,#04c);background-image:-ms-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc',endColorstr='#0044cc',GradientType=0);border-color:#04c #04c #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.datetimepicker table tr td span.active:hover,.datetimepicker table tr td span.active:hover:hover,.datetimepicker table tr td span.active.disabled:hover,.datetimepicker table tr td span.active.disabled:hover:hover,.datetimepicker table tr td span.active:active,.datetimepicker table tr td span.active:hover:active,.datetimepicker table tr td span.active.disabled:active,.datetimepicker table tr td span.active.disabled:hover:active,.datetimepicker table tr td span.active.active,.datetimepicker table tr td span.active:hover.active,.datetimepicker table tr td span.active.disabled.active,.datetimepicker table tr td span.active.disabled:hover.active,.datetimepicker table tr td span.active.disabled,.datetimepicker table tr td span.active:hover.disabled,.datetimepicker table tr td span.active.disabled.disabled,.datetimepicker table tr td span.active.disabled:hover.disabled,.datetimepicker table tr td span.active[disabled],.datetimepicker table tr td span.active:hover[disabled],.datetimepicker table tr td span.active.disabled[disabled],.datetimepicker table tr td span.active.disabled:hover[disabled]{background-color:#04c}.datetimepicker table tr td span.active:active,.datetimepicker table tr td span.active:hover:active,.datetimepicker table tr td span.active.disabled:active,.datetimepicker table tr td span.active.disabled:hover:active,.datetimepicker table tr td span.active.active,.datetimepicker table tr td span.active:hover.active,.datetimepicker table tr td span.active.disabled.active,.datetimepicker table tr td span.active.disabled:hover.active{background-color:#039}.datetimepicker table tr td span.old{color:#999}.datetimepicker th.switch{width:145px}.datetimepicker th span.glyphicon{pointer-events:none}.datetimepicker thead tr:first-child th,.datetimepicker tfoot th{cursor:pointer}.datetimepicker thead tr:first-child th:hover,.datetimepicker tfoot th:hover{background:#eee}.input-append.date .add-on i,.input-prepend.date .add-on i,.input-group.date .input-group-addon span{cursor:pointer;width:14px;height:14px} \ No newline at end of file diff --git a/generator-web/target/classes/static/css/styles.css b/generator-web/target/classes/static/css/styles.css new file mode 100644 index 0000000..f1b7fb3 --- /dev/null +++ b/generator-web/target/classes/static/css/styles.css @@ -0,0 +1 @@ +:root{--blue:#42a5f5;--indigo:#3f51b5;--purple:#9c27b0;--pink:#e91e63;--red:#ef5350;--orange:#fdb244;--yellow:#ffca28;--green:#9ccc65;--teal:#009688;--cyan:#26c6da;--white:#fff;--gray:#999;--gray-dark:#4d4d4d;--primary:#42a5f5;--secondary:#aaa;--success:#9ccc65;--info:#26c6da;--warning:#ffca28;--danger:#ef5350;--light:#f8f9fa;--dark:#444;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}@media print{*,:after,:before{text-shadow:none!important;-webkit-box-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]:after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #aaa;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}.container,body{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #444}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}}*,:after,:before{-webkit-box-sizing:border-box;box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:rgba(68,68,68,0)}@-ms-viewport{width:device-width}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:.875rem;font-weight:400;line-height:1.5;color:#444;text-align:left;background-color:#efefef}[tabindex="-1"]:focus{outline:0!important}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6,p{margin-top:0}p{margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0}address{font-style:normal;line-height:inherit}address,dl,ol,ul{margin-bottom:1rem}dl,ol,ul{margin-top:0}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:500}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#777;text-decoration:none;background-color:transparent;-webkit-text-decoration-skip:objects}a:hover{color:#515151;text-decoration:none}a:not([href]):not([tabindex]),a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg:not(:root){overflow:hidden}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#999;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:1rem;font-family:inherit;font-weight:500;line-height:1.2;color:inherit}.h1,h1{font-size:2.1875rem}.h2,h2{font-size:1.75rem}.h3,h3{font-size:1.53125rem}.h4,h4{font-size:1.3125rem}.h5,h5{font-size:1.09375rem}.h6,h6{font-size:.875rem}.lead{font-size:1.09375rem;font-weight:300}.display-1{font-size:6rem}.display-1,.display-2{font-weight:300;line-height:1.2}.display-2{font-size:5.5rem}.display-3{font-size:4.5rem}.display-3,.display-4{font-weight:300;line-height:1.2}.display-4{font-size:3.5rem}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(68,68,68,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-inline,.list-unstyled{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.09375rem}.blockquote-footer{display:block;font-size:80%;color:#999}.blockquote-footer:before{content:"\2014 \A0"}.img-fluid,.img-thumbnail{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#efefef;border:1px solid #dee2e6}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#999}code{font-size:87.5%;color:#e91e63;word-break:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#4d4d4d}kbd kbd{padding:0;font-size:100%;font-weight:500}pre{display:block;font-size:87.5%;color:#4d4d4d}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-10,.col-11,.col-12,.col-auto,.col-lg,.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-auto,.col-md,.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12,.col-md-auto,.col-sm,.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-auto{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-1,.col-auto{-webkit-box-flex:0}.col-1{-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.col-2{-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-2,.col-3{-webkit-box-flex:0}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.col-4,.col-5{-webkit-box-flex:0}.col-5{-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-6,.col-7{-webkit-box-flex:0}.col-7{-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.col-8{-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.col-8,.col-9{-webkit-box-flex:0}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.col-10,.col-11{-webkit-box-flex:0}.col-11{-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.col-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-sm-1{-webkit-box-flex:0;-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.col-sm-2{-webkit-box-flex:0;-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-sm-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-webkit-box-flex:0;-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.col-sm-5{-webkit-box-flex:0;-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.col-sm-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-webkit-box-flex:0;-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.col-sm-8{-webkit-box-flex:0;-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.col-sm-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-webkit-box-flex:0;-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.col-sm-11{-webkit-box-flex:0;-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.col-sm-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-sm-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-sm-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-sm-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-sm-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-sm-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-sm-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-sm-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-sm-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-sm-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-sm-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-sm-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-sm-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-sm-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-sm-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-md-1{-webkit-box-flex:0;-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.col-md-2{-webkit-box-flex:0;-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-md-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-webkit-box-flex:0;-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.col-md-5{-webkit-box-flex:0;-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.col-md-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-webkit-box-flex:0;-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.col-md-8{-webkit-box-flex:0;-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.col-md-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-webkit-box-flex:0;-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.col-md-11{-webkit-box-flex:0;-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.col-md-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-md-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-md-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-md-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-md-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-md-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-md-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-md-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-md-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-md-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-md-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-md-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-md-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-md-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-md-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-lg-1{-webkit-box-flex:0;-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.col-lg-2{-webkit-box-flex:0;-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-lg-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-webkit-box-flex:0;-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.col-lg-5{-webkit-box-flex:0;-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.col-lg-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-webkit-box-flex:0;-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.col-lg-8{-webkit-box-flex:0;-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.col-lg-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-webkit-box-flex:0;-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.col-lg-11{-webkit-box-flex:0;-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.col-lg-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-lg-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-lg-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-lg-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-lg-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-lg-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-lg-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-lg-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-lg-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-lg-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-lg-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-lg-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-lg-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-lg-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-lg-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-xl-1{-webkit-box-flex:0;-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.col-xl-2{-webkit-box-flex:0;-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-xl-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-webkit-box-flex:0;-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.col-xl-5{-webkit-box-flex:0;-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.col-xl-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-webkit-box-flex:0;-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.col-xl-8{-webkit-box-flex:0;-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.col-xl-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-webkit-box-flex:0;-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.col-xl-11{-webkit-box-flex:0;-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.col-xl-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-xl-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-xl-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-xl-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-xl-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-xl-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-xl-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-xl-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-xl-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-xl-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-xl-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-xl-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-xl-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-xl-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-xl-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}}.table{width:100%;max-width:100%;background-color:transparent}.table td,.table th{padding:.75rem;vertical-align:center; text-align: center;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table .table{background-color:#efefef}.table-sm td,.table-sm th{padding:.3rem}.table-bordered,.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(68,68,68,.05)}.table-hover tbody tr:hover{background-color:rgba(68,68,68,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#cae6fc}.table-hover .table-primary:hover,.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#b2dbfb}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#e7e7e7}.table-hover .table-secondary:hover,.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#dadada}.table-success,.table-success>td,.table-success>th{background-color:#e3f1d4}.table-hover .table-success:hover,.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#d6ebc1}.table-info,.table-info>td,.table-info>th{background-color:#c2eff5}.table-hover .table-info:hover,.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#ace9f1}.table-warning,.table-warning>td,.table-warning>th{background-color:#fff0c3}.table-hover .table-warning:hover,.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffeaaa}.table-danger,.table-danger>td,.table-danger>th{background-color:#fbcfce}.table-hover .table-danger:hover,.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f9b8b6}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-hover .table-light:hover,.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#cbcbcb}.table-hover .table-dark:hover,.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#bebebe}.table-active,.table-active>td,.table-active>th{background-color:rgba(68,68,68,.075)}.table-hover .table-active:hover,.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(55,55,55,.075)}.table .thead-dark th{color:#efefef;background-color:#444;border-color:#606060}.table .thead-light th{color:#777;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#efefef;background-color:#444}.table-dark td,.table-dark th,.table-dark thead th{border-color:#606060}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:hsla(0,0%,100%,.05)}.table-dark.table-hover tbody tr:hover{background-color:hsla(0,0%,100%,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:.875rem;line-height:1.5;color:#777;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:0;-webkit-transition:border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.form-control{-webkit-transition:none;transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#777;background-color:#fff;border-color:#bbdffb;outline:0;-webkit-box-shadow:none;box-shadow:none}.form-control::-webkit-input-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder,.form-control::-ms-input-placeholder{color:#999;opacity:1}.form-control::placeholder{color:#999;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:not([size]):not([multiple]){height:calc(2.0625rem + 2px)}select.form-control:focus::-ms-value{color:#777;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.09375rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.765625rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.375rem;padding-bottom:.375rem;margin-bottom:0;line-height:1.5;color:#444;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm,.input-group-lg>.form-control-plaintext.form-control,.input-group-lg>.input-group-append>.form-control-plaintext.btn,.input-group-lg>.input-group-append>.form-control-plaintext.input-group-text,.input-group-lg>.input-group-prepend>.form-control-plaintext.btn,.input-group-lg>.input-group-prepend>.form-control-plaintext.input-group-text,.input-group-sm>.form-control-plaintext.form-control,.input-group-sm>.input-group-append>.form-control-plaintext.btn,.input-group-sm>.input-group-append>.form-control-plaintext.input-group-text,.input-group-sm>.input-group-prepend>.form-control-plaintext.btn,.input-group-sm>.input-group-prepend>.form-control-plaintext.input-group-text{padding-right:0;padding-left:0}.form-control-sm,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.765625rem;line-height:1.5}.input-group-sm>.input-group-append>select.btn:not([size]):not([multiple]),.input-group-sm>.input-group-append>select.input-group-text:not([size]):not([multiple]),.input-group-sm>.input-group-prepend>select.btn:not([size]):not([multiple]),.input-group-sm>.input-group-prepend>select.input-group-text:not([size]):not([multiple]),.input-group-sm>select.form-control:not([size]):not([multiple]),select.form-control-sm:not([size]):not([multiple]){height:calc(1.6484375rem + 2px)}.form-control-lg,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.09375rem;line-height:1.5}.input-group-lg>.input-group-append>select.btn:not([size]):not([multiple]),.input-group-lg>.input-group-append>select.input-group-text:not([size]):not([multiple]),.input-group-lg>.input-group-prepend>select.btn:not([size]):not([multiple]),.input-group-lg>.input-group-prepend>select.input-group-text:not([size]):not([multiple]),.input-group-lg>select.form-control:not([size]):not([multiple]),select.form-control-lg:not([size]):not([multiple]){height:calc(2.640625rem + 2px)}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label{color:#999}.form-check-label{margin-bottom:0}.form-check-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#9ccc65}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.5rem;margin-top:.1rem;font-size:.875rem;line-height:1;color:#fff;background-color:hsla(88,50%,60%,.8);border-radius:.2rem}.custom-select.is-valid,.form-control.is-valid,.was-validated .custom-select:valid,.was-validated .form-control:valid{border-color:#9ccc65}.custom-select.is-valid:focus,.form-control.is-valid:focus,.was-validated .custom-select:valid:focus,.was-validated .form-control:valid:focus{border-color:#9ccc65;-webkit-box-shadow:0 0 0 .2rem hsla(88,50%,60%,.25);box-shadow:0 0 0 .2rem hsla(88,50%,60%,.25)}.custom-select.is-valid~.valid-feedback,.custom-select.is-valid~.valid-tooltip,.form-control-file.is-valid~.valid-feedback,.form-control-file.is-valid~.valid-tooltip,.form-control.is-valid~.valid-feedback,.form-control.is-valid~.valid-tooltip,.was-validated .custom-select:valid~.valid-feedback,.was-validated .custom-select:valid~.valid-tooltip,.was-validated .form-control-file:valid~.valid-feedback,.was-validated .form-control-file:valid~.valid-tooltip,.was-validated .form-control:valid~.valid-feedback,.was-validated .form-control:valid~.valid-tooltip{display:block}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#9ccc65}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#9ccc65}.custom-control-input.is-valid~.custom-control-label:before,.was-validated .custom-control-input:valid~.custom-control-label:before{background-color:#daecc5}.custom-control-input.is-valid~.valid-feedback,.custom-control-input.is-valid~.valid-tooltip,.was-validated .custom-control-input:valid~.valid-feedback,.was-validated .custom-control-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid:checked~.custom-control-label:before,.was-validated .custom-control-input:valid:checked~.custom-control-label:before{background-color:#b5d98b}.custom-control-input.is-valid:focus~.custom-control-label:before,.was-validated .custom-control-input:valid:focus~.custom-control-label:before{-webkit-box-shadow:0 0 0 1px #efefef,0 0 0 .2rem hsla(88,50%,60%,.25);box-shadow:0 0 0 1px #efefef,0 0 0 .2rem hsla(88,50%,60%,.25)}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#9ccc65}.custom-file-input.is-valid~.custom-file-label:before,.was-validated .custom-file-input:valid~.custom-file-label:before{border-color:inherit}.custom-file-input.is-valid~.valid-feedback,.custom-file-input.is-valid~.valid-tooltip,.was-validated .custom-file-input:valid~.valid-feedback,.was-validated .custom-file-input:valid~.valid-tooltip{display:block}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{-webkit-box-shadow:0 0 0 .2rem hsla(88,50%,60%,.25);box-shadow:0 0 0 .2rem hsla(88,50%,60%,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#ef5350}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.5rem;margin-top:.1rem;font-size:.875rem;line-height:1;color:#fff;background-color:rgba(239,83,80,.8);border-radius:.2rem}.custom-select.is-invalid,.form-control.is-invalid,.was-validated .custom-select:invalid,.was-validated .form-control:invalid{border-color:#ef5350}.custom-select.is-invalid:focus,.form-control.is-invalid:focus,.was-validated .custom-select:invalid:focus,.was-validated .form-control:invalid:focus{border-color:#ef5350;-webkit-box-shadow:0 0 0 .2rem rgba(239,83,80,.25);box-shadow:0 0 0 .2rem rgba(239,83,80,.25)}.custom-select.is-invalid~.invalid-feedback,.custom-select.is-invalid~.invalid-tooltip,.form-control-file.is-invalid~.invalid-feedback,.form-control-file.is-invalid~.invalid-tooltip,.form-control.is-invalid~.invalid-feedback,.form-control.is-invalid~.invalid-tooltip,.was-validated .custom-select:invalid~.invalid-feedback,.was-validated .custom-select:invalid~.invalid-tooltip,.was-validated .form-control-file:invalid~.invalid-feedback,.was-validated .form-control-file:invalid~.invalid-tooltip,.was-validated .form-control:invalid~.invalid-feedback,.was-validated .form-control:invalid~.invalid-tooltip{display:block}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#ef5350}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#ef5350}.custom-control-input.is-invalid~.custom-control-label:before,.was-validated .custom-control-input:invalid~.custom-control-label:before{background-color:#fac6c5}.custom-control-input.is-invalid~.invalid-feedback,.custom-control-input.is-invalid~.invalid-tooltip,.was-validated .custom-control-input:invalid~.invalid-feedback,.was-validated .custom-control-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid:checked~.custom-control-label:before,.was-validated .custom-control-input:invalid:checked~.custom-control-label:before{background-color:#f3817f}.custom-control-input.is-invalid:focus~.custom-control-label:before,.was-validated .custom-control-input:invalid:focus~.custom-control-label:before{-webkit-box-shadow:0 0 0 1px #efefef,0 0 0 .2rem rgba(239,83,80,.25);box-shadow:0 0 0 1px #efefef,0 0 0 .2rem rgba(239,83,80,.25)}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#ef5350}.custom-file-input.is-invalid~.custom-file-label:before,.was-validated .custom-file-input:invalid~.custom-file-label:before{border-color:inherit}.custom-file-input.is-invalid~.invalid-feedback,.custom-file-input.is-invalid~.invalid-tooltip,.was-validated .custom-file-input:invalid~.invalid-feedback,.was-validated .custom-file-input:invalid~.invalid-tooltip{display:block}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{-webkit-box-shadow:0 0 0 .2rem rgba(239,83,80,.25);box-shadow:0 0 0 .2rem rgba(239,83,80,.25)}.form-inline{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{-ms-flex-align:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.form-inline .form-group,.form-inline label{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;align-items:center;margin-bottom:0}.form-inline .form-group{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;padding:.375rem .75rem;font-size:.875rem;line-height:1.5;border-radius:0;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.btn{-webkit-transition:none;transition:none}}.btn:focus,.btn:hover{text-decoration:none}.btn.focus,.btn:focus{outline:0;-webkit-box-shadow:none;box-shadow:none}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}.btn:not(:disabled):not(.disabled).active,.btn:not(:disabled):not(.disabled):active{background-image:none}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#42a5f5;border-color:#42a5f5}.btn-primary:hover{color:#fff;background-color:#1e94f3;border-color:#128ef2}.btn-primary.focus,.btn-primary:focus{-webkit-box-shadow:0 0 0 .2rem rgba(66,165,245,.5);box-shadow:0 0 0 .2rem rgba(66,165,245,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#42a5f5;border-color:#42a5f5}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#128ef2;border-color:#0c87eb}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(66,165,245,.5);box-shadow:0 0 0 .2rem rgba(66,165,245,.5)}.btn-secondary{color:#fff;background-color:#aaa;border-color:#aaa}.btn-secondary:hover{color:#fff;background-color:#979797;border-color:#919090}.btn-secondary.focus,.btn-secondary:focus{-webkit-box-shadow:0 0 0 .2rem hsla(0,0%,67%,.5);box-shadow:0 0 0 .2rem hsla(0,0%,67%,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#aaa;border-color:#aaa}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#919090;border-color:#8a8a8a}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem hsla(0,0%,67%,.5);box-shadow:0 0 0 .2rem hsla(0,0%,67%,.5)}.btn-success{color:#fff;background-color:#9ccc65;border-color:#9ccc65}.btn-success:hover{color:#fff;background-color:#8ac248;border-color:#83bf3f}.btn-success.focus,.btn-success:focus{-webkit-box-shadow:0 0 0 .2rem hsla(88,50%,60%,.5);box-shadow:0 0 0 .2rem hsla(88,50%,60%,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#9ccc65;border-color:#9ccc65}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#83bf3f;border-color:#7db53c}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem hsla(88,50%,60%,.5);box-shadow:0 0 0 .2rem hsla(88,50%,60%,.5)}.btn-info{color:#fff;background-color:#26c6da;border-color:#26c6da}.btn-info:hover{color:#fff;background-color:#20a9ba;border-color:#1e9faf}.btn-info.focus,.btn-info:focus{-webkit-box-shadow:0 0 0 .2rem rgba(38,198,218,.5);box-shadow:0 0 0 .2rem rgba(38,198,218,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#26c6da;border-color:#26c6da}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#1e9faf;border-color:#1c95a4}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(38,198,218,.5);box-shadow:0 0 0 .2rem rgba(38,198,218,.5)}.btn-warning{color:#fff;background-color:#ffca28;border-color:#ffca28}.btn-warning:hover{color:#fff;background-color:#ffc102;border-color:#f4b800}.btn-warning.focus,.btn-warning:focus{-webkit-box-shadow:0 0 0 .2rem rgba(255,202,40,.5);box-shadow:0 0 0 .2rem rgba(255,202,40,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#fff;background-color:#ffca28;border-color:#ffca28}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#fff;background-color:#f4b800;border-color:#e7ae00}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(255,202,40,.5);box-shadow:0 0 0 .2rem rgba(255,202,40,.5)}.btn-danger{color:#fff;background-color:#ef5350;border-color:#ef5350}.btn-danger:hover{color:#fff;background-color:#ec312d;border-color:#eb2521}.btn-danger.focus,.btn-danger:focus{-webkit-box-shadow:0 0 0 .2rem rgba(239,83,80,.5);box-shadow:0 0 0 .2rem rgba(239,83,80,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#ef5350;border-color:#ef5350}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#eb2521;border-color:#ea1a16}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(239,83,80,.5);box-shadow:0 0 0 .2rem rgba(239,83,80,.5)}.btn-light{color:#4d4d4d;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#4d4d4d;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{-webkit-box-shadow:0 0 0 .2rem rgba(248,249,250,.5);box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-light.disabled,.btn-light:disabled{color:#4d4d4d;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#4d4d4d;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(248,249,250,.5);box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-dark{color:#fff;background-color:#444;border-color:#444}.btn-dark:hover{color:#fff;background-color:#313131;border-color:#2b2a2a}.btn-dark.focus,.btn-dark:focus{-webkit-box-shadow:0 0 0 .2rem rgba(68,68,68,.5);box-shadow:0 0 0 .2rem rgba(68,68,68,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#444;border-color:#444}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#2b2a2a;border-color:#242424}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(68,68,68,.5);box-shadow:0 0 0 .2rem rgba(68,68,68,.5)}.btn-outline-primary{color:#42a5f5;background-color:transparent;background-image:none;border-color:#42a5f5}.btn-outline-primary:hover{color:#fff;background-color:#42a5f5;border-color:#42a5f5}.btn-outline-primary.focus,.btn-outline-primary:focus{-webkit-box-shadow:0 0 0 .2rem rgba(66,165,245,.5);box-shadow:0 0 0 .2rem rgba(66,165,245,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#42a5f5;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#42a5f5;border-color:#42a5f5}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(66,165,245,.5);box-shadow:0 0 0 .2rem rgba(66,165,245,.5)}.btn-outline-secondary{color:#aaa;background-color:transparent;background-image:none;border-color:#aaa}.btn-outline-secondary:hover{color:#fff;background-color:#aaa;border-color:#aaa}.btn-outline-secondary.focus,.btn-outline-secondary:focus{-webkit-box-shadow:0 0 0 .2rem hsla(0,0%,67%,.5);box-shadow:0 0 0 .2rem hsla(0,0%,67%,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#aaa;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#aaa;border-color:#aaa}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem hsla(0,0%,67%,.5);box-shadow:0 0 0 .2rem hsla(0,0%,67%,.5)}.btn-outline-success{color:#9ccc65;background-color:transparent;background-image:none;border-color:#9ccc65}.btn-outline-success:hover{color:#fff;background-color:#9ccc65;border-color:#9ccc65}.btn-outline-success.focus,.btn-outline-success:focus{-webkit-box-shadow:0 0 0 .2rem hsla(88,50%,60%,.5);box-shadow:0 0 0 .2rem hsla(88,50%,60%,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#9ccc65;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#9ccc65;border-color:#9ccc65}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem hsla(88,50%,60%,.5);box-shadow:0 0 0 .2rem hsla(88,50%,60%,.5)}.btn-outline-info{color:#26c6da;background-color:transparent;background-image:none;border-color:#26c6da}.btn-outline-info:hover{color:#fff;background-color:#26c6da;border-color:#26c6da}.btn-outline-info.focus,.btn-outline-info:focus{-webkit-box-shadow:0 0 0 .2rem rgba(38,198,218,.5);box-shadow:0 0 0 .2rem rgba(38,198,218,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#26c6da;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#26c6da;border-color:#26c6da}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(38,198,218,.5);box-shadow:0 0 0 .2rem rgba(38,198,218,.5)}.btn-outline-warning{color:#ffca28;background-color:transparent;background-image:none;border-color:#ffca28}.btn-outline-warning:hover{color:#fff;background-color:#ffca28;border-color:#ffca28}.btn-outline-warning.focus,.btn-outline-warning:focus{-webkit-box-shadow:0 0 0 .2rem rgba(255,202,40,.5);box-shadow:0 0 0 .2rem rgba(255,202,40,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffca28;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#fff;background-color:#ffca28;border-color:#ffca28}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(255,202,40,.5);box-shadow:0 0 0 .2rem rgba(255,202,40,.5)}.btn-outline-danger{color:#ef5350;background-color:transparent;background-image:none;border-color:#ef5350}.btn-outline-danger:hover{color:#fff;background-color:#ef5350;border-color:#ef5350}.btn-outline-danger.focus,.btn-outline-danger:focus{-webkit-box-shadow:0 0 0 .2rem rgba(239,83,80,.5);box-shadow:0 0 0 .2rem rgba(239,83,80,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#ef5350;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#ef5350;border-color:#ef5350}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(239,83,80,.5);box-shadow:0 0 0 .2rem rgba(239,83,80,.5)}.btn-outline-light{color:#f8f9fa;background-color:transparent;background-image:none;border-color:#f8f9fa}.btn-outline-light:hover{color:#4d4d4d;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{-webkit-box-shadow:0 0 0 .2rem rgba(248,249,250,.5);box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#4d4d4d;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(248,249,250,.5);box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#444;background-color:transparent;background-image:none;border-color:#444}.btn-outline-dark:hover{color:#fff;background-color:#444;border-color:#444}.btn-outline-dark.focus,.btn-outline-dark:focus{-webkit-box-shadow:0 0 0 .2rem rgba(68,68,68,.5);box-shadow:0 0 0 .2rem rgba(68,68,68,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#444;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#444;border-color:#444}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(68,68,68,.5);box-shadow:0 0 0 .2rem rgba(68,68,68,.5)}.btn-link{font-weight:400;color:#777;background-color:transparent}.btn-link:hover{color:#515151;text-decoration:none;background-color:transparent;border-color:transparent}.btn-link.focus,.btn-link:focus{text-decoration:none;border-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#999;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.09375rem;line-height:1.5;border-radius:0}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.765625rem;line-height:1.5;border-radius:0}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{-webkit-transition:opacity .15s linear;transition:opacity .15s linear}@media screen and (prefers-reduced-motion:reduce){.fade{-webkit-transition:none;transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@media screen and (prefers-reduced-motion:reduce){.collapsing{-webkit-transition:none;transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle:after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty:after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:.875rem;color:#444;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid #dee2e6}.dropdown-menu-right{right:0;left:auto}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle:after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty:after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle:after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty:after{margin-left:0}.dropright .dropdown-toggle:after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle:after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";display:none}.dropleft .dropdown-toggle:before{display:inline-block;width:0;height:0;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty:after{margin-left:0}.dropleft .dropdown-toggle:before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.6rem 1rem;clear:both;font-weight:400;color:#4d4d4d;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#404040;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#42a5f5}.dropdown-item.disabled,.dropdown-item:disabled{color:#999;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1rem;margin-bottom:0;font-size:.765625rem;color:#999;white-space:nowrap}.dropdown-item-text{display:block;padding:.6rem 1rem;color:#4d4d4d}.btn-group,.btn-group-vertical{position:relative;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-group-vertical .btn+.btn,.btn-group-vertical .btn+.btn-group,.btn-group-vertical .btn-group+.btn,.btn-group-vertical .btn-group+.btn-group,.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:first-child{margin-left:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split:after,.dropright .dropdown-toggle-split:after,.dropup .dropdown-toggle-split:after{margin-left:0}.dropleft .dropdown-toggle-split:before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.btn-group-vertical .btn,.btn-group-vertical .btn-group{width:100%}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio],.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.custom-file:focus,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control{margin-left:-1px}.input-group>.custom-file{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.input-group-append,.input-group-prepend,.input-group>.custom-file{display:-webkit-box;display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:.875rem;font-weight:400;line-height:1.5;color:#777;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-label:before{color:#fff;background-color:#42a5f5}.custom-control-input:focus~.custom-control-label:before{-webkit-box-shadow:0 0 0 1px #efefef,none;box-shadow:0 0 0 1px #efefef,none}.custom-control-input:active~.custom-control-label:before{color:#fff;background-color:#ecf6fe}.custom-control-input:disabled~.custom-control-label{color:#999}.custom-control-input:disabled~.custom-control-label:before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0}.custom-control-label:before{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#dee2e6}.custom-control-label:after,.custom-control-label:before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:""}.custom-control-label:after{background-repeat:no-repeat;background-position:50%;background-size:50% 50%}.custom-checkbox .custom-control-input:checked~.custom-control-label:before{background-color:#42a5f5}.custom-checkbox .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label:before{background-color:#42a5f5}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(66,165,245,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label:before{background-color:rgba(66,165,245,.5)}.custom-radio .custom-control-label:before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label:before{background-color:#42a5f5}.custom-radio .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(66,165,245,.5)}.custom-select{display:inline-block;width:100%;height:calc(2.0625rem + 2px);padding:.375rem 1.75rem .375rem .75rem;line-height:1.5;color:#777;vertical-align:middle;background:#fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23575757' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center;background-size:8px 10px;border:1px solid #ced4da;border-radius:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#bbdffb;outline:0;-webkit-box-shadow:inset 0 1px 2px rgba(68,68,68,.075),0 0 5px rgba(187,223,251,.5);box-shadow:inset 0 1px 2px rgba(68,68,68,.075),0 0 5px rgba(187,223,251,.5)}.custom-select:focus::-ms-value{color:#777;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#999;background-color:#e9ecef}.custom-select::-ms-expand{opacity:0}.custom-select-sm{height:calc(1.6484375rem + 2px);font-size:75%}.custom-select-lg,.custom-select-sm{padding-top:.375rem;padding-bottom:.375rem}.custom-select-lg{height:calc(2.640625rem + 2px);font-size:125%}.custom-file{display:inline-block;margin-bottom:0}.custom-file,.custom-file-input{position:relative;width:100%;height:calc(2.0625rem + 2px)}.custom-file-input{z-index:2;margin:0;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#bbdffb;-webkit-box-shadow:none;box-shadow:none}.custom-file-input:focus~.custom-file-label:after{border-color:#bbdffb}.custom-file-input:lang(en)~.custom-file-label:after{content:"Browse"}.custom-file-label{left:0;z-index:1;height:calc(2.0625rem + 2px);background-color:#fff;border:1px solid #ced4da}.custom-file-label,.custom-file-label:after{position:absolute;top:0;right:0;padding:.375rem .75rem;line-height:1.5;color:#777}.custom-file-label:after{bottom:0;z-index:3;display:block;height:2.0625rem;content:"Browse";background-color:#e9ecef;border-left:1px solid #ced4da}.custom-range{width:100%;padding-left:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:none}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#42a5f5;border:0;-webkit-appearance:none;appearance:none}.custom-range::-webkit-slider-thumb:focus{outline:none;-webkit-box-shadow:0 0 0 1px #efefef,none;box-shadow:0 0 0 1px #efefef,none}.custom-range::-webkit-slider-thumb:active{background-color:#ecf6fe}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#42a5f5;border:0;-moz-appearance:none;appearance:none}.custom-range::-moz-range-thumb:focus{outline:none;box-shadow:0 0 0 1px #efefef,none}.custom-range::-moz-range-thumb:active{background-color:#ecf6fe}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent}.custom-range::-ms-thumb{width:1rem;height:1rem;background-color:#42a5f5;border:0;appearance:none}.custom-range::-ms-thumb:focus{outline:none;box-shadow:0 0 0 1px #efefef,none}.custom-range::-ms-thumb:active{background-color:#ecf6fe}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6}.nav{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#999}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#999;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#777;background-color:#efefef;border-color:#dee2e6 #dee2e6 #efefef}.nav-tabs .dropdown-menu{margin-top:-1px}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#42a5f5}.nav-fill .nav-item{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;padding:.5rem 1rem}.navbar,.navbar>.container,.navbar>.container-fluid{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3359375rem;padding-bottom:.3359375rem;margin-right:1rem;font-size:1.09375rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.09375rem;line-height:1;background-color:transparent;border:1px solid transparent}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler:not(:disabled):not(.disabled){cursor:pointer}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat 50%;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm,.navbar-expand-sm .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md,.navbar-expand-md .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg,.navbar-expand-lg .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl,.navbar-expand-xl .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand,.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(68,68,68,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(68,68,68,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(68,68,68,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(68,68,68,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(68,68,68,.9)}.navbar-light .navbar-toggler{color:rgba(68,68,68,.5);border-color:rgba(68,68,68,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(68, 68, 68, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(68,68,68,.5)}.navbar-light .navbar-text a,.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(68,68,68,.9)}.navbar-dark .navbar-brand,.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:hsla(0,0%,100%,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:hsla(0,0%,100%,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:hsla(0,0%,100%,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:hsla(0,0%,100%,.5);border-color:hsla(0,0%,100%,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text{color:hsla(0,0%,100%,.5)}.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px none}.card>hr{margin-right:0;margin-left:0}.card-body{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.card-title{margin-bottom:1rem}.card-subtitle{margin-top:-.5rem}.card-subtitle,.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1rem}.card-header{padding:1rem;margin-bottom:0;background-color:#fff;border-bottom:1px none}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:1rem;background-color:#fff;border-top:1px none}.card-header-tabs{margin-bottom:-1rem;border-bottom:0}.card-header-pills,.card-header-tabs{margin-right:-.5rem;margin-left:-.5rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img,.card-img-bottom,.card-img-top{width:100%}.card-deck{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{-webkit-box-orient:horizontal;-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck,.card-deck .card{-webkit-box-direction:normal}.card-deck .card{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1 0 0%;flex:1 0 0%;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-webkit-box-flex:1;-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}}.card-columns .card{margin-bottom:1rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;column-count:3;-webkit-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion .card:not(:first-of-type):not(:last-of-type){border-bottom:0;border-radius:0}.accordion .card:not(:first-of-type) .card-header:first-child{border-radius:0}.accordion .card:first-of-type{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion .card:last-of-type{border-top-left-radius:0;border-top-right-radius:0}.breadcrumb{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item:before{display:inline-block;padding-right:.5rem;color:#999;content:"/"}.breadcrumb-item+.breadcrumb-item:hover:before{text-decoration:underline;text-decoration:none}.breadcrumb-item.active{color:#999}.pagination{display:-webkit-box;display:-ms-flexbox;display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#777;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#515151;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;-webkit-box-shadow:none;box-shadow:none}.page-link:not(:disabled):not(.disabled){cursor:pointer}.page-item:first-child .page-link{margin-left:0}.page-item.active .page-link{z-index:1;color:#fff;background-color:#42a5f5;border-color:#42a5f5}.page-item.disabled .page-link{color:#999;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.09375rem;line-height:1.5}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.765625rem;line-height:1.5}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:500;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em}.badge-primary{color:#fff;background-color:#42a5f5}.badge-primary[href]:focus,.badge-primary[href]:hover{color:#fff;text-decoration:none;background-color:#128ef2}.badge-secondary{color:#fff;background-color:#aaa}.badge-secondary[href]:focus,.badge-secondary[href]:hover{color:#fff;text-decoration:none;background-color:#919090}.badge-success{color:#fff;background-color:#9ccc65}.badge-success[href]:focus,.badge-success[href]:hover{color:#fff;text-decoration:none;background-color:#83bf3f}.badge-info{color:#fff;background-color:#26c6da}.badge-info[href]:focus,.badge-info[href]:hover{color:#fff;text-decoration:none;background-color:#1e9faf}.badge-warning{color:#fff;background-color:#ffca28}.badge-warning[href]:focus,.badge-warning[href]:hover{color:#fff;text-decoration:none;background-color:#f4b800}.badge-danger{color:#fff;background-color:#ef5350}.badge-danger[href]:focus,.badge-danger[href]:hover{color:#fff;text-decoration:none;background-color:#eb2521}.badge-light{color:#4d4d4d;background-color:#f8f9fa}.badge-light[href]:focus,.badge-light[href]:hover{color:#4d4d4d;text-decoration:none;background-color:#dae0e5}.badge-dark{color:#fff;background-color:#444}.badge-dark[href]:focus,.badge-dark[href]:hover{color:#fff;text-decoration:none;background-color:#2b2a2a}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent}.alert-heading{color:inherit}.alert-link{font-weight:500}.alert-dismissible{padding-right:3.8125rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#4376a0;background-color:#d9edfd;border-color:#cae6fc}.alert-primary hr{border-top-color:#b2dbfb}.alert-primary .alert-link{color:#345b7c}.alert-secondary{color:#797979;background-color:#eee;border-color:#e7e7e7}.alert-secondary hr{border-top-color:#dadada}.alert-secondary .alert-link{color:#605f5f}.alert-success{color:#728b55;background-color:#ebf5e0;border-color:#e3f1d4}.alert-success hr{border-top-color:#d6ebc1}.alert-success .alert-link{color:#586b42}.alert-info{color:#348892;background-color:#d4f4f8;border-color:#c2eff5}.alert-info hr{border-top-color:#ace9f1}.alert-info .alert-link{color:#27656c}.alert-warning{color:#a58a35;background-color:#fff4d4;border-color:#fff0c3}.alert-warning hr{border-top-color:#ffeaaa}.alert-warning .alert-link{color:#7e6a29}.alert-danger{color:#9d4c4a;background-color:#fcdddc;border-color:#fbcfce}.alert-danger hr{border-top-color:#f9b8b6}.alert-danger .alert-link{color:#7a3b3a}.alert-light{color:#a2a2a3;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#88888a}.alert-dark{color:#444;background-color:#dadada;border-color:#cbcbcb}.alert-dark hr{border-top-color:#bebebe}.alert-dark .alert-link{color:#2b2a2a}@-webkit-keyframes progress-bar-stripes{0%{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{0%{background-position:1rem 0}to{background-position:0 0}}.progress{height:1rem;overflow:hidden;font-size:.65625rem;background-color:#e9ecef}.progress,.progress-bar{display:-webkit-box;display:-ms-flexbox;display:flex}.progress-bar{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#42a5f5;-webkit-transition:width .6s ease;transition:width .6s ease}@media screen and (prefers-reduced-motion:reduce){.progress-bar{-webkit-transition:none;transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}.media{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.media-body{-webkit-box-flex:1;-ms-flex:1;flex:1}.list-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#777;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{color:#777;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#444;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(68,68,68,.125)}.list-group-item:last-child{margin-bottom:0}.list-group-item:focus,.list-group-item:hover{z-index:1;text-decoration:none}.list-group-item.disabled,.list-group-item:disabled{color:#999;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#42a5f5;border-color:#42a5f5}.list-group-flush .list-group-item{border-right:0;border-left:0}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{border-bottom:0}.list-group-item-primary{color:#4376a0;background-color:#cae6fc}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#4376a0;background-color:#b2dbfb}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#4376a0;border-color:#4376a0}.list-group-item-secondary{color:#797979;background-color:#e7e7e7}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#797979;background-color:#dadada}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#797979;border-color:#797979}.list-group-item-success{color:#728b55;background-color:#e3f1d4}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#728b55;background-color:#d6ebc1}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#728b55;border-color:#728b55}.list-group-item-info{color:#348892;background-color:#c2eff5}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#348892;background-color:#ace9f1}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#348892;border-color:#348892}.list-group-item-warning{color:#a58a35;background-color:#fff0c3}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#a58a35;background-color:#ffeaaa}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#a58a35;border-color:#a58a35}.list-group-item-danger{color:#9d4c4a;background-color:#fbcfce}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#9d4c4a;background-color:#f9b8b6}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#9d4c4a;border-color:#9d4c4a}.list-group-item-light{color:#a2a2a3;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#a2a2a3;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#a2a2a3;border-color:#a2a2a3}.list-group-item-dark{color:#444;background-color:#cbcbcb}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#444;background-color:#bebebe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#444;border-color:#444}.close{float:right;font-size:1.3125rem;font-weight:500;line-height:1;color:#444;text-shadow:0 1px 0 #fff;opacity:.5}.close:focus,.close:hover{color:#444;text-decoration:none;opacity:.75}.close:not(:disabled):not(.disabled){cursor:pointer}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none}.modal,.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;outline:0}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translateY(-25%);transform:translateY(-25%)}@media screen and (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{-webkit-transition:none;transition:none}}.modal.show .modal-dialog{-webkit-transform:translate(0);transform:translate(0)}.modal-dialog-centered{-webkit-box-align:center;-ms-flex-align:center;align-items:center;min-height:calc(100% - 1rem)}.modal-content,.modal-dialog-centered{display:-webkit-box;display:-ms-flexbox;display:flex}.modal-content{position:relative;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(68,68,68,.2);outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#444}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:1rem;border-bottom:1px solid #e9ecef}.modal-header .close{padding:1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;padding:1rem;border-top:1px solid #e9ecef}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg{max-width:800px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.765625rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow:before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow:before,.bs-tooltip-top .arrow:before{top:0;border-width:.4rem .4rem 0;border-top-color:#444}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow:before,.bs-tooltip-right .arrow:before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#444}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow:before,.bs-tooltip-bottom .arrow:before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#444}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow:before,.bs-tooltip-left .arrow:before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#444}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#444}.popover{top:0;left:0;z-index:1060;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.765625rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(68,68,68,.2)}.popover,.popover .arrow{position:absolute;display:block}.popover .arrow{width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow:after,.popover .arrow:before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top] .arrow,.bs-popover-top .arrow{bottom:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=top] .arrow:after,.bs-popover-auto[x-placement^=top] .arrow:before,.bs-popover-top .arrow:after,.bs-popover-top .arrow:before{border-width:.5rem .5rem 0}.bs-popover-auto[x-placement^=top] .arrow:before,.bs-popover-top .arrow:before{bottom:0;border-top-color:rgba(68,68,68,.25)}.bs-popover-auto[x-placement^=top] .arrow:after,.bs-popover-top .arrow:after{bottom:1px;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right] .arrow,.bs-popover-right .arrow{left:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right] .arrow:after,.bs-popover-auto[x-placement^=right] .arrow:before,.bs-popover-right .arrow:after,.bs-popover-right .arrow:before{border-width:.5rem .5rem .5rem 0}.bs-popover-auto[x-placement^=right] .arrow:before,.bs-popover-right .arrow:before{left:0;border-right-color:rgba(68,68,68,.25)}.bs-popover-auto[x-placement^=right] .arrow:after,.bs-popover-right .arrow:after{left:1px;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom] .arrow,.bs-popover-bottom .arrow{top:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=bottom] .arrow:after,.bs-popover-auto[x-placement^=bottom] .arrow:before,.bs-popover-bottom .arrow:after,.bs-popover-bottom .arrow:before{border-width:0 .5rem .5rem}.bs-popover-auto[x-placement^=bottom] .arrow:before,.bs-popover-bottom .arrow:before{top:0;border-bottom-color:rgba(68,68,68,.25)}.bs-popover-auto[x-placement^=bottom] .arrow:after,.bs-popover-bottom .arrow:after{top:1px;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header:before,.bs-popover-bottom .popover-header:before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left] .arrow,.bs-popover-left .arrow{right:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left] .arrow:after,.bs-popover-auto[x-placement^=left] .arrow:before,.bs-popover-left .arrow:after,.bs-popover-left .arrow:before{border-width:.5rem 0 .5rem .5rem}.bs-popover-auto[x-placement^=left] .arrow:before,.bs-popover-left .arrow:before{right:0;border-left-color:rgba(68,68,68,.25)}.bs-popover-auto[x-placement^=left] .arrow:after,.bs-popover-left .arrow:after{right:1px;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:.875rem;color:inherit;background-color:#f7f7f7;border-bottom:1px solid #ebebeb}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#444}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-item{position:relative;display:none;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:100%;-webkit-transition:-webkit-transform .6s ease;transition:-webkit-transform .6s ease;transition:transform .6s ease;transition:transform .6s ease,-webkit-transform .6s ease;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}@media screen and (prefers-reduced-motion:reduce){.carousel-item{-webkit-transition:none;transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.carousel-item-next,.carousel-item-prev{position:absolute;top:0}.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translateX(0);transform:translateX(0)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translateZ(0);transform:translateZ(0)}}.active.carousel-item-right,.carousel-item-next{-webkit-transform:translateX(100%);transform:translateX(100%)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.active.carousel-item-right,.carousel-item-next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translateX(-100%);transform:translateX(-100%)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.carousel-fade .carousel-item{opacity:0;-webkit-transition-duration:.6s;transition-duration:.6s;-webkit-transition-property:opacity;transition-property:opacity}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{opacity:0}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-prev,.carousel-fade .carousel-item-next,.carousel-fade .carousel-item-prev,.carousel-fade .carousel-item.active{-webkit-transform:translateX(0);transform:translateX(0)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-prev,.carousel-fade .carousel-item-next,.carousel-fade .carousel-item-prev,.carousel-fade .carousel-item.active{-webkit-transform:translateZ(0);transform:translateZ(0)}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:transparent no-repeat 50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E")}.carousel-indicators{position:absolute;right:0;bottom:10px;left:0;z-index:15;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{position:relative;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:hsla(0,0%,100%,.5)}.carousel-indicators li:before{top:-10px}.carousel-indicators li:after,.carousel-indicators li:before{position:absolute;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators li:after{bottom:-10px}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#42a5f5!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#128ef2!important}.bg-secondary{background-color:#aaa!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#919090!important}.bg-success{background-color:#9ccc65!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#83bf3f!important}.bg-info{background-color:#26c6da!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#1e9faf!important}.bg-warning{background-color:#ffca28!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#f4b800!important}.bg-danger{background-color:#ef5350!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#eb2521!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#444!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#2b2a2a!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#42a5f5!important}.border-secondary{border-color:#aaa!important}.border-success{border-color:#9ccc65!important}.border-info{border-color:#26c6da!important}.border-warning{border-color:#ffca28!important}.border-danger{border-color:#ef5350!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#444!important}.border-white{border-color:#fff!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important}.rounded-right,.rounded-top{border-top-right-radius:.25rem!important}.rounded-bottom,.rounded-right{border-bottom-right-radius:.25rem!important}.rounded-bottom,.rounded-left{border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important}.rounded-circle{border-radius:50%!important}.rounded-0{border-radius:0!important}.clearfix:after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive:before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9:before{padding-top:42.85714286%}.embed-responsive-16by9:before{padding-top:56.25%}.embed-responsive-4by3:before{padding-top:75%}.embed-responsive-1by1:before{padding-top:100%}.flex-row{-webkit-box-orient:horizontal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-column,.flex-row{-webkit-box-direction:normal!important}.flex-column{-webkit-box-orient:vertical!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-webkit-box-orient:horizontal!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse,.flex-row-reverse{-webkit-box-direction:reverse!important}.flex-column-reverse{-webkit-box-orient:vertical!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-webkit-box-flex:1!important;-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-webkit-box-flex:0!important;-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-webkit-box-flex:1!important;-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-webkit-box-orient:horizontal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column,.flex-sm-row{-webkit-box-direction:normal!important}.flex-sm-column{-webkit-box-orient:vertical!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-webkit-box-flex:1!important;-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-webkit-box-flex:0!important;-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-webkit-box-flex:1!important;-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-webkit-box-orient:horizontal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column,.flex-md-row{-webkit-box-direction:normal!important}.flex-md-column{-webkit-box-orient:vertical!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-webkit-box-flex:1!important;-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-webkit-box-flex:0!important;-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-webkit-box-flex:1!important;-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-webkit-box-orient:horizontal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column,.flex-lg-row{-webkit-box-direction:normal!important}.flex-lg-column{-webkit-box-orient:vertical!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-webkit-box-flex:1!important;-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-webkit-box-flex:0!important;-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-webkit-box-flex:1!important;-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-webkit-box-orient:horizontal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column,.flex-xl-row{-webkit-box-direction:normal!important}.flex-xl-column{-webkit-box-orient:vertical!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-webkit-box-flex:1!important;-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-webkit-box-flex:0!important;-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-webkit-box-flex:1!important;-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{top:0}.fixed-bottom,.fixed-top{position:fixed;right:0;left:0;z-index:1030}.fixed-bottom{bottom:0}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{-webkit-box-shadow:0 .125rem .25rem rgba(68,68,68,.075)!important;box-shadow:0 .125rem .25rem rgba(68,68,68,.075)!important}.shadow{-webkit-box-shadow:0 .5rem 1rem rgba(68,68,68,.15)!important;box-shadow:0 .5rem 1rem rgba(68,68,68,.15)!important}.shadow-lg{-webkit-box-shadow:0 1rem 3rem rgba(68,68,68,.175)!important;box-shadow:0 1rem 3rem rgba(68,68,68,.175)!important}.shadow-none{-webkit-box-shadow:none!important;box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-justify{text-align:justify!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:500!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#42a5f5!important}a.text-primary:focus,a.text-primary:hover{color:#128ef2!important}.text-secondary{color:#aaa!important}a.text-secondary:focus,a.text-secondary:hover{color:#919090!important}.text-success{color:#9ccc65!important}a.text-success:focus,a.text-success:hover{color:#83bf3f!important}.text-info{color:#26c6da!important}a.text-info:focus,a.text-info:hover{color:#1e9faf!important}.text-warning{color:#ffca28!important}a.text-warning:focus,a.text-warning:hover{color:#f4b800!important}.text-danger{color:#ef5350!important}a.text-danger:focus,a.text-danger:hover{color:#eb2521!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#dae0e5!important}.text-dark{color:#444!important}a.text-dark:focus,a.text-dark:hover{color:#2b2a2a!important}.text-body{color:#444!important}.text-muted{color:#999!important}.text-black-50{color:rgba(68,68,68,.5)!important}.text-white-50{color:hsla(0,0%,100%,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.visible{visibility:visible!important}.invisible{visibility:hidden!important}.page-wrapper{-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column;min-height:100vh}.main-container,.page-wrapper{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-direction:normal}.main-container{-webkit-box-orient:horizontal;-ms-flex-direction:row;flex-direction:row;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.content{padding:32px;min-width:0;-webkit-box-flex:1;-ms-flex:1;flex:1;-webkit-transition:.3s;transition:.3s}.sidebar-fixed .content{margin-left:240px;margin-top:60px}@media (max-width:991.98px){.sidebar-fixed .content{margin-left:0}}.header-fixed .content{margin-top:60px}.sidebar-hidden .content{margin-left:0}.sidebar-fixed .sidebar{position:fixed;margin-top:60px}.sidebar-hidden .sidebar{margin-left:-240px}@media (max-width:991.98px){.sidebar{margin-left:-240px}.sidebar-mobile-show .sidebar{margin-left:0}}.header-fixed .page-header{position:fixed}.header-fixed .sidebar{margin-top:60px}.sidebar{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;width:240px;background-color:#272727;min-height:calc(100vh - 60px);-ms-flex-negative:0;flex-shrink:0;top:0;bottom:0;left:0;-webkit-transition:all .3s;transition:all .3s;z-index:99}.sidebar .sidebar-nav{-webkit-box-flex:1;-ms-flex:1;flex:1;position:relative;width:100%;overflow-y:auto;overflow-x:hidden}.sidebar .nav{width:100%;list-style:none}.sidebar .nav-item{width:100%;position:relative}.sidebar .nav-link{display:block;text-decoration:none;padding:16px 24px;color:#9d9d9d}.sidebar .nav-link i:first-of-type{display:inline-block;width:24px;margin-right:4px;color:#c4c3c3;font-size:14px}.sidebar .nav-link:hover{color:#ddd}.sidebar .nav-link.active,.sidebar .nav-link:hover i{color:#fff}.sidebar .nav-link.active i{color:#42a5f5}.sidebar .nav-dropdown-toggle i:last-of-type{float:right;margin-top:4px}.sidebar .nav-title{font-size:80%;text-transform:uppercase;padding:.8rem 1rem;color:#777}.sidebar .nav-dropdown.open .nav-dropdown-items{max-height:1000px!important;background-color:#1f1f1f}.sidebar .nav-dropdown.open .nav-dropdown-toggle i:last-of-type{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.sidebar .nav-dropdown-items{padding:0;margin:0;overflow:hidden;max-height:0!important;-webkit-transition:max-height .3s ease-in-out;transition:max-height .3s ease-in-out}.sidebar .nav-dropdown-items .nav-item{padding:0;list-style:none}.page-header{height:60px;width:100%;position:relative;background-color:#fff;-webkit-box-shadow:0 2px 4px 0 rgba(0,0,0,.1);box-shadow:0 2px 4px 0 rgba(0,0,0,.1);margin:0;z-index:100}.page-header,.page-header .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.page-header .navbar-nav{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.page-header .navbar-nav .nav-item{min-width:50px;position:relative}.page-header .navbar-nav .nav-item .badge{position:absolute;top:50%;margin-top:-16px;margin-left:0;border-radius:50%}.page-header .navbar-nav .dropdown-menu{padding:0;min-width:12rem;position:absolute}.page-header .navbar-nav .dropdown-menu.dropdown-menu-right{left:auto;right:0}.page-header .navbar-nav .dropdown-menu .dropdown-header{padding:.6rem 1rem;background:#f8f9fa;text-align:center;border-bottom:1px solid #dee2e6}.page-header .navbar-nav .dropdown-menu .dropdown-item{padding:.6rem 1rem;border-bottom:1px solid #dee2e6}.page-header .navbar-nav .dropdown-menu .dropdown-item i{width:20px;margin-right:10px;color:#ced4da;font-size:.8rem}.card{border:1px solid #dee2e6;margin-bottom:1.5rem}.card-actions{position:absolute;top:0;right:0}.card-actions a,.card-actions button{display:block;float:left;padding:1rem;margin:0!important;text-align:center;background:transparent}.alert-primary{color:#fff;background-color:#55aef6;border-color:#42a5f5}.alert-primary hr{border-top-color:#2a99f4}.alert-primary .alert-link{color:#e6e5e5}.alert-secondary{color:#fff;background-color:#b4b4b4;border-color:#aaa}.alert-secondary hr{border-top-color:#9d9d9d}.alert-secondary .alert-link{color:#e6e5e5}.alert-success{color:#fff;background-color:#a6d174;border-color:#9ccc65}.alert-success hr{border-top-color:#90c652}.alert-success .alert-link{color:#e6e5e5}.alert-info{color:#fff;background-color:#37cbdd;border-color:#26c6da}.alert-info hr{border-top-color:#22b3c5}.alert-info .alert-link{color:#e6e5e5}.alert-warning{color:#fff;background-color:#ffcf3c;border-color:#ffca28}.alert-warning hr{border-top-color:#ffc40f}.alert-warning .alert-link{color:#e6e5e5}.alert-danger{color:#fff;background-color:#f16563;border-color:#ef5350}.alert-danger hr{border-top-color:#ed3c39}.alert-danger .alert-link{color:#e6e5e5}.alert-light{color:#fff;background-color:#fff;border-color:#f8f9fa}.alert-light hr{border-top-color:#e9ecef}.alert-light .alert-link{color:#e6e5e5}.alert-dark{color:#c4c3c3;background-color:#4e4e4e;border-color:#444}.alert-dark hr{border-top-color:#373737}.alert-dark .alert-link{color:#aaa}.alert .close{font-size:15px;padding:1rem}.alert .close:focus{outline:none}.btn i{font-size:.875rem}.btn.btn-rounded{border-radius:50px!important}.require:after{content:"*";margin-left:6px;color:#ef5350}.form-text{color:#999}.nav-tabs{border:none}.nav-tabs .nav-link{color:#999}.nav-tabs .nav-link i{padding:0 6px}.nav-tabs .nav-link:hover{color:#4d4d4d;border-color:transparent}.nav-tabs .nav-link.active{color:#4d4d4d;background:#fff;border-color:#dee2e6;border-bottom:none}.nav-tabs .nav-link.active:focus{background:#fff;border-color:#dee2e6;border-bottom-color:#fff}.nav-tabs .nav-link.active:hover{border-color:#dee2e6}.tab-content{margin-top:-1px;border:1px solid #dee2e6;background:#fff}.tab-content .tab-pane{padding:1rem}.navbar .navbar-brand{width:calc(240px - 1rem);margin-right:0}@media (max-width:575.98px){.d-down-none{display:none!important}}@media (max-width:767.98px){.d-sm-down-none{display:none!important}}@media (max-width:991.98px){.d-md-down-none{display:none!important}}@media (max-width:1199.98px){.d-lg-down-none{display:none!important}}.d-xl-down-none{display:none!important}.border-right{border-right:1px solid #dee2e6}.border-left{border-left:1px solid #dee2e6}.border-top{border-top:1px solid #dee2e6}.border-bottom{border-bottom:1px solid #dee2e6}.avatar{border-radius:50em}.avatar-xs{width:20px}.avatar-sm{width:36px}.avatar-lg{width:72px}.toggle-switch{display:inline-block;vertical-align:top;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.toggle-switch .ts-label{display:inline-block;margin:0 20px 0 0;vertical-align:top;-webkit-transition:color .56s cubic-bezier(.4,0,.2,1);transition:color .56s cubic-bezier(.4,0,.2,1)}.toggle-switch .ts-helper{display:inline-block;position:relative;width:40px;height:16px;border-radius:8px;background:rgba(0,0,0,.1);-webkit-transition:background .28s cubic-bezier(.4,0,.2,1);transition:background .28s cubic-bezier(.4,0,.2,1);vertical-align:middle;cursor:pointer}.toggle-switch .ts-helper:before{content:"";position:absolute;top:-4px;left:-4px;width:24px;height:24px;background:#fafafa;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.28);box-shadow:0 2px 8px rgba(0,0,0,.28);border-radius:50%;webkit-transition:left .28s cubic-bezier(.4,0,.2,1),background .28s cubic-bezier(.4,0,.2,1),box-shadow .28s cubic-bezier(.4,0,.2,1);-webkit-transition:left .28s cubic-bezier(.4,0,.2,1),background .28s cubic-bezier(.4,0,.2,1),-webkit-box-shadow .28s cubic-bezier(.4,0,.2,1);transition:left .28s cubic-bezier(.4,0,.2,1),background .28s cubic-bezier(.4,0,.2,1),-webkit-box-shadow .28s cubic-bezier(.4,0,.2,1);transition:left .28s cubic-bezier(.4,0,.2,1),background .28s cubic-bezier(.4,0,.2,1),box-shadow .28s cubic-bezier(.4,0,.2,1);transition:left .28s cubic-bezier(.4,0,.2,1),background .28s cubic-bezier(.4,0,.2,1),box-shadow .28s cubic-bezier(.4,0,.2,1),-webkit-box-shadow .28s cubic-bezier(.4,0,.2,1)}.toggle-switch:not(.disabled) .ts-helper:active:before{-webkit-box-shadow:0 2px 8px rgba(0,0,0,.28),0 0 0 20px hsla(0,0%,50%,.1);box-shadow:0 2px 8px rgba(0,0,0,.28),0 0 0 20px hsla(0,0%,50%,.1)}.toggle-switch input{position:absolute;z-index:1;width:46px;margin:0 0 0 -4px;height:24px;opacity:0;cursor:pointer}.toggle-switch input:checked+.ts-helper:before{left:20px}.toggle-switch.disabled{opacity:.6}.toggle-switch[data-ts-color=primary] input:not(:disabled):checked+.ts-helper{background:#a3d3fa}.toggle-switch[data-ts-color=primary] input:not(:disabled):checked+.ts-helper:before{background:#42a5f5}.toggle-switch[data-ts-color=secondary] input:not(:disabled):checked+.ts-helper{background:#ddd}.toggle-switch[data-ts-color=secondary] input:not(:disabled):checked+.ts-helper:before{background:#aaa}.toggle-switch[data-ts-color=success] input:not(:disabled):checked+.ts-helper{background:#cde5b2}.toggle-switch[data-ts-color=success] input:not(:disabled):checked+.ts-helper:before{background:#9ccc65}.toggle-switch[data-ts-color=info] input:not(:disabled):checked+.ts-helper{background:#7ddde9}.toggle-switch[data-ts-color=info] input:not(:disabled):checked+.ts-helper:before{background:#26c6da}.toggle-switch[data-ts-color=warning] input:not(:disabled):checked+.ts-helper{background:#ffe38e}.toggle-switch[data-ts-color=warning] input:not(:disabled):checked+.ts-helper:before{background:#ffca28}.toggle-switch[data-ts-color=danger] input:not(:disabled):checked+.ts-helper{background:#f8afad}.toggle-switch[data-ts-color=danger] input:not(:disabled):checked+.ts-helper:before{background:#ef5350}h1,h2,h3,h4,h5,h6{font-weight:300;margin-bottom:1rem} \ No newline at end of file diff --git a/generator-web/target/classes/static/css/toast.css b/generator-web/target/classes/static/css/toast.css new file mode 100644 index 0000000..a9a636e --- /dev/null +++ b/generator-web/target/classes/static/css/toast.css @@ -0,0 +1,32 @@ +.mask-page{background:#1b1b1b; opacity:0.5; position:fixed; top:0; left:0; width:100%; height:100%; z-index:100; display:none;} +.toast-box { + position: fixed; + top: 50%; + left: 50%; + -webkit-transform: translate(-50%, -50%); + -moz-transform: translate(-50%, -50%); + -ms-transform: translate(-50%, -50%); + -o-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + max-width: 350px; + min-width: 160px; + padding: 20px 30px; + text-align: center; + border-radius: 4px; + background: rgba(33, 52, 86, 0.62)/*#00a495*/; + color: #fff; + font-size: 16px; + z-index: 110; +} +.toast-mask { + width: 100%; + height: 100%; + position: fixed; + top: 0; + left: 0; + bottom: 0; + right: 0; + margin: auto; + z-index: 1000; + background: #0000004f; +} \ No newline at end of file diff --git a/generator-web/target/classes/static/favicon.ico b/generator-web/target/classes/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..3207549ccf2897d18aa4f68563553c69a821e50d GIT binary patch literal 1150 zcmb7EOK%cU6dn_QKv%9^y3vKM?80}DsMy*Pt5M@C#+tZo(ngKOh3TScqE(_c#YZ%X zs8M6W!n8G@o6^c-z*ZimJOn8(X?aMP%jdZRgMhg3PVSt0&pF>Y=R5b#2*MhAIywY; zuNV5)3c@-;5H`>x6=|w^5^YDNQURaJs8pD|XCx(7ovh~5=%@I%O77$Ftzuwk3ALJc~_R z9N5?8!0^cTzwjKJ%azdE=c2kpcDmV9md zZVZQEGDUHB{6{?pxA8f4Cx}IVj{53>*O!-djm>-eE{>hPqIC?@vu~@E~Io|C~ zL!!L5bs?C|KkGJS@%l{+&kf7qXZ^w$#K_GEt!s7C^-${2-3wxBI^CR~FlNg#MsE>s zT9=7?|3x=GOlImh1%LJWB1BhKNn4c^Kb0!r*r^4=GU^>eGMR_wkQ1|CR^&Q3p5Mpb zJ`sfmZb~3-KX<_e!^;@XocCZ%7lr;|2%S5euzaf4Yx$hSz@Q%$iqkqce$JMV&)(ro zVR9;lp)2z^ep1B3w+s@=0uJ`L;q&F1xz_?I{KoYGXphXp=2$_wETL2?V`e5zTwE}| zinYZmwNzs;yf;OlK43%Vc00CivqRG(V)|pE-b=;5omA>z#4#Sv(cRC}J*<7>e?Id% LwCzvfKa{@#GS-`z literal 0 HcmV?d00001 diff --git a/generator-web/target/classes/static/forms.html b/generator-web/target/classes/static/forms.html new file mode 100644 index 0000000..9ec21f5 --- /dev/null +++ b/generator-web/target/classes/static/forms.html @@ -0,0 +1,595 @@ + + + + + + + Carbon - Admin Template + + + + + +
    + + +
    + + +
    +
    +
    +
    +
    +
    + Basic Forms +
    + +
    +
    +
    +
    + + +
    +
    + +
    +
    + + +
    +
    + +
    +
    + + +
    +
    +
    + +
    +
    +
    + + +
    +
    + +
    +
    + + +
    +
    + +
    +
    + +

    email@example.com

    +
    +
    +
    + +
    +
    +
    + + + We'll never share your email with anyone else. +
    +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    + Input Groups +
    + +
    +
    +
    + + +
    +
    + @ +
    + +
    + +
    + +
    + @ +
    +
    + +
    +
    + $ +
    + +
    + .00 +
    +
    +
    + +
    + + +
    +
    + +
    + +
    + +
    + +
    + +
    +
    + +
    +
    + +
    + +
    + +
    +
    +
    + +
    + + +
    +
    + @ +
    + +
    + +
    +
    + @ +
    + +
    + +
    +
    + @ +
    + +
    +
    +
    + +
    +
    + +
    + + + + +
    +
    + +
    + +
    + + + + +
    +
    + +
    + +
    +
    + + + +
    + + +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    + Switches +
    + +
    +
    +
    +
    + + + +
    +
    + +
    +
    + + + +
    +
    + +
    +
    + + + +
    +
    + +
    +
    + + + +
    +
    +
    + +
    + +
    +
    +
    + + + +
    +
    + +
    +
    + + + +
    +
    + +
    +
    + + + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + diff --git a/generator-web/target/classes/static/imgs/avatar-1.png b/generator-web/target/classes/static/imgs/avatar-1.png new file mode 100644 index 0000000000000000000000000000000000000000..d05067bdccf0dfefa6bd32a11bf10357d3b17319 GIT binary patch literal 27093 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 z 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 KMNUMnLSTX=OUw)a literal 0 HcmV?d00001 diff --git a/generator-web/target/classes/static/imgs/female.jpg b/generator-web/target/classes/static/imgs/female.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a8fd4328c9ad936586c1da3b90ffcf30f6b331d7 GIT binary patch literal 15009 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 literal 0 HcmV?d00001 diff --git a/generator-web/target/classes/static/imgs/logo-wd.png b/generator-web/target/classes/static/imgs/logo-wd.png new file mode 100644 index 0000000000000000000000000000000000000000..dec5b9cee8606b04913a22ded0a36cbea696b241 GIT binary patch literal 40473 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 VYyJN^um8ramHzG57tY^f{}&S3UcdkV literal 0 HcmV?d00001 diff --git a/generator-web/target/classes/static/imgs/logo.png b/generator-web/target/classes/static/imgs/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..099bdc464736d75d5a018006bf3b40f82502e546 GIT binary patch literal 16494 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 literal 0 HcmV?d00001 diff --git a/generator-web/target/classes/static/imgs/male.jpg b/generator-web/target/classes/static/imgs/male.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a4d26d81e4fc1680a75c78aa11948a5fdbf92c0a GIT binary patch literal 14124 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 literal 0 HcmV?d00001 diff --git a/generator-web/target/classes/static/index.html b/generator-web/target/classes/static/index.html new file mode 100644 index 0000000..1e1bd09 --- /dev/null +++ b/generator-web/target/classes/static/index.html @@ -0,0 +1,365 @@ + + + + + + + Carbon - Admin Template + + + + + +
    + + +
    + + +
    +
    +
    +
    +
    +
    +
    + 54 + Total Users +
    + +
    + +
    +
    +
    +
    + +
    +
    +
    +
    + $32,400 + Income +
    + +
    + +
    +
    +
    +
    + +
    +
    +
    +
    + 900 + Downloads +
    + +
    + +
    +
    +
    +
    + +
    +
    +
    +
    + 32s + Time +
    + +
    + +
    +
    +
    +
    +
    + +
    +
    +
    +
    + Total Users +
    + +
    +
    + +
    + +
    +
    +
    Total Traffic
    +
    12,457 Users (40%)
    +
    + +
    +
    Banned Users
    +
    95,333 Users (5%)
    +
    + +
    +
    Page Views
    +
    957,565 Pages (50%)
    +
    + +
    +
    Total Downloads
    +
    957,565 Files (100 TB)
    +
    +
    +
    +
    +
    + More Templates 模板之家 - Collect from 网页模板 +
    +
    +
    +
    +
    + + + + + + + + diff --git a/generator-web/target/classes/static/invoice.html b/generator-web/target/classes/static/invoice.html new file mode 100644 index 0000000..2c4b5d9 --- /dev/null +++ b/generator-web/target/classes/static/invoice.html @@ -0,0 +1,365 @@ + + + + + + + Carbon - Admin Template + + + + + +
    + + +
    + + +
    +
    +
    +
    +
    +
    +
    +
    + +
    + +
    +

    Invoice #550

    +

    Due to: 4 Dec, 2019

    +
    +
    + +
    + +
    +
    +

    Client Information

    +

    John Doe, Mrs Emma Downson

    +

    Acme Inc

    +

    Berlin, Germany

    +

    6781 45P

    +
    + +
    +

    Payment Details

    +

    VAT: 1425782

    +

    VAT ID: 10253642

    +

    Payment Type: Root

    +

    Name: John Doe

    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    IDItemDescriptionQuantityUnit CostTotal
    1SoftwareLTS Versions21$321$3452
    1SoftwareSupport234$6356$23423
    1SoftwareSofware Collection4534$354$23434
    +
    +
    + +
    +
    +
    Grand Total
    +
    $234,234
    +
    + +
    +
    Discount
    +
    10%
    +
    + +
    +
    Sub - Total amount
    +
    $32,432
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + diff --git a/generator-web/target/classes/static/js/carbon.js b/generator-web/target/classes/static/js/carbon.js new file mode 100644 index 0000000..1eed5f8 --- /dev/null +++ b/generator-web/target/classes/static/js/carbon.js @@ -0,0 +1,54 @@ +$(document).ready(function () { + /** + * Sidebar Dropdown + */ + $('.nav-dropdown-toggle').on('click', function (e) { + e.preventDefault(); + $(this).parent().toggleClass('open'); + }); + + // open sub-menu when an item is active. + $('ul.nav').find('a.active').parent().parent().parent().addClass('open'); + + /** + * Sidebar Toggle + */ + $('.sidebar-toggle').on('click', function (e) { + e.preventDefault(); + $('body').toggleClass('sidebar-hidden'); + }); + + /** + * Mobile Sidebar Toggle + */ + $('.sidebar-mobile-toggle').on('click', function () { + $('body').toggleClass('sidebar-mobile-show'); + }); +}); + +// 提示框 +/*toast提示*/ +function msg(text, showIn) { + var $toast = $('.toast-box'); + var $mask = $('.mask-page'); + if ($toast.length != 0 || !text) { + return false; + } + + var showIn = showIn || 1000; // 显示时间 + if ($mask.length == 0) { + var mask = document.createElement('div'); + mask.className = 'mask-page'; + document.body.appendChild(mask); + } + var toast = document.createElement('div'); + toast.className = 'toast-box'; + toast.innerHTML = text; + document.body.appendChild(toast); + $mask = $(mask).show(); + $toast = $(toast).show(); + setTimeout(function () { + $mask.remove(); + $toast.remove(); + }, showIn); +}; \ No newline at end of file diff --git a/generator-web/target/classes/static/js/demo.js b/generator-web/target/classes/static/js/demo.js new file mode 100644 index 0000000..cfd491d --- /dev/null +++ b/generator-web/target/classes/static/js/demo.js @@ -0,0 +1,190 @@ +$(document).ready(function () { + /** + * Line Chart + */ + var lineChart = $('#line-chart'); + + if (lineChart.length > 0) { + new Chart(lineChart, { + type: 'line', + data: { + labels: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], + datasets: [{ + label: 'Users', + data: [12, 19, 3, 5, 2, 3, 20, 33, 23, 12, 33, 10], + backgroundColor: 'rgba(66, 165, 245, 0.5)', + borderColor: '#2196F3', + borderWidth: 1 + }] + }, + options: { + legend: { + display: false + }, + scales: { + yAxes: [{ + ticks: { + beginAtZero: true + } + }] + } + } + }); + } + + /** + * Bar Chart + */ + var barChart = $('#bar-chart'); + + if (barChart.length > 0) { + new Chart(barChart, { + type: 'bar', + data: { + labels: ["Red", "Blue", "Cyan", "Green", "Purple", "Orange"], + datasets: [{ + label: '# of Votes', + data: [12, 19, 3, 5, 2, 3], + backgroundColor: [ + 'rgba(244, 88, 70, 0.5)', + 'rgba(33, 150, 243, 0.5)', + 'rgba(0, 188, 212, 0.5)', + 'rgba(42, 185, 127, 0.5)', + 'rgba(156, 39, 176, 0.5)', + 'rgba(253, 178, 68, 0.5)' + ], + borderColor: [ + '#F45846', + '#2196F3', + '#00BCD4', + '#2ab97f', + '#9C27B0', + '#fdb244' + ], + borderWidth: 1 + }] + }, + options: { + legend: { + display: false + }, + scales: { + yAxes: [{ + ticks: { + beginAtZero: true + } + }] + } + } + }); + } + + /** + * Radar Chart + */ + var radarChart = $('#radar-chart'); + + if (radarChart.length > 0) { + new Chart(radarChart, { + type: 'radar', + data: { + labels: ["Red", "Blue", "Cyan", "Green", "Purple", "Orange"], + datasets: [{ + label: 'Users', + data: [100, 45, 87, 50, 77, 20], + backgroundColor: 'rgba(244, 88, 70, 0.5)', + borderColor: '#F45846', + borderWidth: 1 + }, { + label: 'Votes', + data: [23, 55, 75, 54, 95, 100], + backgroundColor: 'rgba(33, 150, 243, 0.5)', + borderColor: '#2196F3', + borderWidth: 1 + }] + } + }); + } + + /** + * Pie Chart + */ + var pieChart = $('#pie-chart'); + + if (pieChart.length > 0) { + new Chart(pieChart, { + type: 'pie', + data: { + labels: ["Red", "Blue", "Cyan", "Green", "Purple", "Orange"], + datasets: [{ + label: 'Users', + data: [100, 45, 87, 50, 77, 20], + backgroundColor: [ + 'rgba(244, 88, 70, 0.5)', + 'rgba(33, 150, 243, 0.5)', + 'rgba(0, 188, 212, 0.5)', + 'rgba(42, 185, 127, 0.5)', + 'rgba(156, 39, 176, 0.5)', + 'rgba(253, 178, 68, 0.5)' + ], + borderColor: [ + 'rgba(244, 88, 70, 0.5)', + 'rgba(33, 150, 243, 0.5)', + 'rgba(0, 188, 212, 0.5)', + 'rgba(42, 185, 127, 0.5)', + 'rgba(156, 39, 176, 0.5)', + 'rgba(253, 178, 68, 0.5)' + ], + borderWidth: 1 + }] + } + }); + } + + /** + * Widget Line Chart + */ + var wLineChart = $('.widget-line-chart'); + + wLineChart.each(function (index, canvas) { + new Chart(canvas, { + type: 'line', + data: { + labels: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], + datasets: [{ + label: 'Users', + data: [12, 19, 3, 5, 2, 3, 20, 33, 23, 12, 33, 10], + borderColor: '#fff', + borderWidth: 1, + fill: false, + }] + }, + options: { + legend: { + display: false + }, + scales: { + yAxes: [{ + ticks: { + beginAtZero: true, + display: false, + }, + gridLines: { + display: false, + drawBorder: false, + } + }], + xAxes: [{ + ticks: { + display: false, + }, + gridLines: { + display: false, + drawBorder: false, + } + }] + } + } + }); + }); +}); diff --git a/generator-web/target/classes/static/js/page.js b/generator-web/target/classes/static/js/page.js new file mode 100644 index 0000000..dbeee29 --- /dev/null +++ b/generator-web/target/classes/static/js/page.js @@ -0,0 +1,48 @@ +var commonFn={}; + +commonFn.setAjaxPaginator = function (paginatorSelector, count, option) { + var totals = count;//总条数 + var pageSize = option.pageSize; //每页条数 + var totalPages = 1; + if (totals != 0) { + if (totals % pageSize == 0) { + totalPages = totals / pageSize; + } else { + totalPages = Math.ceil(totals / pageSize); + } + } + if (totalPages > 1) { + //当总页数大于1时生成显示分页否则不显示分页 + commonFn.buildAjaxPaginator(paginatorSelector, $.extend(option, {totalPages: totalPages})) + }else{ + paginatorSelector.html(""); + } +} + +commonFn.buildAjaxPaginator = function (paginatorSelector, option) { + var _option = { + currentPage: 1, //当前页 + totalPages: 1, //总页数 + numberOfPages: 5, //设置控件显示的页码数 + bootstrapMajorVersion: 3,//如果是bootstrap3版本需要加此标识,并且设置包含分页内容的DOM元素为UL,如果是bootstrap2版本,则DOM包含元素是DIV + useBootstrapTooltip: false,//是否显示tip提示框 + itemTexts: function (type, page, current) {//文字翻译 + switch (type) { + case "first": + return "首页"; + case "prev": + return "上一页"; + case "next": + return "下一页"; + case "last": + return "尾页"; + case "page": + return page; + } + }, + onPageClicked: function (event, originalEvent, type, page, pageSize) { + } + }; + $.extend(_option, option); + paginatorSelector.bootstrapPaginator(_option); +} \ No newline at end of file diff --git a/generator-web/target/classes/static/js/templateHelper.js b/generator-web/target/classes/static/js/templateHelper.js new file mode 100644 index 0000000..e529485 --- /dev/null +++ b/generator-web/target/classes/static/js/templateHelper.js @@ -0,0 +1,37 @@ +if(typeof(template)!="undefined" && template&&template.helper){ + template.helper("dateToStringShort",dateToStringShort); + template.helper("dateToString",dateToString); +} + +//时间戳转换为时间字符串,返回的时间格式yyyy-MM-dd +function dateToStringShort(inputTime){ + if(inputTime==null || inputTime==''){ + return ''; + } + var date = new Date(inputTime); + var y = date.getFullYear(); + var m = date.getMonth() + 1; + m = m < 10 ? ('0' + m) : m; + var d = date.getDate(); + d = d < 10 ? ('0' + d) : d; + return y + '-' + m + '-' + d; +} +//返回的时间格式 yyyy-MM-dd HH:mm:ss +function dateToString(inputTime){ + if(inputTime==null || inputTime==''){ + return ''; + } + var date = new Date(inputTime); + var y = date.getFullYear(); + var m = date.getMonth() + 1; + m = m < 10 ? ('0' + m) : m; + var d = date.getDate(); + d = d < 10 ? ('0' + d) : d; + var h = date.getHours(); + h = h < 10 ? ('0' + h) : h; + var minute = date.getMinutes(); + var second = date.getSeconds(); + minute = minute < 10 ? ('0' + minute) : minute; + second = second < 10 ? ('0' + second) : second; + return y + '-' + m + '-' + d+' '+h+':'+minute+':'+second; +} diff --git a/generator-web/target/classes/static/layouts-fixed-header.html b/generator-web/target/classes/static/layouts-fixed-header.html new file mode 100644 index 0000000..7ded28b --- /dev/null +++ b/generator-web/target/classes/static/layouts-fixed-header.html @@ -0,0 +1,424 @@ + + + + + + + Carbon - Admin Template + + + + + +
    + + +
    + + +
    +
    +
    +
    +
    + Default Card +
    + +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. Alias architecto atque deleniti dolor dolores doloribus ducimus ea, eveniet facere hic illo illum laborum maiores nemo optio quas quis tenetur totam. +
    +
    +
    + +
    +
    +
    + Light Header +
    + +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. Alias architecto atque deleniti dolor dolores doloribus ducimus ea, eveniet facere hic illo illum laborum maiores nemo optio quas quis tenetur totam. +
    +
    +
    + +
    +
    +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. Alias architecto atque deleniti dolor dolores doloribus ducimus ea, eveniet facere hic illo illum laborum maiores nemo optio quas quis tenetur totam. +
    + + +
    +
    +
    + +
    +
    +
    +
    + Card with Actions + +
    + + + + + + + +
    +
    + +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
    +
    +
    + +
    +
    +
    + Card Divded Header +
    + +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
    +
    +
    + +
    +
    +
    + Light Card +
    + +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
    +
    +
    +
    + +
    +
    +
    +
    + Primary Card +
    + +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
    +
    +
    + +
    +
    +
    + Info Card +
    + +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
    +
    +
    + +
    +
    +
    + Danger Card +
    + +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
    +
    +
    +
    + +
    +
    +
    +
    + Success Card +
    + +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
    +
    +
    + +
    +
    +
    + Warning Card +
    + +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
    +
    +
    + +
    +
    +
    + Dark Card +
    + +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
    +
    +
    +
    +
    +
    +
    + + + + + + + + diff --git a/generator-web/target/classes/static/layouts-fixed-sidebar.html b/generator-web/target/classes/static/layouts-fixed-sidebar.html new file mode 100644 index 0000000..8a14785 --- /dev/null +++ b/generator-web/target/classes/static/layouts-fixed-sidebar.html @@ -0,0 +1,424 @@ + + + + + + + Carbon - Admin Template + + + + + +
    + + +
    + + +
    +
    +
    +
    +
    + Default Card +
    + +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. Alias architecto atque deleniti dolor dolores doloribus ducimus ea, eveniet facere hic illo illum laborum maiores nemo optio quas quis tenetur totam. +
    +
    +
    + +
    +
    +
    + Light Header +
    + +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. Alias architecto atque deleniti dolor dolores doloribus ducimus ea, eveniet facere hic illo illum laborum maiores nemo optio quas quis tenetur totam. +
    +
    +
    + +
    +
    +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. Alias architecto atque deleniti dolor dolores doloribus ducimus ea, eveniet facere hic illo illum laborum maiores nemo optio quas quis tenetur totam. +
    + + +
    +
    +
    + +
    +
    +
    +
    + Card with Actions + +
    + + + + + + + +
    +
    + +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
    +
    +
    + +
    +
    +
    + Card Divded Header +
    + +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
    +
    +
    + +
    +
    +
    + Light Card +
    + +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
    +
    +
    +
    + +
    +
    +
    +
    + Primary Card +
    + +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
    +
    +
    + +
    +
    +
    + Info Card +
    + +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
    +
    +
    + +
    +
    +
    + Danger Card +
    + +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
    +
    +
    +
    + +
    +
    +
    +
    + Success Card +
    + +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
    +
    +
    + +
    +
    +
    + Warning Card +
    + +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
    +
    +
    + +
    +
    +
    + Dark Card +
    + +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
    +
    +
    +
    +
    +
    +
    + + + + + + + + diff --git a/generator-web/target/classes/static/layouts-hidden-sidebar.html b/generator-web/target/classes/static/layouts-hidden-sidebar.html new file mode 100644 index 0000000..384c233 --- /dev/null +++ b/generator-web/target/classes/static/layouts-hidden-sidebar.html @@ -0,0 +1,424 @@ + + + + + + + Carbon - Admin Template + + + + + +
    + + +
    + + +
    +
    +
    +
    +
    + Default Card +
    + +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. Alias architecto atque deleniti dolor dolores doloribus ducimus ea, eveniet facere hic illo illum laborum maiores nemo optio quas quis tenetur totam. +
    +
    +
    + +
    +
    +
    + Light Header +
    + +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. Alias architecto atque deleniti dolor dolores doloribus ducimus ea, eveniet facere hic illo illum laborum maiores nemo optio quas quis tenetur totam. +
    +
    +
    + +
    +
    +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. Alias architecto atque deleniti dolor dolores doloribus ducimus ea, eveniet facere hic illo illum laborum maiores nemo optio quas quis tenetur totam. +
    + + +
    +
    +
    + +
    +
    +
    +
    + Card with Actions + +
    + + + + + + + +
    +
    + +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
    +
    +
    + +
    +
    +
    + Card Divded Header +
    + +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
    +
    +
    + +
    +
    +
    + Light Card +
    + +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
    +
    +
    +
    + +
    +
    +
    +
    + Primary Card +
    + +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
    +
    +
    + +
    +
    +
    + Info Card +
    + +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
    +
    +
    + +
    +
    +
    + Danger Card +
    + +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
    +
    +
    +
    + +
    +
    +
    +
    + Success Card +
    + +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
    +
    +
    + +
    +
    +
    + Warning Card +
    + +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
    +
    +
    + +
    +
    +
    + Dark Card +
    + +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
    +
    +
    +
    +
    +
    +
    + + + + + + + + diff --git a/generator-web/target/classes/static/layouts-normal.html b/generator-web/target/classes/static/layouts-normal.html new file mode 100644 index 0000000..46fcb99 --- /dev/null +++ b/generator-web/target/classes/static/layouts-normal.html @@ -0,0 +1,424 @@ + + + + + + + Carbon - Admin Template + + + + + +
    + + +
    + + +
    +
    +
    +
    +
    + Default Card +
    + +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. Alias architecto atque deleniti dolor dolores doloribus ducimus ea, eveniet facere hic illo illum laborum maiores nemo optio quas quis tenetur totam. +
    +
    +
    + +
    +
    +
    + Light Header +
    + +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. Alias architecto atque deleniti dolor dolores doloribus ducimus ea, eveniet facere hic illo illum laborum maiores nemo optio quas quis tenetur totam. +
    +
    +
    + +
    +
    +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. Alias architecto atque deleniti dolor dolores doloribus ducimus ea, eveniet facere hic illo illum laborum maiores nemo optio quas quis tenetur totam. +
    + + +
    +
    +
    + +
    +
    +
    +
    + Card with Actions + +
    + + + + + + + +
    +
    + +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
    +
    +
    + +
    +
    +
    + Card Divded Header +
    + +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
    +
    +
    + +
    +
    +
    + Light Card +
    + +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
    +
    +
    +
    + +
    +
    +
    +
    + Primary Card +
    + +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
    +
    +
    + +
    +
    +
    + Info Card +
    + +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
    +
    +
    + +
    +
    +
    + Danger Card +
    + +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
    +
    +
    +
    + +
    +
    +
    +
    + Success Card +
    + +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
    +
    +
    + +
    +
    +
    + Warning Card +
    + +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
    +
    +
    + +
    +
    +
    + Dark Card +
    + +
    + Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aperiam cupiditate dolore facere magnam, rerum sint velit voluptate voluptates? A assumenda consequuntur debitis eaque est in ipsam iure molestiae quam. +
    +
    +
    +
    +
    +
    +
    + + + + + + + + diff --git a/generator-web/target/classes/static/login.html b/generator-web/target/classes/static/login.html new file mode 100644 index 0000000..7a89dc6 --- /dev/null +++ b/generator-web/target/classes/static/login.html @@ -0,0 +1,62 @@ + + + + + + + Carbon - Admin Template + + + + + +
    +
    +
    +
    +
    +
    + Login +
    + +
    +
    + + +
    + +
    + + +
    + +
    + + +
    +
    + + +
    +
    +
    +
    +
    + + + + + + + + diff --git a/generator-web/target/classes/static/modals.html b/generator-web/target/classes/static/modals.html new file mode 100644 index 0000000..7ab321c --- /dev/null +++ b/generator-web/target/classes/static/modals.html @@ -0,0 +1,602 @@ + + + + + + + Carbon - Admin Template + + + + + +
    + + +
    + + +
    +
    +
    +
    +
    + Modals +
    + +
    +
    +

    Basic Modals

    + + + +
    + +
    +
    +

    Colored Headers Modals

    + + + + + +
    + +
    +
    +

    Full Color Modals

    + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/generator-web/target/classes/static/progress-bars.html b/generator-web/target/classes/static/progress-bars.html new file mode 100644 index 0000000..8d17b5f --- /dev/null +++ b/generator-web/target/classes/static/progress-bars.html @@ -0,0 +1,412 @@ + + + + + + + Carbon - Admin Template + + + + + +
    + + +
    + + +
    +
    +
    +
    +
    +
    + Normal Progress Bars +
    + +
    +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    +
    +
    + +
    +
    + Stripped Progress Bars +
    + +
    +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    + Progress Bar Sizes +
    + +
    +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    +
    +
    + +
    +
    + Labels with Progress Bars +
    + +
    +
    +
    +
    + +
    +
    +
    + +
    +
    35%
    +
    + +
    +
    55%
    +
    + +
    +
    25%
    +
    + +
    +
    65%
    +
    + +
    +
    30%
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + diff --git a/generator-web/target/classes/static/register.html b/generator-web/target/classes/static/register.html new file mode 100644 index 0000000..cefd55e --- /dev/null +++ b/generator-web/target/classes/static/register.html @@ -0,0 +1,59 @@ + + + + + + + Carbon - Admin Template + + + + + +
    +
    +
    +
    +
    +
    + Register +
    + +
    +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    +
    + + +
    +
    +
    +
    +
    + + + + + + + + diff --git a/generator-web/target/classes/static/settings.html b/generator-web/target/classes/static/settings.html new file mode 100644 index 0000000..a009a7d --- /dev/null +++ b/generator-web/target/classes/static/settings.html @@ -0,0 +1,359 @@ + + + + + + + Carbon - Admin Template + + + + + +
    + + +
    + + +
    +
    +
    + + +
    +
    +
    + Account Settings +
    + +
    +
    +
    +
    Profile Information
    +
    These information are visible to the public.
    +
    + +
    +
    +
    +
    + + +
    +
    + +
    +
    + + +
    +
    +
    + +
    +
    +
    + + +
    +
    +
    + +
    +
    +
    + + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    Access Credentials
    +
    Leave credentials fields empty if you don't wish to change the password.
    +
    + +
    +
    +
    +
    + + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +
    +
    + + + + + + + + diff --git a/generator-web/target/classes/static/tables.html b/generator-web/target/classes/static/tables.html new file mode 100644 index 0000000..a92ce17 --- /dev/null +++ b/generator-web/target/classes/static/tables.html @@ -0,0 +1,512 @@ + + + + + + + Carbon - Admin Template + + + + + +
    + + +
    + + +
    +
    +
    +
    +
    + Normal Table +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    IDNameSalesPriceDiscount
    1Samsung Galaxy S831,589$8005%
    2Google Pixel XL99,542$7503%
    3iPhone X62,220$1,2000%
    4OnePlus 5T50,000$6505%
    5Google Nexus 6400$4007%
    +
    +
    +
    +
    + +
    +
    +
    + Striped Rows +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    IDNameSalesPriceDiscount
    1Samsung Galaxy S831,589$8005%
    2Google Pixel XL99,542$7503%
    3iPhone X62,220$1,2000%
    4OnePlus 5T50,000$6505%
    5Google Nexus 6400$4007%
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    + Bordered Table +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    IDNameSalesPriceDiscount
    1Samsung Galaxy S831,589$8005%
    2Google Pixel XL99,542$7503%
    3iPhone X62,220$1,2000%
    4OnePlus 5T50,000$6505%
    5Google Nexus 6400$4007%
    +
    +
    +
    +
    + +
    +
    +
    + Hoverable Table +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    IDNameSalesPriceDiscount
    1Samsung Galaxy S831,589$8005%
    2Google Pixel XL99,542$7503%
    3iPhone X62,220$1,2000%
    4OnePlus 5T50,000$6505%
    5Google Nexus 6400$4007%
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + diff --git a/generator-web/target/classes/static/tabs.html b/generator-web/target/classes/static/tabs.html new file mode 100644 index 0000000..3d26cce --- /dev/null +++ b/generator-web/target/classes/static/tabs.html @@ -0,0 +1,394 @@ + + + + + + + Carbon - Admin Template + + + + + +
    + + +
    + + +
    +
    +
    + + +
    +
    + 1. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure + dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. +
    + +
    + 2. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure + dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. +
    + +
    + 3. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure + dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. +
    +
    +
    + +
    + + +
    +
    + 1. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure + dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. +
    + +
    + 2. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure + dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. +
    + +
    + 3. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure + dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. +
    +
    +
    +
    + +
    +
    + + +
    +
    + 1. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure + dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. +
    + + + +
    + 3. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure + dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. +
    +
    +
    + +
    + + +
    + + +
    + 2. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure + dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. +
    + +
    + 3. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure + dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. +
    +
    +
    +
    +
    +
    +
    + + + + + + + + diff --git a/generator-web/target/classes/static/vendor/bootstrap/js/bootstrap-datetimepicker.js b/generator-web/target/classes/static/vendor/bootstrap/js/bootstrap-datetimepicker.js new file mode 100755 index 0000000..41293e0 --- /dev/null +++ b/generator-web/target/classes/static/vendor/bootstrap/js/bootstrap-datetimepicker.js @@ -0,0 +1,1967 @@ +/* ========================================================= + * bootstrap-datetimepicker.js + * ========================================================= + * Copyright 2012 Stefan Petre + * + * Improvements by Andrew Rowls + * Improvements by Sébastien Malot + * Improvements by Yun Lai + * Improvements by Kenneth Henderick + * Improvements by CuGBabyBeaR + * Improvements by Christian Vaas + * + * Project URL : http://www.malot.fr/bootstrap-datetimepicker + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================= */ + +(function(factory){ + if (typeof define === 'function' && define.amd) + define(['jquery'], factory); + else if (typeof exports === 'object') + factory(require('jquery')); + else + factory(jQuery); + +}(function($, undefined){ + + // Add ECMA262-5 Array methods if not supported natively (IE8) + if (!('indexOf' in Array.prototype)) { + Array.prototype.indexOf = function (find, i) { + if (i === undefined) i = 0; + if (i < 0) i += this.length; + if (i < 0) i = 0; + for (var n = this.length; i < n; i++) { + if (i in this && this[i] === find) { + return i; + } + } + return -1; + } + } + + // Add timezone abbreviation support for ie6+, Chrome, Firefox + function timeZoneAbbreviation() { + var abbreviation, date, formattedStr, i, len, matchedStrings, ref, str; + date = (new Date()).toString(); + formattedStr = ((ref = date.split('(')[1]) != null ? ref.slice(0, -1) : 0) || date.split(' '); + if (formattedStr instanceof Array) { + matchedStrings = []; + for (var i = 0, len = formattedStr.length; i < len; i++) { + str = formattedStr[i]; + if ((abbreviation = (ref = str.match(/\b[A-Z]+\b/)) !== null) ? ref[0] : 0) { + matchedStrings.push(abbreviation); + } + } + formattedStr = matchedStrings.pop(); + } + return formattedStr; + } + + function UTCDate() { + return new Date(Date.UTC.apply(Date, arguments)); + } + + // Picker object + var Datetimepicker = function (element, options) { + var that = this; + + this.element = $(element); + + // add container for single page application + // when page switch the datetimepicker div will be removed also. + this.container = options.container || 'body'; + + this.language = options.language || this.element.data('date-language') || 'en'; + this.language = this.language in dates ? this.language : this.language.split('-')[0]; // fr-CA fallback to fr + this.language = this.language in dates ? this.language : 'en'; + this.isRTL = dates[this.language].rtl || false; + this.formatType = options.formatType || this.element.data('format-type') || 'standard'; + this.format = DPGlobal.parseFormat(options.format || this.element.data('date-format') || dates[this.language].format || DPGlobal.getDefaultFormat(this.formatType, 'input'), this.formatType); + this.isInline = false; + this.isVisible = false; + this.isInput = this.element.is('input'); + this.fontAwesome = options.fontAwesome || this.element.data('font-awesome') || false; + + this.bootcssVer = options.bootcssVer || (this.isInput ? (this.element.is('.form-control') ? 3 : 2) : ( this.bootcssVer = this.element.is('.input-group') ? 3 : 2 )); + + this.component = this.element.is('.date') ? ( this.bootcssVer === 3 ? this.element.find('.input-group-addon .glyphicon-th, .input-group-addon .glyphicon-time, .input-group-addon .glyphicon-remove, .input-group-addon .glyphicon-calendar, .input-group-addon .fa-calendar, .input-group-addon .fa-clock-o').parent() : this.element.find('.add-on .icon-th, .add-on .icon-time, .add-on .icon-calendar, .add-on .fa-calendar, .add-on .fa-clock-o').parent()) : false; + this.componentReset = this.element.is('.date') ? ( this.bootcssVer === 3 ? this.element.find('.input-group-addon .glyphicon-remove, .input-group-addon .fa-times').parent():this.element.find('.add-on .icon-remove, .add-on .fa-times').parent()) : false; + this.hasInput = this.component && this.element.find('input').length; + if (this.component && this.component.length === 0) { + this.component = false; + } + this.linkField = options.linkField || this.element.data('link-field') || false; + this.linkFormat = DPGlobal.parseFormat(options.linkFormat || this.element.data('link-format') || DPGlobal.getDefaultFormat(this.formatType, 'link'), this.formatType); + this.minuteStep = options.minuteStep || this.element.data('minute-step') || 5; + this.pickerPosition = options.pickerPosition || this.element.data('picker-position') || 'bottom-right'; + this.showMeridian = options.showMeridian || this.element.data('show-meridian') || false; + this.initialDate = options.initialDate || new Date(); + this.zIndex = options.zIndex || this.element.data('z-index') || undefined; + this.title = typeof options.title === 'undefined' ? false : options.title; + this.timezone = options.timezone || timeZoneAbbreviation(); + + this.icons = { + leftArrow: this.fontAwesome ? 'fa-arrow-left' : (this.bootcssVer === 3 ? 'glyphicon-arrow-left' : 'icon-arrow-left'), + rightArrow: this.fontAwesome ? 'fa-arrow-right' : (this.bootcssVer === 3 ? 'glyphicon-arrow-right' : 'icon-arrow-right') + } + this.icontype = this.fontAwesome ? 'fa' : 'glyphicon'; + + this._attachEvents(); + + this.clickedOutside = function (e) { + // Clicked outside the datetimepicker, hide it + if ($(e.target).closest('.datetimepicker').length === 0) { + that.hide(); + } + } + + this.formatViewType = 'datetime'; + if ('formatViewType' in options) { + this.formatViewType = options.formatViewType; + } else if ('formatViewType' in this.element.data()) { + this.formatViewType = this.element.data('formatViewType'); + } + + this.minView = 0; + if ('minView' in options) { + this.minView = options.minView; + } else if ('minView' in this.element.data()) { + this.minView = this.element.data('min-view'); + } + this.minView = DPGlobal.convertViewMode(this.minView); + + this.maxView = DPGlobal.modes.length - 1; + if ('maxView' in options) { + this.maxView = options.maxView; + } else if ('maxView' in this.element.data()) { + this.maxView = this.element.data('max-view'); + } + this.maxView = DPGlobal.convertViewMode(this.maxView); + + this.wheelViewModeNavigation = false; + if ('wheelViewModeNavigation' in options) { + this.wheelViewModeNavigation = options.wheelViewModeNavigation; + } else if ('wheelViewModeNavigation' in this.element.data()) { + this.wheelViewModeNavigation = this.element.data('view-mode-wheel-navigation'); + } + + this.wheelViewModeNavigationInverseDirection = false; + + if ('wheelViewModeNavigationInverseDirection' in options) { + this.wheelViewModeNavigationInverseDirection = options.wheelViewModeNavigationInverseDirection; + } else if ('wheelViewModeNavigationInverseDirection' in this.element.data()) { + this.wheelViewModeNavigationInverseDirection = this.element.data('view-mode-wheel-navigation-inverse-dir'); + } + + this.wheelViewModeNavigationDelay = 100; + if ('wheelViewModeNavigationDelay' in options) { + this.wheelViewModeNavigationDelay = options.wheelViewModeNavigationDelay; + } else if ('wheelViewModeNavigationDelay' in this.element.data()) { + this.wheelViewModeNavigationDelay = this.element.data('view-mode-wheel-navigation-delay'); + } + + this.startViewMode = 2; + if ('startView' in options) { + this.startViewMode = options.startView; + } else if ('startView' in this.element.data()) { + this.startViewMode = this.element.data('start-view'); + } + this.startViewMode = DPGlobal.convertViewMode(this.startViewMode); + this.viewMode = this.startViewMode; + + this.viewSelect = this.minView; + if ('viewSelect' in options) { + this.viewSelect = options.viewSelect; + } else if ('viewSelect' in this.element.data()) { + this.viewSelect = this.element.data('view-select'); + } + this.viewSelect = DPGlobal.convertViewMode(this.viewSelect); + + this.forceParse = true; + if ('forceParse' in options) { + this.forceParse = options.forceParse; + } else if ('dateForceParse' in this.element.data()) { + this.forceParse = this.element.data('date-force-parse'); + } + var template = this.bootcssVer === 3 ? DPGlobal.templateV3 : DPGlobal.template; + while (template.indexOf('{iconType}') !== -1) { + template = template.replace('{iconType}', this.icontype); + } + while (template.indexOf('{leftArrow}') !== -1) { + template = template.replace('{leftArrow}', this.icons.leftArrow); + } + while (template.indexOf('{rightArrow}') !== -1) { + template = template.replace('{rightArrow}', this.icons.rightArrow); + } + this.picker = $(template) + .appendTo(this.isInline ? this.element : this.container) // 'body') + .on({ + click: $.proxy(this.click, this), + mousedown: $.proxy(this.mousedown, this) + }); + + if (this.wheelViewModeNavigation) { + if ($.fn.mousewheel) { + this.picker.on({mousewheel: $.proxy(this.mousewheel, this)}); + } else { + console.log('Mouse Wheel event is not supported. Please include the jQuery Mouse Wheel plugin before enabling this option'); + } + } + + if (this.isInline) { + this.picker.addClass('datetimepicker-inline'); + } else { + this.picker.addClass('datetimepicker-dropdown-' + this.pickerPosition + ' dropdown-menu'); + } + if (this.isRTL) { + this.picker.addClass('datetimepicker-rtl'); + var selector = this.bootcssVer === 3 ? '.prev span, .next span' : '.prev i, .next i'; + this.picker.find(selector).toggleClass(this.icons.leftArrow + ' ' + this.icons.rightArrow); + } + + $(document).on('mousedown touchend', this.clickedOutside); + + this.autoclose = false; + if ('autoclose' in options) { + this.autoclose = options.autoclose; + } else if ('dateAutoclose' in this.element.data()) { + this.autoclose = this.element.data('date-autoclose'); + } + + this.keyboardNavigation = true; + if ('keyboardNavigation' in options) { + this.keyboardNavigation = options.keyboardNavigation; + } else if ('dateKeyboardNavigation' in this.element.data()) { + this.keyboardNavigation = this.element.data('date-keyboard-navigation'); + } + + this.todayBtn = (options.todayBtn || this.element.data('date-today-btn') || false); + this.clearBtn = (options.clearBtn || this.element.data('date-clear-btn') || false); + this.todayHighlight = (options.todayHighlight || this.element.data('date-today-highlight') || false); + + this.weekStart = 0; + if (typeof options.weekStart !== 'undefined') { + this.weekStart = options.weekStart; + } else if (typeof this.element.data('date-weekstart') !== 'undefined') { + this.weekStart = this.element.data('date-weekstart'); + } else if (typeof dates[this.language].weekStart !== 'undefined') { + this.weekStart = dates[this.language].weekStart; + } + this.weekStart = this.weekStart % 7; + this.weekEnd = ((this.weekStart + 6) % 7); + this.onRenderDay = function (date) { + var render = (options.onRenderDay || function () { return []; })(date); + if (typeof render === 'string') { + render = [render]; + } + var res = ['day']; + return res.concat((render ? render : [])); + }; + this.onRenderHour = function (date) { + var render = (options.onRenderHour || function () { return []; })(date); + var res = ['hour']; + if (typeof render === 'string') { + render = [render]; + } + return res.concat((render ? render : [])); + }; + this.onRenderMinute = function (date) { + var render = (options.onRenderMinute || function () { return []; })(date); + var res = ['minute']; + if (typeof render === 'string') { + render = [render]; + } + if (date < this.startDate || date > this.endDate) { + res.push('disabled'); + } else if (Math.floor(this.date.getUTCMinutes() / this.minuteStep) === Math.floor(date.getUTCMinutes() / this.minuteStep)) { + res.push('active'); + } + return res.concat((render ? render : [])); + }; + this.onRenderYear = function (date) { + var render = (options.onRenderYear || function () { return []; })(date); + var res = ['year']; + if (typeof render === 'string') { + render = [render]; + } + if (this.date.getUTCFullYear() === date.getUTCFullYear()) { + res.push('active'); + } + var currentYear = date.getUTCFullYear(); + var endYear = this.endDate.getUTCFullYear(); + if (date < this.startDate || currentYear > endYear) { + res.push('disabled'); + } + return res.concat((render ? render : [])); + } + this.onRenderMonth = function (date) { + var render = (options.onRenderMonth || function () { return []; })(date); + var res = ['month']; + if (typeof render === 'string') { + render = [render]; + } + return res.concat((render ? render : [])); + } + this.startDate = new Date(-8639968443048000); + this.endDate = new Date(8639968443048000); + this.datesDisabled = []; + this.daysOfWeekDisabled = []; + this.setStartDate(options.startDate || this.element.data('date-startdate')); + this.setEndDate(options.endDate || this.element.data('date-enddate')); + this.setDatesDisabled(options.datesDisabled || this.element.data('date-dates-disabled')); + this.setDaysOfWeekDisabled(options.daysOfWeekDisabled || this.element.data('date-days-of-week-disabled')); + this.setMinutesDisabled(options.minutesDisabled || this.element.data('date-minute-disabled')); + this.setHoursDisabled(options.hoursDisabled || this.element.data('date-hour-disabled')); + this.fillDow(); + this.fillMonths(); + this.update(); + this.showMode(); + + if (this.isInline) { + this.show(); + } + }; + + Datetimepicker.prototype = { + constructor: Datetimepicker, + + _events: [], + _attachEvents: function () { + this._detachEvents(); + if (this.isInput) { // single input + this._events = [ + [this.element, { + focus: $.proxy(this.show, this), + keyup: $.proxy(this.update, this), + keydown: $.proxy(this.keydown, this) + }] + ]; + } + else if (this.component && this.hasInput) { // component: input + button + this._events = [ + // For components that are not readonly, allow keyboard nav + [this.element.find('input'), { + focus: $.proxy(this.show, this), + keyup: $.proxy(this.update, this), + keydown: $.proxy(this.keydown, this) + }], + [this.component, { + click: $.proxy(this.show, this) + }] + ]; + if (this.componentReset) { + this._events.push([ + this.componentReset, + {click: $.proxy(this.reset, this)} + ]); + } + } + else if (this.element.is('div')) { // inline datetimepicker + this.isInline = true; + } + else { + this._events = [ + [this.element, { + click: $.proxy(this.show, this) + }] + ]; + } + for (var i = 0, el, ev; i < this._events.length; i++) { + el = this._events[i][0]; + ev = this._events[i][1]; + el.on(ev); + } + }, + + _detachEvents: function () { + for (var i = 0, el, ev; i < this._events.length; i++) { + el = this._events[i][0]; + ev = this._events[i][1]; + el.off(ev); + } + this._events = []; + }, + + show: function (e) { + this.picker.show(); + this.height = this.component ? this.component.outerHeight() : this.element.outerHeight(); + if (this.forceParse) { + this.update(); + } + this.place(); + $(window).on('resize', $.proxy(this.place, this)); + if (e) { + e.stopPropagation(); + e.preventDefault(); + } + this.isVisible = true; + this.element.trigger({ + type: 'show', + date: this.date + }); + }, + + hide: function () { + if (!this.isVisible) return; + if (this.isInline) return; + this.picker.hide(); + $(window).off('resize', this.place); + this.viewMode = this.startViewMode; + this.showMode(); + if (!this.isInput) { + $(document).off('mousedown', this.hide); + } + + if ( + this.forceParse && + ( + this.isInput && this.element.val() || + this.hasInput && this.element.find('input').val() + ) + ) + this.setValue(); + this.isVisible = false; + this.element.trigger({ + type: 'hide', + date: this.date + }); + }, + + remove: function () { + this._detachEvents(); + $(document).off('mousedown', this.clickedOutside); + this.picker.remove(); + delete this.picker; + delete this.element.data().datetimepicker; + }, + + getDate: function () { + var d = this.getUTCDate(); + if (d === null) { + return null; + } + return new Date(d.getTime() + (d.getTimezoneOffset() * 60000)); + }, + + getUTCDate: function () { + return this.date; + }, + + getInitialDate: function () { + return this.initialDate + }, + + setInitialDate: function (initialDate) { + this.initialDate = initialDate; + }, + + setDate: function (d) { + this.setUTCDate(new Date(d.getTime() - (d.getTimezoneOffset() * 60000))); + }, + + setUTCDate: function (d) { + if (d >= this.startDate && d <= this.endDate) { + this.date = d; + this.setValue(); + this.viewDate = this.date; + this.fill(); + } else { + this.element.trigger({ + type: 'outOfRange', + date: d, + startDate: this.startDate, + endDate: this.endDate + }); + } + }, + + setFormat: function (format) { + this.format = DPGlobal.parseFormat(format, this.formatType); + var element; + if (this.isInput) { + element = this.element; + } else if (this.component) { + element = this.element.find('input'); + } + if (element && element.val()) { + this.setValue(); + } + }, + + setValue: function () { + var formatted = this.getFormattedDate(); + if (!this.isInput) { + if (this.component) { + this.element.find('input').val(formatted); + } + this.element.data('date', formatted); + } else { + this.element.val(formatted); + } + if (this.linkField) { + $('#' + this.linkField).val(this.getFormattedDate(this.linkFormat)); + } + }, + + getFormattedDate: function (format) { + format = format || this.format; + return DPGlobal.formatDate(this.date, format, this.language, this.formatType, this.timezone); + }, + + setStartDate: function (startDate) { + this.startDate = startDate || this.startDate; + if (this.startDate.valueOf() !== 8639968443048000) { + this.startDate = DPGlobal.parseDate(this.startDate, this.format, this.language, this.formatType, this.timezone); + } + this.update(); + this.updateNavArrows(); + }, + + setEndDate: function (endDate) { + this.endDate = endDate || this.endDate; + if (this.endDate.valueOf() !== 8639968443048000) { + this.endDate = DPGlobal.parseDate(this.endDate, this.format, this.language, this.formatType, this.timezone); + } + this.update(); + this.updateNavArrows(); + }, + + setDatesDisabled: function (datesDisabled) { + this.datesDisabled = datesDisabled || []; + if (!$.isArray(this.datesDisabled)) { + this.datesDisabled = this.datesDisabled.split(/,\s*/); + } + var mThis = this; + this.datesDisabled = $.map(this.datesDisabled, function (d) { + return DPGlobal.parseDate(d, mThis.format, mThis.language, mThis.formatType, mThis.timezone).toDateString(); + }); + this.update(); + this.updateNavArrows(); + }, + + setTitle: function (selector, value) { + return this.picker.find(selector) + .find('th:eq(1)') + .text(this.title === false ? value : this.title); + }, + + setDaysOfWeekDisabled: function (daysOfWeekDisabled) { + this.daysOfWeekDisabled = daysOfWeekDisabled || []; + if (!$.isArray(this.daysOfWeekDisabled)) { + this.daysOfWeekDisabled = this.daysOfWeekDisabled.split(/,\s*/); + } + this.daysOfWeekDisabled = $.map(this.daysOfWeekDisabled, function (d) { + return parseInt(d, 10); + }); + this.update(); + this.updateNavArrows(); + }, + + setMinutesDisabled: function (minutesDisabled) { + this.minutesDisabled = minutesDisabled || []; + if (!$.isArray(this.minutesDisabled)) { + this.minutesDisabled = this.minutesDisabled.split(/,\s*/); + } + this.minutesDisabled = $.map(this.minutesDisabled, function (d) { + return parseInt(d, 10); + }); + this.update(); + this.updateNavArrows(); + }, + + setHoursDisabled: function (hoursDisabled) { + this.hoursDisabled = hoursDisabled || []; + if (!$.isArray(this.hoursDisabled)) { + this.hoursDisabled = this.hoursDisabled.split(/,\s*/); + } + this.hoursDisabled = $.map(this.hoursDisabled, function (d) { + return parseInt(d, 10); + }); + this.update(); + this.updateNavArrows(); + }, + + place: function () { + if (this.isInline) return; + + if (!this.zIndex) { + var index_highest = 0; + $('div').each(function () { + var index_current = parseInt($(this).css('zIndex'), 10); + if (index_current > index_highest) { + index_highest = index_current; + } + }); + this.zIndex = index_highest + 10; + } + + var offset, top, left, containerOffset; + if (this.container instanceof $) { + containerOffset = this.container.offset(); + } else { + containerOffset = $(this.container).offset(); + } + + if (this.component) { + offset = this.component.offset(); + left = offset.left; + if (this.pickerPosition === 'bottom-left' || this.pickerPosition === 'top-left') { + left += this.component.outerWidth() - this.picker.outerWidth(); + } + } else { + offset = this.element.offset(); + left = offset.left; + if (this.pickerPosition === 'bottom-left' || this.pickerPosition === 'top-left') { + left += this.element.outerWidth() - this.picker.outerWidth(); + } + } + + var bodyWidth = document.body.clientWidth || window.innerWidth; + if (left + 220 > bodyWidth) { + left = bodyWidth - 220; + } + + if (this.pickerPosition === 'top-left' || this.pickerPosition === 'top-right') { + top = offset.top - this.picker.outerHeight(); + } else { + top = offset.top + this.height; + } + + top = top - containerOffset.top; + left = left - containerOffset.left; + + this.picker.css({ + top: top, + left: left, + zIndex: this.zIndex + }); + }, + + hour_minute: "^([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]", + + update: function () { + var date, fromArgs = false; + if (arguments && arguments.length && (typeof arguments[0] === 'string' || arguments[0] instanceof Date)) { + date = arguments[0]; + fromArgs = true; + } else { + date = (this.isInput ? this.element.val() : this.element.find('input').val()) || this.element.data('date') || this.initialDate; + if (typeof date === 'string') { + date = date.replace(/^\s+|\s+$/g,''); + } + } + + if (!date) { + date = new Date(); + fromArgs = false; + } + + if (typeof date === "string") { + if (new RegExp(this.hour_minute).test(date) || new RegExp(this.hour_minute + ":[0-5][0-9]").test(date)) { + date = this.getDate() + } + } + + this.date = DPGlobal.parseDate(date, this.format, this.language, this.formatType, this.timezone); + + if (fromArgs) this.setValue(); + + if (this.date < this.startDate) { + this.viewDate = new Date(this.startDate); + } else if (this.date > this.endDate) { + this.viewDate = new Date(this.endDate); + } else { + this.viewDate = new Date(this.date); + } + this.fill(); + }, + + fillDow: function () { + var dowCnt = this.weekStart, + html = ''; + while (dowCnt < this.weekStart + 7) { + html += '' + dates[this.language].daysMin[(dowCnt++) % 7] + ''; + } + html += ''; + this.picker.find('.datetimepicker-days thead').append(html); + }, + + fillMonths: function () { + var html = ''; + var d = new Date(this.viewDate); + for (var i = 0; i < 12; i++) { + d.setUTCMonth(i); + var classes = this.onRenderMonth(d); + html += '' + dates[this.language].monthsShort[i] + ''; + } + this.picker.find('.datetimepicker-months td').html(html); + }, + + fill: function () { + if (!this.date || !this.viewDate) { + return; + } + var d = new Date(this.viewDate), + year = d.getUTCFullYear(), + month = d.getUTCMonth(), + dayMonth = d.getUTCDate(), + hours = d.getUTCHours(), + startYear = this.startDate.getUTCFullYear(), + startMonth = this.startDate.getUTCMonth(), + endYear = this.endDate.getUTCFullYear(), + endMonth = this.endDate.getUTCMonth() + 1, + currentDate = (new UTCDate(this.date.getUTCFullYear(), this.date.getUTCMonth(), this.date.getUTCDate())).valueOf(), + today = new Date(); + this.setTitle('.datetimepicker-days', dates[this.language].months[month] + ' ' + year) + if (this.formatViewType === 'time') { + var formatted = this.getFormattedDate(); + this.setTitle('.datetimepicker-hours', formatted); + this.setTitle('.datetimepicker-minutes', formatted); + } else { + this.setTitle('.datetimepicker-hours', dayMonth + ' ' + dates[this.language].months[month] + ' ' + year); + this.setTitle('.datetimepicker-minutes', dayMonth + ' ' + dates[this.language].months[month] + ' ' + year); + } + this.picker.find('tfoot th.today') + .text(dates[this.language].today || dates['en'].today) + .toggle(this.todayBtn !== false); + this.picker.find('tfoot th.clear') + .text(dates[this.language].clear || dates['en'].clear) + .toggle(this.clearBtn !== false); + this.updateNavArrows(); + this.fillMonths(); + var prevMonth = UTCDate(year, month - 1, 28, 0, 0, 0, 0), + day = DPGlobal.getDaysInMonth(prevMonth.getUTCFullYear(), prevMonth.getUTCMonth()); + prevMonth.setUTCDate(day); + prevMonth.setUTCDate(day - (prevMonth.getUTCDay() - this.weekStart + 7) % 7); + var nextMonth = new Date(prevMonth); + nextMonth.setUTCDate(nextMonth.getUTCDate() + 42); + nextMonth = nextMonth.valueOf(); + var html = []; + var classes; + while (prevMonth.valueOf() < nextMonth) { + if (prevMonth.getUTCDay() === this.weekStart) { + html.push(''); + } + classes = this.onRenderDay(prevMonth); + if (prevMonth.getUTCFullYear() < year || (prevMonth.getUTCFullYear() === year && prevMonth.getUTCMonth() < month)) { + classes.push('old'); + } else if (prevMonth.getUTCFullYear() > year || (prevMonth.getUTCFullYear() === year && prevMonth.getUTCMonth() > month)) { + classes.push('new'); + } + // Compare internal UTC date with local today, not UTC today + if (this.todayHighlight && + prevMonth.getUTCFullYear() === today.getFullYear() && + prevMonth.getUTCMonth() === today.getMonth() && + prevMonth.getUTCDate() === today.getDate()) { + classes.push('today'); + } + if (prevMonth.valueOf() === currentDate) { + classes.push('active'); + } + if ((prevMonth.valueOf() + 86400000) <= this.startDate || prevMonth.valueOf() > this.endDate || + $.inArray(prevMonth.getUTCDay(), this.daysOfWeekDisabled) !== -1 || + $.inArray(prevMonth.toDateString(), this.datesDisabled) !== -1) { + classes.push('disabled'); + } + html.push('' + prevMonth.getUTCDate() + ''); + if (prevMonth.getUTCDay() === this.weekEnd) { + html.push(''); + } + prevMonth.setUTCDate(prevMonth.getUTCDate() + 1); + } + this.picker.find('.datetimepicker-days tbody').empty().append(html.join('')); + + html = []; + var txt = '', meridian = '', meridianOld = ''; + var hoursDisabled = this.hoursDisabled || []; + d = new Date(this.viewDate) + for (var i = 0; i < 24; i++) { + d.setUTCHours(i); + classes = this.onRenderHour(d); + if (hoursDisabled.indexOf(i) !== -1) { + classes.push('disabled'); + } + var actual = UTCDate(year, month, dayMonth, i); + // We want the previous hour for the startDate + if ((actual.valueOf() + 3600000) <= this.startDate || actual.valueOf() > this.endDate) { + classes.push('disabled'); + } else if (hours === i) { + classes.push('active'); + } + if (this.showMeridian && dates[this.language].meridiem.length === 2) { + meridian = (i < 12 ? dates[this.language].meridiem[0] : dates[this.language].meridiem[1]); + if (meridian !== meridianOld) { + if (meridianOld !== '') { + html.push(''); + } + html.push('
    ' + meridian.toUpperCase() + ''); + } + meridianOld = meridian; + txt = (i % 12 ? i % 12 : 12); + if (i < 12) { + classes.push('hour_am'); + } else { + classes.push('hour_pm'); + } + html.push('' + txt + ''); + if (i === 23) { + html.push('
    '); + } + } else { + txt = i + ':00'; + html.push('' + txt + ''); + } + } + this.picker.find('.datetimepicker-hours td').html(html.join('')); + + html = []; + txt = ''; + meridian = ''; + meridianOld = ''; + var minutesDisabled = this.minutesDisabled || []; + d = new Date(this.viewDate); + for (var i = 0; i < 60; i += this.minuteStep) { + if (minutesDisabled.indexOf(i) !== -1) continue; + d.setUTCMinutes(i); + d.setUTCSeconds(0); + classes = this.onRenderMinute(d); + if (this.showMeridian && dates[this.language].meridiem.length === 2) { + meridian = (hours < 12 ? dates[this.language].meridiem[0] : dates[this.language].meridiem[1]); + if (meridian !== meridianOld) { + if (meridianOld !== '') { + html.push(''); + } + html.push('
    ' + meridian.toUpperCase() + ''); + } + meridianOld = meridian; + txt = (hours % 12 ? hours % 12 : 12); + html.push('' + txt + ':' + (i < 10 ? '0' + i : i) + ''); + if (i === 59) { + html.push('
    '); + } + } else { + txt = i + ':00'; + html.push('' + hours + ':' + (i < 10 ? '0' + i : i) + ''); + } + } + this.picker.find('.datetimepicker-minutes td').html(html.join('')); + + var currentYear = this.date.getUTCFullYear(); + var months = this.setTitle('.datetimepicker-months', year) + .end() + .find('.month').removeClass('active'); + if (currentYear === year) { + // getUTCMonths() returns 0 based, and we need to select the next one + // To cater bootstrap 2 we don't need to select the next one + months.eq(this.date.getUTCMonth()).addClass('active'); + } + if (year < startYear || year > endYear) { + months.addClass('disabled'); + } + if (year === startYear) { + months.slice(0, startMonth).addClass('disabled'); + } + if (year === endYear) { + months.slice(endMonth).addClass('disabled'); + } + + html = ''; + year = parseInt(year / 10, 10) * 10; + var yearCont = this.setTitle('.datetimepicker-years', year + '-' + (year + 9)) + .end() + .find('td'); + year -= 1; + d = new Date(this.viewDate); + for (var i = -1; i < 11; i++) { + d.setUTCFullYear(year); + classes = this.onRenderYear(d); + if (i === -1 || i === 10) { + classes.push(old); + } + html += '' + year + ''; + year += 1; + } + yearCont.html(html); + this.place(); + }, + + updateNavArrows: function () { + var d = new Date(this.viewDate), + year = d.getUTCFullYear(), + month = d.getUTCMonth(), + day = d.getUTCDate(), + hour = d.getUTCHours(); + switch (this.viewMode) { + case 0: + if (year <= this.startDate.getUTCFullYear() + && month <= this.startDate.getUTCMonth() + && day <= this.startDate.getUTCDate() + && hour <= this.startDate.getUTCHours()) { + this.picker.find('.prev').css({visibility: 'hidden'}); + } else { + this.picker.find('.prev').css({visibility: 'visible'}); + } + if (year >= this.endDate.getUTCFullYear() + && month >= this.endDate.getUTCMonth() + && day >= this.endDate.getUTCDate() + && hour >= this.endDate.getUTCHours()) { + this.picker.find('.next').css({visibility: 'hidden'}); + } else { + this.picker.find('.next').css({visibility: 'visible'}); + } + break; + case 1: + if (year <= this.startDate.getUTCFullYear() + && month <= this.startDate.getUTCMonth() + && day <= this.startDate.getUTCDate()) { + this.picker.find('.prev').css({visibility: 'hidden'}); + } else { + this.picker.find('.prev').css({visibility: 'visible'}); + } + if (year >= this.endDate.getUTCFullYear() + && month >= this.endDate.getUTCMonth() + && day >= this.endDate.getUTCDate()) { + this.picker.find('.next').css({visibility: 'hidden'}); + } else { + this.picker.find('.next').css({visibility: 'visible'}); + } + break; + case 2: + if (year <= this.startDate.getUTCFullYear() + && month <= this.startDate.getUTCMonth()) { + this.picker.find('.prev').css({visibility: 'hidden'}); + } else { + this.picker.find('.prev').css({visibility: 'visible'}); + } + if (year >= this.endDate.getUTCFullYear() + && month >= this.endDate.getUTCMonth()) { + this.picker.find('.next').css({visibility: 'hidden'}); + } else { + this.picker.find('.next').css({visibility: 'visible'}); + } + break; + case 3: + case 4: + if (year <= this.startDate.getUTCFullYear()) { + this.picker.find('.prev').css({visibility: 'hidden'}); + } else { + this.picker.find('.prev').css({visibility: 'visible'}); + } + if (year >= this.endDate.getUTCFullYear()) { + this.picker.find('.next').css({visibility: 'hidden'}); + } else { + this.picker.find('.next').css({visibility: 'visible'}); + } + break; + } + }, + + mousewheel: function (e) { + + e.preventDefault(); + e.stopPropagation(); + + if (this.wheelPause) { + return; + } + + this.wheelPause = true; + + var originalEvent = e.originalEvent; + + var delta = originalEvent.wheelDelta; + + var mode = delta > 0 ? 1 : (delta === 0) ? 0 : -1; + + if (this.wheelViewModeNavigationInverseDirection) { + mode = -mode; + } + + this.showMode(mode); + + setTimeout($.proxy(function () { + + this.wheelPause = false + + }, this), this.wheelViewModeNavigationDelay); + + }, + + click: function (e) { + e.stopPropagation(); + e.preventDefault(); + var target = $(e.target).closest('span, td, th, legend'); + if (target.is('.' + this.icontype)) { + target = $(target).parent().closest('span, td, th, legend'); + } + if (target.length === 1) { + if (target.is('.disabled')) { + this.element.trigger({ + type: 'outOfRange', + date: this.viewDate, + startDate: this.startDate, + endDate: this.endDate + }); + return; + } + switch (target[0].nodeName.toLowerCase()) { + case 'th': + switch (target[0].className) { + case 'switch': + this.showMode(1); + break; + case 'prev': + case 'next': + var dir = DPGlobal.modes[this.viewMode].navStep * (target[0].className === 'prev' ? -1 : 1); + switch (this.viewMode) { + case 0: + this.viewDate = this.moveHour(this.viewDate, dir); + break; + case 1: + this.viewDate = this.moveDate(this.viewDate, dir); + break; + case 2: + this.viewDate = this.moveMonth(this.viewDate, dir); + break; + case 3: + case 4: + this.viewDate = this.moveYear(this.viewDate, dir); + break; + } + this.fill(); + this.element.trigger({ + type: target[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 date = new Date(); + date = UTCDate(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds(), 0); + + // Respect startDate and endDate. + if (date < this.startDate) date = this.startDate; + else if (date > this.endDate) date = this.endDate; + + this.viewMode = this.startViewMode; + this.showMode(0); + this._setDate(date); + this.fill(); + if (this.autoclose) { + this.hide(); + } + break; + } + break; + case 'span': + if (!target.is('.disabled')) { + var year = this.viewDate.getUTCFullYear(), + month = this.viewDate.getUTCMonth(), + day = this.viewDate.getUTCDate(), + hours = this.viewDate.getUTCHours(), + minutes = this.viewDate.getUTCMinutes(), + seconds = this.viewDate.getUTCSeconds(); + + if (target.is('.month')) { + this.viewDate.setUTCDate(1); + month = target.parent().find('span').index(target); + day = this.viewDate.getUTCDate(); + this.viewDate.setUTCMonth(month); + this.element.trigger({ + type: 'changeMonth', + date: this.viewDate + }); + if (this.viewSelect >= 3) { + this._setDate(UTCDate(year, month, day, hours, minutes, seconds, 0)); + } + } else if (target.is('.year')) { + this.viewDate.setUTCDate(1); + year = parseInt(target.text(), 10) || 0; + this.viewDate.setUTCFullYear(year); + this.element.trigger({ + type: 'changeYear', + date: this.viewDate + }); + if (this.viewSelect >= 4) { + this._setDate(UTCDate(year, month, day, hours, minutes, seconds, 0)); + } + } else if (target.is('.hour')) { + hours = parseInt(target.text(), 10) || 0; + if (target.hasClass('hour_am') || target.hasClass('hour_pm')) { + if (hours === 12 && target.hasClass('hour_am')) { + hours = 0; + } else if (hours !== 12 && target.hasClass('hour_pm')) { + hours += 12; + } + } + this.viewDate.setUTCHours(hours); + this.element.trigger({ + type: 'changeHour', + date: this.viewDate + }); + if (this.viewSelect >= 1) { + this._setDate(UTCDate(year, month, day, hours, minutes, seconds, 0)); + } + } else if (target.is('.minute')) { + minutes = parseInt(target.text().substr(target.text().indexOf(':') + 1), 10) || 0; + this.viewDate.setUTCMinutes(minutes); + this.element.trigger({ + type: 'changeMinute', + date: this.viewDate + }); + if (this.viewSelect >= 0) { + this._setDate(UTCDate(year, month, day, hours, minutes, seconds, 0)); + } + } + if (this.viewMode !== 0) { + var oldViewMode = this.viewMode; + this.showMode(-1); + this.fill(); + if (oldViewMode === this.viewMode && this.autoclose) { + this.hide(); + } + } else { + this.fill(); + if (this.autoclose) { + this.hide(); + } + } + } + break; + case 'td': + if (target.is('.day') && !target.is('.disabled')) { + var day = parseInt(target.text(), 10) || 1; + var year = this.viewDate.getUTCFullYear(), + month = this.viewDate.getUTCMonth(), + hours = this.viewDate.getUTCHours(), + minutes = this.viewDate.getUTCMinutes(), + seconds = this.viewDate.getUTCSeconds(); + if (target.is('.old')) { + if (month === 0) { + month = 11; + year -= 1; + } else { + month -= 1; + } + } else if (target.is('.new')) { + if (month === 11) { + month = 0; + year += 1; + } else { + month += 1; + } + } + this.viewDate.setUTCFullYear(year); + this.viewDate.setUTCMonth(month, day); + this.element.trigger({ + type: 'changeDay', + date: this.viewDate + }); + if (this.viewSelect >= 2) { + this._setDate(UTCDate(year, month, day, hours, minutes, seconds, 0)); + } + } + var oldViewMode = this.viewMode; + this.showMode(-1); + this.fill(); + if (oldViewMode === this.viewMode && this.autoclose) { + this.hide(); + } + break; + } + } + }, + + _setDate: function (date, which) { + if (!which || which === 'date') + this.date = date; + if (!which || which === 'view') + this.viewDate = date; + this.fill(); + this.setValue(); + var element; + if (this.isInput) { + element = this.element; + } else if (this.component) { + element = this.element.find('input'); + } + if (element) { + element.change(); + } + this.element.trigger({ + type: 'changeDate', + date: this.getDate() + }); + if(date === null) + this.date = this.viewDate; + }, + + moveMinute: function (date, dir) { + if (!dir) return date; + var new_date = new Date(date.valueOf()); + //dir = dir > 0 ? 1 : -1; + new_date.setUTCMinutes(new_date.getUTCMinutes() + (dir * this.minuteStep)); + return new_date; + }, + + moveHour: function (date, dir) { + if (!dir) return date; + var new_date = new Date(date.valueOf()); + //dir = dir > 0 ? 1 : -1; + new_date.setUTCHours(new_date.getUTCHours() + dir); + return new_date; + }, + + moveDate: function (date, dir) { + if (!dir) return date; + var new_date = new Date(date.valueOf()); + //dir = dir > 0 ? 1 : -1; + new_date.setUTCDate(new_date.getUTCDate() + dir); + return new_date; + }, + + moveMonth: function (date, dir) { + if (!dir) return date; + var new_date = new Date(date.valueOf()), + day = new_date.getUTCDate(), + month = new_date.getUTCMonth(), + mag = Math.abs(dir), + new_month, test; + dir = dir > 0 ? 1 : -1; + if (mag === 1) { + test = dir === -1 + // If going back one month, make sure month is not current month + // (eg, Mar 31 -> Feb 31 === Feb 28, not Mar 02) + ? function () { + return new_date.getUTCMonth() === month; + } + // If going forward one month, make sure month is as expected + // (eg, Jan 31 -> Feb 31 === Feb 28, not Mar 02) + : function () { + return new_date.getUTCMonth() !== new_month; + }; + new_month = month + dir; + new_date.setUTCMonth(new_month); + // Dec -> Jan (12) or Jan -> Dec (-1) -- limit expected date to 0-11 + if (new_month < 0 || new_month > 11) + new_month = (new_month + 12) % 12; + } else { + // For magnitudes >1, move one month at a time... + for (var i = 0; i < mag; i++) + // ...which might decrease the day (eg, Jan 31 to Feb 28, etc)... + new_date = this.moveMonth(new_date, dir); + // ...then reset the day, keeping it in the new month + new_month = new_date.getUTCMonth(); + new_date.setUTCDate(day); + test = function () { + return new_month !== new_date.getUTCMonth(); + }; + } + // Common date-resetting loop -- if date is beyond end of month, make it + // end of month + while (test()) { + new_date.setUTCDate(--day); + new_date.setUTCMonth(new_month); + } + return new_date; + }, + + moveYear: function (date, dir) { + return this.moveMonth(date, dir * 12); + }, + + dateWithinRange: function (date) { + return date >= this.startDate && date <= this.endDate; + }, + + keydown: function (e) { + if (this.picker.is(':not(:visible)')) { + if (e.keyCode === 27) // allow escape to hide and re-show picker + this.show(); + return; + } + var dateChanged = false, + dir, newDate, newViewDate; + switch (e.keyCode) { + case 27: // escape + this.hide(); + e.preventDefault(); + break; + case 37: // left + case 39: // right + if (!this.keyboardNavigation) break; + dir = e.keyCode === 37 ? -1 : 1; + var viewMode = this.viewMode; + if (e.ctrlKey) { + viewMode += 2; + } else if (e.shiftKey) { + viewMode += 1; + } + if (viewMode === 4) { + newDate = this.moveYear(this.date, dir); + newViewDate = this.moveYear(this.viewDate, dir); + } else if (viewMode === 3) { + newDate = this.moveMonth(this.date, dir); + newViewDate = this.moveMonth(this.viewDate, dir); + } else if (viewMode === 2) { + newDate = this.moveDate(this.date, dir); + newViewDate = this.moveDate(this.viewDate, dir); + } else if (viewMode === 1) { + newDate = this.moveHour(this.date, dir); + newViewDate = this.moveHour(this.viewDate, dir); + } else if (viewMode === 0) { + newDate = this.moveMinute(this.date, dir); + newViewDate = this.moveMinute(this.viewDate, dir); + } + if (this.dateWithinRange(newDate)) { + this.date = newDate; + this.viewDate = newViewDate; + this.setValue(); + this.update(); + e.preventDefault(); + dateChanged = true; + } + break; + case 38: // up + case 40: // down + if (!this.keyboardNavigation) break; + dir = e.keyCode === 38 ? -1 : 1; + viewMode = this.viewMode; + if (e.ctrlKey) { + viewMode += 2; + } else if (e.shiftKey) { + viewMode += 1; + } + if (viewMode === 4) { + newDate = this.moveYear(this.date, dir); + newViewDate = this.moveYear(this.viewDate, dir); + } else if (viewMode === 3) { + newDate = this.moveMonth(this.date, dir); + newViewDate = this.moveMonth(this.viewDate, dir); + } else if (viewMode === 2) { + newDate = this.moveDate(this.date, dir * 7); + newViewDate = this.moveDate(this.viewDate, dir * 7); + } else if (viewMode === 1) { + if (this.showMeridian) { + newDate = this.moveHour(this.date, dir * 6); + newViewDate = this.moveHour(this.viewDate, dir * 6); + } else { + newDate = this.moveHour(this.date, dir * 4); + newViewDate = this.moveHour(this.viewDate, dir * 4); + } + } else if (viewMode === 0) { + newDate = this.moveMinute(this.date, dir * 4); + newViewDate = this.moveMinute(this.viewDate, dir * 4); + } + if (this.dateWithinRange(newDate)) { + this.date = newDate; + this.viewDate = newViewDate; + this.setValue(); + this.update(); + e.preventDefault(); + dateChanged = true; + } + break; + case 13: // enter + if (this.viewMode !== 0) { + var oldViewMode = this.viewMode; + this.showMode(-1); + this.fill(); + if (oldViewMode === this.viewMode && this.autoclose) { + this.hide(); + } + } else { + this.fill(); + if (this.autoclose) { + this.hide(); + } + } + e.preventDefault(); + break; + case 9: // tab + this.hide(); + break; + } + if (dateChanged) { + var element; + if (this.isInput) { + element = this.element; + } else if (this.component) { + element = this.element.find('input'); + } + if (element) { + element.change(); + } + this.element.trigger({ + type: 'changeDate', + date: this.getDate() + }); + } + }, + + showMode: function (dir) { + if (dir) { + var newViewMode = Math.max(0, Math.min(DPGlobal.modes.length - 1, this.viewMode + dir)); + if (newViewMode >= this.minView && newViewMode <= this.maxView) { + this.element.trigger({ + type: 'changeMode', + date: this.viewDate, + oldViewMode: this.viewMode, + newViewMode: newViewMode + }); + + this.viewMode = newViewMode; + } + } + /* + vitalets: fixing bug of very special conditions: + jquery 1.7.1 + webkit + show inline datetimepicker in bootstrap popover. + Method show() does not set display css correctly and datetimepicker is not shown. + Changed to .css('display', 'block') solve the problem. + See https://github.com/vitalets/x-editable/issues/37 + + In jquery 1.7.2+ everything works fine. + */ + //this.picker.find('>div').hide().filter('.datetimepicker-'+DPGlobal.modes[this.viewMode].clsName).show(); + this.picker.find('>div').hide().filter('.datetimepicker-' + DPGlobal.modes[this.viewMode].clsName).css('display', 'block'); + this.updateNavArrows(); + }, + + reset: function () { + this._setDate(null, 'date'); + }, + + convertViewModeText: function (viewMode) { + switch (viewMode) { + case 4: + return 'decade'; + case 3: + return 'year'; + case 2: + return 'month'; + case 1: + return 'day'; + case 0: + return 'hour'; + } + } + }; + + var old = $.fn.datetimepicker; + $.fn.datetimepicker = function (option) { + var args = Array.apply(null, arguments); + args.shift(); + var internal_return; + this.each(function () { + var $this = $(this), + data = $this.data('datetimepicker'), + options = typeof option === 'object' && option; + if (!data) { + $this.data('datetimepicker', (data = new Datetimepicker(this, $.extend({}, $.fn.datetimepicker.defaults, options)))); + } + if (typeof option === 'string' && typeof data[option] === 'function') { + internal_return = data[option].apply(data, args); + if (internal_return !== undefined) { + return false; + } + } + }); + if (internal_return !== undefined) + return internal_return; + else + return this; + }; + + $.fn.datetimepicker.defaults = { + }; + $.fn.datetimepicker.Constructor = Datetimepicker; + var dates = $.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 DPGlobal = { + 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 (year) { + return (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0)) + }, + getDaysInMonth: function (year, month) { + return [31, (DPGlobal.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month] + }, + getDefaultFormat: function (type, field) { + if (type === 'standard') { + if (field === 'input') + return 'yyyy-mm-dd hh:ii'; + else + return 'yyyy-mm-dd hh:ii:ss'; + } else if (type === 'php') { + if (field === 'input') + return 'Y-m-d H:i'; + else + return 'Y-m-d H:i:s'; + } else { + throw new Error('Invalid format type.'); + } + }, + validParts: function (type) { + if (type === 'standard') { + return /t|hh?|HH?|p|P|z|Z|ii?|ss?|dd?|DD?|mm?|MM?|yy(?:yy)?/g; + } else if (type === 'php') { + return /[dDjlNwzFmMnStyYaABgGhHis]/g; + } else { + throw new Error('Invalid format type.'); + } + }, + nonpunctuation: /[^ -\/:-@\[-`{-~\t\n\rTZ]+/g, + parseFormat: function (format, type) { + // IE treats \0 as a string end in inputs (truncating the value), + // so it's a bad format delimiter, anyway + var separators = format.replace(this.validParts(type), '\0').split('\0'), + parts = format.match(this.validParts(type)); + if (!separators || !separators.length || !parts || parts.length === 0) { + throw new Error('Invalid date format.'); + } + return {separators: separators, parts: parts}; + }, + parseDate: function (date, format, language, type, timezone) { + if (date instanceof Date) { + var dateUTC = new Date(date.valueOf() - date.getTimezoneOffset() * 60000); + dateUTC.setMilliseconds(0); + return dateUTC; + } + if (/^\d{4}\-\d{1,2}\-\d{1,2}$/.test(date)) { + format = this.parseFormat('yyyy-mm-dd', type); + } + if (/^\d{4}\-\d{1,2}\-\d{1,2}[T ]\d{1,2}\:\d{1,2}$/.test(date)) { + format = this.parseFormat('yyyy-mm-dd hh:ii', type); + } + if (/^\d{4}\-\d{1,2}\-\d{1,2}[T ]\d{1,2}\:\d{1,2}\:\d{1,2}[Z]{0,1}$/.test(date)) { + format = this.parseFormat('yyyy-mm-dd hh:ii:ss', type); + } + if (/^[-+]\d+[dmwy]([\s,]+[-+]\d+[dmwy])*$/.test(date)) { + var part_re = /([-+]\d+)([dmwy])/, + parts = date.match(/([-+]\d+)([dmwy])/g), + part, dir; + date = new Date(); + for (var i = 0; i < parts.length; i++) { + part = part_re.exec(parts[i]); + dir = parseInt(part[1]); + switch (part[2]) { + case 'd': + date.setUTCDate(date.getUTCDate() + dir); + break; + case 'm': + date = Datetimepicker.prototype.moveMonth.call(Datetimepicker.prototype, date, dir); + break; + case 'w': + date.setUTCDate(date.getUTCDate() + dir * 7); + break; + case 'y': + date = Datetimepicker.prototype.moveYear.call(Datetimepicker.prototype, date, dir); + break; + } + } + return UTCDate(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds(), 0); + } + var parts = date && date.toString().match(this.nonpunctuation) || [], + date = new Date(0, 0, 0, 0, 0, 0, 0), + parsed = {}, + setters_order = ['hh', 'h', 'ii', 'i', 'ss', 's', 'yyyy', 'yy', 'M', 'MM', 'm', 'mm', 'D', 'DD', 'd', 'dd', 'H', 'HH', 'p', 'P', 'z', 'Z'], + setters_map = { + hh: function (d, v) { + return d.setUTCHours(v); + }, + h: function (d, v) { + return d.setUTCHours(v); + }, + HH: function (d, v) { + return d.setUTCHours(v === 12 ? 0 : v); + }, + H: function (d, v) { + return d.setUTCHours(v === 12 ? 0 : v); + }, + ii: function (d, v) { + return d.setUTCMinutes(v); + }, + i: function (d, v) { + return d.setUTCMinutes(v); + }, + ss: function (d, v) { + return d.setUTCSeconds(v); + }, + s: function (d, v) { + return d.setUTCSeconds(v); + }, + yyyy: function (d, v) { + return d.setUTCFullYear(v); + }, + yy: function (d, v) { + return d.setUTCFullYear(2000 + v); + }, + m: function (d, v) { + v -= 1; + while (v < 0) v += 12; + v %= 12; + d.setUTCMonth(v); + while (d.getUTCMonth() !== v) + if (isNaN(d.getUTCMonth())) + return d; + else + d.setUTCDate(d.getUTCDate() - 1); + return d; + }, + d: function (d, v) { + return d.setUTCDate(v); + }, + p: function (d, v) { + return d.setUTCHours(v === 1 ? d.getUTCHours() + 12 : d.getUTCHours()); + }, + z: function () { + return timezone + } + }, + val, filtered, part; + setters_map['M'] = setters_map['MM'] = setters_map['mm'] = setters_map['m']; + setters_map['dd'] = setters_map['d']; + setters_map['P'] = setters_map['p']; + setters_map['Z'] = setters_map['z']; + date = UTCDate(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds()); + if (parts.length === format.parts.length) { + for (var i = 0, cnt = format.parts.length; i < cnt; i++) { + val = parseInt(parts[i], 10); + part = format.parts[i]; + if (isNaN(val)) { + switch (part) { + case 'MM': + filtered = $(dates[language].months).filter(function () { + var m = this.slice(0, parts[i].length), + p = parts[i].slice(0, m.length); + return m === p; + }); + val = $.inArray(filtered[0], dates[language].months) + 1; + break; + case 'M': + filtered = $(dates[language].monthsShort).filter(function () { + var m = this.slice(0, parts[i].length), + p = parts[i].slice(0, m.length); + return m.toLowerCase() === p.toLowerCase(); + }); + val = $.inArray(filtered[0], dates[language].monthsShort) + 1; + break; + case 'p': + case 'P': + val = $.inArray(parts[i].toLowerCase(), dates[language].meridiem); + break; + case 'z': + case 'Z': + timezone; + break; + + } + } + parsed[part] = val; + } + for (var i = 0, s; i < setters_order.length; i++) { + s = setters_order[i]; + if (s in parsed && !isNaN(parsed[s])) + setters_map[s](date, parsed[s]) + } + } + return date; + }, + formatDate: function (date, format, language, type, timezone) { + if (date === null) { + return ''; + } + var val; + if (type === 'standard') { + val = { + t: date.getTime(), + // year + yy: date.getUTCFullYear().toString().substring(2), + yyyy: date.getUTCFullYear(), + // month + m: date.getUTCMonth() + 1, + M: dates[language].monthsShort[date.getUTCMonth()], + MM: dates[language].months[date.getUTCMonth()], + // day + d: date.getUTCDate(), + D: dates[language].daysShort[date.getUTCDay()], + DD: dates[language].days[date.getUTCDay()], + p: (dates[language].meridiem.length === 2 ? dates[language].meridiem[date.getUTCHours() < 12 ? 0 : 1] : ''), + // hour + h: date.getUTCHours(), + // minute + i: date.getUTCMinutes(), + // second + s: date.getUTCSeconds(), + // timezone + z: timezone + }; + + if (dates[language].meridiem.length === 2) { + val.H = (val.h % 12 === 0 ? 12 : val.h % 12); + } + else { + val.H = val.h; + } + val.HH = (val.H < 10 ? '0' : '') + val.H; + val.P = val.p.toUpperCase(); + val.Z = val.z; + val.hh = (val.h < 10 ? '0' : '') + val.h; + val.ii = (val.i < 10 ? '0' : '') + val.i; + val.ss = (val.s < 10 ? '0' : '') + val.s; + val.dd = (val.d < 10 ? '0' : '') + val.d; + val.mm = (val.m < 10 ? '0' : '') + val.m; + } else if (type === 'php') { + // php format + val = { + // year + y: date.getUTCFullYear().toString().substring(2), + Y: date.getUTCFullYear(), + // month + F: dates[language].months[date.getUTCMonth()], + M: dates[language].monthsShort[date.getUTCMonth()], + n: date.getUTCMonth() + 1, + t: DPGlobal.getDaysInMonth(date.getUTCFullYear(), date.getUTCMonth()), + // day + j: date.getUTCDate(), + l: dates[language].days[date.getUTCDay()], + D: dates[language].daysShort[date.getUTCDay()], + w: date.getUTCDay(), // 0 -> 6 + N: (date.getUTCDay() === 0 ? 7 : date.getUTCDay()), // 1 -> 7 + S: (date.getUTCDate() % 10 <= dates[language].suffix.length ? dates[language].suffix[date.getUTCDate() % 10 - 1] : ''), + // hour + a: (dates[language].meridiem.length === 2 ? dates[language].meridiem[date.getUTCHours() < 12 ? 0 : 1] : ''), + g: (date.getUTCHours() % 12 === 0 ? 12 : date.getUTCHours() % 12), + G: date.getUTCHours(), + // minute + i: date.getUTCMinutes(), + // second + s: date.getUTCSeconds() + }; + val.m = (val.n < 10 ? '0' : '') + val.n; + val.d = (val.j < 10 ? '0' : '') + val.j; + val.A = val.a.toString().toUpperCase(); + val.h = (val.g < 10 ? '0' : '') + val.g; + val.H = (val.G < 10 ? '0' : '') + val.G; + val.i = (val.i < 10 ? '0' : '') + val.i; + val.s = (val.s < 10 ? '0' : '') + val.s; + } else { + throw new Error('Invalid format type.'); + } + var date = [], + seps = $.extend([], format.separators); + for (var i = 0, cnt = format.parts.length; i < cnt; i++) { + if (seps.length) { + date.push(seps.shift()); + } + date.push(val[format.parts[i]]); + } + if (seps.length) { + date.push(seps.shift()); + } + return date.join(''); + }, + convertViewMode: function (viewMode) { + switch (viewMode) { + case 4: + case 'decade': + viewMode = 4; + break; + case 3: + case 'year': + viewMode = 3; + break; + case 2: + case 'month': + viewMode = 2; + break; + case 1: + case 'day': + viewMode = 1; + break; + case 0: + case 'hour': + viewMode = 0; + break; + } + + return viewMode; + }, + headTemplate: '' + + '' + + '' + + '' + + '' + + '' + + '', + headTemplateV3: '' + + '' + + ' ' + + '' + + ' ' + + '' + + '', + contTemplate: '', + footTemplate: '' + + '' + + '' + + '' + }; + DPGlobal.template = '
    ' + + '
    ' + + '' + + DPGlobal.headTemplate + + DPGlobal.contTemplate + + DPGlobal.footTemplate + + '
    ' + + '
    ' + + '
    ' + + '' + + DPGlobal.headTemplate + + DPGlobal.contTemplate + + DPGlobal.footTemplate + + '
    ' + + '
    ' + + '
    ' + + '' + + DPGlobal.headTemplate + + '' + + DPGlobal.footTemplate + + '
    ' + + '
    ' + + '
    ' + + '' + + DPGlobal.headTemplate + + DPGlobal.contTemplate + + DPGlobal.footTemplate + + '
    ' + + '
    ' + + '
    ' + + '' + + DPGlobal.headTemplate + + DPGlobal.contTemplate + + DPGlobal.footTemplate + + '
    ' + + '
    ' + + '
    '; + DPGlobal.templateV3 = '
    ' + + '
    ' + + '' + + DPGlobal.headTemplateV3 + + DPGlobal.contTemplate + + DPGlobal.footTemplate + + '
    ' + + '
    ' + + '
    ' + + '' + + DPGlobal.headTemplateV3 + + DPGlobal.contTemplate + + DPGlobal.footTemplate + + '
    ' + + '
    ' + + '
    ' + + '' + + DPGlobal.headTemplateV3 + + '' + + DPGlobal.footTemplate + + '
    ' + + '
    ' + + '
    ' + + '' + + DPGlobal.headTemplateV3 + + DPGlobal.contTemplate + + DPGlobal.footTemplate + + '
    ' + + '
    ' + + '
    ' + + '' + + DPGlobal.headTemplateV3 + + DPGlobal.contTemplate + + DPGlobal.footTemplate + + '
    ' + + '
    ' + + '
    '; + $.fn.datetimepicker.DPGlobal = DPGlobal; + + /* DATETIMEPICKER NO CONFLICT + * =================== */ + + $.fn.datetimepicker.noConflict = function () { + $.fn.datetimepicker = old; + return this; + }; + + /* DATETIMEPICKER DATA-API + * ================== */ + + $(document).on( + 'focus.datetimepicker.data-api click.datetimepicker.data-api', + '[data-provide="datetimepicker"]', + function (e) { + var $this = $(this); + if ($this.data('datetimepicker')) return; + e.preventDefault(); + // component click requires us to explicitly show it + $this.datetimepicker('show'); + } + ); + $(function () { + $('[data-provide="datetimepicker-inline"]').datetimepicker(); + }); + +})); diff --git a/generator-web/target/classes/static/vendor/bootstrap/js/bootstrap-datetimepicker.zh-CN.js b/generator-web/target/classes/static/vendor/bootstrap/js/bootstrap-datetimepicker.zh-CN.js new file mode 100755 index 0000000..418fb30 --- /dev/null +++ b/generator-web/target/classes/static/vendor/bootstrap/js/bootstrap-datetimepicker.zh-CN.js @@ -0,0 +1,16 @@ +/** + * Simplified Chinese translation for bootstrap-datetimepicker + * Yuan Cheung + */ +;(function($){ + $.fn.datetimepicker.dates['zh-CN'] = { + days: ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"], + daysShort: ["周日", "周一", "周二", "周三", "周四", "周五", "周六", "周日"], + daysMin: ["日", "一", "二", "三", "四", "五", "六", "日"], + months: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"], + monthsShort: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"], + today: "今天", + suffix: [], + meridiem: ["上午", "下午"] + }; +}(jQuery)); diff --git a/generator-web/target/classes/static/vendor/bootstrap/js/bootstrap-paginator.js b/generator-web/target/classes/static/vendor/bootstrap/js/bootstrap-paginator.js new file mode 100644 index 0000000..4bd0cc8 --- /dev/null +++ b/generator-web/target/classes/static/vendor/bootstrap/js/bootstrap-paginator.js @@ -0,0 +1,659 @@ +/** + * bootstrap-paginator.js v0.5 + * -- + * Copyright 2013 Yun Lai + * -- + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +(function ($) { + + "use strict"; // jshint ;_; + + + /* Paginator PUBLIC CLASS DEFINITION + * ================================= */ + + /** + * Boostrap Paginator Constructor + * + * @param element element of the paginator + * @param options the options to config the paginator + * + * */ + var BootstrapPaginator = function (element, options) { + this.init(element, options); + }, + old = null; + + BootstrapPaginator.prototype = { + + /** + * Initialization function of the paginator, accepting an element and the options as parameters + * + * @param element element of the paginator + * @param options the options to config the paginator + * + * */ + init: function (element, options) { + + this.$element = $(element); + + var version = (options && options.bootstrapMajorVersion) ? options.bootstrapMajorVersion : $.fn.bootstrapPaginator.defaults.bootstrapMajorVersion, + id = this.$element.attr("id"); + + if (version === 2 && !this.$element.is("div")) { + + throw "in Bootstrap version 2 the pagination must be a div element. Or if you are using Bootstrap pagination 3. Please specify it in bootstrapMajorVersion in the option"; + } else if (version > 2 && !this.$element.is("ul")) { + throw "in Bootstrap version 3 the pagination root item must be an ul element." + } + + + + this.currentPage = 1; + + this.lastPage = 1; + + this.setOptions(options); + + this.initialized = true; + }, + + /** + * Update the properties of the paginator element + * + * @param options options to config the paginator + * */ + setOptions: function (options) { + + this.options = $.extend({}, (this.options || $.fn.bootstrapPaginator.defaults), options); + + this.totalPages = parseInt(this.options.totalPages, 10); //setup the total pages property. + this.numberOfPages = parseInt(this.options.numberOfPages, 10); //setup the numberOfPages to be shown + + //move the set current page after the setting of total pages. otherwise it will cause out of page exception. + if (options && typeof (options.currentPage) !== 'undefined') { + + this.setCurrentPage(options.currentPage); + } + + this.listen(); + + //render the paginator + this.render(); + + if (!this.initialized && this.lastPage !== this.currentPage) { + this.$element.trigger("page-changed", [this.lastPage, this.currentPage]); + } + + }, + + /** + * Sets up the events listeners. Currently the pageclicked and pagechanged events are linked if available. + * + * */ + listen: function () { + + this.$element.off("page-clicked"); + + this.$element.off("page-changed");// unload the events for the element + + if (typeof (this.options.onPageClicked) === "function") { + this.$element.bind("page-clicked", this.options.onPageClicked); + } + + if (typeof (this.options.onPageChanged) === "function") { + this.$element.on("page-changed", this.options.onPageChanged); + } + + this.$element.bind("page-clicked", this.onPageClicked); + }, + + + /** + * + * Destroys the paginator element, it unload the event first, then empty the content inside. + * + * */ + destroy: function () { + + this.$element.off("page-clicked"); + + this.$element.off("page-changed"); + + this.$element.removeData('bootstrapPaginator'); + + this.$element.empty(); + + }, + + /** + * Shows the page + * + * */ + show: function (page) { + + this.setCurrentPage(page); + + this.render(); + + if (this.lastPage !== this.currentPage) { + this.$element.trigger("page-changed", [this.lastPage, this.currentPage]); + } + }, + + /** + * Shows the next page + * + * */ + showNext: function () { + var pages = this.getPages(); + + if (pages.next) { + this.show(pages.next); + } + + }, + + /** + * Shows the previous page + * + * */ + showPrevious: function () { + var pages = this.getPages(); + + if (pages.prev) { + this.show(pages.prev); + } + + }, + + /** + * Shows the first page + * + * */ + showFirst: function () { + var pages = this.getPages(); + + if (pages.first) { + this.show(pages.first); + } + + }, + + /** + * Shows the last page + * + * */ + showLast: function () { + var pages = this.getPages(); + + if (pages.last) { + this.show(pages.last); + } + + }, + + /** + * Internal on page item click handler, when the page item is clicked, change the current page to the corresponding page and + * trigger the pageclick event for the listeners. + * + * + * */ + onPageItemClicked: function (event) { + + var type = event.data.type, + page = event.data.page; + + this.$element.trigger("page-clicked", [event, type, page]); + + }, + + onPageClicked: function (event, originalEvent, type, page) { + + //show the corresponding page and retrieve the newly built item related to the page clicked before for the event return + + var currentTarget = $(event.currentTarget); + + switch (type) { + case "first": + currentTarget.bootstrapPaginator("showFirst"); + break; + case "prev": + currentTarget.bootstrapPaginator("showPrevious"); + break; + case "next": + currentTarget.bootstrapPaginator("showNext"); + break; + case "last": + currentTarget.bootstrapPaginator("showLast"); + break; + case "page": + currentTarget.bootstrapPaginator("show", page); + break; + } + + }, + + /** + * Renders the paginator according to the internal properties and the settings. + * + * + * */ + render: function () { + + //fetch the container class and add them to the container + var containerClass = this.getValueFromOption(this.options.containerClass, this.$element), + size = this.options.size || "normal", + alignment = this.options.alignment || "left", + pages = this.getPages(), + listContainer = this.options.bootstrapMajorVersion === 2 ? $("
      ") : this.$element, + listContainerClass = this.options.bootstrapMajorVersion === 2 ? this.getValueFromOption(this.options.listContainerClass, listContainer) : null, + first = null, + prev = null, + next = null, + last = null, + p = null, + i = 0; + + + this.$element.prop("class", ""); + + this.$element.addClass("pagination"); + + switch (size.toLowerCase()) { + case "large": + case "small": + case "mini": + this.$element.addClass($.fn.bootstrapPaginator.sizeArray[this.options.bootstrapMajorVersion][size.toLowerCase()]); + break; + default: + break; + } + + if (this.options.bootstrapMajorVersion === 2) { + switch (alignment.toLowerCase()) { + case "center": + this.$element.addClass("pagination-centered"); + break; + case "right": + this.$element.addClass("pagination-right"); + break; + default: + break; + } + } + + + this.$element.addClass(containerClass); + + //empty the outter most container then add the listContainer inside. + this.$element.empty(); + + if (this.options.bootstrapMajorVersion === 2) { + this.$element.append(listContainer); + + listContainer.addClass(listContainerClass); + } + + //update the page element reference + this.pageRef = []; + + if (pages.first) {//if the there is first page element + first = this.buildPageItem("first", pages.first); + + if (first) { + listContainer.append(first); + } + + } + + if (pages.prev) {//if the there is previous page element + + prev = this.buildPageItem("prev", pages.prev); + + if (prev) { + listContainer.append(prev); + } + + } + + + for (i = 0; i < pages.length; i = i + 1) {//fill the numeric pages. + + p = this.buildPageItem("page", pages[i]); + + if (p) { + listContainer.append(p); + } + } + + if (pages.next) {//if there is next page + + next = this.buildPageItem("next", pages.next); + + if (next) { + listContainer.append(next); + } + } + + if (pages.last) {//if there is last page + + last = this.buildPageItem("last", pages.last); + + if (last) { + listContainer.append(last); + } + } + }, + + /** + * + * Creates a page item base on the type and page number given. + * + * @param page page number + * @param type type of the page, whether it is the first, prev, page, next, last + * + * @return Object the constructed page element + * */ + buildPageItem: function (type, page) { + + var itemContainer = $("
    • "),//creates the item container + itemContent = $(""),//creates the item content + text = "", + title = "", + itemContainerClass = this.options.itemContainerClass(type, page, this.currentPage), + itemContentClass = this.getValueFromOption(this.options.itemContentClass, type, page, this.currentPage), + tooltipOpts = null; + + + switch (type) { + + case "first": + if (!this.getValueFromOption(this.options.shouldShowPage, type, page, this.currentPage)) { return; } + text = this.options.itemTexts(type, page, this.currentPage); + title = this.options.tooltipTitles(type, page, this.currentPage); + break; + case "last": + if (!this.getValueFromOption(this.options.shouldShowPage, type, page, this.currentPage)) { return; } + text = this.options.itemTexts(type, page, this.currentPage); + title = this.options.tooltipTitles(type, page, this.currentPage); + break; + case "prev": + if (!this.getValueFromOption(this.options.shouldShowPage, type, page, this.currentPage)) { return; } + text = this.options.itemTexts(type, page, this.currentPage); + title = this.options.tooltipTitles(type, page, this.currentPage); + break; + case "next": + if (!this.getValueFromOption(this.options.shouldShowPage, type, page, this.currentPage)) { return; } + text = this.options.itemTexts(type, page, this.currentPage); + title = this.options.tooltipTitles(type, page, this.currentPage); + break; + case "page": + if (!this.getValueFromOption(this.options.shouldShowPage, type, page, this.currentPage)) { return; } + text = this.options.itemTexts(type, page, this.currentPage); + title = this.options.tooltipTitles(type, page, this.currentPage); + break; + } + + itemContainer.addClass(itemContainerClass).append(itemContent); + itemContainer.addClass("page-item"); + + itemContent.addClass(itemContentClass).html(text).on("click", null, {type: type, page: page}, $.proxy(this.onPageItemClicked, this)); + itemContent.addClass("page-link"); + + if (this.options.pageUrl) { + itemContent.attr("href", this.getValueFromOption(this.options.pageUrl, type, page, this.currentPage)); + } + + if (this.options.useBootstrapTooltip) { + tooltipOpts = $.extend({}, this.options.bootstrapTooltipOptions, {title: title}); + + itemContent.tooltip(tooltipOpts); + } else { + itemContent.attr("title", title); + } + + return itemContainer; + + }, + + setCurrentPage: function (page) { + if (page > this.totalPages || page < 1) {// if the current page is out of range, throw exception. + + throw "Page out of range"; + + } + + this.lastPage = this.currentPage; + + this.currentPage = parseInt(page, 10); + + }, + + /** + * Gets an array that represents the current status of the page object. Numeric pages can be access via array mode. length attributes describes how many numeric pages are there. First, previous, next and last page can be accessed via attributes first, prev, next and last. Current attribute marks the current page within the pages. + * + * @return object output objects that has first, prev, next, last and also the number of pages in between. + * */ + getPages: function () { + + var totalPages = this.totalPages,// get or calculate the total pages via the total records + pageStart = (this.currentPage % this.numberOfPages === 0) ? (parseInt(this.currentPage / this.numberOfPages, 10) - 1) * this.numberOfPages + 1 : parseInt(this.currentPage / this.numberOfPages, 10) * this.numberOfPages + 1,//calculates the start page. + output = [], + i = 0, + counter = 0; + + pageStart = pageStart < 1 ? 1 : pageStart;//check the range of the page start to see if its less than 1. + + for (i = pageStart, counter = 0; counter < this.numberOfPages && i <= totalPages; i = i + 1, counter = counter + 1) {//fill the pages + output.push(i); + } + + output.first = 1;//add the first when the current page leaves the 1st page. + + if (this.currentPage > 1) {// add the previous when the current page leaves the 1st page + output.prev = this.currentPage - 1; + } else { + output.prev = 1; + } + + if (this.currentPage < totalPages) {// add the next page when the current page doesn't reach the last page + output.next = this.currentPage + 1; + } else { + output.next = totalPages; + } + + output.last = totalPages;// add the last page when the current page doesn't reach the last page + + output.current = this.currentPage;//mark the current page. + + output.total = totalPages; + + output.numberOfPages = this.options.numberOfPages; + + return output; + + }, + + /** + * Gets the value from the options, this is made to handle the situation where value is the return value of a function. + * + * @return mixed value that depends on the type of parameters, if the given parameter is a function, then the evaluated result is returned. Otherwise the parameter itself will get returned. + * */ + getValueFromOption: function (value) { + + var output = null, + args = Array.prototype.slice.call(arguments, 1); + + if (typeof value === 'function') { + output = value.apply(this, args); + } else { + output = value; + } + + return output; + + } + + }; + + + /* TYPEAHEAD PLUGIN DEFINITION + * =========================== */ + + old = $.fn.bootstrapPaginator; + + $.fn.bootstrapPaginator = function (option) { + + var args = arguments, + result = null; + + $(this).each(function (index, item) { + var $this = $(item), + data = $this.data('bootstrapPaginator'), + options = (typeof option !== 'object') ? null : option; + + if (!data) { + data = new BootstrapPaginator(this, options); + + $this = $(data.$element); + + $this.data('bootstrapPaginator', data); + + return; + } + + if (typeof option === 'string') { + + if (data[option]) { + result = data[option].apply(data, Array.prototype.slice.call(args, 1)); + } else { + throw "Method " + option + " does not exist"; + } + + } else { + result = data.setOptions(option); + } + }); + + return result; + + }; + + $.fn.bootstrapPaginator.sizeArray = { + + "2": { + "large": "pagination-large", + "small": "pagination-small", + "mini": "pagination-mini" + }, + "3": { + "large": "pagination-lg", + "small": "pagination-sm", + "mini": "" + } + + }; + + $.fn.bootstrapPaginator.defaults = { + containerClass: "", + size: "normal", + alignment: "left", + bootstrapMajorVersion: 2, + listContainerClass: "", + itemContainerClass: function (type, page, current) { + return (page === current) ? "active" : ""; + }, + itemContentClass: function (type, page, current) { + return ""; + }, + currentPage: 1, + numberOfPages: 5, + totalPages: 1, + pageUrl: function (type, page, current) { + return null; + }, + onPageClicked: null, + onPageChanged: null, + useBootstrapTooltip: false, + shouldShowPage: function (type, page, current) { + + var result = true; + + switch (type) { + case "first": + result = (current !== 1); + break; + case "prev": + result = (current !== 1); + break; + case "next": + result = (current !== this.totalPages); + break; + case "last": + result = (current !== this.totalPages); + break; + case "page": + result = true; + break; + } + + return result; + + }, + itemTexts: function (type, page, current) { + switch (type) { + case "first": + return "<<"; + case "prev": + return "<"; + case "next": + return ">"; + case "last": + return ">>"; + case "page": + return page; + } + }, + tooltipTitles: function (type, page, current) { + + switch (type) { + case "first": + return "Go to first page"; + case "prev": + return "Go to previous page"; + case "next": + return "Go to next page"; + case "last": + return "Go to last page"; + case "page": + return (page === current) ? "Current page is " + page : "Go to page " + page; + } + }, + bootstrapTooltipOptions: { + animation: true, + html: true, + placement: 'top', + selector: false, + title: "", + container: false + } + }; + + $.fn.bootstrapPaginator.Constructor = BootstrapPaginator; + + + +}(window.jQuery)); \ No newline at end of file diff --git a/generator-web/target/classes/static/vendor/bootstrap/js/bootstrap.min.js b/generator-web/target/classes/static/vendor/bootstrap/js/bootstrap.min.js new file mode 100644 index 0000000..27aace3 --- /dev/null +++ b/generator-web/target/classes/static/vendor/bootstrap/js/bootstrap.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v4.0.0-beta.2 (https://getbootstrap.com) + * Copyright 2011-2017 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +var bootstrap=function(t,e,n){"use strict";function i(t,e){for(var n=0;n0?n:null}catch(t){return null}},reflow:function(t){return t.offsetHeight},triggerTransitionEnd:function(t){e(t).trigger(r.end)},supportsTransitionEnd:function(){return Boolean(r)},isElement:function(t){return(t[0]||t).nodeType},typeCheckConfig:function(e,n,i){for(var s in i)if(Object.prototype.hasOwnProperty.call(i,s)){var r=i[s],o=n[s],l=o&&a.isElement(o)?"element":t(o);if(!new RegExp(r).test(l))throw new Error(e.toUpperCase()+': Option "'+s+'" provided type "'+l+'" but expected type "'+r+'".')}}};return r=i(),e.fn.emulateTransitionEnd=s,a.supportsTransitionEnd()&&(e.event.special[a.TRANSITION_END]=n()),a}(),r=function(t,e,n){return e&&i(t.prototype,e),n&&i(t,n),t},o=function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e},a=function(){var t="alert",n=e.fn[t],i={CLOSE:"close.bs.alert",CLOSED:"closed.bs.alert",CLICK_DATA_API:"click.bs.alert.data-api"},o={ALERT:"alert",FADE:"fade",SHOW:"show"},a=function(){function t(t){this._element=t}var n=t.prototype;return n.close=function(t){t=t||this._element;var e=this._getRootElement(t);this._triggerCloseEvent(e).isDefaultPrevented()||this._removeElement(e)},n.dispose=function(){e.removeData(this._element,"bs.alert"),this._element=null},n._getRootElement=function(t){var n=s.getSelectorFromElement(t),i=!1;return n&&(i=e(n)[0]),i||(i=e(t).closest("."+o.ALERT)[0]),i},n._triggerCloseEvent=function(t){var n=e.Event(i.CLOSE);return e(t).trigger(n),n},n._removeElement=function(t){var n=this;e(t).removeClass(o.SHOW),s.supportsTransitionEnd()&&e(t).hasClass(o.FADE)?e(t).one(s.TRANSITION_END,function(e){return n._destroyElement(t,e)}).emulateTransitionEnd(150):this._destroyElement(t)},n._destroyElement=function(t){e(t).detach().trigger(i.CLOSED).remove()},t._jQueryInterface=function(n){return this.each(function(){var i=e(this),s=i.data("bs.alert");s||(s=new t(this),i.data("bs.alert",s)),"close"===n&&s[n](this)})},t._handleDismiss=function(t){return function(e){e&&e.preventDefault(),t.close(this)}},r(t,null,[{key:"VERSION",get:function(){return"4.0.0-beta.2"}}]),t}();return e(document).on(i.CLICK_DATA_API,{DISMISS:'[data-dismiss="alert"]'}.DISMISS,a._handleDismiss(new a)),e.fn[t]=a._jQueryInterface,e.fn[t].Constructor=a,e.fn[t].noConflict=function(){return e.fn[t]=n,a._jQueryInterface},a}(),l=function(){var t="button",n=e.fn[t],i={ACTIVE:"active",BUTTON:"btn",FOCUS:"focus"},s={DATA_TOGGLE_CARROT:'[data-toggle^="button"]',DATA_TOGGLE:'[data-toggle="buttons"]',INPUT:"input",ACTIVE:".active",BUTTON:".btn"},o={CLICK_DATA_API:"click.bs.button.data-api",FOCUS_BLUR_DATA_API:"focus.bs.button.data-api blur.bs.button.data-api"},a=function(){function t(t){this._element=t}var n=t.prototype;return n.toggle=function(){var t=!0,n=!0,r=e(this._element).closest(s.DATA_TOGGLE)[0];if(r){var o=e(this._element).find(s.INPUT)[0];if(o){if("radio"===o.type)if(o.checked&&e(this._element).hasClass(i.ACTIVE))t=!1;else{var a=e(r).find(s.ACTIVE)[0];a&&e(a).removeClass(i.ACTIVE)}if(t){if(o.hasAttribute("disabled")||r.hasAttribute("disabled")||o.classList.contains("disabled")||r.classList.contains("disabled"))return;o.checked=!e(this._element).hasClass(i.ACTIVE),e(o).trigger("change")}o.focus(),n=!1}}n&&this._element.setAttribute("aria-pressed",!e(this._element).hasClass(i.ACTIVE)),t&&e(this._element).toggleClass(i.ACTIVE)},n.dispose=function(){e.removeData(this._element,"bs.button"),this._element=null},t._jQueryInterface=function(n){return this.each(function(){var i=e(this).data("bs.button");i||(i=new t(this),e(this).data("bs.button",i)),"toggle"===n&&i[n]()})},r(t,null,[{key:"VERSION",get:function(){return"4.0.0-beta.2"}}]),t}();return e(document).on(o.CLICK_DATA_API,s.DATA_TOGGLE_CARROT,function(t){t.preventDefault();var n=t.target;e(n).hasClass(i.BUTTON)||(n=e(n).closest(s.BUTTON)),a._jQueryInterface.call(e(n),"toggle")}).on(o.FOCUS_BLUR_DATA_API,s.DATA_TOGGLE_CARROT,function(t){var n=e(t.target).closest(s.BUTTON)[0];e(n).toggleClass(i.FOCUS,/^focus(in)?$/.test(t.type))}),e.fn[t]=a._jQueryInterface,e.fn[t].Constructor=a,e.fn[t].noConflict=function(){return e.fn[t]=n,a._jQueryInterface},a}(),h=function(){var t="carousel",n="bs.carousel",i="."+n,o=e.fn[t],a={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0},l={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean"},h={NEXT:"next",PREV:"prev",LEFT:"left",RIGHT:"right"},c={SLIDE:"slide"+i,SLID:"slid"+i,KEYDOWN:"keydown"+i,MOUSEENTER:"mouseenter"+i,MOUSELEAVE:"mouseleave"+i,TOUCHEND:"touchend"+i,LOAD_DATA_API:"load.bs.carousel.data-api",CLICK_DATA_API:"click.bs.carousel.data-api"},u={CAROUSEL:"carousel",ACTIVE:"active",SLIDE:"slide",RIGHT:"carousel-item-right",LEFT:"carousel-item-left",NEXT:"carousel-item-next",PREV:"carousel-item-prev",ITEM:"carousel-item"},d={ACTIVE:".active",ACTIVE_ITEM:".active.carousel-item",ITEM:".carousel-item",NEXT_PREV:".carousel-item-next, .carousel-item-prev",INDICATORS:".carousel-indicators",DATA_SLIDE:"[data-slide], [data-slide-to]",DATA_RIDE:'[data-ride="carousel"]'},f=function(){function o(t,n){this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this._config=this._getConfig(n),this._element=e(t)[0],this._indicatorsElement=e(this._element).find(d.INDICATORS)[0],this._addEventListeners()}var f=o.prototype;return f.next=function(){this._isSliding||this._slide(h.NEXT)},f.nextWhenVisible=function(){!document.hidden&&e(this._element).is(":visible")&&"hidden"!==e(this._element).css("visibility")&&this.next()},f.prev=function(){this._isSliding||this._slide(h.PREV)},f.pause=function(t){t||(this._isPaused=!0),e(this._element).find(d.NEXT_PREV)[0]&&s.supportsTransitionEnd()&&(s.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},f.cycle=function(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},f.to=function(t){var n=this;this._activeElement=e(this._element).find(d.ACTIVE_ITEM)[0];var i=this._getItemIndex(this._activeElement);if(!(t>this._items.length-1||t<0))if(this._isSliding)e(this._element).one(c.SLID,function(){return n.to(t)});else{if(i===t)return this.pause(),void this.cycle();var s=t>i?h.NEXT:h.PREV;this._slide(s,this._items[t])}},f.dispose=function(){e(this._element).off(i),e.removeData(this._element,n),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},f._getConfig=function(n){return n=e.extend({},a,n),s.typeCheckConfig(t,n,l),n},f._addEventListeners=function(){var t=this;this._config.keyboard&&e(this._element).on(c.KEYDOWN,function(e){return t._keydown(e)}),"hover"===this._config.pause&&(e(this._element).on(c.MOUSEENTER,function(e){return t.pause(e)}).on(c.MOUSELEAVE,function(e){return t.cycle(e)}),"ontouchstart"in document.documentElement&&e(this._element).on(c.TOUCHEND,function(){t.pause(),t.touchTimeout&&clearTimeout(t.touchTimeout),t.touchTimeout=setTimeout(function(e){return t.cycle(e)},500+t._config.interval)}))},f._keydown=function(t){if(!/input|textarea/i.test(t.target.tagName))switch(t.which){case 37:t.preventDefault(),this.prev();break;case 39:t.preventDefault(),this.next();break;default:return}},f._getItemIndex=function(t){return this._items=e.makeArray(e(t).parent().find(d.ITEM)),this._items.indexOf(t)},f._getItemByDirection=function(t,e){var n=t===h.NEXT,i=t===h.PREV,s=this._getItemIndex(e),r=this._items.length-1;if((i&&0===s||n&&s===r)&&!this._config.wrap)return e;var o=(s+(t===h.PREV?-1:1))%this._items.length;return-1===o?this._items[this._items.length-1]:this._items[o]},f._triggerSlideEvent=function(t,n){var i=this._getItemIndex(t),s=this._getItemIndex(e(this._element).find(d.ACTIVE_ITEM)[0]),r=e.Event(c.SLIDE,{relatedTarget:t,direction:n,from:s,to:i});return e(this._element).trigger(r),r},f._setActiveIndicatorElement=function(t){if(this._indicatorsElement){e(this._indicatorsElement).find(d.ACTIVE).removeClass(u.ACTIVE);var n=this._indicatorsElement.children[this._getItemIndex(t)];n&&e(n).addClass(u.ACTIVE)}},f._slide=function(t,n){var i,r,o,a=this,l=e(this._element).find(d.ACTIVE_ITEM)[0],f=this._getItemIndex(l),_=n||l&&this._getItemByDirection(t,l),g=this._getItemIndex(_),m=Boolean(this._interval);if(t===h.NEXT?(i=u.LEFT,r=u.NEXT,o=h.LEFT):(i=u.RIGHT,r=u.PREV,o=h.RIGHT),_&&e(_).hasClass(u.ACTIVE))this._isSliding=!1;else if(!this._triggerSlideEvent(_,o).isDefaultPrevented()&&l&&_){this._isSliding=!0,m&&this.pause(),this._setActiveIndicatorElement(_);var p=e.Event(c.SLID,{relatedTarget:_,direction:o,from:f,to:g});s.supportsTransitionEnd()&&e(this._element).hasClass(u.SLIDE)?(e(_).addClass(r),s.reflow(_),e(l).addClass(i),e(_).addClass(i),e(l).one(s.TRANSITION_END,function(){e(_).removeClass(i+" "+r).addClass(u.ACTIVE),e(l).removeClass(u.ACTIVE+" "+r+" "+i),a._isSliding=!1,setTimeout(function(){return e(a._element).trigger(p)},0)}).emulateTransitionEnd(600)):(e(l).removeClass(u.ACTIVE),e(_).addClass(u.ACTIVE),this._isSliding=!1,e(this._element).trigger(p)),m&&this.cycle()}},o._jQueryInterface=function(t){return this.each(function(){var i=e(this).data(n),s=e.extend({},a,e(this).data());"object"==typeof t&&e.extend(s,t);var r="string"==typeof t?t:s.slide;if(i||(i=new o(this,s),e(this).data(n,i)),"number"==typeof t)i.to(t);else if("string"==typeof r){if("undefined"==typeof i[r])throw new Error('No method named "'+r+'"');i[r]()}else s.interval&&(i.pause(),i.cycle())})},o._dataApiClickHandler=function(t){var i=s.getSelectorFromElement(this);if(i){var r=e(i)[0];if(r&&e(r).hasClass(u.CAROUSEL)){var a=e.extend({},e(r).data(),e(this).data()),l=this.getAttribute("data-slide-to");l&&(a.interval=!1),o._jQueryInterface.call(e(r),a),l&&e(r).data(n).to(l),t.preventDefault()}}},r(o,null,[{key:"VERSION",get:function(){return"4.0.0-beta.2"}},{key:"Default",get:function(){return a}}]),o}();return e(document).on(c.CLICK_DATA_API,d.DATA_SLIDE,f._dataApiClickHandler),e(window).on(c.LOAD_DATA_API,function(){e(d.DATA_RIDE).each(function(){var t=e(this);f._jQueryInterface.call(t,t.data())})}),e.fn[t]=f._jQueryInterface,e.fn[t].Constructor=f,e.fn[t].noConflict=function(){return e.fn[t]=o,f._jQueryInterface},f}(),c=function(){var t="collapse",n="bs.collapse",i=e.fn[t],o={toggle:!0,parent:""},a={toggle:"boolean",parent:"(string|element)"},l={SHOW:"show.bs.collapse",SHOWN:"shown.bs.collapse",HIDE:"hide.bs.collapse",HIDDEN:"hidden.bs.collapse",CLICK_DATA_API:"click.bs.collapse.data-api"},h={SHOW:"show",COLLAPSE:"collapse",COLLAPSING:"collapsing",COLLAPSED:"collapsed"},c={WIDTH:"width",HEIGHT:"height"},u={ACTIVES:".show, .collapsing",DATA_TOGGLE:'[data-toggle="collapse"]'},d=function(){function i(t,n){this._isTransitioning=!1,this._element=t,this._config=this._getConfig(n),this._triggerArray=e.makeArray(e('[data-toggle="collapse"][href="#'+t.id+'"],[data-toggle="collapse"][data-target="#'+t.id+'"]'));for(var i=e(u.DATA_TOGGLE),r=0;r0&&this._triggerArray.push(o)}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}var d=i.prototype;return d.toggle=function(){e(this._element).hasClass(h.SHOW)?this.hide():this.show()},d.show=function(){var t=this;if(!this._isTransitioning&&!e(this._element).hasClass(h.SHOW)){var r,o;if(this._parent&&((r=e.makeArray(e(this._parent).children().children(u.ACTIVES))).length||(r=null)),!(r&&(o=e(r).data(n))&&o._isTransitioning)){var a=e.Event(l.SHOW);if(e(this._element).trigger(a),!a.isDefaultPrevented()){r&&(i._jQueryInterface.call(e(r),"hide"),o||e(r).data(n,null));var c=this._getDimension();e(this._element).removeClass(h.COLLAPSE).addClass(h.COLLAPSING),this._element.style[c]=0,this._triggerArray.length&&e(this._triggerArray).removeClass(h.COLLAPSED).attr("aria-expanded",!0),this.setTransitioning(!0);var d=function(){e(t._element).removeClass(h.COLLAPSING).addClass(h.COLLAPSE).addClass(h.SHOW),t._element.style[c]="",t.setTransitioning(!1),e(t._element).trigger(l.SHOWN)};if(s.supportsTransitionEnd()){var f="scroll"+(c[0].toUpperCase()+c.slice(1));e(this._element).one(s.TRANSITION_END,d).emulateTransitionEnd(600),this._element.style[c]=this._element[f]+"px"}else d()}}}},d.hide=function(){var t=this;if(!this._isTransitioning&&e(this._element).hasClass(h.SHOW)){var n=e.Event(l.HIDE);if(e(this._element).trigger(n),!n.isDefaultPrevented()){var i=this._getDimension();if(this._element.style[i]=this._element.getBoundingClientRect()[i]+"px",s.reflow(this._element),e(this._element).addClass(h.COLLAPSING).removeClass(h.COLLAPSE).removeClass(h.SHOW),this._triggerArray.length)for(var r=0;r0},g._getPopperConfig=function(){var t=this,n={};"function"==typeof this._config.offset?n.fn=function(n){return n.offsets=e.extend({},n.offsets,t._config.offset(n.offsets)||{}),n}:n.offset=this._config.offset;var i={placement:this._getPlacement(),modifiers:{offset:n,flip:{enabled:this._config.flip}}};return this._inNavbar&&(i.modifiers.applyStyle={enabled:!this._inNavbar}),i},a._jQueryInterface=function(t){return this.each(function(){var n=e(this).data(i),s="object"==typeof t?t:null;if(n||(n=new a(this,s),e(this).data(i,n)),"string"==typeof t){if("undefined"==typeof n[t])throw new Error('No method named "'+t+'"');n[t]()}})},a._clearMenus=function(t){if(!t||3!==t.which&&("keyup"!==t.type||9===t.which))for(var n=e.makeArray(e(u.DATA_TOGGLE)),s=0;s0&&r--,40===t.which&&rdocument.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},u._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},u._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=t.left+t.right
      ',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip"},u={SHOW:"show",OUT:"out"},d={HIDE:"hide"+i,HIDDEN:"hidden"+i,SHOW:"show"+i,SHOWN:"shown"+i,INSERTED:"inserted"+i,CLICK:"click"+i,FOCUSIN:"focusin"+i,FOCUSOUT:"focusout"+i,MOUSEENTER:"mouseenter"+i,MOUSELEAVE:"mouseleave"+i},f={FADE:"fade",SHOW:"show"},_={TOOLTIP:".tooltip",TOOLTIP_INNER:".tooltip-inner",ARROW:".arrow"},g={HOVER:"hover",FOCUS:"focus",CLICK:"click",MANUAL:"manual"},m=function(){function o(t,e){this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var m=o.prototype;return m.enable=function(){this._isEnabled=!0},m.disable=function(){this._isEnabled=!1},m.toggleEnabled=function(){this._isEnabled=!this._isEnabled},m.toggle=function(t){if(this._isEnabled)if(t){var n=this.constructor.DATA_KEY,i=e(t.currentTarget).data(n);i||(i=new this.constructor(t.currentTarget,this._getDelegateConfig()),e(t.currentTarget).data(n,i)),i._activeTrigger.click=!i._activeTrigger.click,i._isWithActiveTrigger()?i._enter(null,i):i._leave(null,i)}else{if(e(this.getTipElement()).hasClass(f.SHOW))return void this._leave(null,this);this._enter(null,this)}},m.dispose=function(){clearTimeout(this._timeout),e.removeData(this.element,this.constructor.DATA_KEY),e(this.element).off(this.constructor.EVENT_KEY),e(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&e(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,null!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},m.show=function(){var t=this;if("none"===e(this.element).css("display"))throw new Error("Please use show on visible elements");var i=e.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){e(this.element).trigger(i);var r=e.contains(this.element.ownerDocument.documentElement,this.element);if(i.isDefaultPrevented()||!r)return;var a=this.getTipElement(),l=s.getUID(this.constructor.NAME);a.setAttribute("id",l),this.element.setAttribute("aria-describedby",l),this.setContent(),this.config.animation&&e(a).addClass(f.FADE);var h="function"==typeof this.config.placement?this.config.placement.call(this,a,this.element):this.config.placement,c=this._getAttachment(h);this.addAttachmentClass(c);var d=!1===this.config.container?document.body:e(this.config.container);e(a).data(this.constructor.DATA_KEY,this),e.contains(this.element.ownerDocument.documentElement,this.tip)||e(a).appendTo(d),e(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new n(this.element,a,{placement:c,modifiers:{offset:{offset:this.config.offset},flip:{behavior:this.config.fallbackPlacement},arrow:{element:_.ARROW}},onCreate:function(e){e.originalPlacement!==e.placement&&t._handlePopperPlacementChange(e)},onUpdate:function(e){t._handlePopperPlacementChange(e)}}),e(a).addClass(f.SHOW),"ontouchstart"in document.documentElement&&e("body").children().on("mouseover",null,e.noop);var g=function(){t.config.animation&&t._fixTransition();var n=t._hoverState;t._hoverState=null,e(t.element).trigger(t.constructor.Event.SHOWN),n===u.OUT&&t._leave(null,t)};s.supportsTransitionEnd()&&e(this.tip).hasClass(f.FADE)?e(this.tip).one(s.TRANSITION_END,g).emulateTransitionEnd(o._TRANSITION_DURATION):g()}},m.hide=function(t){var n=this,i=this.getTipElement(),r=e.Event(this.constructor.Event.HIDE),o=function(){n._hoverState!==u.SHOW&&i.parentNode&&i.parentNode.removeChild(i),n._cleanTipClass(),n.element.removeAttribute("aria-describedby"),e(n.element).trigger(n.constructor.Event.HIDDEN),null!==n._popper&&n._popper.destroy(),t&&t()};e(this.element).trigger(r),r.isDefaultPrevented()||(e(i).removeClass(f.SHOW),"ontouchstart"in document.documentElement&&e("body").children().off("mouseover",null,e.noop),this._activeTrigger[g.CLICK]=!1,this._activeTrigger[g.FOCUS]=!1,this._activeTrigger[g.HOVER]=!1,s.supportsTransitionEnd()&&e(this.tip).hasClass(f.FADE)?e(i).one(s.TRANSITION_END,o).emulateTransitionEnd(150):o(),this._hoverState="")},m.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},m.isWithContent=function(){return Boolean(this.getTitle())},m.addAttachmentClass=function(t){e(this.getTipElement()).addClass("bs-tooltip-"+t)},m.getTipElement=function(){return this.tip=this.tip||e(this.config.template)[0],this.tip},m.setContent=function(){var t=e(this.getTipElement());this.setElementContent(t.find(_.TOOLTIP_INNER),this.getTitle()),t.removeClass(f.FADE+" "+f.SHOW)},m.setElementContent=function(t,n){var i=this.config.html;"object"==typeof n&&(n.nodeType||n.jquery)?i?e(n).parent().is(t)||t.empty().append(n):t.text(e(n).text()):t[i?"html":"text"](n)},m.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},m._getAttachment=function(t){return h[t.toUpperCase()]},m._setListeners=function(){var t=this;this.config.trigger.split(" ").forEach(function(n){if("click"===n)e(t.element).on(t.constructor.Event.CLICK,t.config.selector,function(e){return t.toggle(e)});else if(n!==g.MANUAL){var i=n===g.HOVER?t.constructor.Event.MOUSEENTER:t.constructor.Event.FOCUSIN,s=n===g.HOVER?t.constructor.Event.MOUSELEAVE:t.constructor.Event.FOCUSOUT;e(t.element).on(i,t.config.selector,function(e){return t._enter(e)}).on(s,t.config.selector,function(e){return t._leave(e)})}e(t.element).closest(".modal").on("hide.bs.modal",function(){return t.hide()})}),this.config.selector?this.config=e.extend({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},m._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},m._enter=function(t,n){var i=this.constructor.DATA_KEY;(n=n||e(t.currentTarget).data(i))||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),e(t.currentTarget).data(i,n)),t&&(n._activeTrigger["focusin"===t.type?g.FOCUS:g.HOVER]=!0),e(n.getTipElement()).hasClass(f.SHOW)||n._hoverState===u.SHOW?n._hoverState=u.SHOW:(clearTimeout(n._timeout),n._hoverState=u.SHOW,n.config.delay&&n.config.delay.show?n._timeout=setTimeout(function(){n._hoverState===u.SHOW&&n.show()},n.config.delay.show):n.show())},m._leave=function(t,n){var i=this.constructor.DATA_KEY;(n=n||e(t.currentTarget).data(i))||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),e(t.currentTarget).data(i,n)),t&&(n._activeTrigger["focusout"===t.type?g.FOCUS:g.HOVER]=!1),n._isWithActiveTrigger()||(clearTimeout(n._timeout),n._hoverState=u.OUT,n.config.delay&&n.config.delay.hide?n._timeout=setTimeout(function(){n._hoverState===u.OUT&&n.hide()},n.config.delay.hide):n.hide())},m._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},m._getConfig=function(n){return"number"==typeof(n=e.extend({},this.constructor.Default,e(this.element).data(),n)).delay&&(n.delay={show:n.delay,hide:n.delay}),"number"==typeof n.title&&(n.title=n.title.toString()),"number"==typeof n.content&&(n.content=n.content.toString()),s.typeCheckConfig(t,n,this.constructor.DefaultType),n},m._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},m._cleanTipClass=function(){var t=e(this.getTipElement()),n=t.attr("class").match(a);null!==n&&n.length>0&&t.removeClass(n.join(""))},m._handlePopperPlacementChange=function(t){this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},m._fixTransition=function(){var t=this.getTipElement(),n=this.config.animation;null===t.getAttribute("x-placement")&&(e(t).removeClass(f.FADE),this.config.animation=!1,this.hide(),this.show(),this.config.animation=n)},o._jQueryInterface=function(t){return this.each(function(){var n=e(this).data("bs.tooltip"),i="object"==typeof t&&t;if((n||!/dispose|hide/.test(t))&&(n||(n=new o(this,i),e(this).data("bs.tooltip",n)),"string"==typeof t)){if("undefined"==typeof n[t])throw new Error('No method named "'+t+'"');n[t]()}})},r(o,null,[{key:"VERSION",get:function(){return"4.0.0-beta.2"}},{key:"Default",get:function(){return c}},{key:"NAME",get:function(){return t}},{key:"DATA_KEY",get:function(){return"bs.tooltip"}},{key:"Event",get:function(){return d}},{key:"EVENT_KEY",get:function(){return i}},{key:"DefaultType",get:function(){return l}}]),o}();return e.fn[t]=m._jQueryInterface,e.fn[t].Constructor=m,e.fn[t].noConflict=function(){return e.fn[t]=o,m._jQueryInterface},m}(),_=function(){var t="popover",n=".bs.popover",i=e.fn[t],s=new RegExp("(^|\\s)bs-popover\\S+","g"),a=e.extend({},f.Default,{placement:"right",trigger:"click",content:"",template:''}),l=e.extend({},f.DefaultType,{content:"(string|element|function)"}),h={FADE:"fade",SHOW:"show"},c={TITLE:".popover-header",CONTENT:".popover-body"},u={HIDE:"hide"+n,HIDDEN:"hidden"+n,SHOW:"show"+n,SHOWN:"shown"+n,INSERTED:"inserted"+n,CLICK:"click"+n,FOCUSIN:"focusin"+n,FOCUSOUT:"focusout"+n,MOUSEENTER:"mouseenter"+n,MOUSELEAVE:"mouseleave"+n},d=function(i){function d(){return i.apply(this,arguments)||this}o(d,i);var f=d.prototype;return f.isWithContent=function(){return this.getTitle()||this._getContent()},f.addAttachmentClass=function(t){e(this.getTipElement()).addClass("bs-popover-"+t)},f.getTipElement=function(){return this.tip=this.tip||e(this.config.template)[0],this.tip},f.setContent=function(){var t=e(this.getTipElement());this.setElementContent(t.find(c.TITLE),this.getTitle()),this.setElementContent(t.find(c.CONTENT),this._getContent()),t.removeClass(h.FADE+" "+h.SHOW)},f._getContent=function(){return this.element.getAttribute("data-content")||("function"==typeof this.config.content?this.config.content.call(this.element):this.config.content)},f._cleanTipClass=function(){var t=e(this.getTipElement()),n=t.attr("class").match(s);null!==n&&n.length>0&&t.removeClass(n.join(""))},d._jQueryInterface=function(t){return this.each(function(){var n=e(this).data("bs.popover"),i="object"==typeof t?t:null;if((n||!/destroy|hide/.test(t))&&(n||(n=new d(this,i),e(this).data("bs.popover",n)),"string"==typeof t)){if("undefined"==typeof n[t])throw new Error('No method named "'+t+'"');n[t]()}})},r(d,null,[{key:"VERSION",get:function(){return"4.0.0-beta.2"}},{key:"Default",get:function(){return a}},{key:"NAME",get:function(){return t}},{key:"DATA_KEY",get:function(){return"bs.popover"}},{key:"Event",get:function(){return u}},{key:"EVENT_KEY",get:function(){return n}},{key:"DefaultType",get:function(){return l}}]),d}(f);return e.fn[t]=d._jQueryInterface,e.fn[t].Constructor=d,e.fn[t].noConflict=function(){return e.fn[t]=i,d._jQueryInterface},d}(),g=function(){var t="scrollspy",n=e.fn[t],i={offset:10,method:"auto",target:""},o={offset:"number",method:"string",target:"(string|element)"},a={ACTIVATE:"activate.bs.scrollspy",SCROLL:"scroll.bs.scrollspy",LOAD_DATA_API:"load.bs.scrollspy.data-api"},l={DROPDOWN_ITEM:"dropdown-item",DROPDOWN_MENU:"dropdown-menu",ACTIVE:"active"},h={DATA_SPY:'[data-spy="scroll"]',ACTIVE:".active",NAV_LIST_GROUP:".nav, .list-group",NAV_LINKS:".nav-link",NAV_ITEMS:".nav-item",LIST_ITEMS:".list-group-item",DROPDOWN:".dropdown",DROPDOWN_ITEMS:".dropdown-item",DROPDOWN_TOGGLE:".dropdown-toggle"},c={OFFSET:"offset",POSITION:"position"},u=function(){function n(t,n){var i=this;this._element=t,this._scrollElement="BODY"===t.tagName?window:t,this._config=this._getConfig(n),this._selector=this._config.target+" "+h.NAV_LINKS+","+this._config.target+" "+h.LIST_ITEMS+","+this._config.target+" "+h.DROPDOWN_ITEMS,this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,e(this._scrollElement).on(a.SCROLL,function(t){return i._process(t)}),this.refresh(),this._process()}var u=n.prototype;return u.refresh=function(){var t=this,n=this._scrollElement!==this._scrollElement.window?c.POSITION:c.OFFSET,i="auto"===this._config.method?n:this._config.method,r=i===c.POSITION?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),e.makeArray(e(this._selector)).map(function(t){var n,o=s.getSelectorFromElement(t);if(o&&(n=e(o)[0]),n){var a=n.getBoundingClientRect();if(a.width||a.height)return[e(n)[i]().top+r,o]}return null}).filter(function(t){return t}).sort(function(t,e){return t[0]-e[0]}).forEach(function(e){t._offsets.push(e[0]),t._targets.push(e[1])})},u.dispose=function(){e.removeData(this._element,"bs.scrollspy"),e(this._scrollElement).off(".bs.scrollspy"),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},u._getConfig=function(n){if("string"!=typeof(n=e.extend({},i,n)).target){var r=e(n.target).attr("id");r||(r=s.getUID(t),e(n.target).attr("id",r)),n.target="#"+r}return s.typeCheckConfig(t,n,o),n},u._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},u._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},u._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},u._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=n){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&t0)return this._activeTarget=null,void this._clear();for(var s=this._offsets.length;s--;)this._activeTarget!==this._targets[s]&&t>=this._offsets[s]&&("undefined"==typeof this._offsets[s+1]||t li > .active",DATA_TOGGLE:'[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',DROPDOWN_TOGGLE:".dropdown-toggle",DROPDOWN_ACTIVE_CHILD:"> .dropdown-menu .active"},a=function(){function t(t){this._element=t}var a=t.prototype;return a.show=function(){var t=this;if(!(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&e(this._element).hasClass(i.ACTIVE)||e(this._element).hasClass(i.DISABLED))){var r,a,l=e(this._element).closest(o.NAV_LIST_GROUP)[0],h=s.getSelectorFromElement(this._element);if(l){var c="UL"===l.nodeName?o.ACTIVE_UL:o.ACTIVE;a=e.makeArray(e(l).find(c)),a=a[a.length-1]}var u=e.Event(n.HIDE,{relatedTarget:this._element}),d=e.Event(n.SHOW,{relatedTarget:a});if(a&&e(a).trigger(u),e(this._element).trigger(d),!d.isDefaultPrevented()&&!u.isDefaultPrevented()){h&&(r=e(h)[0]),this._activate(this._element,l);var f=function(){var i=e.Event(n.HIDDEN,{relatedTarget:t._element}),s=e.Event(n.SHOWN,{relatedTarget:a});e(a).trigger(i),e(t._element).trigger(s)};r?this._activate(r,r.parentNode,f):f()}}},a.dispose=function(){e.removeData(this._element,"bs.tab"),this._element=null},a._activate=function(t,n,r){var a,l=this,h=(a="UL"===n.nodeName?e(n).find(o.ACTIVE_UL):e(n).children(o.ACTIVE))[0],c=r&&s.supportsTransitionEnd()&&h&&e(h).hasClass(i.FADE),u=function(){return l._transitionComplete(t,h,c,r)};h&&c?e(h).one(s.TRANSITION_END,u).emulateTransitionEnd(150):u(),h&&e(h).removeClass(i.SHOW)},a._transitionComplete=function(t,n,r,a){if(n){e(n).removeClass(i.ACTIVE);var l=e(n.parentNode).find(o.DROPDOWN_ACTIVE_CHILD)[0];l&&e(l).removeClass(i.ACTIVE),"tab"===n.getAttribute("role")&&n.setAttribute("aria-selected",!1)}if(e(t).addClass(i.ACTIVE),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!0),r?(s.reflow(t),e(t).addClass(i.SHOW)):e(t).removeClass(i.FADE),t.parentNode&&e(t.parentNode).hasClass(i.DROPDOWN_MENU)){var h=e(t).closest(o.DROPDOWN)[0];h&&e(h).find(o.DROPDOWN_TOGGLE).addClass(i.ACTIVE),t.setAttribute("aria-expanded",!0)}a&&a()},t._jQueryInterface=function(n){return this.each(function(){var i=e(this),s=i.data("bs.tab");if(s||(s=new t(this),i.data("bs.tab",s)),"string"==typeof n){if("undefined"==typeof s[n])throw new Error('No method named "'+n+'"');s[n]()}})},r(t,null,[{key:"VERSION",get:function(){return"4.0.0-beta.2"}}]),t}();return e(document).on(n.CLICK_DATA_API,o.DATA_TOGGLE,function(t){t.preventDefault(),a._jQueryInterface.call(e(this),"show")}),e.fn.tab=a._jQueryInterface,e.fn.tab.Constructor=a,e.fn.tab.noConflict=function(){return e.fn.tab=t,a._jQueryInterface},a}();return function(){if("undefined"==typeof e)throw new Error("Bootstrap's JavaScript requires jQuery. jQuery must be included before Bootstrap's JavaScript.");var t=e.fn.jquery.split(" ")[0].split(".");if(t[0]<2&&t[1]<9||1===t[0]&&9===t[1]&&t[2]<1||t[0]>=4)throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}(),t.Util=s,t.Alert=a,t.Button=l,t.Carousel=h,t.Collapse=c,t.Dropdown=u,t.Modal=d,t.Popover=_,t.Scrollspy=g,t.Tab=m,t.Tooltip=f,t}({},$,Popper); +//# sourceMappingURL=bootstrap.min.js.map \ No newline at end of file diff --git a/generator-web/target/classes/static/vendor/chart.js/chart.js b/generator-web/target/classes/static/vendor/chart.js/chart.js new file mode 100644 index 0000000..0825ec7 --- /dev/null +++ b/generator-web/target/classes/static/vendor/chart.js/chart.js @@ -0,0 +1,14145 @@ +/*! + * Chart.js + * http://chartjs.org/ + * Version: 2.7.1 + * + * Copyright 2017 Nick Downie + * Released under the MIT license + * https://github.com/chartjs/Chart.js/blob/master/LICENSE.md + */ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.Chart = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o lum2) { + return (lum1 + 0.05) / (lum2 + 0.05); + } + return (lum2 + 0.05) / (lum1 + 0.05); + }, + + level: function (color2) { + var contrastRatio = this.contrast(color2); + if (contrastRatio >= 7.1) { + return 'AAA'; + } + + return (contrastRatio >= 4.5) ? 'AA' : ''; + }, + + dark: function () { + // YIQ equation from http://24ways.org/2010/calculating-color-contrast + var rgb = this.values.rgb; + var yiq = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000; + return yiq < 128; + }, + + light: function () { + return !this.dark(); + }, + + negate: function () { + var rgb = []; + for (var i = 0; i < 3; i++) { + rgb[i] = 255 - this.values.rgb[i]; + } + this.setValues('rgb', rgb); + return this; + }, + + lighten: function (ratio) { + var hsl = this.values.hsl; + hsl[2] += hsl[2] * ratio; + this.setValues('hsl', hsl); + return this; + }, + + darken: function (ratio) { + var hsl = this.values.hsl; + hsl[2] -= hsl[2] * ratio; + this.setValues('hsl', hsl); + return this; + }, + + saturate: function (ratio) { + var hsl = this.values.hsl; + hsl[1] += hsl[1] * ratio; + this.setValues('hsl', hsl); + return this; + }, + + desaturate: function (ratio) { + var hsl = this.values.hsl; + hsl[1] -= hsl[1] * ratio; + this.setValues('hsl', hsl); + return this; + }, + + whiten: function (ratio) { + var hwb = this.values.hwb; + hwb[1] += hwb[1] * ratio; + this.setValues('hwb', hwb); + return this; + }, + + blacken: function (ratio) { + var hwb = this.values.hwb; + hwb[2] += hwb[2] * ratio; + this.setValues('hwb', hwb); + return this; + }, + + greyscale: function () { + var rgb = this.values.rgb; + // http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale + var val = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11; + this.setValues('rgb', [val, val, val]); + return this; + }, + + clearer: function (ratio) { + var alpha = this.values.alpha; + this.setValues('alpha', alpha - (alpha * ratio)); + return this; + }, + + opaquer: function (ratio) { + var alpha = this.values.alpha; + this.setValues('alpha', alpha + (alpha * ratio)); + return this; + }, + + rotate: function (degrees) { + var hsl = this.values.hsl; + var hue = (hsl[0] + degrees) % 360; + hsl[0] = hue < 0 ? 360 + hue : hue; + this.setValues('hsl', hsl); + return this; + }, + + /** + * Ported from sass implementation in C + * https://github.com/sass/libsass/blob/0e6b4a2850092356aa3ece07c6b249f0221caced/functions.cpp#L209 + */ + mix: function (mixinColor, weight) { + var color1 = this; + var color2 = mixinColor; + var p = weight === undefined ? 0.5 : weight; + + var w = 2 * p - 1; + var a = color1.alpha() - color2.alpha(); + + var w1 = (((w * a === -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0; + var w2 = 1 - w1; + + return this + .rgb( + w1 * color1.red() + w2 * color2.red(), + w1 * color1.green() + w2 * color2.green(), + w1 * color1.blue() + w2 * color2.blue() + ) + .alpha(color1.alpha() * p + color2.alpha() * (1 - p)); + }, + + toJSON: function () { + return this.rgb(); + }, + + clone: function () { + // NOTE(SB): using node-clone creates a dependency to Buffer when using browserify, + // making the final build way to big to embed in Chart.js. So let's do it manually, + // assuming that values to clone are 1 dimension arrays containing only numbers, + // except 'alpha' which is a number. + var result = new Color(); + var source = this.values; + var target = result.values; + var value, type; + + for (var prop in source) { + if (source.hasOwnProperty(prop)) { + value = source[prop]; + type = ({}).toString.call(value); + if (type === '[object Array]') { + target[prop] = value.slice(0); + } else if (type === '[object Number]') { + target[prop] = value; + } else { + console.error('unexpected color value:', value); + } + } + } + + return result; + } +}; + +Color.prototype.spaces = { + rgb: ['red', 'green', 'blue'], + hsl: ['hue', 'saturation', 'lightness'], + hsv: ['hue', 'saturation', 'value'], + hwb: ['hue', 'whiteness', 'blackness'], + cmyk: ['cyan', 'magenta', 'yellow', 'black'] +}; + +Color.prototype.maxes = { + rgb: [255, 255, 255], + hsl: [360, 100, 100], + hsv: [360, 100, 100], + hwb: [360, 100, 100], + cmyk: [100, 100, 100, 100] +}; + +Color.prototype.getValues = function (space) { + var values = this.values; + var vals = {}; + + for (var i = 0; i < space.length; i++) { + vals[space.charAt(i)] = values[space][i]; + } + + if (values.alpha !== 1) { + vals.a = values.alpha; + } + + // {r: 255, g: 255, b: 255, a: 0.4} + return vals; +}; + +Color.prototype.setValues = function (space, vals) { + var values = this.values; + var spaces = this.spaces; + var maxes = this.maxes; + var alpha = 1; + var i; + + this.valid = true; + + if (space === 'alpha') { + alpha = vals; + } else if (vals.length) { + // [10, 10, 10] + values[space] = vals.slice(0, space.length); + alpha = vals[space.length]; + } else if (vals[space.charAt(0)] !== undefined) { + // {r: 10, g: 10, b: 10} + for (i = 0; i < space.length; i++) { + values[space][i] = vals[space.charAt(i)]; + } + + alpha = vals.a; + } else if (vals[spaces[space][0]] !== undefined) { + // {red: 10, green: 10, blue: 10} + var chans = spaces[space]; + + for (i = 0; i < space.length; i++) { + values[space][i] = vals[chans[i]]; + } + + alpha = vals.alpha; + } + + values.alpha = Math.max(0, Math.min(1, (alpha === undefined ? values.alpha : alpha))); + + if (space === 'alpha') { + return false; + } + + var capped; + + // cap values of the space prior converting all values + for (i = 0; i < space.length; i++) { + capped = Math.max(0, Math.min(maxes[space][i], values[space][i])); + values[space][i] = Math.round(capped); + } + + // convert to all the other color spaces + for (var sname in spaces) { + if (sname !== space) { + values[sname] = convert[space][sname](values[space]); + } + } + + return true; +}; + +Color.prototype.setSpace = function (space, args) { + var vals = args[0]; + + if (vals === undefined) { + // color.rgb() + return this.getValues(space); + } + + // color.rgb(10, 10, 10) + if (typeof vals === 'number') { + vals = Array.prototype.slice.call(args); + } + + this.setValues(space, vals); + return this; +}; + +Color.prototype.setChannel = function (space, index, val) { + var svalues = this.values[space]; + if (val === undefined) { + // color.red() + return svalues[index]; + } else if (val === svalues[index]) { + // color.red(color.red()) + return this; + } + + // color.red(100) + svalues[index] = val; + this.setValues(space, svalues); + + return this; +}; + +if (typeof window !== 'undefined') { + window.Color = Color; +} + +module.exports = Color; + +},{"2":2,"5":5}],4:[function(require,module,exports){ +/* MIT license */ + +module.exports = { + rgb2hsl: rgb2hsl, + rgb2hsv: rgb2hsv, + rgb2hwb: rgb2hwb, + rgb2cmyk: rgb2cmyk, + rgb2keyword: rgb2keyword, + rgb2xyz: rgb2xyz, + rgb2lab: rgb2lab, + rgb2lch: rgb2lch, + + hsl2rgb: hsl2rgb, + hsl2hsv: hsl2hsv, + hsl2hwb: hsl2hwb, + hsl2cmyk: hsl2cmyk, + hsl2keyword: hsl2keyword, + + hsv2rgb: hsv2rgb, + hsv2hsl: hsv2hsl, + hsv2hwb: hsv2hwb, + hsv2cmyk: hsv2cmyk, + hsv2keyword: hsv2keyword, + + hwb2rgb: hwb2rgb, + hwb2hsl: hwb2hsl, + hwb2hsv: hwb2hsv, + hwb2cmyk: hwb2cmyk, + hwb2keyword: hwb2keyword, + + cmyk2rgb: cmyk2rgb, + cmyk2hsl: cmyk2hsl, + cmyk2hsv: cmyk2hsv, + cmyk2hwb: cmyk2hwb, + cmyk2keyword: cmyk2keyword, + + keyword2rgb: keyword2rgb, + keyword2hsl: keyword2hsl, + keyword2hsv: keyword2hsv, + keyword2hwb: keyword2hwb, + keyword2cmyk: keyword2cmyk, + keyword2lab: keyword2lab, + keyword2xyz: keyword2xyz, + + xyz2rgb: xyz2rgb, + xyz2lab: xyz2lab, + xyz2lch: xyz2lch, + + lab2xyz: lab2xyz, + lab2rgb: lab2rgb, + lab2lch: lab2lch, + + lch2lab: lch2lab, + lch2xyz: lch2xyz, + lch2rgb: lch2rgb +} + + +function rgb2hsl(rgb) { + var r = rgb[0]/255, + g = rgb[1]/255, + b = rgb[2]/255, + min = Math.min(r, g, b), + max = Math.max(r, g, b), + delta = max - min, + h, s, l; + + if (max == min) + h = 0; + else if (r == max) + h = (g - b) / delta; + else if (g == max) + h = 2 + (b - r) / delta; + else if (b == max) + h = 4 + (r - g)/ delta; + + h = Math.min(h * 60, 360); + + if (h < 0) + h += 360; + + l = (min + max) / 2; + + if (max == min) + s = 0; + else if (l <= 0.5) + s = delta / (max + min); + else + s = delta / (2 - max - min); + + return [h, s * 100, l * 100]; +} + +function rgb2hsv(rgb) { + var r = rgb[0], + g = rgb[1], + b = rgb[2], + min = Math.min(r, g, b), + max = Math.max(r, g, b), + delta = max - min, + h, s, v; + + if (max == 0) + s = 0; + else + s = (delta/max * 1000)/10; + + if (max == min) + h = 0; + else if (r == max) + h = (g - b) / delta; + else if (g == max) + h = 2 + (b - r) / delta; + else if (b == max) + h = 4 + (r - g) / delta; + + h = Math.min(h * 60, 360); + + if (h < 0) + h += 360; + + v = ((max / 255) * 1000) / 10; + + return [h, s, v]; +} + +function rgb2hwb(rgb) { + var r = rgb[0], + g = rgb[1], + b = rgb[2], + h = rgb2hsl(rgb)[0], + w = 1/255 * Math.min(r, Math.min(g, b)), + b = 1 - 1/255 * Math.max(r, Math.max(g, b)); + + return [h, w * 100, b * 100]; +} + +function rgb2cmyk(rgb) { + var r = rgb[0] / 255, + g = rgb[1] / 255, + b = rgb[2] / 255, + c, m, y, k; + + k = Math.min(1 - r, 1 - g, 1 - b); + c = (1 - r - k) / (1 - k) || 0; + m = (1 - g - k) / (1 - k) || 0; + y = (1 - b - k) / (1 - k) || 0; + return [c * 100, m * 100, y * 100, k * 100]; +} + +function rgb2keyword(rgb) { + return reverseKeywords[JSON.stringify(rgb)]; +} + +function rgb2xyz(rgb) { + var r = rgb[0] / 255, + g = rgb[1] / 255, + b = rgb[2] / 255; + + // assume sRGB + r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92); + g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92); + b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92); + + var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805); + var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722); + var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505); + + return [x * 100, y *100, z * 100]; +} + +function rgb2lab(rgb) { + var xyz = rgb2xyz(rgb), + x = xyz[0], + y = xyz[1], + z = xyz[2], + l, a, b; + + x /= 95.047; + y /= 100; + z /= 108.883; + + x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116); + y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116); + z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116); + + l = (116 * y) - 16; + a = 500 * (x - y); + b = 200 * (y - z); + + return [l, a, b]; +} + +function rgb2lch(args) { + return lab2lch(rgb2lab(args)); +} + +function hsl2rgb(hsl) { + var h = hsl[0] / 360, + s = hsl[1] / 100, + l = hsl[2] / 100, + t1, t2, t3, rgb, val; + + if (s == 0) { + val = l * 255; + return [val, val, val]; + } + + if (l < 0.5) + t2 = l * (1 + s); + else + t2 = l + s - l * s; + t1 = 2 * l - t2; + + rgb = [0, 0, 0]; + for (var i = 0; i < 3; i++) { + t3 = h + 1 / 3 * - (i - 1); + t3 < 0 && t3++; + t3 > 1 && t3--; + + if (6 * t3 < 1) + val = t1 + (t2 - t1) * 6 * t3; + else if (2 * t3 < 1) + val = t2; + else if (3 * t3 < 2) + val = t1 + (t2 - t1) * (2 / 3 - t3) * 6; + else + val = t1; + + rgb[i] = val * 255; + } + + return rgb; +} + +function hsl2hsv(hsl) { + var h = hsl[0], + s = hsl[1] / 100, + l = hsl[2] / 100, + sv, v; + + if(l === 0) { + // no need to do calc on black + // also avoids divide by 0 error + return [0, 0, 0]; + } + + l *= 2; + s *= (l <= 1) ? l : 2 - l; + v = (l + s) / 2; + sv = (2 * s) / (l + s); + return [h, sv * 100, v * 100]; +} + +function hsl2hwb(args) { + return rgb2hwb(hsl2rgb(args)); +} + +function hsl2cmyk(args) { + return rgb2cmyk(hsl2rgb(args)); +} + +function hsl2keyword(args) { + return rgb2keyword(hsl2rgb(args)); +} + + +function hsv2rgb(hsv) { + var h = hsv[0] / 60, + s = hsv[1] / 100, + v = hsv[2] / 100, + hi = Math.floor(h) % 6; + + var f = h - Math.floor(h), + p = 255 * v * (1 - s), + q = 255 * v * (1 - (s * f)), + t = 255 * v * (1 - (s * (1 - f))), + v = 255 * v; + + switch(hi) { + case 0: + return [v, t, p]; + case 1: + return [q, v, p]; + case 2: + return [p, v, t]; + case 3: + return [p, q, v]; + case 4: + return [t, p, v]; + case 5: + return [v, p, q]; + } +} + +function hsv2hsl(hsv) { + var h = hsv[0], + s = hsv[1] / 100, + v = hsv[2] / 100, + sl, l; + + l = (2 - s) * v; + sl = s * v; + sl /= (l <= 1) ? l : 2 - l; + sl = sl || 0; + l /= 2; + return [h, sl * 100, l * 100]; +} + +function hsv2hwb(args) { + return rgb2hwb(hsv2rgb(args)) +} + +function hsv2cmyk(args) { + return rgb2cmyk(hsv2rgb(args)); +} + +function hsv2keyword(args) { + return rgb2keyword(hsv2rgb(args)); +} + +// http://dev.w3.org/csswg/css-color/#hwb-to-rgb +function hwb2rgb(hwb) { + var h = hwb[0] / 360, + wh = hwb[1] / 100, + bl = hwb[2] / 100, + ratio = wh + bl, + i, v, f, n; + + // wh + bl cant be > 1 + if (ratio > 1) { + wh /= ratio; + bl /= ratio; + } + + i = Math.floor(6 * h); + v = 1 - bl; + f = 6 * h - i; + if ((i & 0x01) != 0) { + f = 1 - f; + } + n = wh + f * (v - wh); // linear interpolation + + switch (i) { + default: + case 6: + case 0: r = v; g = n; b = wh; break; + case 1: r = n; g = v; b = wh; break; + case 2: r = wh; g = v; b = n; break; + case 3: r = wh; g = n; b = v; break; + case 4: r = n; g = wh; b = v; break; + case 5: r = v; g = wh; b = n; break; + } + + return [r * 255, g * 255, b * 255]; +} + +function hwb2hsl(args) { + return rgb2hsl(hwb2rgb(args)); +} + +function hwb2hsv(args) { + return rgb2hsv(hwb2rgb(args)); +} + +function hwb2cmyk(args) { + return rgb2cmyk(hwb2rgb(args)); +} + +function hwb2keyword(args) { + return rgb2keyword(hwb2rgb(args)); +} + +function cmyk2rgb(cmyk) { + var c = cmyk[0] / 100, + m = cmyk[1] / 100, + y = cmyk[2] / 100, + k = cmyk[3] / 100, + r, g, b; + + r = 1 - Math.min(1, c * (1 - k) + k); + g = 1 - Math.min(1, m * (1 - k) + k); + b = 1 - Math.min(1, y * (1 - k) + k); + return [r * 255, g * 255, b * 255]; +} + +function cmyk2hsl(args) { + return rgb2hsl(cmyk2rgb(args)); +} + +function cmyk2hsv(args) { + return rgb2hsv(cmyk2rgb(args)); +} + +function cmyk2hwb(args) { + return rgb2hwb(cmyk2rgb(args)); +} + +function cmyk2keyword(args) { + return rgb2keyword(cmyk2rgb(args)); +} + + +function xyz2rgb(xyz) { + var x = xyz[0] / 100, + y = xyz[1] / 100, + z = xyz[2] / 100, + r, g, b; + + r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986); + g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415); + b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570); + + // assume sRGB + r = r > 0.0031308 ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055) + : r = (r * 12.92); + + g = g > 0.0031308 ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055) + : g = (g * 12.92); + + b = b > 0.0031308 ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055) + : b = (b * 12.92); + + r = Math.min(Math.max(0, r), 1); + g = Math.min(Math.max(0, g), 1); + b = Math.min(Math.max(0, b), 1); + + return [r * 255, g * 255, b * 255]; +} + +function xyz2lab(xyz) { + var x = xyz[0], + y = xyz[1], + z = xyz[2], + l, a, b; + + x /= 95.047; + y /= 100; + z /= 108.883; + + x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116); + y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116); + z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116); + + l = (116 * y) - 16; + a = 500 * (x - y); + b = 200 * (y - z); + + return [l, a, b]; +} + +function xyz2lch(args) { + return lab2lch(xyz2lab(args)); +} + +function lab2xyz(lab) { + var l = lab[0], + a = lab[1], + b = lab[2], + x, y, z, y2; + + if (l <= 8) { + y = (l * 100) / 903.3; + y2 = (7.787 * (y / 100)) + (16 / 116); + } else { + y = 100 * Math.pow((l + 16) / 116, 3); + y2 = Math.pow(y / 100, 1/3); + } + + x = x / 95.047 <= 0.008856 ? x = (95.047 * ((a / 500) + y2 - (16 / 116))) / 7.787 : 95.047 * Math.pow((a / 500) + y2, 3); + + z = z / 108.883 <= 0.008859 ? z = (108.883 * (y2 - (b / 200) - (16 / 116))) / 7.787 : 108.883 * Math.pow(y2 - (b / 200), 3); + + return [x, y, z]; +} + +function lab2lch(lab) { + var l = lab[0], + a = lab[1], + b = lab[2], + hr, h, c; + + hr = Math.atan2(b, a); + h = hr * 360 / 2 / Math.PI; + if (h < 0) { + h += 360; + } + c = Math.sqrt(a * a + b * b); + return [l, c, h]; +} + +function lab2rgb(args) { + return xyz2rgb(lab2xyz(args)); +} + +function lch2lab(lch) { + var l = lch[0], + c = lch[1], + h = lch[2], + a, b, hr; + + hr = h / 360 * 2 * Math.PI; + a = c * Math.cos(hr); + b = c * Math.sin(hr); + return [l, a, b]; +} + +function lch2xyz(args) { + return lab2xyz(lch2lab(args)); +} + +function lch2rgb(args) { + return lab2rgb(lch2lab(args)); +} + +function keyword2rgb(keyword) { + return cssKeywords[keyword]; +} + +function keyword2hsl(args) { + return rgb2hsl(keyword2rgb(args)); +} + +function keyword2hsv(args) { + return rgb2hsv(keyword2rgb(args)); +} + +function keyword2hwb(args) { + return rgb2hwb(keyword2rgb(args)); +} + +function keyword2cmyk(args) { + return rgb2cmyk(keyword2rgb(args)); +} + +function keyword2lab(args) { + return rgb2lab(keyword2rgb(args)); +} + +function keyword2xyz(args) { + return rgb2xyz(keyword2rgb(args)); +} + +var cssKeywords = { + aliceblue: [240,248,255], + antiquewhite: [250,235,215], + aqua: [0,255,255], + aquamarine: [127,255,212], + azure: [240,255,255], + beige: [245,245,220], + bisque: [255,228,196], + black: [0,0,0], + blanchedalmond: [255,235,205], + blue: [0,0,255], + blueviolet: [138,43,226], + brown: [165,42,42], + burlywood: [222,184,135], + cadetblue: [95,158,160], + chartreuse: [127,255,0], + chocolate: [210,105,30], + coral: [255,127,80], + cornflowerblue: [100,149,237], + cornsilk: [255,248,220], + crimson: [220,20,60], + cyan: [0,255,255], + darkblue: [0,0,139], + darkcyan: [0,139,139], + darkgoldenrod: [184,134,11], + darkgray: [169,169,169], + darkgreen: [0,100,0], + darkgrey: [169,169,169], + 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], + darkseagreen: [143,188,143], + darkslateblue: [72,61,139], + darkslategray: [47,79,79], + darkslategrey: [47,79,79], + darkturquoise: [0,206,209], + darkviolet: [148,0,211], + deeppink: [255,20,147], + deepskyblue: [0,191,255], + dimgray: [105,105,105], + dimgrey: [105,105,105], + dodgerblue: [30,144,255], + firebrick: [178,34,34], + floralwhite: [255,250,240], + forestgreen: [34,139,34], + fuchsia: [255,0,255], + gainsboro: [220,220,220], + ghostwhite: [248,248,255], + gold: [255,215,0], + goldenrod: [218,165,32], + gray: [128,128,128], + green: [0,128,0], + greenyellow: [173,255,47], + grey: [128,128,128], + honeydew: [240,255,240], + hotpink: [255,105,180], + indianred: [205,92,92], + indigo: [75,0,130], + ivory: [255,255,240], + khaki: [240,230,140], + lavender: [230,230,250], + lavenderblush: [255,240,245], + lawngreen: [124,252,0], + lemonchiffon: [255,250,205], + lightblue: [173,216,230], + lightcoral: [240,128,128], + lightcyan: [224,255,255], + lightgoldenrodyellow: [250,250,210], + lightgray: [211,211,211], + lightgreen: [144,238,144], + lightgrey: [211,211,211], + lightpink: [255,182,193], + lightsalmon: [255,160,122], + lightseagreen: [32,178,170], + lightskyblue: [135,206,250], + lightslategray: [119,136,153], + lightslategrey: [119,136,153], + lightsteelblue: [176,196,222], + lightyellow: [255,255,224], + lime: [0,255,0], + limegreen: [50,205,50], + linen: [250,240,230], + magenta: [255,0,255], + maroon: [128,0,0], + mediumaquamarine: [102,205,170], + mediumblue: [0,0,205], + mediumorchid: [186,85,211], + mediumpurple: [147,112,219], + mediumseagreen: [60,179,113], + mediumslateblue: [123,104,238], + mediumspringgreen: [0,250,154], + mediumturquoise: [72,209,204], + mediumvioletred: [199,21,133], + midnightblue: [25,25,112], + mintcream: [245,255,250], + mistyrose: [255,228,225], + moccasin: [255,228,181], + navajowhite: [255,222,173], + navy: [0,0,128], + oldlace: [253,245,230], + olive: [128,128,0], + olivedrab: [107,142,35], + orange: [255,165,0], + orangered: [255,69,0], + orchid: [218,112,214], + palegoldenrod: [238,232,170], + palegreen: [152,251,152], + paleturquoise: [175,238,238], + palevioletred: [219,112,147], + papayawhip: [255,239,213], + peachpuff: [255,218,185], + peru: [205,133,63], + pink: [255,192,203], + plum: [221,160,221], + powderblue: [176,224,230], + purple: [128,0,128], + rebeccapurple: [102, 51, 153], + red: [255,0,0], + rosybrown: [188,143,143], + royalblue: [65,105,225], + saddlebrown: [139,69,19], + salmon: [250,128,114], + sandybrown: [244,164,96], + seagreen: [46,139,87], + seashell: [255,245,238], + sienna: [160,82,45], + silver: [192,192,192], + skyblue: [135,206,235], + slateblue: [106,90,205], + slategray: [112,128,144], + slategrey: [112,128,144], + snow: [255,250,250], + springgreen: [0,255,127], + steelblue: [70,130,180], + tan: [210,180,140], + teal: [0,128,128], + thistle: [216,191,216], + tomato: [255,99,71], + turquoise: [64,224,208], + violet: [238,130,238], + wheat: [245,222,179], + white: [255,255,255], + whitesmoke: [245,245,245], + yellow: [255,255,0], + yellowgreen: [154,205,50] +}; + +var reverseKeywords = {}; +for (var key in cssKeywords) { + reverseKeywords[JSON.stringify(cssKeywords[key])] = key; +} + +},{}],5:[function(require,module,exports){ +var conversions = require(4); + +var convert = function() { + return new Converter(); +} + +for (var func in conversions) { + // export Raw versions + convert[func + "Raw"] = (function(func) { + // accept array or plain args + return function(arg) { + if (typeof arg == "number") + arg = Array.prototype.slice.call(arguments); + return conversions[func](arg); + } + })(func); + + var pair = /(\w+)2(\w+)/.exec(func), + from = pair[1], + to = pair[2]; + + // export rgb2hsl and ["rgb"]["hsl"] + convert[from] = convert[from] || {}; + + convert[from][to] = convert[func] = (function(func) { + return function(arg) { + if (typeof arg == "number") + arg = Array.prototype.slice.call(arguments); + + var val = conversions[func](arg); + if (typeof val == "string" || val === undefined) + return val; // keyword + + for (var i = 0; i < val.length; i++) + val[i] = Math.round(val[i]); + return val; + } + })(func); +} + + +/* Converter does lazy conversion and caching */ +var Converter = function() { + this.convs = {}; +}; + +/* Either get the values for a space or + set the values for a space, depending on args */ +Converter.prototype.routeSpace = function(space, args) { + var values = args[0]; + if (values === undefined) { + // color.rgb() + return this.getValues(space); + } + // color.rgb(10, 10, 10) + if (typeof values == "number") { + values = Array.prototype.slice.call(args); + } + + return this.setValues(space, values); +}; + +/* Set the values for a space, invalidating cache */ +Converter.prototype.setValues = function(space, values) { + this.space = space; + this.convs = {}; + this.convs[space] = values; + return this; +}; + +/* Get the values for a space. If there's already + a conversion for the space, fetch it, otherwise + compute it */ +Converter.prototype.getValues = function(space) { + var vals = this.convs[space]; + if (!vals) { + var fspace = this.space, + from = this.convs[fspace]; + vals = convert[fspace][space](from); + + this.convs[space] = vals; + } + return vals; +}; + +["rgb", "hsl", "hsv", "cmyk", "keyword"].forEach(function(space) { + Converter.prototype[space] = function(vals) { + return this.routeSpace(space, arguments); + } +}); + +module.exports = convert; +},{"4":4}],6:[function(require,module,exports){ +'use strict' + +module.exports = { + "aliceblue": [240, 248, 255], + "antiquewhite": [250, 235, 215], + "aqua": [0, 255, 255], + "aquamarine": [127, 255, 212], + "azure": [240, 255, 255], + "beige": [245, 245, 220], + "bisque": [255, 228, 196], + "black": [0, 0, 0], + "blanchedalmond": [255, 235, 205], + "blue": [0, 0, 255], + "blueviolet": [138, 43, 226], + "brown": [165, 42, 42], + "burlywood": [222, 184, 135], + "cadetblue": [95, 158, 160], + "chartreuse": [127, 255, 0], + "chocolate": [210, 105, 30], + "coral": [255, 127, 80], + "cornflowerblue": [100, 149, 237], + "cornsilk": [255, 248, 220], + "crimson": [220, 20, 60], + "cyan": [0, 255, 255], + "darkblue": [0, 0, 139], + "darkcyan": [0, 139, 139], + "darkgoldenrod": [184, 134, 11], + "darkgray": [169, 169, 169], + "darkgreen": [0, 100, 0], + "darkgrey": [169, 169, 169], + "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], + "darkseagreen": [143, 188, 143], + "darkslateblue": [72, 61, 139], + "darkslategray": [47, 79, 79], + "darkslategrey": [47, 79, 79], + "darkturquoise": [0, 206, 209], + "darkviolet": [148, 0, 211], + "deeppink": [255, 20, 147], + "deepskyblue": [0, 191, 255], + "dimgray": [105, 105, 105], + "dimgrey": [105, 105, 105], + "dodgerblue": [30, 144, 255], + "firebrick": [178, 34, 34], + "floralwhite": [255, 250, 240], + "forestgreen": [34, 139, 34], + "fuchsia": [255, 0, 255], + "gainsboro": [220, 220, 220], + "ghostwhite": [248, 248, 255], + "gold": [255, 215, 0], + "goldenrod": [218, 165, 32], + "gray": [128, 128, 128], + "green": [0, 128, 0], + "greenyellow": [173, 255, 47], + "grey": [128, 128, 128], + "honeydew": [240, 255, 240], + "hotpink": [255, 105, 180], + "indianred": [205, 92, 92], + "indigo": [75, 0, 130], + "ivory": [255, 255, 240], + "khaki": [240, 230, 140], + "lavender": [230, 230, 250], + "lavenderblush": [255, 240, 245], + "lawngreen": [124, 252, 0], + "lemonchiffon": [255, 250, 205], + "lightblue": [173, 216, 230], + "lightcoral": [240, 128, 128], + "lightcyan": [224, 255, 255], + "lightgoldenrodyellow": [250, 250, 210], + "lightgray": [211, 211, 211], + "lightgreen": [144, 238, 144], + "lightgrey": [211, 211, 211], + "lightpink": [255, 182, 193], + "lightsalmon": [255, 160, 122], + "lightseagreen": [32, 178, 170], + "lightskyblue": [135, 206, 250], + "lightslategray": [119, 136, 153], + "lightslategrey": [119, 136, 153], + "lightsteelblue": [176, 196, 222], + "lightyellow": [255, 255, 224], + "lime": [0, 255, 0], + "limegreen": [50, 205, 50], + "linen": [250, 240, 230], + "magenta": [255, 0, 255], + "maroon": [128, 0, 0], + "mediumaquamarine": [102, 205, 170], + "mediumblue": [0, 0, 205], + "mediumorchid": [186, 85, 211], + "mediumpurple": [147, 112, 219], + "mediumseagreen": [60, 179, 113], + "mediumslateblue": [123, 104, 238], + "mediumspringgreen": [0, 250, 154], + "mediumturquoise": [72, 209, 204], + "mediumvioletred": [199, 21, 133], + "midnightblue": [25, 25, 112], + "mintcream": [245, 255, 250], + "mistyrose": [255, 228, 225], + "moccasin": [255, 228, 181], + "navajowhite": [255, 222, 173], + "navy": [0, 0, 128], + "oldlace": [253, 245, 230], + "olive": [128, 128, 0], + "olivedrab": [107, 142, 35], + "orange": [255, 165, 0], + "orangered": [255, 69, 0], + "orchid": [218, 112, 214], + "palegoldenrod": [238, 232, 170], + "palegreen": [152, 251, 152], + "paleturquoise": [175, 238, 238], + "palevioletred": [219, 112, 147], + "papayawhip": [255, 239, 213], + "peachpuff": [255, 218, 185], + "peru": [205, 133, 63], + "pink": [255, 192, 203], + "plum": [221, 160, 221], + "powderblue": [176, 224, 230], + "purple": [128, 0, 128], + "rebeccapurple": [102, 51, 153], + "red": [255, 0, 0], + "rosybrown": [188, 143, 143], + "royalblue": [65, 105, 225], + "saddlebrown": [139, 69, 19], + "salmon": [250, 128, 114], + "sandybrown": [244, 164, 96], + "seagreen": [46, 139, 87], + "seashell": [255, 245, 238], + "sienna": [160, 82, 45], + "silver": [192, 192, 192], + "skyblue": [135, 206, 235], + "slateblue": [106, 90, 205], + "slategray": [112, 128, 144], + "slategrey": [112, 128, 144], + "snow": [255, 250, 250], + "springgreen": [0, 255, 127], + "steelblue": [70, 130, 180], + "tan": [210, 180, 140], + "teal": [0, 128, 128], + "thistle": [216, 191, 216], + "tomato": [255, 99, 71], + "turquoise": [64, 224, 208], + "violet": [238, 130, 238], + "wheat": [245, 222, 179], + "white": [255, 255, 255], + "whitesmoke": [245, 245, 245], + "yellow": [255, 255, 0], + "yellowgreen": [154, 205, 50] +}; + +},{}],7:[function(require,module,exports){ +/** + * @namespace Chart + */ +var Chart = require(29)(); + +Chart.helpers = require(45); + +// @todo dispatch these helpers into appropriated helpers/helpers.* file and write unit tests! +require(27)(Chart); + +Chart.defaults = require(25); +Chart.Element = require(26); +Chart.elements = require(40); +Chart.Interaction = require(28); +Chart.platform = require(48); + +require(31)(Chart); +require(22)(Chart); +require(23)(Chart); +require(24)(Chart); +require(30)(Chart); +require(33)(Chart); +require(32)(Chart); +require(35)(Chart); + +require(54)(Chart); +require(52)(Chart); +require(53)(Chart); +require(55)(Chart); +require(56)(Chart); +require(57)(Chart); + +// Controllers must be loaded after elements +// See Chart.core.datasetController.dataElementType +require(15)(Chart); +require(16)(Chart); +require(17)(Chart); +require(18)(Chart); +require(19)(Chart); +require(20)(Chart); +require(21)(Chart); + +require(8)(Chart); +require(9)(Chart); +require(10)(Chart); +require(11)(Chart); +require(12)(Chart); +require(13)(Chart); +require(14)(Chart); + +// Loading built-it plugins +var plugins = []; + +plugins.push( + require(49)(Chart), + require(50)(Chart), + require(51)(Chart) +); + +Chart.plugins.register(plugins); + +Chart.platform.initialize(); + +module.exports = Chart; +if (typeof window !== 'undefined') { + window.Chart = Chart; +} + +// DEPRECATIONS + +/** + * Provided for backward compatibility, use Chart.helpers.canvas instead. + * @namespace Chart.canvasHelpers + * @deprecated since version 2.6.0 + * @todo remove at version 3 + * @private + */ +Chart.canvasHelpers = Chart.helpers.canvas; + +},{"10":10,"11":11,"12":12,"13":13,"14":14,"15":15,"16":16,"17":17,"18":18,"19":19,"20":20,"21":21,"22":22,"23":23,"24":24,"25":25,"26":26,"27":27,"28":28,"29":29,"30":30,"31":31,"32":32,"33":33,"35":35,"40":40,"45":45,"48":48,"49":49,"50":50,"51":51,"52":52,"53":53,"54":54,"55":55,"56":56,"57":57,"8":8,"9":9}],8:[function(require,module,exports){ +'use strict'; + +module.exports = function(Chart) { + + Chart.Bar = function(context, config) { + config.type = 'bar'; + + return new Chart(context, config); + }; + +}; + +},{}],9:[function(require,module,exports){ +'use strict'; + +module.exports = function(Chart) { + + Chart.Bubble = function(context, config) { + config.type = 'bubble'; + return new Chart(context, config); + }; + +}; + +},{}],10:[function(require,module,exports){ +'use strict'; + +module.exports = function(Chart) { + + Chart.Doughnut = function(context, config) { + config.type = 'doughnut'; + + return new Chart(context, config); + }; + +}; + +},{}],11:[function(require,module,exports){ +'use strict'; + +module.exports = function(Chart) { + + Chart.Line = function(context, config) { + config.type = 'line'; + + return new Chart(context, config); + }; + +}; + +},{}],12:[function(require,module,exports){ +'use strict'; + +module.exports = function(Chart) { + + Chart.PolarArea = function(context, config) { + config.type = 'polarArea'; + + return new Chart(context, config); + }; + +}; + +},{}],13:[function(require,module,exports){ +'use strict'; + +module.exports = function(Chart) { + + Chart.Radar = function(context, config) { + config.type = 'radar'; + + return new Chart(context, config); + }; + +}; + +},{}],14:[function(require,module,exports){ +'use strict'; + +module.exports = function(Chart) { + Chart.Scatter = function(context, config) { + config.type = 'scatter'; + return new Chart(context, config); + }; +}; + +},{}],15:[function(require,module,exports){ +'use strict'; + +var defaults = require(25); +var elements = require(40); +var helpers = require(45); + +defaults._set('bar', { + hover: { + mode: 'label' + }, + + scales: { + xAxes: [{ + type: 'category', + + // Specific to Bar Controller + categoryPercentage: 0.8, + barPercentage: 0.9, + + // offset settings + offset: true, + + // grid line settings + gridLines: { + offsetGridLines: true + } + }], + + yAxes: [{ + type: 'linear' + }] + } +}); + +defaults._set('horizontalBar', { + hover: { + mode: 'index', + axis: 'y' + }, + + scales: { + xAxes: [{ + type: 'linear', + position: 'bottom' + }], + + yAxes: [{ + position: 'left', + type: 'category', + + // Specific to Horizontal Bar Controller + categoryPercentage: 0.8, + barPercentage: 0.9, + + // offset settings + offset: true, + + // grid line settings + gridLines: { + offsetGridLines: true + } + }] + }, + + elements: { + rectangle: { + borderSkipped: 'left' + } + }, + + tooltips: { + callbacks: { + title: function(item, data) { + // Pick first xLabel for now + var title = ''; + + if (item.length > 0) { + if (item[0].yLabel) { + title = item[0].yLabel; + } else if (data.labels.length > 0 && item[0].index < data.labels.length) { + title = data.labels[item[0].index]; + } + } + + return title; + }, + + label: function(item, data) { + var datasetLabel = data.datasets[item.datasetIndex].label || ''; + return datasetLabel + ': ' + item.xLabel; + } + }, + mode: 'index', + axis: 'y' + } +}); + +module.exports = function(Chart) { + + Chart.controllers.bar = Chart.DatasetController.extend({ + + dataElementType: elements.Rectangle, + + initialize: function() { + var me = this; + var meta; + + Chart.DatasetController.prototype.initialize.apply(me, arguments); + + meta = me.getMeta(); + meta.stack = me.getDataset().stack; + meta.bar = true; + }, + + update: function(reset) { + var me = this; + var rects = me.getMeta().data; + var i, ilen; + + me._ruler = me.getRuler(); + + for (i = 0, ilen = rects.length; i < ilen; ++i) { + me.updateElement(rects[i], i, reset); + } + }, + + updateElement: function(rectangle, index, reset) { + var me = this; + var chart = me.chart; + var meta = me.getMeta(); + var dataset = me.getDataset(); + var custom = rectangle.custom || {}; + var rectangleOptions = chart.options.elements.rectangle; + + rectangle._xScale = me.getScaleForId(meta.xAxisID); + rectangle._yScale = me.getScaleForId(meta.yAxisID); + rectangle._datasetIndex = me.index; + rectangle._index = index; + + rectangle._model = { + datasetLabel: dataset.label, + label: chart.data.labels[index], + borderSkipped: custom.borderSkipped ? custom.borderSkipped : rectangleOptions.borderSkipped, + backgroundColor: custom.backgroundColor ? custom.backgroundColor : helpers.valueAtIndexOrDefault(dataset.backgroundColor, index, rectangleOptions.backgroundColor), + borderColor: custom.borderColor ? custom.borderColor : helpers.valueAtIndexOrDefault(dataset.borderColor, index, rectangleOptions.borderColor), + borderWidth: custom.borderWidth ? custom.borderWidth : helpers.valueAtIndexOrDefault(dataset.borderWidth, index, rectangleOptions.borderWidth) + }; + + me.updateElementGeometry(rectangle, index, reset); + + rectangle.pivot(); + }, + + /** + * @private + */ + updateElementGeometry: function(rectangle, index, reset) { + var me = this; + var model = rectangle._model; + var vscale = me.getValueScale(); + var base = vscale.getBasePixel(); + var horizontal = vscale.isHorizontal(); + var ruler = me._ruler || me.getRuler(); + var vpixels = me.calculateBarValuePixels(me.index, index); + var ipixels = me.calculateBarIndexPixels(me.index, index, ruler); + + model.horizontal = horizontal; + model.base = reset ? base : vpixels.base; + model.x = horizontal ? reset ? base : vpixels.head : ipixels.center; + model.y = horizontal ? ipixels.center : reset ? base : vpixels.head; + model.height = horizontal ? ipixels.size : undefined; + model.width = horizontal ? undefined : ipixels.size; + }, + + /** + * @private + */ + getValueScaleId: function() { + return this.getMeta().yAxisID; + }, + + /** + * @private + */ + getIndexScaleId: function() { + return this.getMeta().xAxisID; + }, + + /** + * @private + */ + getValueScale: function() { + return this.getScaleForId(this.getValueScaleId()); + }, + + /** + * @private + */ + getIndexScale: function() { + return this.getScaleForId(this.getIndexScaleId()); + }, + + /** + * Returns the effective number of stacks based on groups and bar visibility. + * @private + */ + getStackCount: function(last) { + var me = this; + var chart = me.chart; + var scale = me.getIndexScale(); + var stacked = scale.options.stacked; + var ilen = last === undefined ? chart.data.datasets.length : last + 1; + var stacks = []; + var i, meta; + + for (i = 0; i < ilen; ++i) { + meta = chart.getDatasetMeta(i); + if (meta.bar && chart.isDatasetVisible(i) && + (stacked === false || + (stacked === true && stacks.indexOf(meta.stack) === -1) || + (stacked === undefined && (meta.stack === undefined || stacks.indexOf(meta.stack) === -1)))) { + stacks.push(meta.stack); + } + } + + return stacks.length; + }, + + /** + * Returns the stack index for the given dataset based on groups and bar visibility. + * @private + */ + getStackIndex: function(datasetIndex) { + return this.getStackCount(datasetIndex) - 1; + }, + + /** + * @private + */ + getRuler: function() { + var me = this; + var scale = me.getIndexScale(); + var stackCount = me.getStackCount(); + var datasetIndex = me.index; + var pixels = []; + var isHorizontal = scale.isHorizontal(); + var start = isHorizontal ? scale.left : scale.top; + var end = start + (isHorizontal ? scale.width : scale.height); + var i, ilen; + + for (i = 0, ilen = me.getMeta().data.length; i < ilen; ++i) { + pixels.push(scale.getPixelForValue(null, i, datasetIndex)); + } + + return { + pixels: pixels, + start: start, + end: end, + stackCount: stackCount, + scale: scale + }; + }, + + /** + * Note: pixel values are not clamped to the scale area. + * @private + */ + calculateBarValuePixels: function(datasetIndex, index) { + var me = this; + var chart = me.chart; + var meta = me.getMeta(); + var scale = me.getValueScale(); + var datasets = chart.data.datasets; + var value = scale.getRightValue(datasets[datasetIndex].data[index]); + var stacked = scale.options.stacked; + var stack = meta.stack; + var start = 0; + var i, imeta, ivalue, base, head, size; + + if (stacked || (stacked === undefined && stack !== undefined)) { + for (i = 0; i < datasetIndex; ++i) { + imeta = chart.getDatasetMeta(i); + + if (imeta.bar && + imeta.stack === stack && + imeta.controller.getValueScaleId() === scale.id && + chart.isDatasetVisible(i)) { + + ivalue = scale.getRightValue(datasets[i].data[index]); + if ((value < 0 && ivalue < 0) || (value >= 0 && ivalue > 0)) { + start += ivalue; + } + } + } + } + + base = scale.getPixelForValue(start); + head = scale.getPixelForValue(start + value); + size = (head - base) / 2; + + return { + size: size, + base: base, + head: head, + center: head + size / 2 + }; + }, + + /** + * @private + */ + calculateBarIndexPixels: function(datasetIndex, index, ruler) { + var me = this; + var options = ruler.scale.options; + var stackIndex = me.getStackIndex(datasetIndex); + var pixels = ruler.pixels; + var base = pixels[index]; + var length = pixels.length; + var start = ruler.start; + var end = ruler.end; + var leftSampleSize, rightSampleSize, leftCategorySize, rightCategorySize, fullBarSize, size; + + if (length === 1) { + leftSampleSize = base > start ? base - start : end - base; + rightSampleSize = base < end ? end - base : base - start; + } else { + if (index > 0) { + leftSampleSize = (base - pixels[index - 1]) / 2; + if (index === length - 1) { + rightSampleSize = leftSampleSize; + } + } + if (index < length - 1) { + rightSampleSize = (pixels[index + 1] - base) / 2; + if (index === 0) { + leftSampleSize = rightSampleSize; + } + } + } + + leftCategorySize = leftSampleSize * options.categoryPercentage; + rightCategorySize = rightSampleSize * options.categoryPercentage; + fullBarSize = (leftCategorySize + rightCategorySize) / ruler.stackCount; + size = fullBarSize * options.barPercentage; + + size = Math.min( + helpers.valueOrDefault(options.barThickness, size), + helpers.valueOrDefault(options.maxBarThickness, Infinity)); + + base -= leftCategorySize; + base += fullBarSize * stackIndex; + base += (fullBarSize - size) / 2; + + return { + size: size, + base: base, + head: base + size, + center: base + size / 2 + }; + }, + + draw: function() { + var me = this; + var chart = me.chart; + var scale = me.getValueScale(); + var rects = me.getMeta().data; + var dataset = me.getDataset(); + var ilen = rects.length; + var i = 0; + + helpers.canvas.clipArea(chart.ctx, chart.chartArea); + + for (; i < ilen; ++i) { + if (!isNaN(scale.getRightValue(dataset.data[i]))) { + rects[i].draw(); + } + } + + helpers.canvas.unclipArea(chart.ctx); + }, + + setHoverStyle: function(rectangle) { + var dataset = this.chart.data.datasets[rectangle._datasetIndex]; + var index = rectangle._index; + var custom = rectangle.custom || {}; + var model = rectangle._model; + + model.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : helpers.valueAtIndexOrDefault(dataset.hoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor)); + model.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : helpers.valueAtIndexOrDefault(dataset.hoverBorderColor, index, helpers.getHoverColor(model.borderColor)); + model.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : helpers.valueAtIndexOrDefault(dataset.hoverBorderWidth, index, model.borderWidth); + }, + + removeHoverStyle: function(rectangle) { + var dataset = this.chart.data.datasets[rectangle._datasetIndex]; + var index = rectangle._index; + var custom = rectangle.custom || {}; + var model = rectangle._model; + var rectangleElementOptions = this.chart.options.elements.rectangle; + + model.backgroundColor = custom.backgroundColor ? custom.backgroundColor : helpers.valueAtIndexOrDefault(dataset.backgroundColor, index, rectangleElementOptions.backgroundColor); + model.borderColor = custom.borderColor ? custom.borderColor : helpers.valueAtIndexOrDefault(dataset.borderColor, index, rectangleElementOptions.borderColor); + model.borderWidth = custom.borderWidth ? custom.borderWidth : helpers.valueAtIndexOrDefault(dataset.borderWidth, index, rectangleElementOptions.borderWidth); + } + }); + + Chart.controllers.horizontalBar = Chart.controllers.bar.extend({ + /** + * @private + */ + getValueScaleId: function() { + return this.getMeta().xAxisID; + }, + + /** + * @private + */ + getIndexScaleId: function() { + return this.getMeta().yAxisID; + } + }); +}; + +},{"25":25,"40":40,"45":45}],16:[function(require,module,exports){ +'use strict'; + +var defaults = require(25); +var elements = require(40); +var helpers = require(45); + +defaults._set('bubble', { + hover: { + mode: 'single' + }, + + scales: { + xAxes: [{ + type: 'linear', // bubble should probably use a linear scale by default + position: 'bottom', + id: 'x-axis-0' // need an ID so datasets can reference the scale + }], + yAxes: [{ + type: 'linear', + position: 'left', + id: 'y-axis-0' + }] + }, + + tooltips: { + callbacks: { + title: function() { + // Title doesn't make sense for scatter since we format the data as a point + return ''; + }, + label: function(item, data) { + var datasetLabel = data.datasets[item.datasetIndex].label || ''; + var dataPoint = data.datasets[item.datasetIndex].data[item.index]; + return datasetLabel + ': (' + item.xLabel + ', ' + item.yLabel + ', ' + dataPoint.r + ')'; + } + } + } +}); + + +module.exports = function(Chart) { + + Chart.controllers.bubble = Chart.DatasetController.extend({ + /** + * @protected + */ + dataElementType: elements.Point, + + /** + * @protected + */ + update: function(reset) { + var me = this; + var meta = me.getMeta(); + var points = meta.data; + + // Update Points + helpers.each(points, function(point, index) { + me.updateElement(point, index, reset); + }); + }, + + /** + * @protected + */ + updateElement: function(point, index, reset) { + var me = this; + var meta = me.getMeta(); + var custom = point.custom || {}; + var xScale = me.getScaleForId(meta.xAxisID); + var yScale = me.getScaleForId(meta.yAxisID); + var options = me._resolveElementOptions(point, index); + var data = me.getDataset().data[index]; + var dsIndex = me.index; + + var x = reset ? xScale.getPixelForDecimal(0.5) : xScale.getPixelForValue(typeof data === 'object' ? data : NaN, index, dsIndex); + var y = reset ? yScale.getBasePixel() : yScale.getPixelForValue(data, index, dsIndex); + + point._xScale = xScale; + point._yScale = yScale; + point._options = options; + point._datasetIndex = dsIndex; + point._index = index; + point._model = { + backgroundColor: options.backgroundColor, + borderColor: options.borderColor, + borderWidth: options.borderWidth, + hitRadius: options.hitRadius, + pointStyle: options.pointStyle, + radius: reset ? 0 : options.radius, + skip: custom.skip || isNaN(x) || isNaN(y), + x: x, + y: y, + }; + + point.pivot(); + }, + + /** + * @protected + */ + setHoverStyle: function(point) { + var model = point._model; + var options = point._options; + + model.backgroundColor = helpers.valueOrDefault(options.hoverBackgroundColor, helpers.getHoverColor(options.backgroundColor)); + model.borderColor = helpers.valueOrDefault(options.hoverBorderColor, helpers.getHoverColor(options.borderColor)); + model.borderWidth = helpers.valueOrDefault(options.hoverBorderWidth, options.borderWidth); + model.radius = options.radius + options.hoverRadius; + }, + + /** + * @protected + */ + removeHoverStyle: function(point) { + var model = point._model; + var options = point._options; + + model.backgroundColor = options.backgroundColor; + model.borderColor = options.borderColor; + model.borderWidth = options.borderWidth; + model.radius = options.radius; + }, + + /** + * @private + */ + _resolveElementOptions: function(point, index) { + var me = this; + var chart = me.chart; + var datasets = chart.data.datasets; + var dataset = datasets[me.index]; + var custom = point.custom || {}; + var options = chart.options.elements.point; + var resolve = helpers.options.resolve; + var data = dataset.data[index]; + var values = {}; + var i, ilen, key; + + // Scriptable options + var context = { + chart: chart, + dataIndex: index, + dataset: dataset, + datasetIndex: me.index + }; + + var keys = [ + 'backgroundColor', + 'borderColor', + 'borderWidth', + 'hoverBackgroundColor', + 'hoverBorderColor', + 'hoverBorderWidth', + 'hoverRadius', + 'hitRadius', + 'pointStyle' + ]; + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve([ + custom[key], + dataset[key], + options[key] + ], context, index); + } + + // Custom radius resolution + values.radius = resolve([ + custom.radius, + data ? data.r : undefined, + dataset.radius, + options.radius + ], context, index); + + return values; + } + }); +}; + +},{"25":25,"40":40,"45":45}],17:[function(require,module,exports){ +'use strict'; + +var defaults = require(25); +var elements = require(40); +var helpers = require(45); + +defaults._set('doughnut', { + animation: { + // Boolean - Whether we animate the rotation of the Doughnut + animateRotate: true, + // Boolean - Whether we animate scaling the Doughnut from the centre + animateScale: false + }, + hover: { + mode: 'single' + }, + legendCallback: function(chart) { + var text = []; + text.push('
        '); + + var data = chart.data; + var datasets = data.datasets; + var labels = data.labels; + + if (datasets.length) { + for (var i = 0; i < datasets[0].data.length; ++i) { + text.push('
      • '); + if (labels[i]) { + text.push(labels[i]); + } + text.push('
      • '); + } + } + + text.push('
      '); + return text.join(''); + }, + legend: { + labels: { + generateLabels: function(chart) { + var data = chart.data; + if (data.labels.length && data.datasets.length) { + return data.labels.map(function(label, i) { + var meta = chart.getDatasetMeta(0); + var ds = data.datasets[0]; + var arc = meta.data[i]; + var custom = arc && arc.custom || {}; + var valueAtIndexOrDefault = helpers.valueAtIndexOrDefault; + var arcOpts = chart.options.elements.arc; + var fill = custom.backgroundColor ? custom.backgroundColor : valueAtIndexOrDefault(ds.backgroundColor, i, arcOpts.backgroundColor); + var stroke = custom.borderColor ? custom.borderColor : valueAtIndexOrDefault(ds.borderColor, i, arcOpts.borderColor); + var bw = custom.borderWidth ? custom.borderWidth : valueAtIndexOrDefault(ds.borderWidth, i, arcOpts.borderWidth); + + return { + text: label, + fillStyle: fill, + strokeStyle: stroke, + lineWidth: bw, + hidden: isNaN(ds.data[i]) || meta.data[i].hidden, + + // Extra data used for toggling the correct item + index: i + }; + }); + } + return []; + } + }, + + onClick: function(e, legendItem) { + var index = legendItem.index; + var chart = this.chart; + var i, ilen, meta; + + for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) { + meta = chart.getDatasetMeta(i); + // toggle visibility of index if exists + if (meta.data[index]) { + meta.data[index].hidden = !meta.data[index].hidden; + } + } + + chart.update(); + } + }, + + // The percentage of the chart that we cut out of the middle. + cutoutPercentage: 50, + + // The rotation of the chart, where the first data arc begins. + rotation: Math.PI * -0.5, + + // The total circumference of the chart. + circumference: Math.PI * 2.0, + + // Need to override these to give a nice default + tooltips: { + callbacks: { + title: function() { + return ''; + }, + label: function(tooltipItem, data) { + var dataLabel = data.labels[tooltipItem.index]; + var value = ': ' + data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index]; + + if (helpers.isArray(dataLabel)) { + // show value on first line of multiline label + // need to clone because we are changing the value + dataLabel = dataLabel.slice(); + dataLabel[0] += value; + } else { + dataLabel += value; + } + + return dataLabel; + } + } + } +}); + +defaults._set('pie', helpers.clone(defaults.doughnut)); +defaults._set('pie', { + cutoutPercentage: 0 +}); + +module.exports = function(Chart) { + + Chart.controllers.doughnut = Chart.controllers.pie = Chart.DatasetController.extend({ + + dataElementType: elements.Arc, + + linkScales: helpers.noop, + + // Get index of the dataset in relation to the visible datasets. This allows determining the inner and outer radius correctly + getRingIndex: function(datasetIndex) { + var ringIndex = 0; + + for (var j = 0; j < datasetIndex; ++j) { + if (this.chart.isDatasetVisible(j)) { + ++ringIndex; + } + } + + return ringIndex; + }, + + update: function(reset) { + var me = this; + var chart = me.chart; + var chartArea = chart.chartArea; + var opts = chart.options; + var arcOpts = opts.elements.arc; + var availableWidth = chartArea.right - chartArea.left - arcOpts.borderWidth; + var availableHeight = chartArea.bottom - chartArea.top - arcOpts.borderWidth; + var minSize = Math.min(availableWidth, availableHeight); + var offset = {x: 0, y: 0}; + var meta = me.getMeta(); + var cutoutPercentage = opts.cutoutPercentage; + var circumference = opts.circumference; + + // If the chart's circumference isn't a full circle, calculate minSize as a ratio of the width/height of the arc + if (circumference < Math.PI * 2.0) { + var startAngle = opts.rotation % (Math.PI * 2.0); + startAngle += Math.PI * 2.0 * (startAngle >= Math.PI ? -1 : startAngle < -Math.PI ? 1 : 0); + var endAngle = startAngle + circumference; + var start = {x: Math.cos(startAngle), y: Math.sin(startAngle)}; + var end = {x: Math.cos(endAngle), y: Math.sin(endAngle)}; + var contains0 = (startAngle <= 0 && endAngle >= 0) || (startAngle <= Math.PI * 2.0 && Math.PI * 2.0 <= endAngle); + var contains90 = (startAngle <= Math.PI * 0.5 && Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 2.5 && Math.PI * 2.5 <= endAngle); + var contains180 = (startAngle <= -Math.PI && -Math.PI <= endAngle) || (startAngle <= Math.PI && Math.PI <= endAngle); + var contains270 = (startAngle <= -Math.PI * 0.5 && -Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 1.5 && Math.PI * 1.5 <= endAngle); + var cutout = cutoutPercentage / 100.0; + var min = {x: contains180 ? -1 : Math.min(start.x * (start.x < 0 ? 1 : cutout), end.x * (end.x < 0 ? 1 : cutout)), y: contains270 ? -1 : Math.min(start.y * (start.y < 0 ? 1 : cutout), end.y * (end.y < 0 ? 1 : cutout))}; + var max = {x: contains0 ? 1 : Math.max(start.x * (start.x > 0 ? 1 : cutout), end.x * (end.x > 0 ? 1 : cutout)), y: contains90 ? 1 : Math.max(start.y * (start.y > 0 ? 1 : cutout), end.y * (end.y > 0 ? 1 : cutout))}; + var size = {width: (max.x - min.x) * 0.5, height: (max.y - min.y) * 0.5}; + minSize = Math.min(availableWidth / size.width, availableHeight / size.height); + offset = {x: (max.x + min.x) * -0.5, y: (max.y + min.y) * -0.5}; + } + + chart.borderWidth = me.getMaxBorderWidth(meta.data); + chart.outerRadius = Math.max((minSize - chart.borderWidth) / 2, 0); + chart.innerRadius = Math.max(cutoutPercentage ? (chart.outerRadius / 100) * (cutoutPercentage) : 0, 0); + chart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount(); + chart.offsetX = offset.x * chart.outerRadius; + chart.offsetY = offset.y * chart.outerRadius; + + meta.total = me.calculateTotal(); + + me.outerRadius = chart.outerRadius - (chart.radiusLength * me.getRingIndex(me.index)); + me.innerRadius = Math.max(me.outerRadius - chart.radiusLength, 0); + + helpers.each(meta.data, function(arc, index) { + me.updateElement(arc, index, reset); + }); + }, + + updateElement: function(arc, index, reset) { + var me = this; + var chart = me.chart; + var chartArea = chart.chartArea; + var opts = chart.options; + var animationOpts = opts.animation; + var centerX = (chartArea.left + chartArea.right) / 2; + var centerY = (chartArea.top + chartArea.bottom) / 2; + var startAngle = opts.rotation; // non reset case handled later + var endAngle = opts.rotation; // non reset case handled later + var dataset = me.getDataset(); + var circumference = reset && animationOpts.animateRotate ? 0 : arc.hidden ? 0 : me.calculateCircumference(dataset.data[index]) * (opts.circumference / (2.0 * Math.PI)); + var innerRadius = reset && animationOpts.animateScale ? 0 : me.innerRadius; + var outerRadius = reset && animationOpts.animateScale ? 0 : me.outerRadius; + var valueAtIndexOrDefault = helpers.valueAtIndexOrDefault; + + helpers.extend(arc, { + // Utility + _datasetIndex: me.index, + _index: index, + + // Desired view properties + _model: { + x: centerX + chart.offsetX, + y: centerY + chart.offsetY, + startAngle: startAngle, + endAngle: endAngle, + circumference: circumference, + outerRadius: outerRadius, + innerRadius: innerRadius, + label: valueAtIndexOrDefault(dataset.label, index, chart.data.labels[index]) + } + }); + + var model = arc._model; + // Resets the visual styles + this.removeHoverStyle(arc); + + // Set correct angles if not resetting + if (!reset || !animationOpts.animateRotate) { + if (index === 0) { + model.startAngle = opts.rotation; + } else { + model.startAngle = me.getMeta().data[index - 1]._model.endAngle; + } + + model.endAngle = model.startAngle + model.circumference; + } + + arc.pivot(); + }, + + removeHoverStyle: function(arc) { + Chart.DatasetController.prototype.removeHoverStyle.call(this, arc, this.chart.options.elements.arc); + }, + + calculateTotal: function() { + var dataset = this.getDataset(); + var meta = this.getMeta(); + var total = 0; + var value; + + helpers.each(meta.data, function(element, index) { + value = dataset.data[index]; + if (!isNaN(value) && !element.hidden) { + total += Math.abs(value); + } + }); + + /* if (total === 0) { + total = NaN; + }*/ + + return total; + }, + + calculateCircumference: function(value) { + var total = this.getMeta().total; + if (total > 0 && !isNaN(value)) { + return (Math.PI * 2.0) * (value / total); + } + return 0; + }, + + // gets the max border or hover width to properly scale pie charts + getMaxBorderWidth: function(arcs) { + var max = 0; + var index = this.index; + var length = arcs.length; + var borderWidth; + var hoverWidth; + + for (var i = 0; i < length; i++) { + borderWidth = arcs[i]._model ? arcs[i]._model.borderWidth : 0; + hoverWidth = arcs[i]._chart ? arcs[i]._chart.config.data.datasets[index].hoverBorderWidth : 0; + + max = borderWidth > max ? borderWidth : max; + max = hoverWidth > max ? hoverWidth : max; + } + return max; + } + }); +}; + +},{"25":25,"40":40,"45":45}],18:[function(require,module,exports){ +'use strict'; + +var defaults = require(25); +var elements = require(40); +var helpers = require(45); + +defaults._set('line', { + showLines: true, + spanGaps: false, + + hover: { + mode: 'label' + }, + + scales: { + xAxes: [{ + type: 'category', + id: 'x-axis-0' + }], + yAxes: [{ + type: 'linear', + id: 'y-axis-0' + }] + } +}); + +module.exports = function(Chart) { + + function lineEnabled(dataset, options) { + return helpers.valueOrDefault(dataset.showLine, options.showLines); + } + + Chart.controllers.line = Chart.DatasetController.extend({ + + datasetElementType: elements.Line, + + dataElementType: elements.Point, + + update: function(reset) { + var me = this; + var meta = me.getMeta(); + var line = meta.dataset; + var points = meta.data || []; + var options = me.chart.options; + var lineElementOptions = options.elements.line; + var scale = me.getScaleForId(meta.yAxisID); + var i, ilen, custom; + var dataset = me.getDataset(); + var showLine = lineEnabled(dataset, options); + + // Update Line + if (showLine) { + custom = line.custom || {}; + + // Compatibility: If the properties are defined with only the old name, use those values + if ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) { + dataset.lineTension = dataset.tension; + } + + // Utility + line._scale = scale; + line._datasetIndex = me.index; + // Data + line._children = points; + // Model + line._model = { + // Appearance + // The default behavior of lines is to break at null values, according + // to https://github.com/chartjs/Chart.js/issues/2435#issuecomment-216718158 + // This option gives lines the ability to span gaps + spanGaps: dataset.spanGaps ? dataset.spanGaps : options.spanGaps, + tension: custom.tension ? custom.tension : helpers.valueOrDefault(dataset.lineTension, lineElementOptions.tension), + backgroundColor: custom.backgroundColor ? custom.backgroundColor : (dataset.backgroundColor || lineElementOptions.backgroundColor), + borderWidth: custom.borderWidth ? custom.borderWidth : (dataset.borderWidth || lineElementOptions.borderWidth), + borderColor: custom.borderColor ? custom.borderColor : (dataset.borderColor || lineElementOptions.borderColor), + borderCapStyle: custom.borderCapStyle ? custom.borderCapStyle : (dataset.borderCapStyle || lineElementOptions.borderCapStyle), + borderDash: custom.borderDash ? custom.borderDash : (dataset.borderDash || lineElementOptions.borderDash), + borderDashOffset: custom.borderDashOffset ? custom.borderDashOffset : (dataset.borderDashOffset || lineElementOptions.borderDashOffset), + borderJoinStyle: custom.borderJoinStyle ? custom.borderJoinStyle : (dataset.borderJoinStyle || lineElementOptions.borderJoinStyle), + fill: custom.fill ? custom.fill : (dataset.fill !== undefined ? dataset.fill : lineElementOptions.fill), + steppedLine: custom.steppedLine ? custom.steppedLine : helpers.valueOrDefault(dataset.steppedLine, lineElementOptions.stepped), + cubicInterpolationMode: custom.cubicInterpolationMode ? custom.cubicInterpolationMode : helpers.valueOrDefault(dataset.cubicInterpolationMode, lineElementOptions.cubicInterpolationMode), + }; + + line.pivot(); + } + + // Update Points + for (i = 0, ilen = points.length; i < ilen; ++i) { + me.updateElement(points[i], i, reset); + } + + if (showLine && line._model.tension !== 0) { + me.updateBezierControlPoints(); + } + + // Now pivot the point for animation + for (i = 0, ilen = points.length; i < ilen; ++i) { + points[i].pivot(); + } + }, + + getPointBackgroundColor: function(point, index) { + var backgroundColor = this.chart.options.elements.point.backgroundColor; + var dataset = this.getDataset(); + var custom = point.custom || {}; + + if (custom.backgroundColor) { + backgroundColor = custom.backgroundColor; + } else if (dataset.pointBackgroundColor) { + backgroundColor = helpers.valueAtIndexOrDefault(dataset.pointBackgroundColor, index, backgroundColor); + } else if (dataset.backgroundColor) { + backgroundColor = dataset.backgroundColor; + } + + return backgroundColor; + }, + + getPointBorderColor: function(point, index) { + var borderColor = this.chart.options.elements.point.borderColor; + var dataset = this.getDataset(); + var custom = point.custom || {}; + + if (custom.borderColor) { + borderColor = custom.borderColor; + } else if (dataset.pointBorderColor) { + borderColor = helpers.valueAtIndexOrDefault(dataset.pointBorderColor, index, borderColor); + } else if (dataset.borderColor) { + borderColor = dataset.borderColor; + } + + return borderColor; + }, + + getPointBorderWidth: function(point, index) { + var borderWidth = this.chart.options.elements.point.borderWidth; + var dataset = this.getDataset(); + var custom = point.custom || {}; + + if (!isNaN(custom.borderWidth)) { + borderWidth = custom.borderWidth; + } else if (!isNaN(dataset.pointBorderWidth) || helpers.isArray(dataset.pointBorderWidth)) { + borderWidth = helpers.valueAtIndexOrDefault(dataset.pointBorderWidth, index, borderWidth); + } else if (!isNaN(dataset.borderWidth)) { + borderWidth = dataset.borderWidth; + } + + return borderWidth; + }, + + updateElement: function(point, index, reset) { + var me = this; + var meta = me.getMeta(); + var custom = point.custom || {}; + var dataset = me.getDataset(); + var datasetIndex = me.index; + var value = dataset.data[index]; + var yScale = me.getScaleForId(meta.yAxisID); + var xScale = me.getScaleForId(meta.xAxisID); + var pointOptions = me.chart.options.elements.point; + var x, y; + + // Compatibility: If the properties are defined with only the old name, use those values + if ((dataset.radius !== undefined) && (dataset.pointRadius === undefined)) { + dataset.pointRadius = dataset.radius; + } + if ((dataset.hitRadius !== undefined) && (dataset.pointHitRadius === undefined)) { + dataset.pointHitRadius = dataset.hitRadius; + } + + x = xScale.getPixelForValue(typeof value === 'object' ? value : NaN, index, datasetIndex); + y = reset ? yScale.getBasePixel() : me.calculatePointY(value, index, datasetIndex); + + // Utility + point._xScale = xScale; + point._yScale = yScale; + point._datasetIndex = datasetIndex; + point._index = index; + + // Desired view properties + point._model = { + x: x, + y: y, + skip: custom.skip || isNaN(x) || isNaN(y), + // Appearance + radius: custom.radius || helpers.valueAtIndexOrDefault(dataset.pointRadius, index, pointOptions.radius), + pointStyle: custom.pointStyle || helpers.valueAtIndexOrDefault(dataset.pointStyle, index, pointOptions.pointStyle), + backgroundColor: me.getPointBackgroundColor(point, index), + borderColor: me.getPointBorderColor(point, index), + borderWidth: me.getPointBorderWidth(point, index), + tension: meta.dataset._model ? meta.dataset._model.tension : 0, + steppedLine: meta.dataset._model ? meta.dataset._model.steppedLine : false, + // Tooltip + hitRadius: custom.hitRadius || helpers.valueAtIndexOrDefault(dataset.pointHitRadius, index, pointOptions.hitRadius) + }; + }, + + calculatePointY: function(value, index, datasetIndex) { + var me = this; + var chart = me.chart; + var meta = me.getMeta(); + var yScale = me.getScaleForId(meta.yAxisID); + var sumPos = 0; + var sumNeg = 0; + var i, ds, dsMeta; + + if (yScale.options.stacked) { + for (i = 0; i < datasetIndex; i++) { + ds = chart.data.datasets[i]; + dsMeta = chart.getDatasetMeta(i); + if (dsMeta.type === 'line' && dsMeta.yAxisID === yScale.id && chart.isDatasetVisible(i)) { + var stackedRightValue = Number(yScale.getRightValue(ds.data[index])); + if (stackedRightValue < 0) { + sumNeg += stackedRightValue || 0; + } else { + sumPos += stackedRightValue || 0; + } + } + } + + var rightValue = Number(yScale.getRightValue(value)); + if (rightValue < 0) { + return yScale.getPixelForValue(sumNeg + rightValue); + } + return yScale.getPixelForValue(sumPos + rightValue); + } + + return yScale.getPixelForValue(value); + }, + + updateBezierControlPoints: function() { + var me = this; + var meta = me.getMeta(); + var area = me.chart.chartArea; + var points = (meta.data || []); + var i, ilen, point, model, controlPoints; + + // Only consider points that are drawn in case the spanGaps option is used + if (meta.dataset._model.spanGaps) { + points = points.filter(function(pt) { + return !pt._model.skip; + }); + } + + function capControlPoint(pt, min, max) { + return Math.max(Math.min(pt, max), min); + } + + if (meta.dataset._model.cubicInterpolationMode === 'monotone') { + helpers.splineCurveMonotone(points); + } else { + for (i = 0, ilen = points.length; i < ilen; ++i) { + point = points[i]; + model = point._model; + controlPoints = helpers.splineCurve( + helpers.previousItem(points, i)._model, + model, + helpers.nextItem(points, i)._model, + meta.dataset._model.tension + ); + model.controlPointPreviousX = controlPoints.previous.x; + model.controlPointPreviousY = controlPoints.previous.y; + model.controlPointNextX = controlPoints.next.x; + model.controlPointNextY = controlPoints.next.y; + } + } + + if (me.chart.options.elements.line.capBezierPoints) { + for (i = 0, ilen = points.length; i < ilen; ++i) { + model = points[i]._model; + model.controlPointPreviousX = capControlPoint(model.controlPointPreviousX, area.left, area.right); + model.controlPointPreviousY = capControlPoint(model.controlPointPreviousY, area.top, area.bottom); + model.controlPointNextX = capControlPoint(model.controlPointNextX, area.left, area.right); + model.controlPointNextY = capControlPoint(model.controlPointNextY, area.top, area.bottom); + } + } + }, + + draw: function() { + var me = this; + var chart = me.chart; + var meta = me.getMeta(); + var points = meta.data || []; + var area = chart.chartArea; + var ilen = points.length; + var i = 0; + + helpers.canvas.clipArea(chart.ctx, area); + + if (lineEnabled(me.getDataset(), chart.options)) { + meta.dataset.draw(); + } + + helpers.canvas.unclipArea(chart.ctx); + + // Draw the points + for (; i < ilen; ++i) { + points[i].draw(area); + } + }, + + setHoverStyle: function(point) { + // Point + var dataset = this.chart.data.datasets[point._datasetIndex]; + var index = point._index; + var custom = point.custom || {}; + var model = point._model; + + model.radius = custom.hoverRadius || helpers.valueAtIndexOrDefault(dataset.pointHoverRadius, index, this.chart.options.elements.point.hoverRadius); + model.backgroundColor = custom.hoverBackgroundColor || helpers.valueAtIndexOrDefault(dataset.pointHoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor)); + model.borderColor = custom.hoverBorderColor || helpers.valueAtIndexOrDefault(dataset.pointHoverBorderColor, index, helpers.getHoverColor(model.borderColor)); + model.borderWidth = custom.hoverBorderWidth || helpers.valueAtIndexOrDefault(dataset.pointHoverBorderWidth, index, model.borderWidth); + }, + + removeHoverStyle: function(point) { + var me = this; + var dataset = me.chart.data.datasets[point._datasetIndex]; + var index = point._index; + var custom = point.custom || {}; + var model = point._model; + + // Compatibility: If the properties are defined with only the old name, use those values + if ((dataset.radius !== undefined) && (dataset.pointRadius === undefined)) { + dataset.pointRadius = dataset.radius; + } + + model.radius = custom.radius || helpers.valueAtIndexOrDefault(dataset.pointRadius, index, me.chart.options.elements.point.radius); + model.backgroundColor = me.getPointBackgroundColor(point, index); + model.borderColor = me.getPointBorderColor(point, index); + model.borderWidth = me.getPointBorderWidth(point, index); + } + }); +}; + +},{"25":25,"40":40,"45":45}],19:[function(require,module,exports){ +'use strict'; + +var defaults = require(25); +var elements = require(40); +var helpers = require(45); + +defaults._set('polarArea', { + scale: { + type: 'radialLinear', + angleLines: { + display: false + }, + gridLines: { + circular: true + }, + pointLabels: { + display: false + }, + ticks: { + beginAtZero: true + } + }, + + // Boolean - Whether to animate the rotation of the chart + animation: { + animateRotate: true, + animateScale: true + }, + + startAngle: -0.5 * Math.PI, + legendCallback: function(chart) { + var text = []; + text.push('
        '); + + var data = chart.data; + var datasets = data.datasets; + var labels = data.labels; + + if (datasets.length) { + for (var i = 0; i < datasets[0].data.length; ++i) { + text.push('
      • '); + if (labels[i]) { + text.push(labels[i]); + } + text.push('
      • '); + } + } + + text.push('
      '); + return text.join(''); + }, + legend: { + labels: { + generateLabels: function(chart) { + var data = chart.data; + if (data.labels.length && data.datasets.length) { + return data.labels.map(function(label, i) { + var meta = chart.getDatasetMeta(0); + var ds = data.datasets[0]; + var arc = meta.data[i]; + var custom = arc.custom || {}; + var valueAtIndexOrDefault = helpers.valueAtIndexOrDefault; + var arcOpts = chart.options.elements.arc; + var fill = custom.backgroundColor ? custom.backgroundColor : valueAtIndexOrDefault(ds.backgroundColor, i, arcOpts.backgroundColor); + var stroke = custom.borderColor ? custom.borderColor : valueAtIndexOrDefault(ds.borderColor, i, arcOpts.borderColor); + var bw = custom.borderWidth ? custom.borderWidth : valueAtIndexOrDefault(ds.borderWidth, i, arcOpts.borderWidth); + + return { + text: label, + fillStyle: fill, + strokeStyle: stroke, + lineWidth: bw, + hidden: isNaN(ds.data[i]) || meta.data[i].hidden, + + // Extra data used for toggling the correct item + index: i + }; + }); + } + return []; + } + }, + + onClick: function(e, legendItem) { + var index = legendItem.index; + var chart = this.chart; + var i, ilen, meta; + + for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) { + meta = chart.getDatasetMeta(i); + meta.data[index].hidden = !meta.data[index].hidden; + } + + chart.update(); + } + }, + + // Need to override these to give a nice default + tooltips: { + callbacks: { + title: function() { + return ''; + }, + label: function(item, data) { + return data.labels[item.index] + ': ' + item.yLabel; + } + } + } +}); + +module.exports = function(Chart) { + + Chart.controllers.polarArea = Chart.DatasetController.extend({ + + dataElementType: elements.Arc, + + linkScales: helpers.noop, + + update: function(reset) { + var me = this; + var chart = me.chart; + var chartArea = chart.chartArea; + var meta = me.getMeta(); + var opts = chart.options; + var arcOpts = opts.elements.arc; + var minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top); + chart.outerRadius = Math.max((minSize - arcOpts.borderWidth / 2) / 2, 0); + chart.innerRadius = Math.max(opts.cutoutPercentage ? (chart.outerRadius / 100) * (opts.cutoutPercentage) : 1, 0); + chart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount(); + + me.outerRadius = chart.outerRadius - (chart.radiusLength * me.index); + me.innerRadius = me.outerRadius - chart.radiusLength; + + meta.count = me.countVisibleElements(); + + helpers.each(meta.data, function(arc, index) { + me.updateElement(arc, index, reset); + }); + }, + + updateElement: function(arc, index, reset) { + var me = this; + var chart = me.chart; + var dataset = me.getDataset(); + var opts = chart.options; + var animationOpts = opts.animation; + var scale = chart.scale; + var labels = chart.data.labels; + + var circumference = me.calculateCircumference(dataset.data[index]); + var centerX = scale.xCenter; + var centerY = scale.yCenter; + + // If there is NaN data before us, we need to calculate the starting angle correctly. + // We could be way more efficient here, but its unlikely that the polar area chart will have a lot of data + var visibleCount = 0; + var meta = me.getMeta(); + for (var i = 0; i < index; ++i) { + if (!isNaN(dataset.data[i]) && !meta.data[i].hidden) { + ++visibleCount; + } + } + + // var negHalfPI = -0.5 * Math.PI; + var datasetStartAngle = opts.startAngle; + var distance = arc.hidden ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]); + var startAngle = datasetStartAngle + (circumference * visibleCount); + var endAngle = startAngle + (arc.hidden ? 0 : circumference); + + var resetRadius = animationOpts.animateScale ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]); + + helpers.extend(arc, { + // Utility + _datasetIndex: me.index, + _index: index, + _scale: scale, + + // Desired view properties + _model: { + x: centerX, + y: centerY, + innerRadius: 0, + outerRadius: reset ? resetRadius : distance, + startAngle: reset && animationOpts.animateRotate ? datasetStartAngle : startAngle, + endAngle: reset && animationOpts.animateRotate ? datasetStartAngle : endAngle, + label: helpers.valueAtIndexOrDefault(labels, index, labels[index]) + } + }); + + // Apply border and fill style + me.removeHoverStyle(arc); + + arc.pivot(); + }, + + removeHoverStyle: function(arc) { + Chart.DatasetController.prototype.removeHoverStyle.call(this, arc, this.chart.options.elements.arc); + }, + + countVisibleElements: function() { + var dataset = this.getDataset(); + var meta = this.getMeta(); + var count = 0; + + helpers.each(meta.data, function(element, index) { + if (!isNaN(dataset.data[index]) && !element.hidden) { + count++; + } + }); + + return count; + }, + + calculateCircumference: function(value) { + var count = this.getMeta().count; + if (count > 0 && !isNaN(value)) { + return (2 * Math.PI) / count; + } + return 0; + } + }); +}; + +},{"25":25,"40":40,"45":45}],20:[function(require,module,exports){ +'use strict'; + +var defaults = require(25); +var elements = require(40); +var helpers = require(45); + +defaults._set('radar', { + scale: { + type: 'radialLinear' + }, + elements: { + line: { + tension: 0 // no bezier in radar + } + } +}); + +module.exports = function(Chart) { + + Chart.controllers.radar = Chart.DatasetController.extend({ + + datasetElementType: elements.Line, + + dataElementType: elements.Point, + + linkScales: helpers.noop, + + update: function(reset) { + var me = this; + var meta = me.getMeta(); + var line = meta.dataset; + var points = meta.data; + var custom = line.custom || {}; + var dataset = me.getDataset(); + var lineElementOptions = me.chart.options.elements.line; + var scale = me.chart.scale; + + // Compatibility: If the properties are defined with only the old name, use those values + if ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) { + dataset.lineTension = dataset.tension; + } + + helpers.extend(meta.dataset, { + // Utility + _datasetIndex: me.index, + _scale: scale, + // Data + _children: points, + _loop: true, + // Model + _model: { + // Appearance + tension: custom.tension ? custom.tension : helpers.valueOrDefault(dataset.lineTension, lineElementOptions.tension), + backgroundColor: custom.backgroundColor ? custom.backgroundColor : (dataset.backgroundColor || lineElementOptions.backgroundColor), + borderWidth: custom.borderWidth ? custom.borderWidth : (dataset.borderWidth || lineElementOptions.borderWidth), + borderColor: custom.borderColor ? custom.borderColor : (dataset.borderColor || lineElementOptions.borderColor), + fill: custom.fill ? custom.fill : (dataset.fill !== undefined ? dataset.fill : lineElementOptions.fill), + borderCapStyle: custom.borderCapStyle ? custom.borderCapStyle : (dataset.borderCapStyle || lineElementOptions.borderCapStyle), + borderDash: custom.borderDash ? custom.borderDash : (dataset.borderDash || lineElementOptions.borderDash), + borderDashOffset: custom.borderDashOffset ? custom.borderDashOffset : (dataset.borderDashOffset || lineElementOptions.borderDashOffset), + borderJoinStyle: custom.borderJoinStyle ? custom.borderJoinStyle : (dataset.borderJoinStyle || lineElementOptions.borderJoinStyle), + } + }); + + meta.dataset.pivot(); + + // Update Points + helpers.each(points, function(point, index) { + me.updateElement(point, index, reset); + }, me); + + // Update bezier control points + me.updateBezierControlPoints(); + }, + updateElement: function(point, index, reset) { + var me = this; + var custom = point.custom || {}; + var dataset = me.getDataset(); + var scale = me.chart.scale; + var pointElementOptions = me.chart.options.elements.point; + var pointPosition = scale.getPointPositionForValue(index, dataset.data[index]); + + // Compatibility: If the properties are defined with only the old name, use those values + if ((dataset.radius !== undefined) && (dataset.pointRadius === undefined)) { + dataset.pointRadius = dataset.radius; + } + if ((dataset.hitRadius !== undefined) && (dataset.pointHitRadius === undefined)) { + dataset.pointHitRadius = dataset.hitRadius; + } + + helpers.extend(point, { + // Utility + _datasetIndex: me.index, + _index: index, + _scale: scale, + + // Desired view properties + _model: { + x: reset ? scale.xCenter : pointPosition.x, // value not used in dataset scale, but we want a consistent API between scales + y: reset ? scale.yCenter : pointPosition.y, + + // Appearance + tension: custom.tension ? custom.tension : helpers.valueOrDefault(dataset.lineTension, me.chart.options.elements.line.tension), + radius: custom.radius ? custom.radius : helpers.valueAtIndexOrDefault(dataset.pointRadius, index, pointElementOptions.radius), + backgroundColor: custom.backgroundColor ? custom.backgroundColor : helpers.valueAtIndexOrDefault(dataset.pointBackgroundColor, index, pointElementOptions.backgroundColor), + borderColor: custom.borderColor ? custom.borderColor : helpers.valueAtIndexOrDefault(dataset.pointBorderColor, index, pointElementOptions.borderColor), + borderWidth: custom.borderWidth ? custom.borderWidth : helpers.valueAtIndexOrDefault(dataset.pointBorderWidth, index, pointElementOptions.borderWidth), + pointStyle: custom.pointStyle ? custom.pointStyle : helpers.valueAtIndexOrDefault(dataset.pointStyle, index, pointElementOptions.pointStyle), + + // Tooltip + hitRadius: custom.hitRadius ? custom.hitRadius : helpers.valueAtIndexOrDefault(dataset.pointHitRadius, index, pointElementOptions.hitRadius) + } + }); + + point._model.skip = custom.skip ? custom.skip : (isNaN(point._model.x) || isNaN(point._model.y)); + }, + updateBezierControlPoints: function() { + var chartArea = this.chart.chartArea; + var meta = this.getMeta(); + + helpers.each(meta.data, function(point, index) { + var model = point._model; + var controlPoints = helpers.splineCurve( + helpers.previousItem(meta.data, index, true)._model, + model, + helpers.nextItem(meta.data, index, true)._model, + model.tension + ); + + // Prevent the bezier going outside of the bounds of the graph + model.controlPointPreviousX = Math.max(Math.min(controlPoints.previous.x, chartArea.right), chartArea.left); + model.controlPointPreviousY = Math.max(Math.min(controlPoints.previous.y, chartArea.bottom), chartArea.top); + + model.controlPointNextX = Math.max(Math.min(controlPoints.next.x, chartArea.right), chartArea.left); + model.controlPointNextY = Math.max(Math.min(controlPoints.next.y, chartArea.bottom), chartArea.top); + + // Now pivot the point for animation + point.pivot(); + }); + }, + + setHoverStyle: function(point) { + // Point + var dataset = this.chart.data.datasets[point._datasetIndex]; + var custom = point.custom || {}; + var index = point._index; + var model = point._model; + + model.radius = custom.hoverRadius ? custom.hoverRadius : helpers.valueAtIndexOrDefault(dataset.pointHoverRadius, index, this.chart.options.elements.point.hoverRadius); + model.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : helpers.valueAtIndexOrDefault(dataset.pointHoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor)); + model.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : helpers.valueAtIndexOrDefault(dataset.pointHoverBorderColor, index, helpers.getHoverColor(model.borderColor)); + model.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : helpers.valueAtIndexOrDefault(dataset.pointHoverBorderWidth, index, model.borderWidth); + }, + + removeHoverStyle: function(point) { + var dataset = this.chart.data.datasets[point._datasetIndex]; + var custom = point.custom || {}; + var index = point._index; + var model = point._model; + var pointElementOptions = this.chart.options.elements.point; + + model.radius = custom.radius ? custom.radius : helpers.valueAtIndexOrDefault(dataset.pointRadius, index, pointElementOptions.radius); + model.backgroundColor = custom.backgroundColor ? custom.backgroundColor : helpers.valueAtIndexOrDefault(dataset.pointBackgroundColor, index, pointElementOptions.backgroundColor); + model.borderColor = custom.borderColor ? custom.borderColor : helpers.valueAtIndexOrDefault(dataset.pointBorderColor, index, pointElementOptions.borderColor); + model.borderWidth = custom.borderWidth ? custom.borderWidth : helpers.valueAtIndexOrDefault(dataset.pointBorderWidth, index, pointElementOptions.borderWidth); + } + }); +}; + +},{"25":25,"40":40,"45":45}],21:[function(require,module,exports){ +'use strict'; + +var defaults = require(25); + +defaults._set('scatter', { + hover: { + mode: 'single' + }, + + scales: { + xAxes: [{ + id: 'x-axis-1', // need an ID so datasets can reference the scale + type: 'linear', // scatter should not use a category axis + position: 'bottom' + }], + yAxes: [{ + id: 'y-axis-1', + type: 'linear', + position: 'left' + }] + }, + + showLines: false, + + tooltips: { + callbacks: { + title: function() { + return ''; // doesn't make sense for scatter since data are formatted as a point + }, + label: function(item) { + return '(' + item.xLabel + ', ' + item.yLabel + ')'; + } + } + } +}); + +module.exports = function(Chart) { + + // Scatter charts use line controllers + Chart.controllers.scatter = Chart.controllers.line; + +}; + +},{"25":25}],22:[function(require,module,exports){ +/* global window: false */ +'use strict'; + +var defaults = require(25); +var Element = require(26); +var helpers = require(45); + +defaults._set('global', { + animation: { + duration: 1000, + easing: 'easeOutQuart', + onProgress: helpers.noop, + onComplete: helpers.noop + } +}); + +module.exports = function(Chart) { + + Chart.Animation = Element.extend({ + chart: null, // the animation associated chart instance + currentStep: 0, // the current animation step + numSteps: 60, // default number of steps + easing: '', // the easing to use for this animation + render: null, // render function used by the animation service + + onAnimationProgress: null, // user specified callback to fire on each step of the animation + onAnimationComplete: null, // user specified callback to fire when the animation finishes + }); + + Chart.animationService = { + frameDuration: 17, + animations: [], + dropFrames: 0, + request: null, + + /** + * @param {Chart} chart - The chart to animate. + * @param {Chart.Animation} animation - The animation that we will animate. + * @param {Number} duration - The animation duration in ms. + * @param {Boolean} lazy - if true, the chart is not marked as animating to enable more responsive interactions + */ + addAnimation: function(chart, animation, duration, lazy) { + var animations = this.animations; + var i, ilen; + + animation.chart = chart; + + if (!lazy) { + chart.animating = true; + } + + for (i = 0, ilen = animations.length; i < ilen; ++i) { + if (animations[i].chart === chart) { + animations[i] = animation; + return; + } + } + + animations.push(animation); + + // If there are no animations queued, manually kickstart a digest, for lack of a better word + if (animations.length === 1) { + this.requestAnimationFrame(); + } + }, + + cancelAnimation: function(chart) { + var index = helpers.findIndex(this.animations, function(animation) { + return animation.chart === chart; + }); + + if (index !== -1) { + this.animations.splice(index, 1); + chart.animating = false; + } + }, + + requestAnimationFrame: function() { + var me = this; + if (me.request === null) { + // Skip animation frame requests until the active one is executed. + // This can happen when processing mouse events, e.g. 'mousemove' + // and 'mouseout' events will trigger multiple renders. + me.request = helpers.requestAnimFrame.call(window, function() { + me.request = null; + me.startDigest(); + }); + } + }, + + /** + * @private + */ + startDigest: function() { + var me = this; + var startTime = Date.now(); + var framesToDrop = 0; + + if (me.dropFrames > 1) { + framesToDrop = Math.floor(me.dropFrames); + me.dropFrames = me.dropFrames % 1; + } + + me.advance(1 + framesToDrop); + + var endTime = Date.now(); + + me.dropFrames += (endTime - startTime) / me.frameDuration; + + // Do we have more stuff to animate? + if (me.animations.length > 0) { + me.requestAnimationFrame(); + } + }, + + /** + * @private + */ + advance: function(count) { + var animations = this.animations; + var animation, chart; + var i = 0; + + while (i < animations.length) { + animation = animations[i]; + chart = animation.chart; + + animation.currentStep = (animation.currentStep || 0) + count; + animation.currentStep = Math.min(animation.currentStep, animation.numSteps); + + helpers.callback(animation.render, [chart, animation], chart); + helpers.callback(animation.onAnimationProgress, [animation], chart); + + if (animation.currentStep >= animation.numSteps) { + helpers.callback(animation.onAnimationComplete, [animation], chart); + chart.animating = false; + animations.splice(i, 1); + } else { + ++i; + } + } + } + }; + + /** + * Provided for backward compatibility, use Chart.Animation instead + * @prop Chart.Animation#animationObject + * @deprecated since version 2.6.0 + * @todo remove at version 3 + */ + Object.defineProperty(Chart.Animation.prototype, 'animationObject', { + get: function() { + return this; + } + }); + + /** + * Provided for backward compatibility, use Chart.Animation#chart instead + * @prop Chart.Animation#chartInstance + * @deprecated since version 2.6.0 + * @todo remove at version 3 + */ + Object.defineProperty(Chart.Animation.prototype, 'chartInstance', { + get: function() { + return this.chart; + }, + set: function(value) { + this.chart = value; + } + }); + +}; + +},{"25":25,"26":26,"45":45}],23:[function(require,module,exports){ +'use strict'; + +var defaults = require(25); +var helpers = require(45); +var Interaction = require(28); +var platform = require(48); + +module.exports = function(Chart) { + var plugins = Chart.plugins; + + // Create a dictionary of chart types, to allow for extension of existing types + Chart.types = {}; + + // Store a reference to each instance - allowing us to globally resize chart instances on window resize. + // Destroy method on the chart will remove the instance of the chart from this reference. + Chart.instances = {}; + + // Controllers available for dataset visualization eg. bar, line, slice, etc. + Chart.controllers = {}; + + /** + * Initializes the given config with global and chart default values. + */ + function initConfig(config) { + config = config || {}; + + // Do NOT use configMerge() for the data object because this method merges arrays + // and so would change references to labels and datasets, preventing data updates. + var data = config.data = config.data || {}; + data.datasets = data.datasets || []; + data.labels = data.labels || []; + + config.options = helpers.configMerge( + defaults.global, + defaults[config.type], + config.options || {}); + + return config; + } + + /** + * Updates the config of the chart + * @param chart {Chart} chart to update the options for + */ + function updateConfig(chart) { + var newOptions = chart.options; + + // Update Scale(s) with options + if (newOptions.scale) { + chart.scale.options = newOptions.scale; + } else if (newOptions.scales) { + newOptions.scales.xAxes.concat(newOptions.scales.yAxes).forEach(function(scaleOptions) { + chart.scales[scaleOptions.id].options = scaleOptions; + }); + } + + // Tooltip + chart.tooltip._options = newOptions.tooltips; + } + + function positionIsHorizontal(position) { + return position === 'top' || position === 'bottom'; + } + + helpers.extend(Chart.prototype, /** @lends Chart */ { + /** + * @private + */ + construct: function(item, config) { + var me = this; + + config = initConfig(config); + + var context = platform.acquireContext(item, config); + var canvas = context && context.canvas; + var height = canvas && canvas.height; + var width = canvas && canvas.width; + + me.id = helpers.uid(); + me.ctx = context; + me.canvas = canvas; + me.config = config; + me.width = width; + me.height = height; + me.aspectRatio = height ? width / height : null; + me.options = config.options; + me._bufferedRender = false; + + /** + * Provided for backward compatibility, Chart and Chart.Controller have been merged, + * the "instance" still need to be defined since it might be called from plugins. + * @prop Chart#chart + * @deprecated since version 2.6.0 + * @todo remove at version 3 + * @private + */ + me.chart = me; + me.controller = me; // chart.chart.controller #inception + + // Add the chart instance to the global namespace + Chart.instances[me.id] = me; + + // Define alias to the config data: `chart.data === chart.config.data` + Object.defineProperty(me, 'data', { + get: function() { + return me.config.data; + }, + set: function(value) { + me.config.data = value; + } + }); + + if (!context || !canvas) { + // The given item is not a compatible context2d element, let's return before finalizing + // the chart initialization but after setting basic chart / controller properties that + // can help to figure out that the chart is not valid (e.g chart.canvas !== null); + // https://github.com/chartjs/Chart.js/issues/2807 + console.error("Failed to create chart: can't acquire context from the given item"); + return; + } + + me.initialize(); + me.update(); + }, + + /** + * @private + */ + initialize: function() { + var me = this; + + // Before init plugin notification + plugins.notify(me, 'beforeInit'); + + helpers.retinaScale(me, me.options.devicePixelRatio); + + me.bindEvents(); + + if (me.options.responsive) { + // Initial resize before chart draws (must be silent to preserve initial animations). + me.resize(true); + } + + // Make sure scales have IDs and are built before we build any controllers. + me.ensureScalesHaveIDs(); + me.buildScales(); + me.initToolTip(); + + // After init plugin notification + plugins.notify(me, 'afterInit'); + + return me; + }, + + clear: function() { + helpers.canvas.clear(this); + return this; + }, + + stop: function() { + // Stops any current animation loop occurring + Chart.animationService.cancelAnimation(this); + return this; + }, + + resize: function(silent) { + var me = this; + var options = me.options; + var canvas = me.canvas; + var aspectRatio = (options.maintainAspectRatio && me.aspectRatio) || null; + + // the canvas render width and height will be casted to integers so make sure that + // the canvas display style uses the same integer values to avoid blurring effect. + + // Set to 0 instead of canvas.size because the size defaults to 300x150 if the element is collased + var newWidth = Math.max(0, Math.floor(helpers.getMaximumWidth(canvas))); + var newHeight = Math.max(0, Math.floor(aspectRatio ? newWidth / aspectRatio : helpers.getMaximumHeight(canvas))); + + if (me.width === newWidth && me.height === newHeight) { + return; + } + + canvas.width = me.width = newWidth; + canvas.height = me.height = newHeight; + canvas.style.width = newWidth + 'px'; + canvas.style.height = newHeight + 'px'; + + helpers.retinaScale(me, options.devicePixelRatio); + + if (!silent) { + // Notify any plugins about the resize + var newSize = {width: newWidth, height: newHeight}; + plugins.notify(me, 'resize', [newSize]); + + // Notify of resize + if (me.options.onResize) { + me.options.onResize(me, newSize); + } + + me.stop(); + me.update(me.options.responsiveAnimationDuration); + } + }, + + ensureScalesHaveIDs: function() { + var options = this.options; + var scalesOptions = options.scales || {}; + var scaleOptions = options.scale; + + helpers.each(scalesOptions.xAxes, function(xAxisOptions, index) { + xAxisOptions.id = xAxisOptions.id || ('x-axis-' + index); + }); + + helpers.each(scalesOptions.yAxes, function(yAxisOptions, index) { + yAxisOptions.id = yAxisOptions.id || ('y-axis-' + index); + }); + + if (scaleOptions) { + scaleOptions.id = scaleOptions.id || 'scale'; + } + }, + + /** + * Builds a map of scale ID to scale object for future lookup. + */ + buildScales: function() { + var me = this; + var options = me.options; + var scales = me.scales = {}; + var items = []; + + if (options.scales) { + items = items.concat( + (options.scales.xAxes || []).map(function(xAxisOptions) { + return {options: xAxisOptions, dtype: 'category', dposition: 'bottom'}; + }), + (options.scales.yAxes || []).map(function(yAxisOptions) { + return {options: yAxisOptions, dtype: 'linear', dposition: 'left'}; + }) + ); + } + + if (options.scale) { + items.push({ + options: options.scale, + dtype: 'radialLinear', + isDefault: true, + dposition: 'chartArea' + }); + } + + helpers.each(items, function(item) { + var scaleOptions = item.options; + var scaleType = helpers.valueOrDefault(scaleOptions.type, item.dtype); + var scaleClass = Chart.scaleService.getScaleConstructor(scaleType); + if (!scaleClass) { + return; + } + + if (positionIsHorizontal(scaleOptions.position) !== positionIsHorizontal(item.dposition)) { + scaleOptions.position = item.dposition; + } + + var scale = new scaleClass({ + id: scaleOptions.id, + options: scaleOptions, + ctx: me.ctx, + chart: me + }); + + scales[scale.id] = scale; + scale.mergeTicksOptions(); + + // TODO(SB): I think we should be able to remove this custom case (options.scale) + // and consider it as a regular scale part of the "scales"" map only! This would + // make the logic easier and remove some useless? custom code. + if (item.isDefault) { + me.scale = scale; + } + }); + + Chart.scaleService.addScalesToLayout(this); + }, + + buildOrUpdateControllers: function() { + var me = this; + var types = []; + var newControllers = []; + + helpers.each(me.data.datasets, function(dataset, datasetIndex) { + var meta = me.getDatasetMeta(datasetIndex); + var type = dataset.type || me.config.type; + + if (meta.type && meta.type !== type) { + me.destroyDatasetMeta(datasetIndex); + meta = me.getDatasetMeta(datasetIndex); + } + meta.type = type; + + types.push(meta.type); + + if (meta.controller) { + meta.controller.updateIndex(datasetIndex); + } else { + var ControllerClass = Chart.controllers[meta.type]; + if (ControllerClass === undefined) { + throw new Error('"' + meta.type + '" is not a chart type.'); + } + + meta.controller = new ControllerClass(me, datasetIndex); + newControllers.push(meta.controller); + } + }, me); + + return newControllers; + }, + + /** + * Reset the elements of all datasets + * @private + */ + resetElements: function() { + var me = this; + helpers.each(me.data.datasets, function(dataset, datasetIndex) { + me.getDatasetMeta(datasetIndex).controller.reset(); + }, me); + }, + + /** + * Resets the chart back to it's state before the initial animation + */ + reset: function() { + this.resetElements(); + this.tooltip.initialize(); + }, + + update: function(config) { + var me = this; + + if (!config || typeof config !== 'object') { + // backwards compatibility + config = { + duration: config, + lazy: arguments[1] + }; + } + + updateConfig(me); + + if (plugins.notify(me, 'beforeUpdate') === false) { + return; + } + + // In case the entire data object changed + me.tooltip._data = me.data; + + // Make sure dataset controllers are updated and new controllers are reset + var newControllers = me.buildOrUpdateControllers(); + + // Make sure all dataset controllers have correct meta data counts + helpers.each(me.data.datasets, function(dataset, datasetIndex) { + me.getDatasetMeta(datasetIndex).controller.buildOrUpdateElements(); + }, me); + + me.updateLayout(); + + // Can only reset the new controllers after the scales have been updated + helpers.each(newControllers, function(controller) { + controller.reset(); + }); + + me.updateDatasets(); + + // Need to reset tooltip in case it is displayed with elements that are removed + // after update. + me.tooltip.initialize(); + + // Last active contains items that were previously in the tooltip. + // When we reset the tooltip, we need to clear it + me.lastActive = []; + + // Do this before render so that any plugins that need final scale updates can use it + plugins.notify(me, 'afterUpdate'); + + if (me._bufferedRender) { + me._bufferedRequest = { + duration: config.duration, + easing: config.easing, + lazy: config.lazy + }; + } else { + me.render(config); + } + }, + + /** + * Updates the chart layout unless a plugin returns `false` to the `beforeLayout` + * hook, in which case, plugins will not be called on `afterLayout`. + * @private + */ + updateLayout: function() { + var me = this; + + if (plugins.notify(me, 'beforeLayout') === false) { + return; + } + + Chart.layoutService.update(this, this.width, this.height); + + /** + * Provided for backward compatibility, use `afterLayout` instead. + * @method IPlugin#afterScaleUpdate + * @deprecated since version 2.5.0 + * @todo remove at version 3 + * @private + */ + plugins.notify(me, 'afterScaleUpdate'); + plugins.notify(me, 'afterLayout'); + }, + + /** + * Updates all datasets unless a plugin returns `false` to the `beforeDatasetsUpdate` + * hook, in which case, plugins will not be called on `afterDatasetsUpdate`. + * @private + */ + updateDatasets: function() { + var me = this; + + if (plugins.notify(me, 'beforeDatasetsUpdate') === false) { + return; + } + + for (var i = 0, ilen = me.data.datasets.length; i < ilen; ++i) { + me.updateDataset(i); + } + + plugins.notify(me, 'afterDatasetsUpdate'); + }, + + /** + * Updates dataset at index unless a plugin returns `false` to the `beforeDatasetUpdate` + * hook, in which case, plugins will not be called on `afterDatasetUpdate`. + * @private + */ + updateDataset: function(index) { + var me = this; + var meta = me.getDatasetMeta(index); + var args = { + meta: meta, + index: index + }; + + if (plugins.notify(me, 'beforeDatasetUpdate', [args]) === false) { + return; + } + + meta.controller.update(); + + plugins.notify(me, 'afterDatasetUpdate', [args]); + }, + + render: function(config) { + var me = this; + + if (!config || typeof config !== 'object') { + // backwards compatibility + config = { + duration: config, + lazy: arguments[1] + }; + } + + var duration = config.duration; + var lazy = config.lazy; + + if (plugins.notify(me, 'beforeRender') === false) { + return; + } + + var animationOptions = me.options.animation; + var onComplete = function(animation) { + plugins.notify(me, 'afterRender'); + helpers.callback(animationOptions && animationOptions.onComplete, [animation], me); + }; + + if (animationOptions && ((typeof duration !== 'undefined' && duration !== 0) || (typeof duration === 'undefined' && animationOptions.duration !== 0))) { + var animation = new Chart.Animation({ + numSteps: (duration || animationOptions.duration) / 16.66, // 60 fps + easing: config.easing || animationOptions.easing, + + render: function(chart, animationObject) { + var easingFunction = helpers.easing.effects[animationObject.easing]; + var currentStep = animationObject.currentStep; + var stepDecimal = currentStep / animationObject.numSteps; + + chart.draw(easingFunction(stepDecimal), stepDecimal, currentStep); + }, + + onAnimationProgress: animationOptions.onProgress, + onAnimationComplete: onComplete + }); + + Chart.animationService.addAnimation(me, animation, duration, lazy); + } else { + me.draw(); + + // See https://github.com/chartjs/Chart.js/issues/3781 + onComplete(new Chart.Animation({numSteps: 0, chart: me})); + } + + return me; + }, + + draw: function(easingValue) { + var me = this; + + me.clear(); + + if (helpers.isNullOrUndef(easingValue)) { + easingValue = 1; + } + + me.transition(easingValue); + + if (plugins.notify(me, 'beforeDraw', [easingValue]) === false) { + return; + } + + // Draw all the scales + helpers.each(me.boxes, function(box) { + box.draw(me.chartArea); + }, me); + + if (me.scale) { + me.scale.draw(); + } + + me.drawDatasets(easingValue); + me._drawTooltip(easingValue); + + plugins.notify(me, 'afterDraw', [easingValue]); + }, + + /** + * @private + */ + transition: function(easingValue) { + var me = this; + + for (var i = 0, ilen = (me.data.datasets || []).length; i < ilen; ++i) { + if (me.isDatasetVisible(i)) { + me.getDatasetMeta(i).controller.transition(easingValue); + } + } + + me.tooltip.transition(easingValue); + }, + + /** + * Draws all datasets unless a plugin returns `false` to the `beforeDatasetsDraw` + * hook, in which case, plugins will not be called on `afterDatasetsDraw`. + * @private + */ + drawDatasets: function(easingValue) { + var me = this; + + if (plugins.notify(me, 'beforeDatasetsDraw', [easingValue]) === false) { + return; + } + + // Draw datasets reversed to support proper line stacking + for (var i = (me.data.datasets || []).length - 1; i >= 0; --i) { + if (me.isDatasetVisible(i)) { + me.drawDataset(i, easingValue); + } + } + + plugins.notify(me, 'afterDatasetsDraw', [easingValue]); + }, + + /** + * Draws dataset at index unless a plugin returns `false` to the `beforeDatasetDraw` + * hook, in which case, plugins will not be called on `afterDatasetDraw`. + * @private + */ + drawDataset: function(index, easingValue) { + var me = this; + var meta = me.getDatasetMeta(index); + var args = { + meta: meta, + index: index, + easingValue: easingValue + }; + + if (plugins.notify(me, 'beforeDatasetDraw', [args]) === false) { + return; + } + + meta.controller.draw(easingValue); + + plugins.notify(me, 'afterDatasetDraw', [args]); + }, + + /** + * Draws tooltip unless a plugin returns `false` to the `beforeTooltipDraw` + * hook, in which case, plugins will not be called on `afterTooltipDraw`. + * @private + */ + _drawTooltip: function(easingValue) { + var me = this; + var tooltip = me.tooltip; + var args = { + tooltip: tooltip, + easingValue: easingValue + }; + + if (plugins.notify(me, 'beforeTooltipDraw', [args]) === false) { + return; + } + + tooltip.draw(); + + plugins.notify(me, 'afterTooltipDraw', [args]); + }, + + // Get the single element that was clicked on + // @return : An object containing the dataset index and element index of the matching element. Also contains the rectangle that was draw + getElementAtEvent: function(e) { + return Interaction.modes.single(this, e); + }, + + getElementsAtEvent: function(e) { + return Interaction.modes.label(this, e, {intersect: true}); + }, + + getElementsAtXAxis: function(e) { + return Interaction.modes['x-axis'](this, e, {intersect: true}); + }, + + getElementsAtEventForMode: function(e, mode, options) { + var method = Interaction.modes[mode]; + if (typeof method === 'function') { + return method(this, e, options); + } + + return []; + }, + + getDatasetAtEvent: function(e) { + return Interaction.modes.dataset(this, e, {intersect: true}); + }, + + getDatasetMeta: function(datasetIndex) { + var me = this; + var dataset = me.data.datasets[datasetIndex]; + if (!dataset._meta) { + dataset._meta = {}; + } + + var meta = dataset._meta[me.id]; + if (!meta) { + meta = dataset._meta[me.id] = { + type: null, + data: [], + dataset: null, + controller: null, + hidden: null, // See isDatasetVisible() comment + xAxisID: null, + yAxisID: null + }; + } + + return meta; + }, + + getVisibleDatasetCount: function() { + var count = 0; + for (var i = 0, ilen = this.data.datasets.length; i < ilen; ++i) { + if (this.isDatasetVisible(i)) { + count++; + } + } + return count; + }, + + isDatasetVisible: function(datasetIndex) { + var meta = this.getDatasetMeta(datasetIndex); + + // meta.hidden is a per chart dataset hidden flag override with 3 states: if true or false, + // the dataset.hidden value is ignored, else if null, the dataset hidden state is returned. + return typeof meta.hidden === 'boolean' ? !meta.hidden : !this.data.datasets[datasetIndex].hidden; + }, + + generateLegend: function() { + return this.options.legendCallback(this); + }, + + /** + * @private + */ + destroyDatasetMeta: function(datasetIndex) { + var id = this.id; + var dataset = this.data.datasets[datasetIndex]; + var meta = dataset._meta && dataset._meta[id]; + + if (meta) { + meta.controller.destroy(); + delete dataset._meta[id]; + } + }, + + destroy: function() { + var me = this; + var canvas = me.canvas; + var i, ilen; + + me.stop(); + + // dataset controllers need to cleanup associated data + for (i = 0, ilen = me.data.datasets.length; i < ilen; ++i) { + me.destroyDatasetMeta(i); + } + + if (canvas) { + me.unbindEvents(); + helpers.canvas.clear(me); + platform.releaseContext(me.ctx); + me.canvas = null; + me.ctx = null; + } + + plugins.notify(me, 'destroy'); + + delete Chart.instances[me.id]; + }, + + toBase64Image: function() { + return this.canvas.toDataURL.apply(this.canvas, arguments); + }, + + initToolTip: function() { + var me = this; + me.tooltip = new Chart.Tooltip({ + _chart: me, + _chartInstance: me, // deprecated, backward compatibility + _data: me.data, + _options: me.options.tooltips + }, me); + }, + + /** + * @private + */ + bindEvents: function() { + var me = this; + var listeners = me._listeners = {}; + var listener = function() { + me.eventHandler.apply(me, arguments); + }; + + helpers.each(me.options.events, function(type) { + platform.addEventListener(me, type, listener); + listeners[type] = listener; + }); + + // Elements used to detect size change should not be injected for non responsive charts. + // See https://github.com/chartjs/Chart.js/issues/2210 + if (me.options.responsive) { + listener = function() { + me.resize(); + }; + + platform.addEventListener(me, 'resize', listener); + listeners.resize = listener; + } + }, + + /** + * @private + */ + unbindEvents: function() { + var me = this; + var listeners = me._listeners; + if (!listeners) { + return; + } + + delete me._listeners; + helpers.each(listeners, function(listener, type) { + platform.removeEventListener(me, type, listener); + }); + }, + + updateHoverStyle: function(elements, mode, enabled) { + var method = enabled ? 'setHoverStyle' : 'removeHoverStyle'; + var element, i, ilen; + + for (i = 0, ilen = elements.length; i < ilen; ++i) { + element = elements[i]; + if (element) { + this.getDatasetMeta(element._datasetIndex).controller[method](element); + } + } + }, + + /** + * @private + */ + eventHandler: function(e) { + var me = this; + var tooltip = me.tooltip; + + if (plugins.notify(me, 'beforeEvent', [e]) === false) { + return; + } + + // Buffer any update calls so that renders do not occur + me._bufferedRender = true; + me._bufferedRequest = null; + + var changed = me.handleEvent(e); + changed |= tooltip && tooltip.handleEvent(e); + + plugins.notify(me, 'afterEvent', [e]); + + var bufferedRequest = me._bufferedRequest; + if (bufferedRequest) { + // If we have an update that was triggered, we need to do a normal render + me.render(bufferedRequest); + } else if (changed && !me.animating) { + // If entering, leaving, or changing elements, animate the change via pivot + me.stop(); + + // We only need to render at this point. Updating will cause scales to be + // recomputed generating flicker & using more memory than necessary. + me.render(me.options.hover.animationDuration, true); + } + + me._bufferedRender = false; + me._bufferedRequest = null; + + return me; + }, + + /** + * Handle an event + * @private + * @param {IEvent} event the event to handle + * @return {Boolean} true if the chart needs to re-render + */ + handleEvent: function(e) { + var me = this; + var options = me.options || {}; + var hoverOptions = options.hover; + var changed = false; + + me.lastActive = me.lastActive || []; + + // Find Active Elements for hover and tooltips + if (e.type === 'mouseout') { + me.active = []; + } else { + me.active = me.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions); + } + + // Invoke onHover hook + // Need to call with native event here to not break backwards compatibility + helpers.callback(options.onHover || options.hover.onHover, [e.native, me.active], me); + + if (e.type === 'mouseup' || e.type === 'click') { + if (options.onClick) { + // Use e.native here for backwards compatibility + options.onClick.call(me, e.native, me.active); + } + } + + // Remove styling for last active (even if it may still be active) + if (me.lastActive.length) { + me.updateHoverStyle(me.lastActive, hoverOptions.mode, false); + } + + // Built in hover styling + if (me.active.length && hoverOptions.mode) { + me.updateHoverStyle(me.active, hoverOptions.mode, true); + } + + changed = !helpers.arrayEquals(me.active, me.lastActive); + + // Remember Last Actives + me.lastActive = me.active; + + return changed; + } + }); + + /** + * Provided for backward compatibility, use Chart instead. + * @class Chart.Controller + * @deprecated since version 2.6.0 + * @todo remove at version 3 + * @private + */ + Chart.Controller = Chart; +}; + +},{"25":25,"28":28,"45":45,"48":48}],24:[function(require,module,exports){ +'use strict'; + +var helpers = require(45); + +module.exports = function(Chart) { + + var arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift']; + + /** + * Hooks the array methods that add or remove values ('push', pop', 'shift', 'splice', + * 'unshift') and notify the listener AFTER the array has been altered. Listeners are + * called on the 'onData*' callbacks (e.g. onDataPush, etc.) with same arguments. + */ + function listenArrayEvents(array, listener) { + if (array._chartjs) { + array._chartjs.listeners.push(listener); + return; + } + + Object.defineProperty(array, '_chartjs', { + configurable: true, + enumerable: false, + value: { + listeners: [listener] + } + }); + + arrayEvents.forEach(function(key) { + var method = 'onData' + key.charAt(0).toUpperCase() + key.slice(1); + var base = array[key]; + + Object.defineProperty(array, key, { + configurable: true, + enumerable: false, + value: function() { + var args = Array.prototype.slice.call(arguments); + var res = base.apply(this, args); + + helpers.each(array._chartjs.listeners, function(object) { + if (typeof object[method] === 'function') { + object[method].apply(object, args); + } + }); + + return res; + } + }); + }); + } + + /** + * Removes the given array event listener and cleanup extra attached properties (such as + * the _chartjs stub and overridden methods) if array doesn't have any more listeners. + */ + function unlistenArrayEvents(array, listener) { + var stub = array._chartjs; + if (!stub) { + return; + } + + var listeners = stub.listeners; + var index = listeners.indexOf(listener); + if (index !== -1) { + listeners.splice(index, 1); + } + + if (listeners.length > 0) { + return; + } + + arrayEvents.forEach(function(key) { + delete array[key]; + }); + + delete array._chartjs; + } + + // Base class for all dataset controllers (line, bar, etc) + Chart.DatasetController = function(chart, datasetIndex) { + this.initialize(chart, datasetIndex); + }; + + helpers.extend(Chart.DatasetController.prototype, { + + /** + * Element type used to generate a meta dataset (e.g. Chart.element.Line). + * @type {Chart.core.element} + */ + datasetElementType: null, + + /** + * Element type used to generate a meta data (e.g. Chart.element.Point). + * @type {Chart.core.element} + */ + dataElementType: null, + + initialize: function(chart, datasetIndex) { + var me = this; + me.chart = chart; + me.index = datasetIndex; + me.linkScales(); + me.addElements(); + }, + + updateIndex: function(datasetIndex) { + this.index = datasetIndex; + }, + + linkScales: function() { + var me = this; + var meta = me.getMeta(); + var dataset = me.getDataset(); + + if (meta.xAxisID === null) { + meta.xAxisID = dataset.xAxisID || me.chart.options.scales.xAxes[0].id; + } + if (meta.yAxisID === null) { + meta.yAxisID = dataset.yAxisID || me.chart.options.scales.yAxes[0].id; + } + }, + + getDataset: function() { + return this.chart.data.datasets[this.index]; + }, + + getMeta: function() { + return this.chart.getDatasetMeta(this.index); + }, + + getScaleForId: function(scaleID) { + return this.chart.scales[scaleID]; + }, + + reset: function() { + this.update(true); + }, + + /** + * @private + */ + destroy: function() { + if (this._data) { + unlistenArrayEvents(this._data, this); + } + }, + + createMetaDataset: function() { + var me = this; + var type = me.datasetElementType; + return type && new type({ + _chart: me.chart, + _datasetIndex: me.index + }); + }, + + createMetaData: function(index) { + var me = this; + var type = me.dataElementType; + return type && new type({ + _chart: me.chart, + _datasetIndex: me.index, + _index: index + }); + }, + + addElements: function() { + var me = this; + var meta = me.getMeta(); + var data = me.getDataset().data || []; + var metaData = meta.data; + var i, ilen; + + for (i = 0, ilen = data.length; i < ilen; ++i) { + metaData[i] = metaData[i] || me.createMetaData(i); + } + + meta.dataset = meta.dataset || me.createMetaDataset(); + }, + + addElementAndReset: function(index) { + var element = this.createMetaData(index); + this.getMeta().data.splice(index, 0, element); + this.updateElement(element, index, true); + }, + + buildOrUpdateElements: function() { + var me = this; + var dataset = me.getDataset(); + var data = dataset.data || (dataset.data = []); + + // In order to correctly handle data addition/deletion animation (an thus simulate + // real-time charts), we need to monitor these data modifications and synchronize + // the internal meta data accordingly. + if (me._data !== data) { + if (me._data) { + // This case happens when the user replaced the data array instance. + unlistenArrayEvents(me._data, me); + } + + listenArrayEvents(data, me); + me._data = data; + } + + // Re-sync meta data in case the user replaced the data array or if we missed + // any updates and so make sure that we handle number of datapoints changing. + me.resyncElements(); + }, + + update: helpers.noop, + + transition: function(easingValue) { + var meta = this.getMeta(); + var elements = meta.data || []; + var ilen = elements.length; + var i = 0; + + for (; i < ilen; ++i) { + elements[i].transition(easingValue); + } + + if (meta.dataset) { + meta.dataset.transition(easingValue); + } + }, + + draw: function() { + var meta = this.getMeta(); + var elements = meta.data || []; + var ilen = elements.length; + var i = 0; + + if (meta.dataset) { + meta.dataset.draw(); + } + + for (; i < ilen; ++i) { + elements[i].draw(); + } + }, + + removeHoverStyle: function(element, elementOpts) { + var dataset = this.chart.data.datasets[element._datasetIndex]; + var index = element._index; + var custom = element.custom || {}; + var valueOrDefault = helpers.valueAtIndexOrDefault; + var model = element._model; + + model.backgroundColor = custom.backgroundColor ? custom.backgroundColor : valueOrDefault(dataset.backgroundColor, index, elementOpts.backgroundColor); + model.borderColor = custom.borderColor ? custom.borderColor : valueOrDefault(dataset.borderColor, index, elementOpts.borderColor); + model.borderWidth = custom.borderWidth ? custom.borderWidth : valueOrDefault(dataset.borderWidth, index, elementOpts.borderWidth); + }, + + setHoverStyle: function(element) { + var dataset = this.chart.data.datasets[element._datasetIndex]; + var index = element._index; + var custom = element.custom || {}; + var valueOrDefault = helpers.valueAtIndexOrDefault; + var getHoverColor = helpers.getHoverColor; + var model = element._model; + + model.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : valueOrDefault(dataset.hoverBackgroundColor, index, getHoverColor(model.backgroundColor)); + model.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : valueOrDefault(dataset.hoverBorderColor, index, getHoverColor(model.borderColor)); + model.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : valueOrDefault(dataset.hoverBorderWidth, index, model.borderWidth); + }, + + /** + * @private + */ + resyncElements: function() { + var me = this; + var meta = me.getMeta(); + var data = me.getDataset().data; + var numMeta = meta.data.length; + var numData = data.length; + + if (numData < numMeta) { + meta.data.splice(numData, numMeta - numData); + } else if (numData > numMeta) { + me.insertElements(numMeta, numData - numMeta); + } + }, + + /** + * @private + */ + insertElements: function(start, count) { + for (var i = 0; i < count; ++i) { + this.addElementAndReset(start + i); + } + }, + + /** + * @private + */ + onDataPush: function() { + this.insertElements(this.getDataset().data.length - 1, arguments.length); + }, + + /** + * @private + */ + onDataPop: function() { + this.getMeta().data.pop(); + }, + + /** + * @private + */ + onDataShift: function() { + this.getMeta().data.shift(); + }, + + /** + * @private + */ + onDataSplice: function(start, count) { + this.getMeta().data.splice(start, count); + this.insertElements(start, arguments.length - 2); + }, + + /** + * @private + */ + onDataUnshift: function() { + this.insertElements(0, arguments.length); + } + }); + + Chart.DatasetController.extend = helpers.inherits; +}; + +},{"45":45}],25:[function(require,module,exports){ +'use strict'; + +var helpers = require(45); + +module.exports = { + /** + * @private + */ + _set: function(scope, values) { + return helpers.merge(this[scope] || (this[scope] = {}), values); + } +}; + +},{"45":45}],26:[function(require,module,exports){ +'use strict'; + +var color = require(3); +var helpers = require(45); + +function interpolate(start, view, model, ease) { + var keys = Object.keys(model); + var i, ilen, key, actual, origin, target, type, c0, c1; + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + + target = model[key]; + + // if a value is added to the model after pivot() has been called, the view + // doesn't contain it, so let's initialize the view to the target value. + if (!view.hasOwnProperty(key)) { + view[key] = target; + } + + actual = view[key]; + + if (actual === target || key[0] === '_') { + continue; + } + + if (!start.hasOwnProperty(key)) { + start[key] = actual; + } + + origin = start[key]; + + type = typeof target; + + if (type === typeof origin) { + if (type === 'string') { + c0 = color(origin); + if (c0.valid) { + c1 = color(target); + if (c1.valid) { + view[key] = c1.mix(c0, ease).rgbString(); + continue; + } + } + } else if (type === 'number' && isFinite(origin) && isFinite(target)) { + view[key] = origin + (target - origin) * ease; + continue; + } + } + + view[key] = target; + } +} + +var Element = function(configuration) { + helpers.extend(this, configuration); + this.initialize.apply(this, arguments); +}; + +helpers.extend(Element.prototype, { + + initialize: function() { + this.hidden = false; + }, + + pivot: function() { + var me = this; + if (!me._view) { + me._view = helpers.clone(me._model); + } + me._start = {}; + return me; + }, + + transition: function(ease) { + var me = this; + var model = me._model; + var start = me._start; + var view = me._view; + + // No animation -> No Transition + if (!model || ease === 1) { + me._view = model; + me._start = null; + return me; + } + + if (!view) { + view = me._view = {}; + } + + if (!start) { + start = me._start = {}; + } + + interpolate(start, view, model, ease); + + return me; + }, + + tooltipPosition: function() { + return { + x: this._model.x, + y: this._model.y + }; + }, + + hasValue: function() { + return helpers.isNumber(this._model.x) && helpers.isNumber(this._model.y); + } +}); + +Element.extend = helpers.inherits; + +module.exports = Element; + +},{"3":3,"45":45}],27:[function(require,module,exports){ +/* global window: false */ +/* global document: false */ +'use strict'; + +var color = require(3); +var defaults = require(25); +var helpers = require(45); + +module.exports = function(Chart) { + + // -- Basic js utility methods + + helpers.configMerge = function(/* objects ... */) { + return helpers.merge(helpers.clone(arguments[0]), [].slice.call(arguments, 1), { + merger: function(key, target, source, options) { + var tval = target[key] || {}; + var sval = source[key]; + + if (key === 'scales') { + // scale config merging is complex. Add our own function here for that + target[key] = helpers.scaleMerge(tval, sval); + } else if (key === 'scale') { + // used in polar area & radar charts since there is only one scale + target[key] = helpers.merge(tval, [Chart.scaleService.getScaleDefaults(sval.type), sval]); + } else { + helpers._merger(key, target, source, options); + } + } + }); + }; + + helpers.scaleMerge = function(/* objects ... */) { + return helpers.merge(helpers.clone(arguments[0]), [].slice.call(arguments, 1), { + merger: function(key, target, source, options) { + if (key === 'xAxes' || key === 'yAxes') { + var slen = source[key].length; + var i, type, scale; + + if (!target[key]) { + target[key] = []; + } + + for (i = 0; i < slen; ++i) { + scale = source[key][i]; + type = helpers.valueOrDefault(scale.type, key === 'xAxes' ? 'category' : 'linear'); + + if (i >= target[key].length) { + target[key].push({}); + } + + if (!target[key][i].type || (scale.type && scale.type !== target[key][i].type)) { + // new/untyped scale or type changed: let's apply the new defaults + // then merge source scale to correctly overwrite the defaults. + helpers.merge(target[key][i], [Chart.scaleService.getScaleDefaults(type), scale]); + } else { + // scales type are the same + helpers.merge(target[key][i], scale); + } + } + } else { + helpers._merger(key, target, source, options); + } + } + }); + }; + + helpers.where = function(collection, filterCallback) { + if (helpers.isArray(collection) && Array.prototype.filter) { + return collection.filter(filterCallback); + } + var filtered = []; + + helpers.each(collection, function(item) { + if (filterCallback(item)) { + filtered.push(item); + } + }); + + return filtered; + }; + helpers.findIndex = Array.prototype.findIndex ? + function(array, callback, scope) { + return array.findIndex(callback, scope); + } : + function(array, callback, scope) { + scope = scope === undefined ? array : scope; + for (var i = 0, ilen = array.length; i < ilen; ++i) { + if (callback.call(scope, array[i], i, array)) { + return i; + } + } + return -1; + }; + helpers.findNextWhere = function(arrayToSearch, filterCallback, startIndex) { + // Default to start of the array + if (helpers.isNullOrUndef(startIndex)) { + startIndex = -1; + } + for (var i = startIndex + 1; i < arrayToSearch.length; i++) { + var currentItem = arrayToSearch[i]; + if (filterCallback(currentItem)) { + return currentItem; + } + } + }; + helpers.findPreviousWhere = function(arrayToSearch, filterCallback, startIndex) { + // Default to end of the array + if (helpers.isNullOrUndef(startIndex)) { + startIndex = arrayToSearch.length; + } + for (var i = startIndex - 1; i >= 0; i--) { + var currentItem = arrayToSearch[i]; + if (filterCallback(currentItem)) { + return currentItem; + } + } + }; + + // -- Math methods + helpers.isNumber = function(n) { + return !isNaN(parseFloat(n)) && isFinite(n); + }; + helpers.almostEquals = function(x, y, epsilon) { + return Math.abs(x - y) < epsilon; + }; + helpers.almostWhole = function(x, epsilon) { + var rounded = Math.round(x); + return (((rounded - epsilon) < x) && ((rounded + epsilon) > x)); + }; + helpers.max = function(array) { + return array.reduce(function(max, value) { + if (!isNaN(value)) { + return Math.max(max, value); + } + return max; + }, Number.NEGATIVE_INFINITY); + }; + helpers.min = function(array) { + return array.reduce(function(min, value) { + if (!isNaN(value)) { + return Math.min(min, value); + } + return min; + }, Number.POSITIVE_INFINITY); + }; + helpers.sign = Math.sign ? + function(x) { + return Math.sign(x); + } : + function(x) { + x = +x; // convert to a number + if (x === 0 || isNaN(x)) { + return x; + } + return x > 0 ? 1 : -1; + }; + helpers.log10 = Math.log10 ? + function(x) { + return Math.log10(x); + } : + function(x) { + return Math.log(x) / Math.LN10; + }; + helpers.toRadians = function(degrees) { + return degrees * (Math.PI / 180); + }; + helpers.toDegrees = function(radians) { + return radians * (180 / Math.PI); + }; + // Gets the angle from vertical upright to the point about a centre. + helpers.getAngleFromPoint = function(centrePoint, anglePoint) { + var distanceFromXCenter = anglePoint.x - centrePoint.x; + var distanceFromYCenter = anglePoint.y - centrePoint.y; + var radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter); + + var angle = Math.atan2(distanceFromYCenter, distanceFromXCenter); + + if (angle < (-0.5 * Math.PI)) { + angle += 2.0 * Math.PI; // make sure the returned angle is in the range of (-PI/2, 3PI/2] + } + + return { + angle: angle, + distance: radialDistanceFromCenter + }; + }; + helpers.distanceBetweenPoints = function(pt1, pt2) { + return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2)); + }; + helpers.aliasPixel = function(pixelWidth) { + return (pixelWidth % 2 === 0) ? 0 : 0.5; + }; + helpers.splineCurve = function(firstPoint, middlePoint, afterPoint, t) { + // Props to Rob Spencer at scaled innovation for his post on splining between points + // http://scaledinnovation.com/analytics/splines/aboutSplines.html + + // This function must also respect "skipped" points + + var previous = firstPoint.skip ? middlePoint : firstPoint; + var current = middlePoint; + var next = afterPoint.skip ? middlePoint : afterPoint; + + var d01 = Math.sqrt(Math.pow(current.x - previous.x, 2) + Math.pow(current.y - previous.y, 2)); + var d12 = Math.sqrt(Math.pow(next.x - current.x, 2) + Math.pow(next.y - current.y, 2)); + + var s01 = d01 / (d01 + d12); + var s12 = d12 / (d01 + d12); + + // If all points are the same, s01 & s02 will be inf + s01 = isNaN(s01) ? 0 : s01; + s12 = isNaN(s12) ? 0 : s12; + + var fa = t * s01; // scaling factor for triangle Ta + var fb = t * s12; + + return { + previous: { + x: current.x - fa * (next.x - previous.x), + y: current.y - fa * (next.y - previous.y) + }, + next: { + x: current.x + fb * (next.x - previous.x), + y: current.y + fb * (next.y - previous.y) + } + }; + }; + helpers.EPSILON = Number.EPSILON || 1e-14; + helpers.splineCurveMonotone = function(points) { + // This function calculates Bézier control points in a similar way than |splineCurve|, + // but preserves monotonicity of the provided data and ensures no local extremums are added + // between the dataset discrete points due to the interpolation. + // See : https://en.wikipedia.org/wiki/Monotone_cubic_interpolation + + var pointsWithTangents = (points || []).map(function(point) { + return { + model: point._model, + deltaK: 0, + mK: 0 + }; + }); + + // Calculate slopes (deltaK) and initialize tangents (mK) + var pointsLen = pointsWithTangents.length; + var i, pointBefore, pointCurrent, pointAfter; + for (i = 0; i < pointsLen; ++i) { + pointCurrent = pointsWithTangents[i]; + if (pointCurrent.model.skip) { + continue; + } + + pointBefore = i > 0 ? pointsWithTangents[i - 1] : null; + pointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null; + if (pointAfter && !pointAfter.model.skip) { + var slopeDeltaX = (pointAfter.model.x - pointCurrent.model.x); + + // In the case of two points that appear at the same x pixel, slopeDeltaX is 0 + pointCurrent.deltaK = slopeDeltaX !== 0 ? (pointAfter.model.y - pointCurrent.model.y) / slopeDeltaX : 0; + } + + if (!pointBefore || pointBefore.model.skip) { + pointCurrent.mK = pointCurrent.deltaK; + } else if (!pointAfter || pointAfter.model.skip) { + pointCurrent.mK = pointBefore.deltaK; + } else if (this.sign(pointBefore.deltaK) !== this.sign(pointCurrent.deltaK)) { + pointCurrent.mK = 0; + } else { + pointCurrent.mK = (pointBefore.deltaK + pointCurrent.deltaK) / 2; + } + } + + // Adjust tangents to ensure monotonic properties + var alphaK, betaK, tauK, squaredMagnitude; + for (i = 0; i < pointsLen - 1; ++i) { + pointCurrent = pointsWithTangents[i]; + pointAfter = pointsWithTangents[i + 1]; + if (pointCurrent.model.skip || pointAfter.model.skip) { + continue; + } + + if (helpers.almostEquals(pointCurrent.deltaK, 0, this.EPSILON)) { + pointCurrent.mK = pointAfter.mK = 0; + continue; + } + + alphaK = pointCurrent.mK / pointCurrent.deltaK; + betaK = pointAfter.mK / pointCurrent.deltaK; + squaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2); + if (squaredMagnitude <= 9) { + continue; + } + + tauK = 3 / Math.sqrt(squaredMagnitude); + pointCurrent.mK = alphaK * tauK * pointCurrent.deltaK; + pointAfter.mK = betaK * tauK * pointCurrent.deltaK; + } + + // Compute control points + var deltaX; + for (i = 0; i < pointsLen; ++i) { + pointCurrent = pointsWithTangents[i]; + if (pointCurrent.model.skip) { + continue; + } + + pointBefore = i > 0 ? pointsWithTangents[i - 1] : null; + pointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null; + if (pointBefore && !pointBefore.model.skip) { + deltaX = (pointCurrent.model.x - pointBefore.model.x) / 3; + pointCurrent.model.controlPointPreviousX = pointCurrent.model.x - deltaX; + pointCurrent.model.controlPointPreviousY = pointCurrent.model.y - deltaX * pointCurrent.mK; + } + if (pointAfter && !pointAfter.model.skip) { + deltaX = (pointAfter.model.x - pointCurrent.model.x) / 3; + pointCurrent.model.controlPointNextX = pointCurrent.model.x + deltaX; + pointCurrent.model.controlPointNextY = pointCurrent.model.y + deltaX * pointCurrent.mK; + } + } + }; + helpers.nextItem = function(collection, index, loop) { + if (loop) { + return index >= collection.length - 1 ? collection[0] : collection[index + 1]; + } + return index >= collection.length - 1 ? collection[collection.length - 1] : collection[index + 1]; + }; + helpers.previousItem = function(collection, index, loop) { + if (loop) { + return index <= 0 ? collection[collection.length - 1] : collection[index - 1]; + } + return index <= 0 ? collection[0] : collection[index - 1]; + }; + // Implementation of the nice number algorithm used in determining where axis labels will go + helpers.niceNum = function(range, round) { + var exponent = Math.floor(helpers.log10(range)); + var fraction = range / Math.pow(10, exponent); + var niceFraction; + + if (round) { + if (fraction < 1.5) { + niceFraction = 1; + } else if (fraction < 3) { + niceFraction = 2; + } else if (fraction < 7) { + niceFraction = 5; + } else { + niceFraction = 10; + } + } else if (fraction <= 1.0) { + niceFraction = 1; + } else if (fraction <= 2) { + niceFraction = 2; + } else if (fraction <= 5) { + niceFraction = 5; + } else { + niceFraction = 10; + } + + return niceFraction * Math.pow(10, exponent); + }; + // Request animation polyfill - http://www.paulirish.com/2011/requestanimationframe-for-smart-animating/ + helpers.requestAnimFrame = (function() { + if (typeof window === 'undefined') { + return function(callback) { + callback(); + }; + } + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + window.oRequestAnimationFrame || + window.msRequestAnimationFrame || + function(callback) { + return window.setTimeout(callback, 1000 / 60); + }; + }()); + // -- DOM methods + helpers.getRelativePosition = function(evt, chart) { + var mouseX, mouseY; + var e = evt.originalEvent || evt; + var canvas = evt.currentTarget || evt.srcElement; + var boundingRect = canvas.getBoundingClientRect(); + + var touches = e.touches; + if (touches && touches.length > 0) { + mouseX = touches[0].clientX; + mouseY = touches[0].clientY; + + } else { + mouseX = e.clientX; + mouseY = e.clientY; + } + + // Scale mouse coordinates into canvas coordinates + // by following the pattern laid out by 'jerryj' in the comments of + // http://www.html5canvastutorials.com/advanced/html5-canvas-mouse-coordinates/ + var paddingLeft = parseFloat(helpers.getStyle(canvas, 'padding-left')); + var paddingTop = parseFloat(helpers.getStyle(canvas, 'padding-top')); + var paddingRight = parseFloat(helpers.getStyle(canvas, 'padding-right')); + var paddingBottom = parseFloat(helpers.getStyle(canvas, 'padding-bottom')); + var width = boundingRect.right - boundingRect.left - paddingLeft - paddingRight; + var height = boundingRect.bottom - boundingRect.top - paddingTop - paddingBottom; + + // We divide by the current device pixel ratio, because the canvas is scaled up by that amount in each direction. However + // the backend model is in unscaled coordinates. Since we are going to deal with our model coordinates, we go back here + mouseX = Math.round((mouseX - boundingRect.left - paddingLeft) / (width) * canvas.width / chart.currentDevicePixelRatio); + mouseY = Math.round((mouseY - boundingRect.top - paddingTop) / (height) * canvas.height / chart.currentDevicePixelRatio); + + return { + x: mouseX, + y: mouseY + }; + + }; + + // Private helper function to convert max-width/max-height values that may be percentages into a number + function parseMaxStyle(styleValue, node, parentProperty) { + var valueInPixels; + if (typeof styleValue === 'string') { + valueInPixels = parseInt(styleValue, 10); + + if (styleValue.indexOf('%') !== -1) { + // percentage * size in dimension + valueInPixels = valueInPixels / 100 * node.parentNode[parentProperty]; + } + } else { + valueInPixels = styleValue; + } + + return valueInPixels; + } + + /** + * Returns if the given value contains an effective constraint. + * @private + */ + function isConstrainedValue(value) { + return value !== undefined && value !== null && value !== 'none'; + } + + // Private helper to get a constraint dimension + // @param domNode : the node to check the constraint on + // @param maxStyle : the style that defines the maximum for the direction we are using (maxWidth / maxHeight) + // @param percentageProperty : property of parent to use when calculating width as a percentage + // @see http://www.nathanaeljones.com/blog/2013/reading-max-width-cross-browser + function getConstraintDimension(domNode, maxStyle, percentageProperty) { + var view = document.defaultView; + var parentNode = domNode.parentNode; + var constrainedNode = view.getComputedStyle(domNode)[maxStyle]; + var constrainedContainer = view.getComputedStyle(parentNode)[maxStyle]; + var hasCNode = isConstrainedValue(constrainedNode); + var hasCContainer = isConstrainedValue(constrainedContainer); + var infinity = Number.POSITIVE_INFINITY; + + if (hasCNode || hasCContainer) { + return Math.min( + hasCNode ? parseMaxStyle(constrainedNode, domNode, percentageProperty) : infinity, + hasCContainer ? parseMaxStyle(constrainedContainer, parentNode, percentageProperty) : infinity); + } + + return 'none'; + } + // returns Number or undefined if no constraint + helpers.getConstraintWidth = function(domNode) { + return getConstraintDimension(domNode, 'max-width', 'clientWidth'); + }; + // returns Number or undefined if no constraint + helpers.getConstraintHeight = function(domNode) { + return getConstraintDimension(domNode, 'max-height', 'clientHeight'); + }; + helpers.getMaximumWidth = function(domNode) { + var container = domNode.parentNode; + if (!container) { + return domNode.clientWidth; + } + + var paddingLeft = parseInt(helpers.getStyle(container, 'padding-left'), 10); + var paddingRight = parseInt(helpers.getStyle(container, 'padding-right'), 10); + var w = container.clientWidth - paddingLeft - paddingRight; + var cw = helpers.getConstraintWidth(domNode); + return isNaN(cw) ? w : Math.min(w, cw); + }; + helpers.getMaximumHeight = function(domNode) { + var container = domNode.parentNode; + if (!container) { + return domNode.clientHeight; + } + + var paddingTop = parseInt(helpers.getStyle(container, 'padding-top'), 10); + var paddingBottom = parseInt(helpers.getStyle(container, 'padding-bottom'), 10); + var h = container.clientHeight - paddingTop - paddingBottom; + var ch = helpers.getConstraintHeight(domNode); + return isNaN(ch) ? h : Math.min(h, ch); + }; + helpers.getStyle = function(el, property) { + return el.currentStyle ? + el.currentStyle[property] : + document.defaultView.getComputedStyle(el, null).getPropertyValue(property); + }; + helpers.retinaScale = function(chart, forceRatio) { + var pixelRatio = chart.currentDevicePixelRatio = forceRatio || window.devicePixelRatio || 1; + if (pixelRatio === 1) { + return; + } + + var canvas = chart.canvas; + var height = chart.height; + var width = chart.width; + + canvas.height = height * pixelRatio; + canvas.width = width * pixelRatio; + chart.ctx.scale(pixelRatio, pixelRatio); + + // If no style has been set on the canvas, the render size is used as display size, + // making the chart visually bigger, so let's enforce it to the "correct" values. + // See https://github.com/chartjs/Chart.js/issues/3575 + canvas.style.height = height + 'px'; + canvas.style.width = width + 'px'; + }; + // -- Canvas methods + helpers.fontString = function(pixelSize, fontStyle, fontFamily) { + return fontStyle + ' ' + pixelSize + 'px ' + fontFamily; + }; + helpers.longestText = function(ctx, font, arrayOfThings, cache) { + cache = cache || {}; + var data = cache.data = cache.data || {}; + var gc = cache.garbageCollect = cache.garbageCollect || []; + + if (cache.font !== font) { + data = cache.data = {}; + gc = cache.garbageCollect = []; + cache.font = font; + } + + ctx.font = font; + var longest = 0; + helpers.each(arrayOfThings, function(thing) { + // Undefined strings and arrays should not be measured + if (thing !== undefined && thing !== null && helpers.isArray(thing) !== true) { + longest = helpers.measureText(ctx, data, gc, longest, thing); + } else if (helpers.isArray(thing)) { + // if it is an array lets measure each element + // to do maybe simplify this function a bit so we can do this more recursively? + helpers.each(thing, function(nestedThing) { + // Undefined strings and arrays should not be measured + if (nestedThing !== undefined && nestedThing !== null && !helpers.isArray(nestedThing)) { + longest = helpers.measureText(ctx, data, gc, longest, nestedThing); + } + }); + } + }); + + var gcLen = gc.length / 2; + if (gcLen > arrayOfThings.length) { + for (var i = 0; i < gcLen; i++) { + delete data[gc[i]]; + } + gc.splice(0, gcLen); + } + return longest; + }; + helpers.measureText = function(ctx, data, gc, longest, string) { + var textWidth = data[string]; + if (!textWidth) { + textWidth = data[string] = ctx.measureText(string).width; + gc.push(string); + } + if (textWidth > longest) { + longest = textWidth; + } + return longest; + }; + helpers.numberOfLabelLines = function(arrayOfThings) { + var numberOfLines = 1; + helpers.each(arrayOfThings, function(thing) { + if (helpers.isArray(thing)) { + if (thing.length > numberOfLines) { + numberOfLines = thing.length; + } + } + }); + return numberOfLines; + }; + + helpers.color = !color ? + function(value) { + console.error('Color.js not found!'); + return value; + } : + function(value) { + /* global CanvasGradient */ + if (value instanceof CanvasGradient) { + value = defaults.global.defaultColor; + } + + return color(value); + }; + + helpers.getHoverColor = function(colorValue) { + /* global CanvasPattern */ + return (colorValue instanceof CanvasPattern) ? + colorValue : + helpers.color(colorValue).saturate(0.5).darken(0.1).rgbString(); + }; +}; + +},{"25":25,"3":3,"45":45}],28:[function(require,module,exports){ +'use strict'; + +var helpers = require(45); + +/** + * Helper function to get relative position for an event + * @param {Event|IEvent} event - The event to get the position for + * @param {Chart} chart - The chart + * @returns {Point} the event position + */ +function getRelativePosition(e, chart) { + if (e.native) { + return { + x: e.x, + y: e.y + }; + } + + return helpers.getRelativePosition(e, chart); +} + +/** + * Helper function to traverse all of the visible elements in the chart + * @param chart {chart} the chart + * @param handler {Function} the callback to execute for each visible item + */ +function parseVisibleItems(chart, handler) { + var datasets = chart.data.datasets; + var meta, i, j, ilen, jlen; + + for (i = 0, ilen = datasets.length; i < ilen; ++i) { + if (!chart.isDatasetVisible(i)) { + continue; + } + + meta = chart.getDatasetMeta(i); + for (j = 0, jlen = meta.data.length; j < jlen; ++j) { + var element = meta.data[j]; + if (!element._view.skip) { + handler(element); + } + } + } +} + +/** + * Helper function to get the items that intersect the event position + * @param items {ChartElement[]} elements to filter + * @param position {Point} the point to be nearest to + * @return {ChartElement[]} the nearest items + */ +function getIntersectItems(chart, position) { + var elements = []; + + parseVisibleItems(chart, function(element) { + if (element.inRange(position.x, position.y)) { + elements.push(element); + } + }); + + return elements; +} + +/** + * Helper function to get the items nearest to the event position considering all visible items in teh chart + * @param chart {Chart} the chart to look at elements from + * @param position {Point} the point to be nearest to + * @param intersect {Boolean} if true, only consider items that intersect the position + * @param distanceMetric {Function} function to provide the distance between points + * @return {ChartElement[]} the nearest items + */ +function getNearestItems(chart, position, intersect, distanceMetric) { + var minDistance = Number.POSITIVE_INFINITY; + var nearestItems = []; + + parseVisibleItems(chart, function(element) { + if (intersect && !element.inRange(position.x, position.y)) { + return; + } + + var center = element.getCenterPoint(); + var distance = distanceMetric(position, center); + + if (distance < minDistance) { + nearestItems = [element]; + minDistance = distance; + } else if (distance === minDistance) { + // Can have multiple items at the same distance in which case we sort by size + nearestItems.push(element); + } + }); + + return nearestItems; +} + +/** + * Get a distance metric function for two points based on the + * axis mode setting + * @param {String} axis the axis mode. x|y|xy + */ +function getDistanceMetricForAxis(axis) { + var useX = axis.indexOf('x') !== -1; + var useY = axis.indexOf('y') !== -1; + + return function(pt1, pt2) { + var deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0; + var deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0; + return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2)); + }; +} + +function indexMode(chart, e, options) { + var position = getRelativePosition(e, chart); + // Default axis for index mode is 'x' to match old behaviour + options.axis = options.axis || 'x'; + var distanceMetric = getDistanceMetricForAxis(options.axis); + var items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric); + var elements = []; + + if (!items.length) { + return []; + } + + chart.data.datasets.forEach(function(dataset, datasetIndex) { + if (chart.isDatasetVisible(datasetIndex)) { + var meta = chart.getDatasetMeta(datasetIndex); + var element = meta.data[items[0]._index]; + + // don't count items that are skipped (null data) + if (element && !element._view.skip) { + elements.push(element); + } + } + }); + + return elements; +} + +/** + * @interface IInteractionOptions + */ +/** + * If true, only consider items that intersect the point + * @name IInterfaceOptions#boolean + * @type Boolean + */ + +/** + * Contains interaction related functions + * @namespace Chart.Interaction + */ +module.exports = { + // Helper function for different modes + modes: { + single: function(chart, e) { + var position = getRelativePosition(e, chart); + var elements = []; + + parseVisibleItems(chart, function(element) { + if (element.inRange(position.x, position.y)) { + elements.push(element); + return elements; + } + }); + + return elements.slice(0, 1); + }, + + /** + * @function Chart.Interaction.modes.label + * @deprecated since version 2.4.0 + * @todo remove at version 3 + * @private + */ + label: indexMode, + + /** + * Returns items at the same index. If the options.intersect parameter is true, we only return items if we intersect something + * If the options.intersect mode is false, we find the nearest item and return the items at the same index as that item + * @function Chart.Interaction.modes.index + * @since v2.4.0 + * @param chart {chart} the chart we are returning items from + * @param e {Event} the event we are find things at + * @param options {IInteractionOptions} options to use during interaction + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + index: indexMode, + + /** + * Returns items in the same dataset. If the options.intersect parameter is true, we only return items if we intersect something + * If the options.intersect is false, we find the nearest item and return the items in that dataset + * @function Chart.Interaction.modes.dataset + * @param chart {chart} the chart we are returning items from + * @param e {Event} the event we are find things at + * @param options {IInteractionOptions} options to use during interaction + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + dataset: function(chart, e, options) { + var position = getRelativePosition(e, chart); + options.axis = options.axis || 'xy'; + var distanceMetric = getDistanceMetricForAxis(options.axis); + var items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric); + + if (items.length > 0) { + items = chart.getDatasetMeta(items[0]._datasetIndex).data; + } + + return items; + }, + + /** + * @function Chart.Interaction.modes.x-axis + * @deprecated since version 2.4.0. Use index mode and intersect == true + * @todo remove at version 3 + * @private + */ + 'x-axis': function(chart, e) { + return indexMode(chart, e, {intersect: false}); + }, + + /** + * Point mode returns all elements that hit test based on the event position + * of the event + * @function Chart.Interaction.modes.intersect + * @param chart {chart} the chart we are returning items from + * @param e {Event} the event we are find things at + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + point: function(chart, e) { + var position = getRelativePosition(e, chart); + return getIntersectItems(chart, position); + }, + + /** + * nearest mode returns the element closest to the point + * @function Chart.Interaction.modes.intersect + * @param chart {chart} the chart we are returning items from + * @param e {Event} the event we are find things at + * @param options {IInteractionOptions} options to use + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + nearest: function(chart, e, options) { + var position = getRelativePosition(e, chart); + options.axis = options.axis || 'xy'; + var distanceMetric = getDistanceMetricForAxis(options.axis); + var nearestItems = getNearestItems(chart, position, options.intersect, distanceMetric); + + // We have multiple items at the same distance from the event. Now sort by smallest + if (nearestItems.length > 1) { + nearestItems.sort(function(a, b) { + var sizeA = a.getArea(); + var sizeB = b.getArea(); + var ret = sizeA - sizeB; + + if (ret === 0) { + // if equal sort by dataset index + ret = a._datasetIndex - b._datasetIndex; + } + + return ret; + }); + } + + // Return only 1 item + return nearestItems.slice(0, 1); + }, + + /** + * x mode returns the elements that hit-test at the current x coordinate + * @function Chart.Interaction.modes.x + * @param chart {chart} the chart we are returning items from + * @param e {Event} the event we are find things at + * @param options {IInteractionOptions} options to use + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + x: function(chart, e, options) { + var position = getRelativePosition(e, chart); + var items = []; + var intersectsItem = false; + + parseVisibleItems(chart, function(element) { + if (element.inXRange(position.x)) { + items.push(element); + } + + if (element.inRange(position.x, position.y)) { + intersectsItem = true; + } + }); + + // If we want to trigger on an intersect and we don't have any items + // that intersect the position, return nothing + if (options.intersect && !intersectsItem) { + items = []; + } + return items; + }, + + /** + * y mode returns the elements that hit-test at the current y coordinate + * @function Chart.Interaction.modes.y + * @param chart {chart} the chart we are returning items from + * @param e {Event} the event we are find things at + * @param options {IInteractionOptions} options to use + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + y: function(chart, e, options) { + var position = getRelativePosition(e, chart); + var items = []; + var intersectsItem = false; + + parseVisibleItems(chart, function(element) { + if (element.inYRange(position.y)) { + items.push(element); + } + + if (element.inRange(position.x, position.y)) { + intersectsItem = true; + } + }); + + // If we want to trigger on an intersect and we don't have any items + // that intersect the position, return nothing + if (options.intersect && !intersectsItem) { + items = []; + } + return items; + } + } +}; + +},{"45":45}],29:[function(require,module,exports){ +'use strict'; + +var defaults = require(25); + +defaults._set('global', { + responsive: true, + responsiveAnimationDuration: 0, + maintainAspectRatio: true, + events: ['mousemove', 'mouseout', 'click', 'touchstart', 'touchmove'], + hover: { + onHover: null, + mode: 'nearest', + intersect: true, + animationDuration: 400 + }, + onClick: null, + defaultColor: 'rgba(0,0,0,0.1)', + defaultFontColor: '#666', + defaultFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif", + defaultFontSize: 12, + defaultFontStyle: 'normal', + showLines: true, + + // Element defaults defined in element extensions + elements: {}, + + // Layout options such as padding + layout: { + padding: { + top: 0, + right: 0, + bottom: 0, + left: 0 + } + } +}); + +module.exports = function() { + + // Occupy the global variable of Chart, and create a simple base class + var Chart = function(item, config) { + this.construct(item, config); + return this; + }; + + Chart.Chart = Chart; + + return Chart; +}; + +},{"25":25}],30:[function(require,module,exports){ +'use strict'; + +var helpers = require(45); + +module.exports = function(Chart) { + + function filterByPosition(array, position) { + return helpers.where(array, function(v) { + return v.position === position; + }); + } + + function sortByWeight(array, reverse) { + array.forEach(function(v, i) { + v._tmpIndex_ = i; + return v; + }); + array.sort(function(a, b) { + var v0 = reverse ? b : a; + var v1 = reverse ? a : b; + return v0.weight === v1.weight ? + v0._tmpIndex_ - v1._tmpIndex_ : + v0.weight - v1.weight; + }); + array.forEach(function(v) { + delete v._tmpIndex_; + }); + } + + /** + * @interface ILayoutItem + * @prop {String} position - The position of the item in the chart layout. Possible values are + * 'left', 'top', 'right', 'bottom', and 'chartArea' + * @prop {Number} weight - The weight used to sort the item. Higher weights are further away from the chart area + * @prop {Boolean} fullWidth - if true, and the item is horizontal, then push vertical boxes down + * @prop {Function} isHorizontal - returns true if the layout item is horizontal (ie. top or bottom) + * @prop {Function} update - Takes two parameters: width and height. Returns size of item + * @prop {Function} getPadding - Returns an object with padding on the edges + * @prop {Number} width - Width of item. Must be valid after update() + * @prop {Number} height - Height of item. Must be valid after update() + * @prop {Number} left - Left edge of the item. Set by layout system and cannot be used in update + * @prop {Number} top - Top edge of the item. Set by layout system and cannot be used in update + * @prop {Number} right - Right edge of the item. Set by layout system and cannot be used in update + * @prop {Number} bottom - Bottom edge of the item. Set by layout system and cannot be used in update + */ + + // The layout service is very self explanatory. It's responsible for the layout within a chart. + // Scales, Legends and Plugins all rely on the layout service and can easily register to be placed anywhere they need + // It is this service's responsibility of carrying out that layout. + Chart.layoutService = { + defaults: {}, + + /** + * Register a box to a chart. + * A box is simply a reference to an object that requires layout. eg. Scales, Legend, Title. + * @param {Chart} chart - the chart to use + * @param {ILayoutItem} item - the item to add to be layed out + */ + addBox: function(chart, item) { + if (!chart.boxes) { + chart.boxes = []; + } + + // initialize item with default values + item.fullWidth = item.fullWidth || false; + item.position = item.position || 'top'; + item.weight = item.weight || 0; + + chart.boxes.push(item); + }, + + /** + * Remove a layoutItem from a chart + * @param {Chart} chart - the chart to remove the box from + * @param {Object} layoutItem - the item to remove from the layout + */ + removeBox: function(chart, layoutItem) { + var index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1; + if (index !== -1) { + chart.boxes.splice(index, 1); + } + }, + + /** + * Sets (or updates) options on the given `item`. + * @param {Chart} chart - the chart in which the item lives (or will be added to) + * @param {Object} item - the item to configure with the given options + * @param {Object} options - the new item options. + */ + configure: function(chart, item, options) { + var props = ['fullWidth', 'position', 'weight']; + var ilen = props.length; + var i = 0; + var prop; + + for (; i < ilen; ++i) { + prop = props[i]; + if (options.hasOwnProperty(prop)) { + item[prop] = options[prop]; + } + } + }, + + /** + * Fits boxes of the given chart into the given size by having each box measure itself + * then running a fitting algorithm + * @param {Chart} chart - the chart + * @param {Number} width - the width to fit into + * @param {Number} height - the height to fit into + */ + update: function(chart, width, height) { + if (!chart) { + return; + } + + var layoutOptions = chart.options.layout || {}; + var padding = helpers.options.toPadding(layoutOptions.padding); + var leftPadding = padding.left; + var rightPadding = padding.right; + var topPadding = padding.top; + var bottomPadding = padding.bottom; + + var leftBoxes = filterByPosition(chart.boxes, 'left'); + var rightBoxes = filterByPosition(chart.boxes, 'right'); + var topBoxes = filterByPosition(chart.boxes, 'top'); + var bottomBoxes = filterByPosition(chart.boxes, 'bottom'); + var chartAreaBoxes = filterByPosition(chart.boxes, 'chartArea'); + + // Sort boxes by weight. A higher weight is further away from the chart area + sortByWeight(leftBoxes, true); + sortByWeight(rightBoxes, false); + sortByWeight(topBoxes, true); + sortByWeight(bottomBoxes, false); + + // Essentially we now have any number of boxes on each of the 4 sides. + // Our canvas looks like the following. + // The areas L1 and L2 are the left axes. R1 is the right axis, T1 is the top axis and + // B1 is the bottom axis + // There are also 4 quadrant-like locations (left to right instead of clockwise) reserved for chart overlays + // These locations are single-box locations only, when trying to register a chartArea location that is already taken, + // an error will be thrown. + // + // |----------------------------------------------------| + // | T1 (Full Width) | + // |----------------------------------------------------| + // | | | T2 | | + // | |----|-------------------------------------|----| + // | | | C1 | | C2 | | + // | | |----| |----| | + // | | | | | + // | L1 | L2 | ChartArea (C0) | R1 | + // | | | | | + // | | |----| |----| | + // | | | C3 | | C4 | | + // | |----|-------------------------------------|----| + // | | | B1 | | + // |----------------------------------------------------| + // | B2 (Full Width) | + // |----------------------------------------------------| + // + // What we do to find the best sizing, we do the following + // 1. Determine the minimum size of the chart area. + // 2. Split the remaining width equally between each vertical axis + // 3. Split the remaining height equally between each horizontal axis + // 4. Give each layout the maximum size it can be. The layout will return it's minimum size + // 5. Adjust the sizes of each axis based on it's minimum reported size. + // 6. Refit each axis + // 7. Position each axis in the final location + // 8. Tell the chart the final location of the chart area + // 9. Tell any axes that overlay the chart area the positions of the chart area + + // Step 1 + var chartWidth = width - leftPadding - rightPadding; + var chartHeight = height - topPadding - bottomPadding; + var chartAreaWidth = chartWidth / 2; // min 50% + var chartAreaHeight = chartHeight / 2; // min 50% + + // Step 2 + var verticalBoxWidth = (width - chartAreaWidth) / (leftBoxes.length + rightBoxes.length); + + // Step 3 + var horizontalBoxHeight = (height - chartAreaHeight) / (topBoxes.length + bottomBoxes.length); + + // Step 4 + var maxChartAreaWidth = chartWidth; + var maxChartAreaHeight = chartHeight; + var minBoxSizes = []; + + function getMinimumBoxSize(box) { + var minSize; + var isHorizontal = box.isHorizontal(); + + if (isHorizontal) { + minSize = box.update(box.fullWidth ? chartWidth : maxChartAreaWidth, horizontalBoxHeight); + maxChartAreaHeight -= minSize.height; + } else { + minSize = box.update(verticalBoxWidth, chartAreaHeight); + maxChartAreaWidth -= minSize.width; + } + + minBoxSizes.push({ + horizontal: isHorizontal, + minSize: minSize, + box: box, + }); + } + + helpers.each(leftBoxes.concat(rightBoxes, topBoxes, bottomBoxes), getMinimumBoxSize); + + // If a horizontal box has padding, we move the left boxes over to avoid ugly charts (see issue #2478) + var maxHorizontalLeftPadding = 0; + var maxHorizontalRightPadding = 0; + var maxVerticalTopPadding = 0; + var maxVerticalBottomPadding = 0; + + helpers.each(topBoxes.concat(bottomBoxes), function(horizontalBox) { + if (horizontalBox.getPadding) { + var boxPadding = horizontalBox.getPadding(); + maxHorizontalLeftPadding = Math.max(maxHorizontalLeftPadding, boxPadding.left); + maxHorizontalRightPadding = Math.max(maxHorizontalRightPadding, boxPadding.right); + } + }); + + helpers.each(leftBoxes.concat(rightBoxes), function(verticalBox) { + if (verticalBox.getPadding) { + var boxPadding = verticalBox.getPadding(); + maxVerticalTopPadding = Math.max(maxVerticalTopPadding, boxPadding.top); + maxVerticalBottomPadding = Math.max(maxVerticalBottomPadding, boxPadding.bottom); + } + }); + + // At this point, maxChartAreaHeight and maxChartAreaWidth are the size the chart area could + // be if the axes are drawn at their minimum sizes. + // Steps 5 & 6 + var totalLeftBoxesWidth = leftPadding; + var totalRightBoxesWidth = rightPadding; + var totalTopBoxesHeight = topPadding; + var totalBottomBoxesHeight = bottomPadding; + + // Function to fit a box + function fitBox(box) { + var minBoxSize = helpers.findNextWhere(minBoxSizes, function(minBox) { + return minBox.box === box; + }); + + if (minBoxSize) { + if (box.isHorizontal()) { + var scaleMargin = { + left: Math.max(totalLeftBoxesWidth, maxHorizontalLeftPadding), + right: Math.max(totalRightBoxesWidth, maxHorizontalRightPadding), + top: 0, + bottom: 0 + }; + + // Don't use min size here because of label rotation. When the labels are rotated, their rotation highly depends + // on the margin. Sometimes they need to increase in size slightly + box.update(box.fullWidth ? chartWidth : maxChartAreaWidth, chartHeight / 2, scaleMargin); + } else { + box.update(minBoxSize.minSize.width, maxChartAreaHeight); + } + } + } + + // Update, and calculate the left and right margins for the horizontal boxes + helpers.each(leftBoxes.concat(rightBoxes), fitBox); + + helpers.each(leftBoxes, function(box) { + totalLeftBoxesWidth += box.width; + }); + + helpers.each(rightBoxes, function(box) { + totalRightBoxesWidth += box.width; + }); + + // Set the Left and Right margins for the horizontal boxes + helpers.each(topBoxes.concat(bottomBoxes), fitBox); + + // Figure out how much margin is on the top and bottom of the vertical boxes + helpers.each(topBoxes, function(box) { + totalTopBoxesHeight += box.height; + }); + + helpers.each(bottomBoxes, function(box) { + totalBottomBoxesHeight += box.height; + }); + + function finalFitVerticalBox(box) { + var minBoxSize = helpers.findNextWhere(minBoxSizes, function(minSize) { + return minSize.box === box; + }); + + var scaleMargin = { + left: 0, + right: 0, + top: totalTopBoxesHeight, + bottom: totalBottomBoxesHeight + }; + + if (minBoxSize) { + box.update(minBoxSize.minSize.width, maxChartAreaHeight, scaleMargin); + } + } + + // Let the left layout know the final margin + helpers.each(leftBoxes.concat(rightBoxes), finalFitVerticalBox); + + // Recalculate because the size of each layout might have changed slightly due to the margins (label rotation for instance) + totalLeftBoxesWidth = leftPadding; + totalRightBoxesWidth = rightPadding; + totalTopBoxesHeight = topPadding; + totalBottomBoxesHeight = bottomPadding; + + helpers.each(leftBoxes, function(box) { + totalLeftBoxesWidth += box.width; + }); + + helpers.each(rightBoxes, function(box) { + totalRightBoxesWidth += box.width; + }); + + helpers.each(topBoxes, function(box) { + totalTopBoxesHeight += box.height; + }); + helpers.each(bottomBoxes, function(box) { + totalBottomBoxesHeight += box.height; + }); + + // We may be adding some padding to account for rotated x axis labels + var leftPaddingAddition = Math.max(maxHorizontalLeftPadding - totalLeftBoxesWidth, 0); + totalLeftBoxesWidth += leftPaddingAddition; + totalRightBoxesWidth += Math.max(maxHorizontalRightPadding - totalRightBoxesWidth, 0); + + var topPaddingAddition = Math.max(maxVerticalTopPadding - totalTopBoxesHeight, 0); + totalTopBoxesHeight += topPaddingAddition; + totalBottomBoxesHeight += Math.max(maxVerticalBottomPadding - totalBottomBoxesHeight, 0); + + // Figure out if our chart area changed. This would occur if the dataset layout label rotation + // changed due to the application of the margins in step 6. Since we can only get bigger, this is safe to do + // without calling `fit` again + var newMaxChartAreaHeight = height - totalTopBoxesHeight - totalBottomBoxesHeight; + var newMaxChartAreaWidth = width - totalLeftBoxesWidth - totalRightBoxesWidth; + + if (newMaxChartAreaWidth !== maxChartAreaWidth || newMaxChartAreaHeight !== maxChartAreaHeight) { + helpers.each(leftBoxes, function(box) { + box.height = newMaxChartAreaHeight; + }); + + helpers.each(rightBoxes, function(box) { + box.height = newMaxChartAreaHeight; + }); + + helpers.each(topBoxes, function(box) { + if (!box.fullWidth) { + box.width = newMaxChartAreaWidth; + } + }); + + helpers.each(bottomBoxes, function(box) { + if (!box.fullWidth) { + box.width = newMaxChartAreaWidth; + } + }); + + maxChartAreaHeight = newMaxChartAreaHeight; + maxChartAreaWidth = newMaxChartAreaWidth; + } + + // Step 7 - Position the boxes + var left = leftPadding + leftPaddingAddition; + var top = topPadding + topPaddingAddition; + + function placeBox(box) { + if (box.isHorizontal()) { + box.left = box.fullWidth ? leftPadding : totalLeftBoxesWidth; + box.right = box.fullWidth ? width - rightPadding : totalLeftBoxesWidth + maxChartAreaWidth; + box.top = top; + box.bottom = top + box.height; + + // Move to next point + top = box.bottom; + + } else { + + box.left = left; + box.right = left + box.width; + box.top = totalTopBoxesHeight; + box.bottom = totalTopBoxesHeight + maxChartAreaHeight; + + // Move to next point + left = box.right; + } + } + + helpers.each(leftBoxes.concat(topBoxes), placeBox); + + // Account for chart width and height + left += maxChartAreaWidth; + top += maxChartAreaHeight; + + helpers.each(rightBoxes, placeBox); + helpers.each(bottomBoxes, placeBox); + + // Step 8 + chart.chartArea = { + left: totalLeftBoxesWidth, + top: totalTopBoxesHeight, + right: totalLeftBoxesWidth + maxChartAreaWidth, + bottom: totalTopBoxesHeight + maxChartAreaHeight + }; + + // Step 9 + helpers.each(chartAreaBoxes, function(box) { + box.left = chart.chartArea.left; + box.top = chart.chartArea.top; + box.right = chart.chartArea.right; + box.bottom = chart.chartArea.bottom; + + box.update(maxChartAreaWidth, maxChartAreaHeight); + }); + } + }; +}; + +},{"45":45}],31:[function(require,module,exports){ +'use strict'; + +var defaults = require(25); +var Element = require(26); +var helpers = require(45); + +defaults._set('global', { + plugins: {} +}); + +module.exports = function(Chart) { + + /** + * The plugin service singleton + * @namespace Chart.plugins + * @since 2.1.0 + */ + Chart.plugins = { + /** + * Globally registered plugins. + * @private + */ + _plugins: [], + + /** + * This identifier is used to invalidate the descriptors cache attached to each chart + * when a global plugin is registered or unregistered. In this case, the cache ID is + * incremented and descriptors are regenerated during following API calls. + * @private + */ + _cacheId: 0, + + /** + * Registers the given plugin(s) if not already registered. + * @param {Array|Object} plugins plugin instance(s). + */ + register: function(plugins) { + var p = this._plugins; + ([]).concat(plugins).forEach(function(plugin) { + if (p.indexOf(plugin) === -1) { + p.push(plugin); + } + }); + + this._cacheId++; + }, + + /** + * Unregisters the given plugin(s) only if registered. + * @param {Array|Object} plugins plugin instance(s). + */ + unregister: function(plugins) { + var p = this._plugins; + ([]).concat(plugins).forEach(function(plugin) { + var idx = p.indexOf(plugin); + if (idx !== -1) { + p.splice(idx, 1); + } + }); + + this._cacheId++; + }, + + /** + * Remove all registered plugins. + * @since 2.1.5 + */ + clear: function() { + this._plugins = []; + this._cacheId++; + }, + + /** + * Returns the number of registered plugins? + * @returns {Number} + * @since 2.1.5 + */ + count: function() { + return this._plugins.length; + }, + + /** + * Returns all registered plugin instances. + * @returns {Array} array of plugin objects. + * @since 2.1.5 + */ + getAll: function() { + return this._plugins; + }, + + /** + * Calls enabled plugins for `chart` on the specified hook and with the given args. + * This method immediately returns as soon as a plugin explicitly returns false. The + * returned value can be used, for instance, to interrupt the current action. + * @param {Object} chart - The chart instance for which plugins should be called. + * @param {String} hook - The name of the plugin method to call (e.g. 'beforeUpdate'). + * @param {Array} [args] - Extra arguments to apply to the hook call. + * @returns {Boolean} false if any of the plugins return false, else returns true. + */ + notify: function(chart, hook, args) { + var descriptors = this.descriptors(chart); + var ilen = descriptors.length; + var i, descriptor, plugin, params, method; + + for (i = 0; i < ilen; ++i) { + descriptor = descriptors[i]; + plugin = descriptor.plugin; + method = plugin[hook]; + if (typeof method === 'function') { + params = [chart].concat(args || []); + params.push(descriptor.options); + if (method.apply(plugin, params) === false) { + return false; + } + } + } + + return true; + }, + + /** + * Returns descriptors of enabled plugins for the given chart. + * @returns {Array} [{ plugin, options }] + * @private + */ + descriptors: function(chart) { + var cache = chart._plugins || (chart._plugins = {}); + if (cache.id === this._cacheId) { + return cache.descriptors; + } + + var plugins = []; + var descriptors = []; + var config = (chart && chart.config) || {}; + var options = (config.options && config.options.plugins) || {}; + + this._plugins.concat(config.plugins || []).forEach(function(plugin) { + var idx = plugins.indexOf(plugin); + if (idx !== -1) { + return; + } + + var id = plugin.id; + var opts = options[id]; + if (opts === false) { + return; + } + + if (opts === true) { + opts = helpers.clone(defaults.global.plugins[id]); + } + + plugins.push(plugin); + descriptors.push({ + plugin: plugin, + options: opts || {} + }); + }); + + cache.descriptors = descriptors; + cache.id = this._cacheId; + return descriptors; + } + }; + + /** + * Plugin extension hooks. + * @interface IPlugin + * @since 2.1.0 + */ + /** + * @method IPlugin#beforeInit + * @desc Called before initializing `chart`. + * @param {Chart.Controller} chart - The chart instance. + * @param {Object} options - The plugin options. + */ + /** + * @method IPlugin#afterInit + * @desc Called after `chart` has been initialized and before the first update. + * @param {Chart.Controller} chart - The chart instance. + * @param {Object} options - The plugin options. + */ + /** + * @method IPlugin#beforeUpdate + * @desc Called before updating `chart`. If any plugin returns `false`, the update + * is cancelled (and thus subsequent render(s)) until another `update` is triggered. + * @param {Chart.Controller} chart - The chart instance. + * @param {Object} options - The plugin options. + * @returns {Boolean} `false` to cancel the chart update. + */ + /** + * @method IPlugin#afterUpdate + * @desc Called after `chart` has been updated and before rendering. Note that this + * hook will not be called if the chart update has been previously cancelled. + * @param {Chart.Controller} chart - The chart instance. + * @param {Object} options - The plugin options. + */ + /** + * @method IPlugin#beforeDatasetsUpdate + * @desc Called before updating the `chart` datasets. If any plugin returns `false`, + * the datasets update is cancelled until another `update` is triggered. + * @param {Chart.Controller} chart - The chart instance. + * @param {Object} options - The plugin options. + * @returns {Boolean} false to cancel the datasets update. + * @since version 2.1.5 + */ + /** + * @method IPlugin#afterDatasetsUpdate + * @desc Called after the `chart` datasets have been updated. Note that this hook + * will not be called if the datasets update has been previously cancelled. + * @param {Chart.Controller} chart - The chart instance. + * @param {Object} options - The plugin options. + * @since version 2.1.5 + */ + /** + * @method IPlugin#beforeDatasetUpdate + * @desc Called before updating the `chart` dataset at the given `args.index`. If any plugin + * returns `false`, the datasets update is cancelled until another `update` is triggered. + * @param {Chart} chart - The chart instance. + * @param {Object} args - The call arguments. + * @param {Number} args.index - The dataset index. + * @param {Object} args.meta - The dataset metadata. + * @param {Object} options - The plugin options. + * @returns {Boolean} `false` to cancel the chart datasets drawing. + */ + /** + * @method IPlugin#afterDatasetUpdate + * @desc Called after the `chart` datasets at the given `args.index` has been updated. Note + * that this hook will not be called if the datasets update has been previously cancelled. + * @param {Chart} chart - The chart instance. + * @param {Object} args - The call arguments. + * @param {Number} args.index - The dataset index. + * @param {Object} args.meta - The dataset metadata. + * @param {Object} options - The plugin options. + */ + /** + * @method IPlugin#beforeLayout + * @desc Called before laying out `chart`. If any plugin returns `false`, + * the layout update is cancelled until another `update` is triggered. + * @param {Chart.Controller} chart - The chart instance. + * @param {Object} options - The plugin options. + * @returns {Boolean} `false` to cancel the chart layout. + */ + /** + * @method IPlugin#afterLayout + * @desc Called after the `chart` has been layed out. Note that this hook will not + * be called if the layout update has been previously cancelled. + * @param {Chart.Controller} chart - The chart instance. + * @param {Object} options - The plugin options. + */ + /** + * @method IPlugin#beforeRender + * @desc Called before rendering `chart`. If any plugin returns `false`, + * the rendering is cancelled until another `render` is triggered. + * @param {Chart.Controller} chart - The chart instance. + * @param {Object} options - The plugin options. + * @returns {Boolean} `false` to cancel the chart rendering. + */ + /** + * @method IPlugin#afterRender + * @desc Called after the `chart` has been fully rendered (and animation completed). Note + * that this hook will not be called if the rendering has been previously cancelled. + * @param {Chart.Controller} chart - The chart instance. + * @param {Object} options - The plugin options. + */ + /** + * @method IPlugin#beforeDraw + * @desc Called before drawing `chart` at every animation frame specified by the given + * easing value. If any plugin returns `false`, the frame drawing is cancelled until + * another `render` is triggered. + * @param {Chart.Controller} chart - The chart instance. + * @param {Number} easingValue - The current animation value, between 0.0 and 1.0. + * @param {Object} options - The plugin options. + * @returns {Boolean} `false` to cancel the chart drawing. + */ + /** + * @method IPlugin#afterDraw + * @desc Called after the `chart` has been drawn for the specific easing value. Note + * that this hook will not be called if the drawing has been previously cancelled. + * @param {Chart.Controller} chart - The chart instance. + * @param {Number} easingValue - The current animation value, between 0.0 and 1.0. + * @param {Object} options - The plugin options. + */ + /** + * @method IPlugin#beforeDatasetsDraw + * @desc Called before drawing the `chart` datasets. If any plugin returns `false`, + * the datasets drawing is cancelled until another `render` is triggered. + * @param {Chart.Controller} chart - The chart instance. + * @param {Number} easingValue - The current animation value, between 0.0 and 1.0. + * @param {Object} options - The plugin options. + * @returns {Boolean} `false` to cancel the chart datasets drawing. + */ + /** + * @method IPlugin#afterDatasetsDraw + * @desc Called after the `chart` datasets have been drawn. Note that this hook + * will not be called if the datasets drawing has been previously cancelled. + * @param {Chart.Controller} chart - The chart instance. + * @param {Number} easingValue - The current animation value, between 0.0 and 1.0. + * @param {Object} options - The plugin options. + */ + /** + * @method IPlugin#beforeDatasetDraw + * @desc Called before drawing the `chart` dataset at the given `args.index` (datasets + * are drawn in the reverse order). If any plugin returns `false`, the datasets drawing + * is cancelled until another `render` is triggered. + * @param {Chart} chart - The chart instance. + * @param {Object} args - The call arguments. + * @param {Number} args.index - The dataset index. + * @param {Object} args.meta - The dataset metadata. + * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0. + * @param {Object} options - The plugin options. + * @returns {Boolean} `false` to cancel the chart datasets drawing. + */ + /** + * @method IPlugin#afterDatasetDraw + * @desc Called after the `chart` datasets at the given `args.index` have been drawn + * (datasets are drawn in the reverse order). Note that this hook will not be called + * if the datasets drawing has been previously cancelled. + * @param {Chart} chart - The chart instance. + * @param {Object} args - The call arguments. + * @param {Number} args.index - The dataset index. + * @param {Object} args.meta - The dataset metadata. + * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0. + * @param {Object} options - The plugin options. + */ + /** + * @method IPlugin#beforeTooltipDraw + * @desc Called before drawing the `tooltip`. If any plugin returns `false`, + * the tooltip drawing is cancelled until another `render` is triggered. + * @param {Chart} chart - The chart instance. + * @param {Object} args - The call arguments. + * @param {Object} args.tooltip - The tooltip. + * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0. + * @param {Object} options - The plugin options. + * @returns {Boolean} `false` to cancel the chart tooltip drawing. + */ + /** + * @method IPlugin#afterTooltipDraw + * @desc Called after drawing the `tooltip`. Note that this hook will not + * be called if the tooltip drawing has been previously cancelled. + * @param {Chart} chart - The chart instance. + * @param {Object} args - The call arguments. + * @param {Object} args.tooltip - The tooltip. + * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0. + * @param {Object} options - The plugin options. + */ + /** + * @method IPlugin#beforeEvent + * @desc Called before processing the specified `event`. If any plugin returns `false`, + * the event will be discarded. + * @param {Chart.Controller} chart - The chart instance. + * @param {IEvent} event - The event object. + * @param {Object} options - The plugin options. + */ + /** + * @method IPlugin#afterEvent + * @desc Called after the `event` has been consumed. Note that this hook + * will not be called if the `event` has been previously discarded. + * @param {Chart.Controller} chart - The chart instance. + * @param {IEvent} event - The event object. + * @param {Object} options - The plugin options. + */ + /** + * @method IPlugin#resize + * @desc Called after the chart as been resized. + * @param {Chart.Controller} chart - The chart instance. + * @param {Number} size - The new canvas display size (eq. canvas.style width & height). + * @param {Object} options - The plugin options. + */ + /** + * @method IPlugin#destroy + * @desc Called after the chart as been destroyed. + * @param {Chart.Controller} chart - The chart instance. + * @param {Object} options - The plugin options. + */ + + /** + * Provided for backward compatibility, use Chart.plugins instead + * @namespace Chart.pluginService + * @deprecated since version 2.1.5 + * @todo remove at version 3 + * @private + */ + Chart.pluginService = Chart.plugins; + + /** + * Provided for backward compatibility, inheriting from Chart.PlugingBase has no + * effect, instead simply create/register plugins via plain JavaScript objects. + * @interface Chart.PluginBase + * @deprecated since version 2.5.0 + * @todo remove at version 3 + * @private + */ + Chart.PluginBase = Element.extend({}); +}; + +},{"25":25,"26":26,"45":45}],32:[function(require,module,exports){ +'use strict'; + +var defaults = require(25); +var Element = require(26); +var helpers = require(45); +var Ticks = require(34); + +defaults._set('scale', { + display: true, + position: 'left', + offset: false, + + // grid line settings + gridLines: { + display: true, + color: 'rgba(0, 0, 0, 0.1)', + lineWidth: 1, + drawBorder: true, + drawOnChartArea: true, + drawTicks: true, + tickMarkLength: 10, + zeroLineWidth: 1, + zeroLineColor: 'rgba(0,0,0,0.25)', + zeroLineBorderDash: [], + zeroLineBorderDashOffset: 0.0, + offsetGridLines: false, + borderDash: [], + borderDashOffset: 0.0 + }, + + // scale label + scaleLabel: { + // display property + display: false, + + // actual label + labelString: '', + + // line height + lineHeight: 1.2, + + // top/bottom padding + padding: { + top: 4, + bottom: 4 + } + }, + + // label settings + ticks: { + beginAtZero: false, + minRotation: 0, + maxRotation: 50, + mirror: false, + padding: 0, + reverse: false, + display: true, + autoSkip: true, + autoSkipPadding: 0, + labelOffset: 0, + // We pass through arrays to be rendered as multiline labels, we convert Others to strings here. + callback: Ticks.formatters.values, + minor: {}, + major: {} + } +}); + +function labelsFromTicks(ticks) { + var labels = []; + var i, ilen; + + for (i = 0, ilen = ticks.length; i < ilen; ++i) { + labels.push(ticks[i].label); + } + + return labels; +} + +function getLineValue(scale, index, offsetGridLines) { + var lineValue = scale.getPixelForTick(index); + + if (offsetGridLines) { + if (index === 0) { + lineValue -= (scale.getPixelForTick(1) - lineValue) / 2; + } else { + lineValue -= (lineValue - scale.getPixelForTick(index - 1)) / 2; + } + } + return lineValue; +} + +module.exports = function(Chart) { + + function computeTextSize(context, tick, font) { + return helpers.isArray(tick) ? + helpers.longestText(context, font, tick) : + context.measureText(tick).width; + } + + function parseFontOptions(options) { + var valueOrDefault = helpers.valueOrDefault; + var globalDefaults = defaults.global; + var size = valueOrDefault(options.fontSize, globalDefaults.defaultFontSize); + var style = valueOrDefault(options.fontStyle, globalDefaults.defaultFontStyle); + var family = valueOrDefault(options.fontFamily, globalDefaults.defaultFontFamily); + + return { + size: size, + style: style, + family: family, + font: helpers.fontString(size, style, family) + }; + } + + function parseLineHeight(options) { + return helpers.options.toLineHeight( + helpers.valueOrDefault(options.lineHeight, 1.2), + helpers.valueOrDefault(options.fontSize, defaults.global.defaultFontSize)); + } + + Chart.Scale = Element.extend({ + /** + * Get the padding needed for the scale + * @method getPadding + * @private + * @returns {Padding} the necessary padding + */ + getPadding: function() { + var me = this; + return { + left: me.paddingLeft || 0, + top: me.paddingTop || 0, + right: me.paddingRight || 0, + bottom: me.paddingBottom || 0 + }; + }, + + /** + * Returns the scale tick objects ({label, major}) + * @since 2.7 + */ + getTicks: function() { + return this._ticks; + }, + + // These methods are ordered by lifecyle. Utilities then follow. + // Any function defined here is inherited by all scale types. + // Any function can be extended by the scale type + + mergeTicksOptions: function() { + var ticks = this.options.ticks; + if (ticks.minor === false) { + ticks.minor = { + display: false + }; + } + if (ticks.major === false) { + ticks.major = { + display: false + }; + } + for (var key in ticks) { + if (key !== 'major' && key !== 'minor') { + if (typeof ticks.minor[key] === 'undefined') { + ticks.minor[key] = ticks[key]; + } + if (typeof ticks.major[key] === 'undefined') { + ticks.major[key] = ticks[key]; + } + } + } + }, + beforeUpdate: function() { + helpers.callback(this.options.beforeUpdate, [this]); + }, + update: function(maxWidth, maxHeight, margins) { + var me = this; + var i, ilen, labels, label, ticks, tick; + + // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;) + me.beforeUpdate(); + + // Absorb the master measurements + me.maxWidth = maxWidth; + me.maxHeight = maxHeight; + me.margins = helpers.extend({ + left: 0, + right: 0, + top: 0, + bottom: 0 + }, margins); + me.longestTextCache = me.longestTextCache || {}; + + // Dimensions + me.beforeSetDimensions(); + me.setDimensions(); + me.afterSetDimensions(); + + // Data min/max + me.beforeDataLimits(); + me.determineDataLimits(); + me.afterDataLimits(); + + // Ticks - `this.ticks` is now DEPRECATED! + // Internal ticks are now stored as objects in the PRIVATE `this._ticks` member + // and must not be accessed directly from outside this class. `this.ticks` being + // around for long time and not marked as private, we can't change its structure + // without unexpected breaking changes. If you need to access the scale ticks, + // use scale.getTicks() instead. + + me.beforeBuildTicks(); + + // New implementations should return an array of objects but for BACKWARD COMPAT, + // we still support no return (`this.ticks` internally set by calling this method). + ticks = me.buildTicks() || []; + + me.afterBuildTicks(); + + me.beforeTickToLabelConversion(); + + // New implementations should return the formatted tick labels but for BACKWARD + // COMPAT, we still support no return (`this.ticks` internally changed by calling + // this method and supposed to contain only string values). + labels = me.convertTicksToLabels(ticks) || me.ticks; + + me.afterTickToLabelConversion(); + + me.ticks = labels; // BACKWARD COMPATIBILITY + + // IMPORTANT: from this point, we consider that `this.ticks` will NEVER change! + + // BACKWARD COMPAT: synchronize `_ticks` with labels (so potentially `this.ticks`) + for (i = 0, ilen = labels.length; i < ilen; ++i) { + label = labels[i]; + tick = ticks[i]; + if (!tick) { + ticks.push(tick = { + label: label, + major: false + }); + } else { + tick.label = label; + } + } + + me._ticks = ticks; + + // Tick Rotation + me.beforeCalculateTickRotation(); + me.calculateTickRotation(); + me.afterCalculateTickRotation(); + // Fit + me.beforeFit(); + me.fit(); + me.afterFit(); + // + me.afterUpdate(); + + return me.minSize; + + }, + afterUpdate: function() { + helpers.callback(this.options.afterUpdate, [this]); + }, + + // + + beforeSetDimensions: function() { + helpers.callback(this.options.beforeSetDimensions, [this]); + }, + setDimensions: function() { + var me = this; + // Set the unconstrained dimension before label rotation + if (me.isHorizontal()) { + // Reset position before calculating rotation + me.width = me.maxWidth; + me.left = 0; + me.right = me.width; + } else { + me.height = me.maxHeight; + + // Reset position before calculating rotation + me.top = 0; + me.bottom = me.height; + } + + // Reset padding + me.paddingLeft = 0; + me.paddingTop = 0; + me.paddingRight = 0; + me.paddingBottom = 0; + }, + afterSetDimensions: function() { + helpers.callback(this.options.afterSetDimensions, [this]); + }, + + // Data limits + beforeDataLimits: function() { + helpers.callback(this.options.beforeDataLimits, [this]); + }, + determineDataLimits: helpers.noop, + afterDataLimits: function() { + helpers.callback(this.options.afterDataLimits, [this]); + }, + + // + beforeBuildTicks: function() { + helpers.callback(this.options.beforeBuildTicks, [this]); + }, + buildTicks: helpers.noop, + afterBuildTicks: function() { + helpers.callback(this.options.afterBuildTicks, [this]); + }, + + beforeTickToLabelConversion: function() { + helpers.callback(this.options.beforeTickToLabelConversion, [this]); + }, + convertTicksToLabels: function() { + var me = this; + // Convert ticks to strings + var tickOpts = me.options.ticks; + me.ticks = me.ticks.map(tickOpts.userCallback || tickOpts.callback, this); + }, + afterTickToLabelConversion: function() { + helpers.callback(this.options.afterTickToLabelConversion, [this]); + }, + + // + + beforeCalculateTickRotation: function() { + helpers.callback(this.options.beforeCalculateTickRotation, [this]); + }, + calculateTickRotation: function() { + var me = this; + var context = me.ctx; + var tickOpts = me.options.ticks; + var labels = labelsFromTicks(me._ticks); + + // Get the width of each grid by calculating the difference + // between x offsets between 0 and 1. + var tickFont = parseFontOptions(tickOpts); + context.font = tickFont.font; + + var labelRotation = tickOpts.minRotation || 0; + + if (labels.length && me.options.display && me.isHorizontal()) { + var originalLabelWidth = helpers.longestText(context, tickFont.font, labels, me.longestTextCache); + var labelWidth = originalLabelWidth; + var cosRotation, sinRotation; + + // Allow 3 pixels x2 padding either side for label readability + var tickWidth = me.getPixelForTick(1) - me.getPixelForTick(0) - 6; + + // Max label rotation can be set or default to 90 - also act as a loop counter + while (labelWidth > tickWidth && labelRotation < tickOpts.maxRotation) { + var angleRadians = helpers.toRadians(labelRotation); + cosRotation = Math.cos(angleRadians); + sinRotation = Math.sin(angleRadians); + + if (sinRotation * originalLabelWidth > me.maxHeight) { + // go back one step + labelRotation--; + break; + } + + labelRotation++; + labelWidth = cosRotation * originalLabelWidth; + } + } + + me.labelRotation = labelRotation; + }, + afterCalculateTickRotation: function() { + helpers.callback(this.options.afterCalculateTickRotation, [this]); + }, + + // + + beforeFit: function() { + helpers.callback(this.options.beforeFit, [this]); + }, + fit: function() { + var me = this; + // Reset + var minSize = me.minSize = { + width: 0, + height: 0 + }; + + var labels = labelsFromTicks(me._ticks); + + var opts = me.options; + var tickOpts = opts.ticks; + var scaleLabelOpts = opts.scaleLabel; + var gridLineOpts = opts.gridLines; + var display = opts.display; + var isHorizontal = me.isHorizontal(); + + var tickFont = parseFontOptions(tickOpts); + var tickMarkLength = opts.gridLines.tickMarkLength; + + // Width + if (isHorizontal) { + // subtract the margins to line up with the chartArea if we are a full width scale + minSize.width = me.isFullWidth() ? me.maxWidth - me.margins.left - me.margins.right : me.maxWidth; + } else { + minSize.width = display && gridLineOpts.drawTicks ? tickMarkLength : 0; + } + + // height + if (isHorizontal) { + minSize.height = display && gridLineOpts.drawTicks ? tickMarkLength : 0; + } else { + minSize.height = me.maxHeight; // fill all the height + } + + // Are we showing a title for the scale? + if (scaleLabelOpts.display && display) { + var scaleLabelLineHeight = parseLineHeight(scaleLabelOpts); + var scaleLabelPadding = helpers.options.toPadding(scaleLabelOpts.padding); + var deltaHeight = scaleLabelLineHeight + scaleLabelPadding.height; + + if (isHorizontal) { + minSize.height += deltaHeight; + } else { + minSize.width += deltaHeight; + } + } + + // Don't bother fitting the ticks if we are not showing them + if (tickOpts.display && display) { + var largestTextWidth = helpers.longestText(me.ctx, tickFont.font, labels, me.longestTextCache); + var tallestLabelHeightInLines = helpers.numberOfLabelLines(labels); + var lineSpace = tickFont.size * 0.5; + var tickPadding = me.options.ticks.padding; + + if (isHorizontal) { + // A horizontal axis is more constrained by the height. + me.longestLabelWidth = largestTextWidth; + + var angleRadians = helpers.toRadians(me.labelRotation); + var cosRotation = Math.cos(angleRadians); + var sinRotation = Math.sin(angleRadians); + + // TODO - improve this calculation + var labelHeight = (sinRotation * largestTextWidth) + + (tickFont.size * tallestLabelHeightInLines) + + (lineSpace * (tallestLabelHeightInLines - 1)) + + lineSpace; // padding + + minSize.height = Math.min(me.maxHeight, minSize.height + labelHeight + tickPadding); + + me.ctx.font = tickFont.font; + var firstLabelWidth = computeTextSize(me.ctx, labels[0], tickFont.font); + var lastLabelWidth = computeTextSize(me.ctx, labels[labels.length - 1], tickFont.font); + + // Ensure that our ticks are always inside the canvas. When rotated, ticks are right aligned + // which means that the right padding is dominated by the font height + if (me.labelRotation !== 0) { + me.paddingLeft = opts.position === 'bottom' ? (cosRotation * firstLabelWidth) + 3 : (cosRotation * lineSpace) + 3; // add 3 px to move away from canvas edges + me.paddingRight = opts.position === 'bottom' ? (cosRotation * lineSpace) + 3 : (cosRotation * lastLabelWidth) + 3; + } else { + me.paddingLeft = firstLabelWidth / 2 + 3; // add 3 px to move away from canvas edges + me.paddingRight = lastLabelWidth / 2 + 3; + } + } else { + // A vertical axis is more constrained by the width. Labels are the + // dominant factor here, so get that length first and account for padding + if (tickOpts.mirror) { + largestTextWidth = 0; + } else { + // use lineSpace for consistency with horizontal axis + // tickPadding is not implemented for horizontal + largestTextWidth += tickPadding + lineSpace; + } + + minSize.width = Math.min(me.maxWidth, minSize.width + largestTextWidth); + + me.paddingTop = tickFont.size / 2; + me.paddingBottom = tickFont.size / 2; + } + } + + me.handleMargins(); + + me.width = minSize.width; + me.height = minSize.height; + }, + + /** + * Handle margins and padding interactions + * @private + */ + handleMargins: function() { + var me = this; + if (me.margins) { + me.paddingLeft = Math.max(me.paddingLeft - me.margins.left, 0); + me.paddingTop = Math.max(me.paddingTop - me.margins.top, 0); + me.paddingRight = Math.max(me.paddingRight - me.margins.right, 0); + me.paddingBottom = Math.max(me.paddingBottom - me.margins.bottom, 0); + } + }, + + afterFit: function() { + helpers.callback(this.options.afterFit, [this]); + }, + + // Shared Methods + isHorizontal: function() { + return this.options.position === 'top' || this.options.position === 'bottom'; + }, + isFullWidth: function() { + return (this.options.fullWidth); + }, + + // Get the correct value. NaN bad inputs, If the value type is object get the x or y based on whether we are horizontal or not + getRightValue: function(rawValue) { + // Null and undefined values first + if (helpers.isNullOrUndef(rawValue)) { + return NaN; + } + // isNaN(object) returns true, so make sure NaN is checking for a number; Discard Infinite values + if (typeof rawValue === 'number' && !isFinite(rawValue)) { + return NaN; + } + // If it is in fact an object, dive in one more level + if (rawValue) { + if (this.isHorizontal()) { + if (rawValue.x !== undefined) { + return this.getRightValue(rawValue.x); + } + } else if (rawValue.y !== undefined) { + return this.getRightValue(rawValue.y); + } + } + + // Value is good, return it + return rawValue; + }, + + /** + * Used to get the value to display in the tooltip for the data at the given index + * @param index + * @param datasetIndex + */ + getLabelForIndex: helpers.noop, + + /** + * Returns the location of the given data point. Value can either be an index or a numerical value + * The coordinate (0, 0) is at the upper-left corner of the canvas + * @param value + * @param index + * @param datasetIndex + */ + getPixelForValue: helpers.noop, + + /** + * Used to get the data value from a given pixel. This is the inverse of getPixelForValue + * The coordinate (0, 0) is at the upper-left corner of the canvas + * @param pixel + */ + getValueForPixel: helpers.noop, + + /** + * Returns the location of the tick at the given index + * The coordinate (0, 0) is at the upper-left corner of the canvas + */ + getPixelForTick: function(index) { + var me = this; + var offset = me.options.offset; + if (me.isHorizontal()) { + var innerWidth = me.width - (me.paddingLeft + me.paddingRight); + var tickWidth = innerWidth / Math.max((me._ticks.length - (offset ? 0 : 1)), 1); + var pixel = (tickWidth * index) + me.paddingLeft; + + if (offset) { + pixel += tickWidth / 2; + } + + var finalVal = me.left + Math.round(pixel); + finalVal += me.isFullWidth() ? me.margins.left : 0; + return finalVal; + } + var innerHeight = me.height - (me.paddingTop + me.paddingBottom); + return me.top + (index * (innerHeight / (me._ticks.length - 1))); + }, + + /** + * Utility for getting the pixel location of a percentage of scale + * The coordinate (0, 0) is at the upper-left corner of the canvas + */ + getPixelForDecimal: function(decimal) { + var me = this; + if (me.isHorizontal()) { + var innerWidth = me.width - (me.paddingLeft + me.paddingRight); + var valueOffset = (innerWidth * decimal) + me.paddingLeft; + + var finalVal = me.left + Math.round(valueOffset); + finalVal += me.isFullWidth() ? me.margins.left : 0; + return finalVal; + } + return me.top + (decimal * me.height); + }, + + /** + * Returns the pixel for the minimum chart value + * The coordinate (0, 0) is at the upper-left corner of the canvas + */ + getBasePixel: function() { + return this.getPixelForValue(this.getBaseValue()); + }, + + getBaseValue: function() { + var me = this; + var min = me.min; + var max = me.max; + + return me.beginAtZero ? 0 : + min < 0 && max < 0 ? max : + min > 0 && max > 0 ? min : + 0; + }, + + /** + * Returns a subset of ticks to be plotted to avoid overlapping labels. + * @private + */ + _autoSkip: function(ticks) { + var skipRatio; + var me = this; + var isHorizontal = me.isHorizontal(); + var optionTicks = me.options.ticks.minor; + var tickCount = ticks.length; + var labelRotationRadians = helpers.toRadians(me.labelRotation); + var cosRotation = Math.cos(labelRotationRadians); + var longestRotatedLabel = me.longestLabelWidth * cosRotation; + var result = []; + var i, tick, shouldSkip; + + // figure out the maximum number of gridlines to show + var maxTicks; + if (optionTicks.maxTicksLimit) { + maxTicks = optionTicks.maxTicksLimit; + } + + if (isHorizontal) { + skipRatio = false; + + if ((longestRotatedLabel + optionTicks.autoSkipPadding) * tickCount > (me.width - (me.paddingLeft + me.paddingRight))) { + skipRatio = 1 + Math.floor(((longestRotatedLabel + optionTicks.autoSkipPadding) * tickCount) / (me.width - (me.paddingLeft + me.paddingRight))); + } + + // if they defined a max number of optionTicks, + // increase skipRatio until that number is met + if (maxTicks && tickCount > maxTicks) { + skipRatio = Math.max(skipRatio, Math.floor(tickCount / maxTicks)); + } + } + + for (i = 0; i < tickCount; i++) { + tick = ticks[i]; + + // Since we always show the last tick,we need may need to hide the last shown one before + shouldSkip = (skipRatio > 1 && i % skipRatio > 0) || (i % skipRatio === 0 && i + skipRatio >= tickCount); + if (shouldSkip && i !== tickCount - 1) { + // leave tick in place but make sure it's not displayed (#4635) + delete tick.label; + } + result.push(tick); + } + return result; + }, + + // Actually draw the scale on the canvas + // @param {rectangle} chartArea : the area of the chart to draw full grid lines on + draw: function(chartArea) { + var me = this; + var options = me.options; + if (!options.display) { + return; + } + + var context = me.ctx; + var globalDefaults = defaults.global; + var optionTicks = options.ticks.minor; + var optionMajorTicks = options.ticks.major || optionTicks; + var gridLines = options.gridLines; + var scaleLabel = options.scaleLabel; + + var isRotated = me.labelRotation !== 0; + var isHorizontal = me.isHorizontal(); + + var ticks = optionTicks.autoSkip ? me._autoSkip(me.getTicks()) : me.getTicks(); + var tickFontColor = helpers.valueOrDefault(optionTicks.fontColor, globalDefaults.defaultFontColor); + var tickFont = parseFontOptions(optionTicks); + var majorTickFontColor = helpers.valueOrDefault(optionMajorTicks.fontColor, globalDefaults.defaultFontColor); + var majorTickFont = parseFontOptions(optionMajorTicks); + + var tl = gridLines.drawTicks ? gridLines.tickMarkLength : 0; + + var scaleLabelFontColor = helpers.valueOrDefault(scaleLabel.fontColor, globalDefaults.defaultFontColor); + var scaleLabelFont = parseFontOptions(scaleLabel); + var scaleLabelPadding = helpers.options.toPadding(scaleLabel.padding); + var labelRotationRadians = helpers.toRadians(me.labelRotation); + + var itemsToDraw = []; + + var xTickStart = options.position === 'right' ? me.left : me.right - tl; + var xTickEnd = options.position === 'right' ? me.left + tl : me.right; + var yTickStart = options.position === 'bottom' ? me.top : me.bottom - tl; + var yTickEnd = options.position === 'bottom' ? me.top + tl : me.bottom; + + helpers.each(ticks, function(tick, index) { + // autoskipper skipped this tick (#4635) + if (helpers.isNullOrUndef(tick.label)) { + return; + } + + var label = tick.label; + var lineWidth, lineColor, borderDash, borderDashOffset; + if (index === me.zeroLineIndex && options.offset === gridLines.offsetGridLines) { + // Draw the first index specially + lineWidth = gridLines.zeroLineWidth; + lineColor = gridLines.zeroLineColor; + borderDash = gridLines.zeroLineBorderDash; + borderDashOffset = gridLines.zeroLineBorderDashOffset; + } else { + lineWidth = helpers.valueAtIndexOrDefault(gridLines.lineWidth, index); + lineColor = helpers.valueAtIndexOrDefault(gridLines.color, index); + borderDash = helpers.valueOrDefault(gridLines.borderDash, globalDefaults.borderDash); + borderDashOffset = helpers.valueOrDefault(gridLines.borderDashOffset, globalDefaults.borderDashOffset); + } + + // Common properties + var tx1, ty1, tx2, ty2, x1, y1, x2, y2, labelX, labelY; + var textAlign = 'middle'; + var textBaseline = 'middle'; + var tickPadding = optionTicks.padding; + + if (isHorizontal) { + var labelYOffset = tl + tickPadding; + + if (options.position === 'bottom') { + // bottom + textBaseline = !isRotated ? 'top' : 'middle'; + textAlign = !isRotated ? 'center' : 'right'; + labelY = me.top + labelYOffset; + } else { + // top + textBaseline = !isRotated ? 'bottom' : 'middle'; + textAlign = !isRotated ? 'center' : 'left'; + labelY = me.bottom - labelYOffset; + } + + var xLineValue = getLineValue(me, index, gridLines.offsetGridLines && ticks.length > 1); + if (xLineValue < me.left) { + lineColor = 'rgba(0,0,0,0)'; + } + xLineValue += helpers.aliasPixel(lineWidth); + + labelX = me.getPixelForTick(index) + optionTicks.labelOffset; // x values for optionTicks (need to consider offsetLabel option) + + tx1 = tx2 = x1 = x2 = xLineValue; + ty1 = yTickStart; + ty2 = yTickEnd; + y1 = chartArea.top; + y2 = chartArea.bottom; + } else { + var isLeft = options.position === 'left'; + var labelXOffset; + + if (optionTicks.mirror) { + textAlign = isLeft ? 'left' : 'right'; + labelXOffset = tickPadding; + } else { + textAlign = isLeft ? 'right' : 'left'; + labelXOffset = tl + tickPadding; + } + + labelX = isLeft ? me.right - labelXOffset : me.left + labelXOffset; + + var yLineValue = getLineValue(me, index, gridLines.offsetGridLines && ticks.length > 1); + if (yLineValue < me.top) { + lineColor = 'rgba(0,0,0,0)'; + } + yLineValue += helpers.aliasPixel(lineWidth); + + labelY = me.getPixelForTick(index) + optionTicks.labelOffset; + + tx1 = xTickStart; + tx2 = xTickEnd; + x1 = chartArea.left; + x2 = chartArea.right; + ty1 = ty2 = y1 = y2 = yLineValue; + } + + itemsToDraw.push({ + tx1: tx1, + ty1: ty1, + tx2: tx2, + ty2: ty2, + x1: x1, + y1: y1, + x2: x2, + y2: y2, + labelX: labelX, + labelY: labelY, + glWidth: lineWidth, + glColor: lineColor, + glBorderDash: borderDash, + glBorderDashOffset: borderDashOffset, + rotation: -1 * labelRotationRadians, + label: label, + major: tick.major, + textBaseline: textBaseline, + textAlign: textAlign + }); + }); + + // Draw all of the tick labels, tick marks, and grid lines at the correct places + helpers.each(itemsToDraw, function(itemToDraw) { + if (gridLines.display) { + context.save(); + context.lineWidth = itemToDraw.glWidth; + context.strokeStyle = itemToDraw.glColor; + if (context.setLineDash) { + context.setLineDash(itemToDraw.glBorderDash); + context.lineDashOffset = itemToDraw.glBorderDashOffset; + } + + context.beginPath(); + + if (gridLines.drawTicks) { + context.moveTo(itemToDraw.tx1, itemToDraw.ty1); + context.lineTo(itemToDraw.tx2, itemToDraw.ty2); + } + + if (gridLines.drawOnChartArea) { + context.moveTo(itemToDraw.x1, itemToDraw.y1); + context.lineTo(itemToDraw.x2, itemToDraw.y2); + } + + context.stroke(); + context.restore(); + } + + if (optionTicks.display) { + // Make sure we draw text in the correct color and font + context.save(); + context.translate(itemToDraw.labelX, itemToDraw.labelY); + context.rotate(itemToDraw.rotation); + context.font = itemToDraw.major ? majorTickFont.font : tickFont.font; + context.fillStyle = itemToDraw.major ? majorTickFontColor : tickFontColor; + context.textBaseline = itemToDraw.textBaseline; + context.textAlign = itemToDraw.textAlign; + + var label = itemToDraw.label; + if (helpers.isArray(label)) { + for (var i = 0, y = 0; i < label.length; ++i) { + // We just make sure the multiline element is a string here.. + context.fillText('' + label[i], 0, y); + // apply same lineSpacing as calculated @ L#320 + y += (tickFont.size * 1.5); + } + } else { + context.fillText(label, 0, 0); + } + context.restore(); + } + }); + + if (scaleLabel.display) { + // Draw the scale label + var scaleLabelX; + var scaleLabelY; + var rotation = 0; + var halfLineHeight = parseLineHeight(scaleLabel) / 2; + + if (isHorizontal) { + scaleLabelX = me.left + ((me.right - me.left) / 2); // midpoint of the width + scaleLabelY = options.position === 'bottom' + ? me.bottom - halfLineHeight - scaleLabelPadding.bottom + : me.top + halfLineHeight + scaleLabelPadding.top; + } else { + var isLeft = options.position === 'left'; + scaleLabelX = isLeft + ? me.left + halfLineHeight + scaleLabelPadding.top + : me.right - halfLineHeight - scaleLabelPadding.top; + scaleLabelY = me.top + ((me.bottom - me.top) / 2); + rotation = isLeft ? -0.5 * Math.PI : 0.5 * Math.PI; + } + + context.save(); + context.translate(scaleLabelX, scaleLabelY); + context.rotate(rotation); + context.textAlign = 'center'; + context.textBaseline = 'middle'; + context.fillStyle = scaleLabelFontColor; // render in correct colour + context.font = scaleLabelFont.font; + context.fillText(scaleLabel.labelString, 0, 0); + context.restore(); + } + + if (gridLines.drawBorder) { + // Draw the line at the edge of the axis + context.lineWidth = helpers.valueAtIndexOrDefault(gridLines.lineWidth, 0); + context.strokeStyle = helpers.valueAtIndexOrDefault(gridLines.color, 0); + var x1 = me.left; + var x2 = me.right; + var y1 = me.top; + var y2 = me.bottom; + + var aliasPixel = helpers.aliasPixel(context.lineWidth); + if (isHorizontal) { + y1 = y2 = options.position === 'top' ? me.bottom : me.top; + y1 += aliasPixel; + y2 += aliasPixel; + } else { + x1 = x2 = options.position === 'left' ? me.right : me.left; + x1 += aliasPixel; + x2 += aliasPixel; + } + + context.beginPath(); + context.moveTo(x1, y1); + context.lineTo(x2, y2); + context.stroke(); + } + } + }); +}; + +},{"25":25,"26":26,"34":34,"45":45}],33:[function(require,module,exports){ +'use strict'; + +var defaults = require(25); +var helpers = require(45); + +module.exports = function(Chart) { + + Chart.scaleService = { + // Scale registration object. Extensions can register new scale types (such as log or DB scales) and then + // use the new chart options to grab the correct scale + constructors: {}, + // Use a registration function so that we can move to an ES6 map when we no longer need to support + // old browsers + + // Scale config defaults + defaults: {}, + registerScaleType: function(type, scaleConstructor, scaleDefaults) { + this.constructors[type] = scaleConstructor; + this.defaults[type] = helpers.clone(scaleDefaults); + }, + getScaleConstructor: function(type) { + return this.constructors.hasOwnProperty(type) ? this.constructors[type] : undefined; + }, + getScaleDefaults: function(type) { + // Return the scale defaults merged with the global settings so that we always use the latest ones + return this.defaults.hasOwnProperty(type) ? helpers.merge({}, [defaults.scale, this.defaults[type]]) : {}; + }, + updateScaleDefaults: function(type, additions) { + var me = this; + if (me.defaults.hasOwnProperty(type)) { + me.defaults[type] = helpers.extend(me.defaults[type], additions); + } + }, + addScalesToLayout: function(chart) { + // Adds each scale to the chart.boxes array to be sized accordingly + helpers.each(chart.scales, function(scale) { + // Set ILayoutItem parameters for backwards compatibility + scale.fullWidth = scale.options.fullWidth; + scale.position = scale.options.position; + scale.weight = scale.options.weight; + Chart.layoutService.addBox(chart, scale); + }); + } + }; +}; + +},{"25":25,"45":45}],34:[function(require,module,exports){ +'use strict'; + +var helpers = require(45); + +/** + * Namespace to hold static tick generation functions + * @namespace Chart.Ticks + */ +module.exports = { + /** + * Namespace to hold generators for different types of ticks + * @namespace Chart.Ticks.generators + */ + generators: { + /** + * Interface for the options provided to the numeric tick generator + * @interface INumericTickGenerationOptions + */ + /** + * The maximum number of ticks to display + * @name INumericTickGenerationOptions#maxTicks + * @type Number + */ + /** + * The distance between each tick. + * @name INumericTickGenerationOptions#stepSize + * @type Number + * @optional + */ + /** + * Forced minimum for the ticks. If not specified, the minimum of the data range is used to calculate the tick minimum + * @name INumericTickGenerationOptions#min + * @type Number + * @optional + */ + /** + * The maximum value of the ticks. If not specified, the maximum of the data range is used to calculate the tick maximum + * @name INumericTickGenerationOptions#max + * @type Number + * @optional + */ + + /** + * Generate a set of linear ticks + * @method Chart.Ticks.generators.linear + * @param generationOptions {INumericTickGenerationOptions} the options used to generate the ticks + * @param dataRange {IRange} the range of the data + * @returns {Array} array of tick values + */ + linear: function(generationOptions, dataRange) { + var ticks = []; + // To get a "nice" value for the tick spacing, we will use the appropriately named + // "nice number" algorithm. See http://stackoverflow.com/questions/8506881/nice-label-algorithm-for-charts-with-minimum-ticks + // for details. + + var spacing; + if (generationOptions.stepSize && generationOptions.stepSize > 0) { + spacing = generationOptions.stepSize; + } else { + var niceRange = helpers.niceNum(dataRange.max - dataRange.min, false); + spacing = helpers.niceNum(niceRange / (generationOptions.maxTicks - 1), true); + } + var niceMin = Math.floor(dataRange.min / spacing) * spacing; + var niceMax = Math.ceil(dataRange.max / spacing) * spacing; + + // If min, max and stepSize is set and they make an evenly spaced scale use it. + if (generationOptions.min && generationOptions.max && generationOptions.stepSize) { + // If very close to our whole number, use it. + if (helpers.almostWhole((generationOptions.max - generationOptions.min) / generationOptions.stepSize, spacing / 1000)) { + niceMin = generationOptions.min; + niceMax = generationOptions.max; + } + } + + var numSpaces = (niceMax - niceMin) / spacing; + // If very close to our rounded value, use it. + if (helpers.almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) { + numSpaces = Math.round(numSpaces); + } else { + numSpaces = Math.ceil(numSpaces); + } + + // Put the values into the ticks array + ticks.push(generationOptions.min !== undefined ? generationOptions.min : niceMin); + for (var j = 1; j < numSpaces; ++j) { + ticks.push(niceMin + (j * spacing)); + } + ticks.push(generationOptions.max !== undefined ? generationOptions.max : niceMax); + + return ticks; + }, + + /** + * Generate a set of logarithmic ticks + * @method Chart.Ticks.generators.logarithmic + * @param generationOptions {INumericTickGenerationOptions} the options used to generate the ticks + * @param dataRange {IRange} the range of the data + * @returns {Array} array of tick values + */ + logarithmic: function(generationOptions, dataRange) { + var ticks = []; + var valueOrDefault = helpers.valueOrDefault; + + // Figure out what the max number of ticks we can support it is based on the size of + // the axis area. For now, we say that the minimum tick spacing in pixels must be 50 + // We also limit the maximum number of ticks to 11 which gives a nice 10 squares on + // the graph + var tickVal = valueOrDefault(generationOptions.min, Math.pow(10, Math.floor(helpers.log10(dataRange.min)))); + + var endExp = Math.floor(helpers.log10(dataRange.max)); + var endSignificand = Math.ceil(dataRange.max / Math.pow(10, endExp)); + var exp, significand; + + if (tickVal === 0) { + exp = Math.floor(helpers.log10(dataRange.minNotZero)); + significand = Math.floor(dataRange.minNotZero / Math.pow(10, exp)); + + ticks.push(tickVal); + tickVal = significand * Math.pow(10, exp); + } else { + exp = Math.floor(helpers.log10(tickVal)); + significand = Math.floor(tickVal / Math.pow(10, exp)); + } + + do { + ticks.push(tickVal); + + ++significand; + if (significand === 10) { + significand = 1; + ++exp; + } + + tickVal = significand * Math.pow(10, exp); + } while (exp < endExp || (exp === endExp && significand < endSignificand)); + + var lastTick = valueOrDefault(generationOptions.max, tickVal); + ticks.push(lastTick); + + return ticks; + } + }, + + /** + * Namespace to hold formatters for different types of ticks + * @namespace Chart.Ticks.formatters + */ + formatters: { + /** + * Formatter for value labels + * @method Chart.Ticks.formatters.values + * @param value the value to display + * @return {String|Array} the label to display + */ + values: function(value) { + return helpers.isArray(value) ? value : '' + value; + }, + + /** + * Formatter for linear numeric ticks + * @method Chart.Ticks.formatters.linear + * @param tickValue {Number} the value to be formatted + * @param index {Number} the position of the tickValue parameter in the ticks array + * @param ticks {Array} the list of ticks being converted + * @return {String} string representation of the tickValue parameter + */ + linear: function(tickValue, index, ticks) { + // If we have lots of ticks, don't use the ones + var delta = ticks.length > 3 ? ticks[2] - ticks[1] : ticks[1] - ticks[0]; + + // If we have a number like 2.5 as the delta, figure out how many decimal places we need + if (Math.abs(delta) > 1) { + if (tickValue !== Math.floor(tickValue)) { + // not an integer + delta = tickValue - Math.floor(tickValue); + } + } + + var logDelta = helpers.log10(Math.abs(delta)); + var tickString = ''; + + if (tickValue !== 0) { + var numDecimal = -1 * Math.floor(logDelta); + numDecimal = Math.max(Math.min(numDecimal, 20), 0); // toFixed has a max of 20 decimal places + tickString = tickValue.toFixed(numDecimal); + } else { + tickString = '0'; // never show decimal places for 0 + } + + return tickString; + }, + + logarithmic: function(tickValue, index, ticks) { + var remain = tickValue / (Math.pow(10, Math.floor(helpers.log10(tickValue)))); + + if (tickValue === 0) { + return '0'; + } else if (remain === 1 || remain === 2 || remain === 5 || index === 0 || index === ticks.length - 1) { + return tickValue.toExponential(); + } + return ''; + } + } +}; + +},{"45":45}],35:[function(require,module,exports){ +'use strict'; + +var defaults = require(25); +var Element = require(26); +var helpers = require(45); + +defaults._set('global', { + tooltips: { + enabled: true, + custom: null, + mode: 'nearest', + position: 'average', + intersect: true, + backgroundColor: 'rgba(0,0,0,0.8)', + titleFontStyle: 'bold', + titleSpacing: 2, + titleMarginBottom: 6, + titleFontColor: '#fff', + titleAlign: 'left', + bodySpacing: 2, + bodyFontColor: '#fff', + bodyAlign: 'left', + footerFontStyle: 'bold', + footerSpacing: 2, + footerMarginTop: 6, + footerFontColor: '#fff', + footerAlign: 'left', + yPadding: 6, + xPadding: 6, + caretPadding: 2, + caretSize: 5, + cornerRadius: 6, + multiKeyBackground: '#fff', + displayColors: true, + borderColor: 'rgba(0,0,0,0)', + borderWidth: 0, + callbacks: { + // Args are: (tooltipItems, data) + beforeTitle: helpers.noop, + title: function(tooltipItems, data) { + // Pick first xLabel for now + var title = ''; + var labels = data.labels; + var labelCount = labels ? labels.length : 0; + + if (tooltipItems.length > 0) { + var item = tooltipItems[0]; + + if (item.xLabel) { + title = item.xLabel; + } else if (labelCount > 0 && item.index < labelCount) { + title = labels[item.index]; + } + } + + return title; + }, + afterTitle: helpers.noop, + + // Args are: (tooltipItems, data) + beforeBody: helpers.noop, + + // Args are: (tooltipItem, data) + beforeLabel: helpers.noop, + label: function(tooltipItem, data) { + var label = data.datasets[tooltipItem.datasetIndex].label || ''; + + if (label) { + label += ': '; + } + label += tooltipItem.yLabel; + return label; + }, + labelColor: function(tooltipItem, chart) { + var meta = chart.getDatasetMeta(tooltipItem.datasetIndex); + var activeElement = meta.data[tooltipItem.index]; + var view = activeElement._view; + return { + borderColor: view.borderColor, + backgroundColor: view.backgroundColor + }; + }, + labelTextColor: function() { + return this._options.bodyFontColor; + }, + afterLabel: helpers.noop, + + // Args are: (tooltipItems, data) + afterBody: helpers.noop, + + // Args are: (tooltipItems, data) + beforeFooter: helpers.noop, + footer: helpers.noop, + afterFooter: helpers.noop + } + } +}); + +module.exports = function(Chart) { + + /** + * Helper method to merge the opacity into a color + */ + function mergeOpacity(colorString, opacity) { + var color = helpers.color(colorString); + return color.alpha(opacity * color.alpha()).rgbaString(); + } + + // Helper to push or concat based on if the 2nd parameter is an array or not + function pushOrConcat(base, toPush) { + if (toPush) { + if (helpers.isArray(toPush)) { + // base = base.concat(toPush); + Array.prototype.push.apply(base, toPush); + } else { + base.push(toPush); + } + } + + return base; + } + + // Private helper to create a tooltip item model + // @param element : the chart element (point, arc, bar) to create the tooltip item for + // @return : new tooltip item + function createTooltipItem(element) { + var xScale = element._xScale; + var yScale = element._yScale || element._scale; // handle radar || polarArea charts + var index = element._index; + var datasetIndex = element._datasetIndex; + + return { + xLabel: xScale ? xScale.getLabelForIndex(index, datasetIndex) : '', + yLabel: yScale ? yScale.getLabelForIndex(index, datasetIndex) : '', + index: index, + datasetIndex: datasetIndex, + x: element._model.x, + y: element._model.y + }; + } + + /** + * Helper to get the reset model for the tooltip + * @param tooltipOpts {Object} the tooltip options + */ + function getBaseModel(tooltipOpts) { + var globalDefaults = defaults.global; + var valueOrDefault = helpers.valueOrDefault; + + return { + // Positioning + xPadding: tooltipOpts.xPadding, + yPadding: tooltipOpts.yPadding, + xAlign: tooltipOpts.xAlign, + yAlign: tooltipOpts.yAlign, + + // Body + bodyFontColor: tooltipOpts.bodyFontColor, + _bodyFontFamily: valueOrDefault(tooltipOpts.bodyFontFamily, globalDefaults.defaultFontFamily), + _bodyFontStyle: valueOrDefault(tooltipOpts.bodyFontStyle, globalDefaults.defaultFontStyle), + _bodyAlign: tooltipOpts.bodyAlign, + bodyFontSize: valueOrDefault(tooltipOpts.bodyFontSize, globalDefaults.defaultFontSize), + bodySpacing: tooltipOpts.bodySpacing, + + // Title + titleFontColor: tooltipOpts.titleFontColor, + _titleFontFamily: valueOrDefault(tooltipOpts.titleFontFamily, globalDefaults.defaultFontFamily), + _titleFontStyle: valueOrDefault(tooltipOpts.titleFontStyle, globalDefaults.defaultFontStyle), + titleFontSize: valueOrDefault(tooltipOpts.titleFontSize, globalDefaults.defaultFontSize), + _titleAlign: tooltipOpts.titleAlign, + titleSpacing: tooltipOpts.titleSpacing, + titleMarginBottom: tooltipOpts.titleMarginBottom, + + // Footer + footerFontColor: tooltipOpts.footerFontColor, + _footerFontFamily: valueOrDefault(tooltipOpts.footerFontFamily, globalDefaults.defaultFontFamily), + _footerFontStyle: valueOrDefault(tooltipOpts.footerFontStyle, globalDefaults.defaultFontStyle), + footerFontSize: valueOrDefault(tooltipOpts.footerFontSize, globalDefaults.defaultFontSize), + _footerAlign: tooltipOpts.footerAlign, + footerSpacing: tooltipOpts.footerSpacing, + footerMarginTop: tooltipOpts.footerMarginTop, + + // Appearance + caretSize: tooltipOpts.caretSize, + cornerRadius: tooltipOpts.cornerRadius, + backgroundColor: tooltipOpts.backgroundColor, + opacity: 0, + legendColorBackground: tooltipOpts.multiKeyBackground, + displayColors: tooltipOpts.displayColors, + borderColor: tooltipOpts.borderColor, + borderWidth: tooltipOpts.borderWidth + }; + } + + /** + * Get the size of the tooltip + */ + function getTooltipSize(tooltip, model) { + var ctx = tooltip._chart.ctx; + + var height = model.yPadding * 2; // Tooltip Padding + var width = 0; + + // Count of all lines in the body + var body = model.body; + var combinedBodyLength = body.reduce(function(count, bodyItem) { + return count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length; + }, 0); + combinedBodyLength += model.beforeBody.length + model.afterBody.length; + + var titleLineCount = model.title.length; + var footerLineCount = model.footer.length; + var titleFontSize = model.titleFontSize; + var bodyFontSize = model.bodyFontSize; + var footerFontSize = model.footerFontSize; + + height += titleLineCount * titleFontSize; // Title Lines + height += titleLineCount ? (titleLineCount - 1) * model.titleSpacing : 0; // Title Line Spacing + height += titleLineCount ? model.titleMarginBottom : 0; // Title's bottom Margin + height += combinedBodyLength * bodyFontSize; // Body Lines + height += combinedBodyLength ? (combinedBodyLength - 1) * model.bodySpacing : 0; // Body Line Spacing + height += footerLineCount ? model.footerMarginTop : 0; // Footer Margin + height += footerLineCount * (footerFontSize); // Footer Lines + height += footerLineCount ? (footerLineCount - 1) * model.footerSpacing : 0; // Footer Line Spacing + + // Title width + var widthPadding = 0; + var maxLineWidth = function(line) { + width = Math.max(width, ctx.measureText(line).width + widthPadding); + }; + + ctx.font = helpers.fontString(titleFontSize, model._titleFontStyle, model._titleFontFamily); + helpers.each(model.title, maxLineWidth); + + // Body width + ctx.font = helpers.fontString(bodyFontSize, model._bodyFontStyle, model._bodyFontFamily); + helpers.each(model.beforeBody.concat(model.afterBody), maxLineWidth); + + // Body lines may include some extra width due to the color box + widthPadding = model.displayColors ? (bodyFontSize + 2) : 0; + helpers.each(body, function(bodyItem) { + helpers.each(bodyItem.before, maxLineWidth); + helpers.each(bodyItem.lines, maxLineWidth); + helpers.each(bodyItem.after, maxLineWidth); + }); + + // Reset back to 0 + widthPadding = 0; + + // Footer width + ctx.font = helpers.fontString(footerFontSize, model._footerFontStyle, model._footerFontFamily); + helpers.each(model.footer, maxLineWidth); + + // Add padding + width += 2 * model.xPadding; + + return { + width: width, + height: height + }; + } + + /** + * Helper to get the alignment of a tooltip given the size + */ + function determineAlignment(tooltip, size) { + var model = tooltip._model; + var chart = tooltip._chart; + var chartArea = tooltip._chart.chartArea; + var xAlign = 'center'; + var yAlign = 'center'; + + if (model.y < size.height) { + yAlign = 'top'; + } else if (model.y > (chart.height - size.height)) { + yAlign = 'bottom'; + } + + var lf, rf; // functions to determine left, right alignment + var olf, orf; // functions to determine if left/right alignment causes tooltip to go outside chart + var yf; // function to get the y alignment if the tooltip goes outside of the left or right edges + var midX = (chartArea.left + chartArea.right) / 2; + var midY = (chartArea.top + chartArea.bottom) / 2; + + if (yAlign === 'center') { + lf = function(x) { + return x <= midX; + }; + rf = function(x) { + return x > midX; + }; + } else { + lf = function(x) { + return x <= (size.width / 2); + }; + rf = function(x) { + return x >= (chart.width - (size.width / 2)); + }; + } + + olf = function(x) { + return x + size.width > chart.width; + }; + orf = function(x) { + return x - size.width < 0; + }; + yf = function(y) { + return y <= midY ? 'top' : 'bottom'; + }; + + if (lf(model.x)) { + xAlign = 'left'; + + // Is tooltip too wide and goes over the right side of the chart.? + if (olf(model.x)) { + xAlign = 'center'; + yAlign = yf(model.y); + } + } else if (rf(model.x)) { + xAlign = 'right'; + + // Is tooltip too wide and goes outside left edge of canvas? + if (orf(model.x)) { + xAlign = 'center'; + yAlign = yf(model.y); + } + } + + var opts = tooltip._options; + return { + xAlign: opts.xAlign ? opts.xAlign : xAlign, + yAlign: opts.yAlign ? opts.yAlign : yAlign + }; + } + + /** + * @Helper to get the location a tooltip needs to be placed at given the initial position (via the vm) and the size and alignment + */ + function getBackgroundPoint(vm, size, alignment) { + // Background Position + var x = vm.x; + var y = vm.y; + + var caretSize = vm.caretSize; + var caretPadding = vm.caretPadding; + var cornerRadius = vm.cornerRadius; + var xAlign = alignment.xAlign; + var yAlign = alignment.yAlign; + var paddingAndSize = caretSize + caretPadding; + var radiusAndPadding = cornerRadius + caretPadding; + + if (xAlign === 'right') { + x -= size.width; + } else if (xAlign === 'center') { + x -= (size.width / 2); + } + + if (yAlign === 'top') { + y += paddingAndSize; + } else if (yAlign === 'bottom') { + y -= size.height + paddingAndSize; + } else { + y -= (size.height / 2); + } + + if (yAlign === 'center') { + if (xAlign === 'left') { + x += paddingAndSize; + } else if (xAlign === 'right') { + x -= paddingAndSize; + } + } else if (xAlign === 'left') { + x -= radiusAndPadding; + } else if (xAlign === 'right') { + x += radiusAndPadding; + } + + return { + x: x, + y: y + }; + } + + Chart.Tooltip = Element.extend({ + initialize: function() { + this._model = getBaseModel(this._options); + this._lastActive = []; + }, + + // Get the title + // Args are: (tooltipItem, data) + getTitle: function() { + var me = this; + var opts = me._options; + var callbacks = opts.callbacks; + + var beforeTitle = callbacks.beforeTitle.apply(me, arguments); + var title = callbacks.title.apply(me, arguments); + var afterTitle = callbacks.afterTitle.apply(me, arguments); + + var lines = []; + lines = pushOrConcat(lines, beforeTitle); + lines = pushOrConcat(lines, title); + lines = pushOrConcat(lines, afterTitle); + + return lines; + }, + + // Args are: (tooltipItem, data) + getBeforeBody: function() { + var lines = this._options.callbacks.beforeBody.apply(this, arguments); + return helpers.isArray(lines) ? lines : lines !== undefined ? [lines] : []; + }, + + // Args are: (tooltipItem, data) + getBody: function(tooltipItems, data) { + var me = this; + var callbacks = me._options.callbacks; + var bodyItems = []; + + helpers.each(tooltipItems, function(tooltipItem) { + var bodyItem = { + before: [], + lines: [], + after: [] + }; + pushOrConcat(bodyItem.before, callbacks.beforeLabel.call(me, tooltipItem, data)); + pushOrConcat(bodyItem.lines, callbacks.label.call(me, tooltipItem, data)); + pushOrConcat(bodyItem.after, callbacks.afterLabel.call(me, tooltipItem, data)); + + bodyItems.push(bodyItem); + }); + + return bodyItems; + }, + + // Args are: (tooltipItem, data) + getAfterBody: function() { + var lines = this._options.callbacks.afterBody.apply(this, arguments); + return helpers.isArray(lines) ? lines : lines !== undefined ? [lines] : []; + }, + + // Get the footer and beforeFooter and afterFooter lines + // Args are: (tooltipItem, data) + getFooter: function() { + var me = this; + var callbacks = me._options.callbacks; + + var beforeFooter = callbacks.beforeFooter.apply(me, arguments); + var footer = callbacks.footer.apply(me, arguments); + var afterFooter = callbacks.afterFooter.apply(me, arguments); + + var lines = []; + lines = pushOrConcat(lines, beforeFooter); + lines = pushOrConcat(lines, footer); + lines = pushOrConcat(lines, afterFooter); + + return lines; + }, + + update: function(changed) { + var me = this; + var opts = me._options; + + // Need to regenerate the model because its faster than using extend and it is necessary due to the optimization in Chart.Element.transition + // that does _view = _model if ease === 1. This causes the 2nd tooltip update to set properties in both the view and model at the same time + // which breaks any animations. + var existingModel = me._model; + var model = me._model = getBaseModel(opts); + var active = me._active; + + var data = me._data; + + // In the case where active.length === 0 we need to keep these at existing values for good animations + var alignment = { + xAlign: existingModel.xAlign, + yAlign: existingModel.yAlign + }; + var backgroundPoint = { + x: existingModel.x, + y: existingModel.y + }; + var tooltipSize = { + width: existingModel.width, + height: existingModel.height + }; + var tooltipPosition = { + x: existingModel.caretX, + y: existingModel.caretY + }; + + var i, len; + + if (active.length) { + model.opacity = 1; + + var labelColors = []; + var labelTextColors = []; + tooltipPosition = Chart.Tooltip.positioners[opts.position].call(me, active, me._eventPosition); + + var tooltipItems = []; + for (i = 0, len = active.length; i < len; ++i) { + tooltipItems.push(createTooltipItem(active[i])); + } + + // If the user provided a filter function, use it to modify the tooltip items + if (opts.filter) { + tooltipItems = tooltipItems.filter(function(a) { + return opts.filter(a, data); + }); + } + + // If the user provided a sorting function, use it to modify the tooltip items + if (opts.itemSort) { + tooltipItems = tooltipItems.sort(function(a, b) { + return opts.itemSort(a, b, data); + }); + } + + // Determine colors for boxes + helpers.each(tooltipItems, function(tooltipItem) { + labelColors.push(opts.callbacks.labelColor.call(me, tooltipItem, me._chart)); + labelTextColors.push(opts.callbacks.labelTextColor.call(me, tooltipItem, me._chart)); + }); + + + // Build the Text Lines + model.title = me.getTitle(tooltipItems, data); + model.beforeBody = me.getBeforeBody(tooltipItems, data); + model.body = me.getBody(tooltipItems, data); + model.afterBody = me.getAfterBody(tooltipItems, data); + model.footer = me.getFooter(tooltipItems, data); + + // Initial positioning and colors + model.x = Math.round(tooltipPosition.x); + model.y = Math.round(tooltipPosition.y); + model.caretPadding = opts.caretPadding; + model.labelColors = labelColors; + model.labelTextColors = labelTextColors; + + // data points + model.dataPoints = tooltipItems; + + // We need to determine alignment of the tooltip + tooltipSize = getTooltipSize(this, model); + alignment = determineAlignment(this, tooltipSize); + // Final Size and Position + backgroundPoint = getBackgroundPoint(model, tooltipSize, alignment); + } else { + model.opacity = 0; + } + + model.xAlign = alignment.xAlign; + model.yAlign = alignment.yAlign; + model.x = backgroundPoint.x; + model.y = backgroundPoint.y; + model.width = tooltipSize.width; + model.height = tooltipSize.height; + + // Point where the caret on the tooltip points to + model.caretX = tooltipPosition.x; + model.caretY = tooltipPosition.y; + + me._model = model; + + if (changed && opts.custom) { + opts.custom.call(me, model); + } + + return me; + }, + drawCaret: function(tooltipPoint, size) { + var ctx = this._chart.ctx; + var vm = this._view; + var caretPosition = this.getCaretPosition(tooltipPoint, size, vm); + + ctx.lineTo(caretPosition.x1, caretPosition.y1); + ctx.lineTo(caretPosition.x2, caretPosition.y2); + ctx.lineTo(caretPosition.x3, caretPosition.y3); + }, + getCaretPosition: function(tooltipPoint, size, vm) { + var x1, x2, x3, y1, y2, y3; + var caretSize = vm.caretSize; + var cornerRadius = vm.cornerRadius; + var xAlign = vm.xAlign; + var yAlign = vm.yAlign; + var ptX = tooltipPoint.x; + var ptY = tooltipPoint.y; + var width = size.width; + var height = size.height; + + if (yAlign === 'center') { + y2 = ptY + (height / 2); + + if (xAlign === 'left') { + x1 = ptX; + x2 = x1 - caretSize; + x3 = x1; + + y1 = y2 + caretSize; + y3 = y2 - caretSize; + } else { + x1 = ptX + width; + x2 = x1 + caretSize; + x3 = x1; + + y1 = y2 - caretSize; + y3 = y2 + caretSize; + } + } else { + if (xAlign === 'left') { + x2 = ptX + cornerRadius + (caretSize); + x1 = x2 - caretSize; + x3 = x2 + caretSize; + } else if (xAlign === 'right') { + x2 = ptX + width - cornerRadius - caretSize; + x1 = x2 - caretSize; + x3 = x2 + caretSize; + } else { + x2 = ptX + (width / 2); + x1 = x2 - caretSize; + x3 = x2 + caretSize; + } + if (yAlign === 'top') { + y1 = ptY; + y2 = y1 - caretSize; + y3 = y1; + } else { + y1 = ptY + height; + y2 = y1 + caretSize; + y3 = y1; + // invert drawing order + var tmp = x3; + x3 = x1; + x1 = tmp; + } + } + return {x1: x1, x2: x2, x3: x3, y1: y1, y2: y2, y3: y3}; + }, + drawTitle: function(pt, vm, ctx, opacity) { + var title = vm.title; + + if (title.length) { + ctx.textAlign = vm._titleAlign; + ctx.textBaseline = 'top'; + + var titleFontSize = vm.titleFontSize; + var titleSpacing = vm.titleSpacing; + + ctx.fillStyle = mergeOpacity(vm.titleFontColor, opacity); + ctx.font = helpers.fontString(titleFontSize, vm._titleFontStyle, vm._titleFontFamily); + + var i, len; + for (i = 0, len = title.length; i < len; ++i) { + ctx.fillText(title[i], pt.x, pt.y); + pt.y += titleFontSize + titleSpacing; // Line Height and spacing + + if (i + 1 === title.length) { + pt.y += vm.titleMarginBottom - titleSpacing; // If Last, add margin, remove spacing + } + } + } + }, + drawBody: function(pt, vm, ctx, opacity) { + var bodyFontSize = vm.bodyFontSize; + var bodySpacing = vm.bodySpacing; + var body = vm.body; + + ctx.textAlign = vm._bodyAlign; + ctx.textBaseline = 'top'; + ctx.font = helpers.fontString(bodyFontSize, vm._bodyFontStyle, vm._bodyFontFamily); + + // Before Body + var xLinePadding = 0; + var fillLineOfText = function(line) { + ctx.fillText(line, pt.x + xLinePadding, pt.y); + pt.y += bodyFontSize + bodySpacing; + }; + + // Before body lines + ctx.fillStyle = mergeOpacity(vm.bodyFontColor, opacity); + helpers.each(vm.beforeBody, fillLineOfText); + + var drawColorBoxes = vm.displayColors; + xLinePadding = drawColorBoxes ? (bodyFontSize + 2) : 0; + + // Draw body lines now + helpers.each(body, function(bodyItem, i) { + var textColor = mergeOpacity(vm.labelTextColors[i], opacity); + ctx.fillStyle = textColor; + helpers.each(bodyItem.before, fillLineOfText); + + helpers.each(bodyItem.lines, function(line) { + // Draw Legend-like boxes if needed + if (drawColorBoxes) { + // Fill a white rect so that colours merge nicely if the opacity is < 1 + ctx.fillStyle = mergeOpacity(vm.legendColorBackground, opacity); + ctx.fillRect(pt.x, pt.y, bodyFontSize, bodyFontSize); + + // Border + ctx.lineWidth = 1; + ctx.strokeStyle = mergeOpacity(vm.labelColors[i].borderColor, opacity); + ctx.strokeRect(pt.x, pt.y, bodyFontSize, bodyFontSize); + + // Inner square + ctx.fillStyle = mergeOpacity(vm.labelColors[i].backgroundColor, opacity); + ctx.fillRect(pt.x + 1, pt.y + 1, bodyFontSize - 2, bodyFontSize - 2); + ctx.fillStyle = textColor; + } + + fillLineOfText(line); + }); + + helpers.each(bodyItem.after, fillLineOfText); + }); + + // Reset back to 0 for after body + xLinePadding = 0; + + // After body lines + helpers.each(vm.afterBody, fillLineOfText); + pt.y -= bodySpacing; // Remove last body spacing + }, + drawFooter: function(pt, vm, ctx, opacity) { + var footer = vm.footer; + + if (footer.length) { + pt.y += vm.footerMarginTop; + + ctx.textAlign = vm._footerAlign; + ctx.textBaseline = 'top'; + + ctx.fillStyle = mergeOpacity(vm.footerFontColor, opacity); + ctx.font = helpers.fontString(vm.footerFontSize, vm._footerFontStyle, vm._footerFontFamily); + + helpers.each(footer, function(line) { + ctx.fillText(line, pt.x, pt.y); + pt.y += vm.footerFontSize + vm.footerSpacing; + }); + } + }, + drawBackground: function(pt, vm, ctx, tooltipSize, opacity) { + ctx.fillStyle = mergeOpacity(vm.backgroundColor, opacity); + ctx.strokeStyle = mergeOpacity(vm.borderColor, opacity); + ctx.lineWidth = vm.borderWidth; + var xAlign = vm.xAlign; + var yAlign = vm.yAlign; + var x = pt.x; + var y = pt.y; + var width = tooltipSize.width; + var height = tooltipSize.height; + var radius = vm.cornerRadius; + + ctx.beginPath(); + ctx.moveTo(x + radius, y); + if (yAlign === 'top') { + this.drawCaret(pt, tooltipSize); + } + ctx.lineTo(x + width - radius, y); + ctx.quadraticCurveTo(x + width, y, x + width, y + radius); + if (yAlign === 'center' && xAlign === 'right') { + this.drawCaret(pt, tooltipSize); + } + ctx.lineTo(x + width, y + height - radius); + ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height); + if (yAlign === 'bottom') { + this.drawCaret(pt, tooltipSize); + } + ctx.lineTo(x + radius, y + height); + ctx.quadraticCurveTo(x, y + height, x, y + height - radius); + if (yAlign === 'center' && xAlign === 'left') { + this.drawCaret(pt, tooltipSize); + } + ctx.lineTo(x, y + radius); + ctx.quadraticCurveTo(x, y, x + radius, y); + ctx.closePath(); + + ctx.fill(); + + if (vm.borderWidth > 0) { + ctx.stroke(); + } + }, + draw: function() { + var ctx = this._chart.ctx; + var vm = this._view; + + if (vm.opacity === 0) { + return; + } + + var tooltipSize = { + width: vm.width, + height: vm.height + }; + var pt = { + x: vm.x, + y: vm.y + }; + + // IE11/Edge does not like very small opacities, so snap to 0 + var opacity = Math.abs(vm.opacity < 1e-3) ? 0 : vm.opacity; + + // Truthy/falsey value for empty tooltip + var hasTooltipContent = vm.title.length || vm.beforeBody.length || vm.body.length || vm.afterBody.length || vm.footer.length; + + if (this._options.enabled && hasTooltipContent) { + // Draw Background + this.drawBackground(pt, vm, ctx, tooltipSize, opacity); + + // Draw Title, Body, and Footer + pt.x += vm.xPadding; + pt.y += vm.yPadding; + + // Titles + this.drawTitle(pt, vm, ctx, opacity); + + // Body + this.drawBody(pt, vm, ctx, opacity); + + // Footer + this.drawFooter(pt, vm, ctx, opacity); + } + }, + + /** + * Handle an event + * @private + * @param {IEvent} event - The event to handle + * @returns {Boolean} true if the tooltip changed + */ + handleEvent: function(e) { + var me = this; + var options = me._options; + var changed = false; + + me._lastActive = me._lastActive || []; + + // Find Active Elements for tooltips + if (e.type === 'mouseout') { + me._active = []; + } else { + me._active = me._chart.getElementsAtEventForMode(e, options.mode, options); + } + + // Remember Last Actives + changed = !helpers.arrayEquals(me._active, me._lastActive); + + // If tooltip didn't change, do not handle the target event + if (!changed) { + return false; + } + + me._lastActive = me._active; + + if (options.enabled || options.custom) { + me._eventPosition = { + x: e.x, + y: e.y + }; + + var model = me._model; + me.update(true); + me.pivot(); + + // See if our tooltip position changed + changed |= (model.x !== me._model.x) || (model.y !== me._model.y); + } + + return changed; + } + }); + + /** + * @namespace Chart.Tooltip.positioners + */ + Chart.Tooltip.positioners = { + /** + * Average mode places the tooltip at the average position of the elements shown + * @function Chart.Tooltip.positioners.average + * @param elements {ChartElement[]} the elements being displayed in the tooltip + * @returns {Point} tooltip position + */ + average: function(elements) { + if (!elements.length) { + return false; + } + + var i, len; + var x = 0; + var y = 0; + var count = 0; + + for (i = 0, len = elements.length; i < len; ++i) { + var el = elements[i]; + if (el && el.hasValue()) { + var pos = el.tooltipPosition(); + x += pos.x; + y += pos.y; + ++count; + } + } + + return { + x: Math.round(x / count), + y: Math.round(y / count) + }; + }, + + /** + * Gets the tooltip position nearest of the item nearest to the event position + * @function Chart.Tooltip.positioners.nearest + * @param elements {Chart.Element[]} the tooltip elements + * @param eventPosition {Point} the position of the event in canvas coordinates + * @returns {Point} the tooltip position + */ + nearest: function(elements, eventPosition) { + var x = eventPosition.x; + var y = eventPosition.y; + var minDistance = Number.POSITIVE_INFINITY; + var i, len, nearestElement; + + for (i = 0, len = elements.length; i < len; ++i) { + var el = elements[i]; + if (el && el.hasValue()) { + var center = el.getCenterPoint(); + var d = helpers.distanceBetweenPoints(eventPosition, center); + + if (d < minDistance) { + minDistance = d; + nearestElement = el; + } + } + } + + if (nearestElement) { + var tp = nearestElement.tooltipPosition(); + x = tp.x; + y = tp.y; + } + + return { + x: x, + y: y + }; + } + }; +}; + +},{"25":25,"26":26,"45":45}],36:[function(require,module,exports){ +'use strict'; + +var defaults = require(25); +var Element = require(26); +var helpers = require(45); + +defaults._set('global', { + elements: { + arc: { + backgroundColor: defaults.global.defaultColor, + borderColor: '#fff', + borderWidth: 2 + } + } +}); + +module.exports = Element.extend({ + inLabelRange: function(mouseX) { + var vm = this._view; + + if (vm) { + return (Math.pow(mouseX - vm.x, 2) < Math.pow(vm.radius + vm.hoverRadius, 2)); + } + return false; + }, + + inRange: function(chartX, chartY) { + var vm = this._view; + + if (vm) { + var pointRelativePosition = helpers.getAngleFromPoint(vm, {x: chartX, y: chartY}); + var angle = pointRelativePosition.angle; + var distance = pointRelativePosition.distance; + + // Sanitise angle range + var startAngle = vm.startAngle; + var endAngle = vm.endAngle; + while (endAngle < startAngle) { + endAngle += 2.0 * Math.PI; + } + while (angle > endAngle) { + angle -= 2.0 * Math.PI; + } + while (angle < startAngle) { + angle += 2.0 * Math.PI; + } + + // Check if within the range of the open/close angle + var betweenAngles = (angle >= startAngle && angle <= endAngle); + var withinRadius = (distance >= vm.innerRadius && distance <= vm.outerRadius); + + return (betweenAngles && withinRadius); + } + return false; + }, + + getCenterPoint: function() { + var vm = this._view; + var halfAngle = (vm.startAngle + vm.endAngle) / 2; + var halfRadius = (vm.innerRadius + vm.outerRadius) / 2; + return { + x: vm.x + Math.cos(halfAngle) * halfRadius, + y: vm.y + Math.sin(halfAngle) * halfRadius + }; + }, + + getArea: function() { + var vm = this._view; + return Math.PI * ((vm.endAngle - vm.startAngle) / (2 * Math.PI)) * (Math.pow(vm.outerRadius, 2) - Math.pow(vm.innerRadius, 2)); + }, + + tooltipPosition: function() { + var vm = this._view; + var centreAngle = vm.startAngle + ((vm.endAngle - vm.startAngle) / 2); + var rangeFromCentre = (vm.outerRadius - vm.innerRadius) / 2 + vm.innerRadius; + + return { + x: vm.x + (Math.cos(centreAngle) * rangeFromCentre), + y: vm.y + (Math.sin(centreAngle) * rangeFromCentre) + }; + }, + + draw: function() { + var ctx = this._chart.ctx; + var vm = this._view; + var sA = vm.startAngle; + var eA = vm.endAngle; + + ctx.beginPath(); + + ctx.arc(vm.x, vm.y, vm.outerRadius, sA, eA); + ctx.arc(vm.x, vm.y, vm.innerRadius, eA, sA, true); + + ctx.closePath(); + ctx.strokeStyle = vm.borderColor; + ctx.lineWidth = vm.borderWidth; + + ctx.fillStyle = vm.backgroundColor; + + ctx.fill(); + ctx.lineJoin = 'bevel'; + + if (vm.borderWidth) { + ctx.stroke(); + } + } +}); + +},{"25":25,"26":26,"45":45}],37:[function(require,module,exports){ +'use strict'; + +var defaults = require(25); +var Element = require(26); +var helpers = require(45); + +var globalDefaults = defaults.global; + +defaults._set('global', { + elements: { + line: { + tension: 0.4, + backgroundColor: globalDefaults.defaultColor, + borderWidth: 3, + borderColor: globalDefaults.defaultColor, + borderCapStyle: 'butt', + borderDash: [], + borderDashOffset: 0.0, + borderJoinStyle: 'miter', + capBezierPoints: true, + fill: true, // do we fill in the area between the line and its base axis + } + } +}); + +module.exports = Element.extend({ + draw: function() { + var me = this; + var vm = me._view; + var ctx = me._chart.ctx; + var spanGaps = vm.spanGaps; + var points = me._children.slice(); // clone array + var globalOptionLineElements = globalDefaults.elements.line; + var lastDrawnIndex = -1; + var index, current, previous, currentVM; + + // If we are looping, adding the first point again + if (me._loop && points.length) { + points.push(points[0]); + } + + ctx.save(); + + // Stroke Line Options + ctx.lineCap = vm.borderCapStyle || globalOptionLineElements.borderCapStyle; + + // IE 9 and 10 do not support line dash + if (ctx.setLineDash) { + ctx.setLineDash(vm.borderDash || globalOptionLineElements.borderDash); + } + + ctx.lineDashOffset = vm.borderDashOffset || globalOptionLineElements.borderDashOffset; + ctx.lineJoin = vm.borderJoinStyle || globalOptionLineElements.borderJoinStyle; + ctx.lineWidth = vm.borderWidth || globalOptionLineElements.borderWidth; + ctx.strokeStyle = vm.borderColor || globalDefaults.defaultColor; + + // Stroke Line + ctx.beginPath(); + lastDrawnIndex = -1; + + for (index = 0; index < points.length; ++index) { + current = points[index]; + previous = helpers.previousItem(points, index); + currentVM = current._view; + + // First point moves to it's starting position no matter what + if (index === 0) { + if (!currentVM.skip) { + ctx.moveTo(currentVM.x, currentVM.y); + lastDrawnIndex = index; + } + } else { + previous = lastDrawnIndex === -1 ? previous : points[lastDrawnIndex]; + + if (!currentVM.skip) { + if ((lastDrawnIndex !== (index - 1) && !spanGaps) || lastDrawnIndex === -1) { + // There was a gap and this is the first point after the gap + ctx.moveTo(currentVM.x, currentVM.y); + } else { + // Line to next point + helpers.canvas.lineTo(ctx, previous._view, current._view); + } + lastDrawnIndex = index; + } + } + } + + ctx.stroke(); + ctx.restore(); + } +}); + +},{"25":25,"26":26,"45":45}],38:[function(require,module,exports){ +'use strict'; + +var defaults = require(25); +var Element = require(26); +var helpers = require(45); + +var defaultColor = defaults.global.defaultColor; + +defaults._set('global', { + elements: { + point: { + radius: 3, + pointStyle: 'circle', + backgroundColor: defaultColor, + borderColor: defaultColor, + borderWidth: 1, + // Hover + hitRadius: 1, + hoverRadius: 4, + hoverBorderWidth: 1 + } + } +}); + +function xRange(mouseX) { + var vm = this._view; + return vm ? (Math.pow(mouseX - vm.x, 2) < Math.pow(vm.radius + vm.hitRadius, 2)) : false; +} + +function yRange(mouseY) { + var vm = this._view; + return vm ? (Math.pow(mouseY - vm.y, 2) < Math.pow(vm.radius + vm.hitRadius, 2)) : false; +} + +module.exports = Element.extend({ + inRange: function(mouseX, mouseY) { + var vm = this._view; + return vm ? ((Math.pow(mouseX - vm.x, 2) + Math.pow(mouseY - vm.y, 2)) < Math.pow(vm.hitRadius + vm.radius, 2)) : false; + }, + + inLabelRange: xRange, + inXRange: xRange, + inYRange: yRange, + + getCenterPoint: function() { + var vm = this._view; + return { + x: vm.x, + y: vm.y + }; + }, + + getArea: function() { + return Math.PI * Math.pow(this._view.radius, 2); + }, + + tooltipPosition: function() { + var vm = this._view; + return { + x: vm.x, + y: vm.y, + padding: vm.radius + vm.borderWidth + }; + }, + + draw: function(chartArea) { + var vm = this._view; + var model = this._model; + var ctx = this._chart.ctx; + var pointStyle = vm.pointStyle; + var radius = vm.radius; + var x = vm.x; + var y = vm.y; + var color = helpers.color; + var errMargin = 1.01; // 1.01 is margin for Accumulated error. (Especially Edge, IE.) + var ratio = 0; + + if (vm.skip) { + return; + } + + ctx.strokeStyle = vm.borderColor || defaultColor; + ctx.lineWidth = helpers.valueOrDefault(vm.borderWidth, defaults.global.elements.point.borderWidth); + ctx.fillStyle = vm.backgroundColor || defaultColor; + + // Cliping for Points. + // going out from inner charArea? + if ((chartArea !== undefined) && ((model.x < chartArea.left) || (chartArea.right * errMargin < model.x) || (model.y < chartArea.top) || (chartArea.bottom * errMargin < model.y))) { + // Point fade out + if (model.x < chartArea.left) { + ratio = (x - model.x) / (chartArea.left - model.x); + } else if (chartArea.right * errMargin < model.x) { + ratio = (model.x - x) / (model.x - chartArea.right); + } else if (model.y < chartArea.top) { + ratio = (y - model.y) / (chartArea.top - model.y); + } else if (chartArea.bottom * errMargin < model.y) { + ratio = (model.y - y) / (model.y - chartArea.bottom); + } + ratio = Math.round(ratio * 100) / 100; + ctx.strokeStyle = color(ctx.strokeStyle).alpha(ratio).rgbString(); + ctx.fillStyle = color(ctx.fillStyle).alpha(ratio).rgbString(); + } + + helpers.canvas.drawPoint(ctx, pointStyle, radius, x, y); + } +}); + +},{"25":25,"26":26,"45":45}],39:[function(require,module,exports){ +'use strict'; + +var defaults = require(25); +var Element = require(26); + +defaults._set('global', { + elements: { + rectangle: { + backgroundColor: defaults.global.defaultColor, + borderColor: defaults.global.defaultColor, + borderSkipped: 'bottom', + borderWidth: 0 + } + } +}); + +function isVertical(bar) { + return bar._view.width !== undefined; +} + +/** + * Helper function to get the bounds of the bar regardless of the orientation + * @param bar {Chart.Element.Rectangle} the bar + * @return {Bounds} bounds of the bar + * @private + */ +function getBarBounds(bar) { + var vm = bar._view; + var x1, x2, y1, y2; + + if (isVertical(bar)) { + // vertical + var halfWidth = vm.width / 2; + x1 = vm.x - halfWidth; + x2 = vm.x + halfWidth; + y1 = Math.min(vm.y, vm.base); + y2 = Math.max(vm.y, vm.base); + } else { + // horizontal bar + var halfHeight = vm.height / 2; + x1 = Math.min(vm.x, vm.base); + x2 = Math.max(vm.x, vm.base); + y1 = vm.y - halfHeight; + y2 = vm.y + halfHeight; + } + + return { + left: x1, + top: y1, + right: x2, + bottom: y2 + }; +} + +module.exports = Element.extend({ + draw: function() { + var ctx = this._chart.ctx; + var vm = this._view; + var left, right, top, bottom, signX, signY, borderSkipped; + var borderWidth = vm.borderWidth; + + if (!vm.horizontal) { + // bar + left = vm.x - vm.width / 2; + right = vm.x + vm.width / 2; + top = vm.y; + bottom = vm.base; + signX = 1; + signY = bottom > top ? 1 : -1; + borderSkipped = vm.borderSkipped || 'bottom'; + } else { + // horizontal bar + left = vm.base; + right = vm.x; + top = vm.y - vm.height / 2; + bottom = vm.y + vm.height / 2; + signX = right > left ? 1 : -1; + signY = 1; + borderSkipped = vm.borderSkipped || 'left'; + } + + // Canvas doesn't allow us to stroke inside the width so we can + // adjust the sizes to fit if we're setting a stroke on the line + if (borderWidth) { + // borderWidth shold be less than bar width and bar height. + var barSize = Math.min(Math.abs(left - right), Math.abs(top - bottom)); + borderWidth = borderWidth > barSize ? barSize : borderWidth; + var halfStroke = borderWidth / 2; + // Adjust borderWidth when bar top position is near vm.base(zero). + var borderLeft = left + (borderSkipped !== 'left' ? halfStroke * signX : 0); + var borderRight = right + (borderSkipped !== 'right' ? -halfStroke * signX : 0); + var borderTop = top + (borderSkipped !== 'top' ? halfStroke * signY : 0); + var borderBottom = bottom + (borderSkipped !== 'bottom' ? -halfStroke * signY : 0); + // not become a vertical line? + if (borderLeft !== borderRight) { + top = borderTop; + bottom = borderBottom; + } + // not become a horizontal line? + if (borderTop !== borderBottom) { + left = borderLeft; + right = borderRight; + } + } + + ctx.beginPath(); + ctx.fillStyle = vm.backgroundColor; + ctx.strokeStyle = vm.borderColor; + ctx.lineWidth = borderWidth; + + // Corner points, from bottom-left to bottom-right clockwise + // | 1 2 | + // | 0 3 | + var corners = [ + [left, bottom], + [left, top], + [right, top], + [right, bottom] + ]; + + // Find first (starting) corner with fallback to 'bottom' + var borders = ['bottom', 'left', 'top', 'right']; + var startCorner = borders.indexOf(borderSkipped, 0); + if (startCorner === -1) { + startCorner = 0; + } + + function cornerAt(index) { + return corners[(startCorner + index) % 4]; + } + + // Draw rectangle from 'startCorner' + var corner = cornerAt(0); + ctx.moveTo(corner[0], corner[1]); + + for (var i = 1; i < 4; i++) { + corner = cornerAt(i); + ctx.lineTo(corner[0], corner[1]); + } + + ctx.fill(); + if (borderWidth) { + ctx.stroke(); + } + }, + + height: function() { + var vm = this._view; + return vm.base - vm.y; + }, + + inRange: function(mouseX, mouseY) { + var inRange = false; + + if (this._view) { + var bounds = getBarBounds(this); + inRange = mouseX >= bounds.left && mouseX <= bounds.right && mouseY >= bounds.top && mouseY <= bounds.bottom; + } + + return inRange; + }, + + inLabelRange: function(mouseX, mouseY) { + var me = this; + if (!me._view) { + return false; + } + + var inRange = false; + var bounds = getBarBounds(me); + + if (isVertical(me)) { + inRange = mouseX >= bounds.left && mouseX <= bounds.right; + } else { + inRange = mouseY >= bounds.top && mouseY <= bounds.bottom; + } + + return inRange; + }, + + inXRange: function(mouseX) { + var bounds = getBarBounds(this); + return mouseX >= bounds.left && mouseX <= bounds.right; + }, + + inYRange: function(mouseY) { + var bounds = getBarBounds(this); + return mouseY >= bounds.top && mouseY <= bounds.bottom; + }, + + getCenterPoint: function() { + var vm = this._view; + var x, y; + if (isVertical(this)) { + x = vm.x; + y = (vm.y + vm.base) / 2; + } else { + x = (vm.x + vm.base) / 2; + y = vm.y; + } + + return {x: x, y: y}; + }, + + getArea: function() { + var vm = this._view; + return vm.width * Math.abs(vm.y - vm.base); + }, + + tooltipPosition: function() { + var vm = this._view; + return { + x: vm.x, + y: vm.y + }; + } +}); + +},{"25":25,"26":26}],40:[function(require,module,exports){ +'use strict'; + +module.exports = {}; +module.exports.Arc = require(36); +module.exports.Line = require(37); +module.exports.Point = require(38); +module.exports.Rectangle = require(39); + +},{"36":36,"37":37,"38":38,"39":39}],41:[function(require,module,exports){ +'use strict'; + +var helpers = require(42); + +/** + * @namespace Chart.helpers.canvas + */ +var exports = module.exports = { + /** + * Clears the entire canvas associated to the given `chart`. + * @param {Chart} chart - The chart for which to clear the canvas. + */ + clear: function(chart) { + chart.ctx.clearRect(0, 0, chart.width, chart.height); + }, + + /** + * Creates a "path" for a rectangle with rounded corners at position (x, y) with a + * given size (width, height) and the same `radius` for all corners. + * @param {CanvasRenderingContext2D} ctx - The canvas 2D Context. + * @param {Number} x - The x axis of the coordinate for the rectangle starting point. + * @param {Number} y - The y axis of the coordinate for the rectangle starting point. + * @param {Number} width - The rectangle's width. + * @param {Number} height - The rectangle's height. + * @param {Number} radius - The rounded amount (in pixels) for the four corners. + * @todo handle `radius` as top-left, top-right, bottom-right, bottom-left array/object? + */ + roundedRect: function(ctx, x, y, width, height, radius) { + if (radius) { + var rx = Math.min(radius, width / 2); + var ry = Math.min(radius, height / 2); + + ctx.moveTo(x + rx, y); + ctx.lineTo(x + width - rx, y); + ctx.quadraticCurveTo(x + width, y, x + width, y + ry); + ctx.lineTo(x + width, y + height - ry); + ctx.quadraticCurveTo(x + width, y + height, x + width - rx, y + height); + ctx.lineTo(x + rx, y + height); + ctx.quadraticCurveTo(x, y + height, x, y + height - ry); + ctx.lineTo(x, y + ry); + ctx.quadraticCurveTo(x, y, x + rx, y); + } else { + ctx.rect(x, y, width, height); + } + }, + + drawPoint: function(ctx, style, radius, x, y) { + var type, edgeLength, xOffset, yOffset, height, size; + + if (style && typeof style === 'object') { + type = style.toString(); + if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') { + ctx.drawImage(style, x - style.width / 2, y - style.height / 2, style.width, style.height); + return; + } + } + + if (isNaN(radius) || radius <= 0) { + return; + } + + switch (style) { + // Default includes circle + default: + ctx.beginPath(); + ctx.arc(x, y, radius, 0, Math.PI * 2); + ctx.closePath(); + ctx.fill(); + break; + case 'triangle': + ctx.beginPath(); + edgeLength = 3 * radius / Math.sqrt(3); + height = edgeLength * Math.sqrt(3) / 2; + ctx.moveTo(x - edgeLength / 2, y + height / 3); + ctx.lineTo(x + edgeLength / 2, y + height / 3); + ctx.lineTo(x, y - 2 * height / 3); + ctx.closePath(); + ctx.fill(); + break; + case 'rect': + size = 1 / Math.SQRT2 * radius; + ctx.beginPath(); + ctx.fillRect(x - size, y - size, 2 * size, 2 * size); + ctx.strokeRect(x - size, y - size, 2 * size, 2 * size); + break; + case 'rectRounded': + var offset = radius / Math.SQRT2; + var leftX = x - offset; + var topY = y - offset; + var sideSize = Math.SQRT2 * radius; + ctx.beginPath(); + this.roundedRect(ctx, leftX, topY, sideSize, sideSize, radius / 2); + ctx.closePath(); + ctx.fill(); + break; + case 'rectRot': + size = 1 / Math.SQRT2 * radius; + ctx.beginPath(); + ctx.moveTo(x - size, y); + ctx.lineTo(x, y + size); + ctx.lineTo(x + size, y); + ctx.lineTo(x, y - size); + ctx.closePath(); + ctx.fill(); + break; + case 'cross': + ctx.beginPath(); + ctx.moveTo(x, y + radius); + ctx.lineTo(x, y - radius); + ctx.moveTo(x - radius, y); + ctx.lineTo(x + radius, y); + ctx.closePath(); + break; + case 'crossRot': + ctx.beginPath(); + xOffset = Math.cos(Math.PI / 4) * radius; + yOffset = Math.sin(Math.PI / 4) * radius; + ctx.moveTo(x - xOffset, y - yOffset); + ctx.lineTo(x + xOffset, y + yOffset); + ctx.moveTo(x - xOffset, y + yOffset); + ctx.lineTo(x + xOffset, y - yOffset); + ctx.closePath(); + break; + case 'star': + ctx.beginPath(); + ctx.moveTo(x, y + radius); + ctx.lineTo(x, y - radius); + ctx.moveTo(x - radius, y); + ctx.lineTo(x + radius, y); + xOffset = Math.cos(Math.PI / 4) * radius; + yOffset = Math.sin(Math.PI / 4) * radius; + ctx.moveTo(x - xOffset, y - yOffset); + ctx.lineTo(x + xOffset, y + yOffset); + ctx.moveTo(x - xOffset, y + yOffset); + ctx.lineTo(x + xOffset, y - yOffset); + ctx.closePath(); + break; + case 'line': + ctx.beginPath(); + ctx.moveTo(x - radius, y); + ctx.lineTo(x + radius, y); + ctx.closePath(); + break; + case 'dash': + ctx.beginPath(); + ctx.moveTo(x, y); + ctx.lineTo(x + radius, y); + ctx.closePath(); + break; + } + + ctx.stroke(); + }, + + clipArea: function(ctx, area) { + ctx.save(); + ctx.beginPath(); + ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top); + ctx.clip(); + }, + + unclipArea: function(ctx) { + ctx.restore(); + }, + + lineTo: function(ctx, previous, target, flip) { + if (target.steppedLine) { + if ((target.steppedLine === 'after' && !flip) || (target.steppedLine !== 'after' && flip)) { + ctx.lineTo(previous.x, target.y); + } else { + ctx.lineTo(target.x, previous.y); + } + ctx.lineTo(target.x, target.y); + return; + } + + if (!target.tension) { + ctx.lineTo(target.x, target.y); + return; + } + + ctx.bezierCurveTo( + flip ? previous.controlPointPreviousX : previous.controlPointNextX, + flip ? previous.controlPointPreviousY : previous.controlPointNextY, + flip ? target.controlPointNextX : target.controlPointPreviousX, + flip ? target.controlPointNextY : target.controlPointPreviousY, + target.x, + target.y); + } +}; + +// DEPRECATIONS + +/** + * Provided for backward compatibility, use Chart.helpers.canvas.clear instead. + * @namespace Chart.helpers.clear + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers.clear = exports.clear; + +/** + * Provided for backward compatibility, use Chart.helpers.canvas.roundedRect instead. + * @namespace Chart.helpers.drawRoundedRectangle + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers.drawRoundedRectangle = function(ctx) { + ctx.beginPath(); + exports.roundedRect.apply(exports, arguments); + ctx.closePath(); +}; + +},{"42":42}],42:[function(require,module,exports){ +'use strict'; + +/** + * @namespace Chart.helpers + */ +var helpers = { + /** + * An empty function that can be used, for example, for optional callback. + */ + noop: function() {}, + + /** + * Returns a unique id, sequentially generated from a global variable. + * @returns {Number} + * @function + */ + uid: (function() { + var id = 0; + return function() { + return id++; + }; + }()), + + /** + * Returns true if `value` is neither null nor undefined, else returns false. + * @param {*} value - The value to test. + * @returns {Boolean} + * @since 2.7.0 + */ + isNullOrUndef: function(value) { + return value === null || typeof value === 'undefined'; + }, + + /** + * Returns true if `value` is an array, else returns false. + * @param {*} value - The value to test. + * @returns {Boolean} + * @function + */ + isArray: Array.isArray ? Array.isArray : function(value) { + return Object.prototype.toString.call(value) === '[object Array]'; + }, + + /** + * Returns true if `value` is an object (excluding null), else returns false. + * @param {*} value - The value to test. + * @returns {Boolean} + * @since 2.7.0 + */ + isObject: function(value) { + return value !== null && Object.prototype.toString.call(value) === '[object Object]'; + }, + + /** + * Returns `value` if defined, else returns `defaultValue`. + * @param {*} value - The value to return if defined. + * @param {*} defaultValue - The value to return if `value` is undefined. + * @returns {*} + */ + valueOrDefault: function(value, defaultValue) { + return typeof value === 'undefined' ? defaultValue : value; + }, + + /** + * Returns value at the given `index` in array if defined, else returns `defaultValue`. + * @param {Array} value - The array to lookup for value at `index`. + * @param {Number} index - The index in `value` to lookup for value. + * @param {*} defaultValue - The value to return if `value[index]` is undefined. + * @returns {*} + */ + valueAtIndexOrDefault: function(value, index, defaultValue) { + return helpers.valueOrDefault(helpers.isArray(value) ? value[index] : value, defaultValue); + }, + + /** + * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the + * value returned by `fn`. If `fn` is not a function, this method returns undefined. + * @param {Function} fn - The function to call. + * @param {Array|undefined|null} args - The arguments with which `fn` should be called. + * @param {Object} [thisArg] - The value of `this` provided for the call to `fn`. + * @returns {*} + */ + callback: function(fn, args, thisArg) { + if (fn && typeof fn.call === 'function') { + return fn.apply(thisArg, args); + } + }, + + /** + * Note(SB) for performance sake, this method should only be used when loopable type + * is unknown or in none intensive code (not called often and small loopable). Else + * it's preferable to use a regular for() loop and save extra function calls. + * @param {Object|Array} loopable - The object or array to be iterated. + * @param {Function} fn - The function to call for each item. + * @param {Object} [thisArg] - The value of `this` provided for the call to `fn`. + * @param {Boolean} [reverse] - If true, iterates backward on the loopable. + */ + each: function(loopable, fn, thisArg, reverse) { + var i, len, keys; + if (helpers.isArray(loopable)) { + len = loopable.length; + if (reverse) { + for (i = len - 1; i >= 0; i--) { + fn.call(thisArg, loopable[i], i); + } + } else { + for (i = 0; i < len; i++) { + fn.call(thisArg, loopable[i], i); + } + } + } else if (helpers.isObject(loopable)) { + keys = Object.keys(loopable); + len = keys.length; + for (i = 0; i < len; i++) { + fn.call(thisArg, loopable[keys[i]], keys[i]); + } + } + }, + + /** + * Returns true if the `a0` and `a1` arrays have the same content, else returns false. + * @see http://stackoverflow.com/a/14853974 + * @param {Array} a0 - The array to compare + * @param {Array} a1 - The array to compare + * @returns {Boolean} + */ + arrayEquals: function(a0, a1) { + var i, ilen, v0, v1; + + if (!a0 || !a1 || a0.length !== a1.length) { + return false; + } + + for (i = 0, ilen = a0.length; i < ilen; ++i) { + v0 = a0[i]; + v1 = a1[i]; + + if (v0 instanceof Array && v1 instanceof Array) { + if (!helpers.arrayEquals(v0, v1)) { + return false; + } + } else if (v0 !== v1) { + // NOTE: two different object instances will never be equal: {x:20} != {x:20} + return false; + } + } + + return true; + }, + + /** + * Returns a deep copy of `source` without keeping references on objects and arrays. + * @param {*} source - The value to clone. + * @returns {*} + */ + clone: function(source) { + if (helpers.isArray(source)) { + return source.map(helpers.clone); + } + + if (helpers.isObject(source)) { + var target = {}; + var keys = Object.keys(source); + var klen = keys.length; + var k = 0; + + for (; k < klen; ++k) { + target[keys[k]] = helpers.clone(source[keys[k]]); + } + + return target; + } + + return source; + }, + + /** + * The default merger when Chart.helpers.merge is called without merger option. + * Note(SB): this method is also used by configMerge and scaleMerge as fallback. + * @private + */ + _merger: function(key, target, source, options) { + var tval = target[key]; + var sval = source[key]; + + if (helpers.isObject(tval) && helpers.isObject(sval)) { + helpers.merge(tval, sval, options); + } else { + target[key] = helpers.clone(sval); + } + }, + + /** + * Merges source[key] in target[key] only if target[key] is undefined. + * @private + */ + _mergerIf: function(key, target, source) { + var tval = target[key]; + var sval = source[key]; + + if (helpers.isObject(tval) && helpers.isObject(sval)) { + helpers.mergeIf(tval, sval); + } else if (!target.hasOwnProperty(key)) { + target[key] = helpers.clone(sval); + } + }, + + /** + * Recursively deep copies `source` properties into `target` with the given `options`. + * IMPORTANT: `target` is not cloned and will be updated with `source` properties. + * @param {Object} target - The target object in which all sources are merged into. + * @param {Object|Array(Object)} source - Object(s) to merge into `target`. + * @param {Object} [options] - Merging options: + * @param {Function} [options.merger] - The merge method (key, target, source, options) + * @returns {Object} The `target` object. + */ + merge: function(target, source, options) { + var sources = helpers.isArray(source) ? source : [source]; + var ilen = sources.length; + var merge, i, keys, klen, k; + + if (!helpers.isObject(target)) { + return target; + } + + options = options || {}; + merge = options.merger || helpers._merger; + + for (i = 0; i < ilen; ++i) { + source = sources[i]; + if (!helpers.isObject(source)) { + continue; + } + + keys = Object.keys(source); + for (k = 0, klen = keys.length; k < klen; ++k) { + merge(keys[k], target, source, options); + } + } + + return target; + }, + + /** + * Recursively deep copies `source` properties into `target` *only* if not defined in target. + * IMPORTANT: `target` is not cloned and will be updated with `source` properties. + * @param {Object} target - The target object in which all sources are merged into. + * @param {Object|Array(Object)} source - Object(s) to merge into `target`. + * @returns {Object} The `target` object. + */ + mergeIf: function(target, source) { + return helpers.merge(target, source, {merger: helpers._mergerIf}); + }, + + /** + * Applies the contents of two or more objects together into the first object. + * @param {Object} target - The target object in which all objects are merged into. + * @param {Object} arg1 - Object containing additional properties to merge in target. + * @param {Object} argN - Additional objects containing properties to merge in target. + * @returns {Object} The `target` object. + */ + extend: function(target) { + var setFn = function(value, key) { + target[key] = value; + }; + for (var i = 1, ilen = arguments.length; i < ilen; ++i) { + helpers.each(arguments[i], setFn); + } + return target; + }, + + /** + * Basic javascript inheritance based on the model created in Backbone.js + */ + inherits: function(extensions) { + var me = this; + var ChartElement = (extensions && extensions.hasOwnProperty('constructor')) ? extensions.constructor : function() { + return me.apply(this, arguments); + }; + + var Surrogate = function() { + this.constructor = ChartElement; + }; + + Surrogate.prototype = me.prototype; + ChartElement.prototype = new Surrogate(); + ChartElement.extend = helpers.inherits; + + if (extensions) { + helpers.extend(ChartElement.prototype, extensions); + } + + ChartElement.__super__ = me.prototype; + return ChartElement; + } +}; + +module.exports = helpers; + +// DEPRECATIONS + +/** + * Provided for backward compatibility, use Chart.helpers.callback instead. + * @function Chart.helpers.callCallback + * @deprecated since version 2.6.0 + * @todo remove at version 3 + * @private + */ +helpers.callCallback = helpers.callback; + +/** + * Provided for backward compatibility, use Array.prototype.indexOf instead. + * Array.prototype.indexOf compatibility: Chrome, Opera, Safari, FF1.5+, IE9+ + * @function Chart.helpers.indexOf + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers.indexOf = function(array, item, fromIndex) { + return Array.prototype.indexOf.call(array, item, fromIndex); +}; + +/** + * Provided for backward compatibility, use Chart.helpers.valueOrDefault instead. + * @function Chart.helpers.getValueOrDefault + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers.getValueOrDefault = helpers.valueOrDefault; + +/** + * Provided for backward compatibility, use Chart.helpers.valueAtIndexOrDefault instead. + * @function Chart.helpers.getValueAtIndexOrDefault + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers.getValueAtIndexOrDefault = helpers.valueAtIndexOrDefault; + +},{}],43:[function(require,module,exports){ +'use strict'; + +var helpers = require(42); + +/** + * Easing functions adapted from Robert Penner's easing equations. + * @namespace Chart.helpers.easingEffects + * @see http://www.robertpenner.com/easing/ + */ +var effects = { + linear: function(t) { + return t; + }, + + easeInQuad: function(t) { + return t * t; + }, + + easeOutQuad: function(t) { + return -t * (t - 2); + }, + + easeInOutQuad: function(t) { + if ((t /= 0.5) < 1) { + return 0.5 * t * t; + } + return -0.5 * ((--t) * (t - 2) - 1); + }, + + easeInCubic: function(t) { + return t * t * t; + }, + + easeOutCubic: function(t) { + return (t = t - 1) * t * t + 1; + }, + + easeInOutCubic: function(t) { + if ((t /= 0.5) < 1) { + return 0.5 * t * t * t; + } + return 0.5 * ((t -= 2) * t * t + 2); + }, + + easeInQuart: function(t) { + return t * t * t * t; + }, + + easeOutQuart: function(t) { + return -((t = t - 1) * t * t * t - 1); + }, + + easeInOutQuart: function(t) { + if ((t /= 0.5) < 1) { + return 0.5 * t * t * t * t; + } + return -0.5 * ((t -= 2) * t * t * t - 2); + }, + + easeInQuint: function(t) { + return t * t * t * t * t; + }, + + easeOutQuint: function(t) { + return (t = t - 1) * t * t * t * t + 1; + }, + + easeInOutQuint: function(t) { + if ((t /= 0.5) < 1) { + return 0.5 * t * t * t * t * t; + } + return 0.5 * ((t -= 2) * t * t * t * t + 2); + }, + + easeInSine: function(t) { + return -Math.cos(t * (Math.PI / 2)) + 1; + }, + + easeOutSine: function(t) { + return Math.sin(t * (Math.PI / 2)); + }, + + easeInOutSine: function(t) { + return -0.5 * (Math.cos(Math.PI * t) - 1); + }, + + easeInExpo: function(t) { + return (t === 0) ? 0 : Math.pow(2, 10 * (t - 1)); + }, + + easeOutExpo: function(t) { + return (t === 1) ? 1 : -Math.pow(2, -10 * t) + 1; + }, + + easeInOutExpo: function(t) { + if (t === 0) { + return 0; + } + if (t === 1) { + return 1; + } + if ((t /= 0.5) < 1) { + return 0.5 * Math.pow(2, 10 * (t - 1)); + } + return 0.5 * (-Math.pow(2, -10 * --t) + 2); + }, + + easeInCirc: function(t) { + if (t >= 1) { + return t; + } + return -(Math.sqrt(1 - t * t) - 1); + }, + + easeOutCirc: function(t) { + return Math.sqrt(1 - (t = t - 1) * t); + }, + + easeInOutCirc: function(t) { + if ((t /= 0.5) < 1) { + return -0.5 * (Math.sqrt(1 - t * t) - 1); + } + return 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1); + }, + + easeInElastic: function(t) { + var s = 1.70158; + var p = 0; + var a = 1; + if (t === 0) { + return 0; + } + if (t === 1) { + return 1; + } + if (!p) { + p = 0.3; + } + if (a < 1) { + a = 1; + s = p / 4; + } else { + s = p / (2 * Math.PI) * Math.asin(1 / a); + } + return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p)); + }, + + easeOutElastic: function(t) { + var s = 1.70158; + var p = 0; + var a = 1; + if (t === 0) { + return 0; + } + if (t === 1) { + return 1; + } + if (!p) { + p = 0.3; + } + if (a < 1) { + a = 1; + s = p / 4; + } else { + s = p / (2 * Math.PI) * Math.asin(1 / a); + } + return a * Math.pow(2, -10 * t) * Math.sin((t - s) * (2 * Math.PI) / p) + 1; + }, + + easeInOutElastic: function(t) { + var s = 1.70158; + var p = 0; + var a = 1; + if (t === 0) { + return 0; + } + if ((t /= 0.5) === 2) { + return 1; + } + if (!p) { + p = 0.45; + } + if (a < 1) { + a = 1; + s = p / 4; + } else { + s = p / (2 * Math.PI) * Math.asin(1 / a); + } + if (t < 1) { + return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p)); + } + return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p) * 0.5 + 1; + }, + easeInBack: function(t) { + var s = 1.70158; + return t * t * ((s + 1) * t - s); + }, + + easeOutBack: function(t) { + var s = 1.70158; + return (t = t - 1) * t * ((s + 1) * t + s) + 1; + }, + + easeInOutBack: function(t) { + var s = 1.70158; + if ((t /= 0.5) < 1) { + return 0.5 * (t * t * (((s *= (1.525)) + 1) * t - s)); + } + return 0.5 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2); + }, + + easeInBounce: function(t) { + return 1 - effects.easeOutBounce(1 - t); + }, + + easeOutBounce: function(t) { + if (t < (1 / 2.75)) { + return 7.5625 * t * t; + } + if (t < (2 / 2.75)) { + return 7.5625 * (t -= (1.5 / 2.75)) * t + 0.75; + } + if (t < (2.5 / 2.75)) { + return 7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375; + } + return 7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375; + }, + + easeInOutBounce: function(t) { + if (t < 0.5) { + return effects.easeInBounce(t * 2) * 0.5; + } + return effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5; + } +}; + +module.exports = { + effects: effects +}; + +// DEPRECATIONS + +/** + * Provided for backward compatibility, use Chart.helpers.easing.effects instead. + * @function Chart.helpers.easingEffects + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers.easingEffects = effects; + +},{"42":42}],44:[function(require,module,exports){ +'use strict'; + +var helpers = require(42); + +/** + * @alias Chart.helpers.options + * @namespace + */ +module.exports = { + /** + * Converts the given line height `value` in pixels for a specific font `size`. + * @param {Number|String} value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em'). + * @param {Number} size - The font size (in pixels) used to resolve relative `value`. + * @returns {Number} The effective line height in pixels (size * 1.2 if value is invalid). + * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height + * @since 2.7.0 + */ + toLineHeight: function(value, size) { + var matches = ('' + value).match(/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/); + if (!matches || matches[1] === 'normal') { + return size * 1.2; + } + + value = +matches[2]; + + switch (matches[3]) { + case 'px': + return value; + case '%': + value /= 100; + break; + default: + break; + } + + return size * value; + }, + + /** + * Converts the given value into a padding object with pre-computed width/height. + * @param {Number|Object} value - If a number, set the value to all TRBL component, + * else, if and object, use defined properties and sets undefined ones to 0. + * @returns {Object} The padding values (top, right, bottom, left, width, height) + * @since 2.7.0 + */ + toPadding: function(value) { + var t, r, b, l; + + if (helpers.isObject(value)) { + t = +value.top || 0; + r = +value.right || 0; + b = +value.bottom || 0; + l = +value.left || 0; + } else { + t = r = b = l = +value || 0; + } + + return { + top: t, + right: r, + bottom: b, + left: l, + height: t + b, + width: l + r + }; + }, + + /** + * Evaluates the given `inputs` sequentially and returns the first defined value. + * @param {Array[]} inputs - An array of values, falling back to the last value. + * @param {Object} [context] - If defined and the current value is a function, the value + * is called with `context` as first argument and the result becomes the new input. + * @param {Number} [index] - If defined and the current value is an array, the value + * at `index` become the new input. + * @since 2.7.0 + */ + resolve: function(inputs, context, index) { + var i, ilen, value; + + for (i = 0, ilen = inputs.length; i < ilen; ++i) { + value = inputs[i]; + if (value === undefined) { + continue; + } + if (context !== undefined && typeof value === 'function') { + value = value(context); + } + if (index !== undefined && helpers.isArray(value)) { + value = value[index]; + } + if (value !== undefined) { + return value; + } + } + } +}; + +},{"42":42}],45:[function(require,module,exports){ +'use strict'; + +module.exports = require(42); +module.exports.easing = require(43); +module.exports.canvas = require(41); +module.exports.options = require(44); + +},{"41":41,"42":42,"43":43,"44":44}],46:[function(require,module,exports){ +/** + * Platform fallback implementation (minimal). + * @see https://github.com/chartjs/Chart.js/pull/4591#issuecomment-319575939 + */ + +module.exports = { + acquireContext: function(item) { + if (item && item.canvas) { + // Support for any object associated to a canvas (including a context2d) + item = item.canvas; + } + + return item && item.getContext('2d') || null; + } +}; + +},{}],47:[function(require,module,exports){ +/** + * Chart.Platform implementation for targeting a web browser + */ + +'use strict'; + +var helpers = require(45); + +var EXPANDO_KEY = '$chartjs'; +var CSS_PREFIX = 'chartjs-'; +var CSS_RENDER_MONITOR = CSS_PREFIX + 'render-monitor'; +var CSS_RENDER_ANIMATION = CSS_PREFIX + 'render-animation'; +var ANIMATION_START_EVENTS = ['animationstart', 'webkitAnimationStart']; + +/** + * DOM event types -> Chart.js event types. + * Note: only events with different types are mapped. + * @see https://developer.mozilla.org/en-US/docs/Web/Events + */ +var EVENT_TYPES = { + touchstart: 'mousedown', + touchmove: 'mousemove', + touchend: 'mouseup', + pointerenter: 'mouseenter', + pointerdown: 'mousedown', + pointermove: 'mousemove', + pointerup: 'mouseup', + pointerleave: 'mouseout', + pointerout: 'mouseout' +}; + +/** + * The "used" size is the final value of a dimension property after all calculations have + * been performed. This method uses the computed style of `element` but returns undefined + * if the computed style is not expressed in pixels. That can happen in some cases where + * `element` has a size relative to its parent and this last one is not yet displayed, + * for example because of `display: none` on a parent node. + * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value + * @returns {Number} Size in pixels or undefined if unknown. + */ +function readUsedSize(element, property) { + var value = helpers.getStyle(element, property); + var matches = value && value.match(/^(\d+)(\.\d+)?px$/); + return matches ? Number(matches[1]) : undefined; +} + +/** + * Initializes the canvas style and render size without modifying the canvas display size, + * since responsiveness is handled by the controller.resize() method. The config is used + * to determine the aspect ratio to apply in case no explicit height has been specified. + */ +function initCanvas(canvas, config) { + var style = canvas.style; + + // NOTE(SB) canvas.getAttribute('width') !== canvas.width: in the first case it + // returns null or '' if no explicit value has been set to the canvas attribute. + var renderHeight = canvas.getAttribute('height'); + var renderWidth = canvas.getAttribute('width'); + + // Chart.js modifies some canvas values that we want to restore on destroy + canvas[EXPANDO_KEY] = { + initial: { + height: renderHeight, + width: renderWidth, + style: { + display: style.display, + height: style.height, + width: style.width + } + } + }; + + // Force canvas to display as block to avoid extra space caused by inline + // elements, which would interfere with the responsive resize process. + // https://github.com/chartjs/Chart.js/issues/2538 + style.display = style.display || 'block'; + + if (renderWidth === null || renderWidth === '') { + var displayWidth = readUsedSize(canvas, 'width'); + if (displayWidth !== undefined) { + canvas.width = displayWidth; + } + } + + if (renderHeight === null || renderHeight === '') { + if (canvas.style.height === '') { + // If no explicit render height and style height, let's apply the aspect ratio, + // which one can be specified by the user but also by charts as default option + // (i.e. options.aspectRatio). If not specified, use canvas aspect ratio of 2. + canvas.height = canvas.width / (config.options.aspectRatio || 2); + } else { + var displayHeight = readUsedSize(canvas, 'height'); + if (displayWidth !== undefined) { + canvas.height = displayHeight; + } + } + } + + return canvas; +} + +/** + * Detects support for options object argument in addEventListener. + * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support + * @private + */ +var supportsEventListenerOptions = (function() { + var supports = false; + try { + var options = Object.defineProperty({}, 'passive', { + get: function() { + supports = true; + } + }); + window.addEventListener('e', null, options); + } catch (e) { + // continue regardless of error + } + return supports; +}()); + +// Default passive to true as expected by Chrome for 'touchstart' and 'touchend' events. +// https://github.com/chartjs/Chart.js/issues/4287 +var eventListenerOptions = supportsEventListenerOptions ? {passive: true} : false; + +function addEventListener(node, type, listener) { + node.addEventListener(type, listener, eventListenerOptions); +} + +function removeEventListener(node, type, listener) { + node.removeEventListener(type, listener, eventListenerOptions); +} + +function createEvent(type, chart, x, y, nativeEvent) { + return { + type: type, + chart: chart, + native: nativeEvent || null, + x: x !== undefined ? x : null, + y: y !== undefined ? y : null, + }; +} + +function fromNativeEvent(event, chart) { + var type = EVENT_TYPES[event.type] || event.type; + var pos = helpers.getRelativePosition(event, chart); + return createEvent(type, chart, pos.x, pos.y, event); +} + +function throttled(fn, thisArg) { + var ticking = false; + var args = []; + + return function() { + args = Array.prototype.slice.call(arguments); + thisArg = thisArg || this; + + if (!ticking) { + ticking = true; + helpers.requestAnimFrame.call(window, function() { + ticking = false; + fn.apply(thisArg, args); + }); + } + }; +} + +// Implementation based on https://github.com/marcj/css-element-queries +function createResizer(handler) { + var resizer = document.createElement('div'); + var cls = CSS_PREFIX + 'size-monitor'; + var maxSize = 1000000; + var style = + 'position:absolute;' + + 'left:0;' + + 'top:0;' + + 'right:0;' + + 'bottom:0;' + + 'overflow:hidden;' + + 'pointer-events:none;' + + 'visibility:hidden;' + + 'z-index:-1;'; + + resizer.style.cssText = style; + resizer.className = cls; + resizer.innerHTML = + '
      ' + + '
      ' + + '
      ' + + '
      ' + + '
      ' + + '
      ' + + '
      ' + + '
      '; + + var expand = resizer.childNodes[0]; + var shrink = resizer.childNodes[1]; + + resizer._reset = function() { + expand.scrollLeft = maxSize; + expand.scrollTop = maxSize; + shrink.scrollLeft = maxSize; + shrink.scrollTop = maxSize; + }; + var onScroll = function() { + resizer._reset(); + handler(); + }; + + addEventListener(expand, 'scroll', onScroll.bind(expand, 'expand')); + addEventListener(shrink, 'scroll', onScroll.bind(shrink, 'shrink')); + + return resizer; +} + +// https://davidwalsh.name/detect-node-insertion +function watchForRender(node, handler) { + var expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {}); + var proxy = expando.renderProxy = function(e) { + if (e.animationName === CSS_RENDER_ANIMATION) { + handler(); + } + }; + + helpers.each(ANIMATION_START_EVENTS, function(type) { + addEventListener(node, type, proxy); + }); + + // #4737: Chrome might skip the CSS animation when the CSS_RENDER_MONITOR class + // is removed then added back immediately (same animation frame?). Accessing the + // `offsetParent` property will force a reflow and re-evaluate the CSS animation. + // https://gist.github.com/paulirish/5d52fb081b3570c81e3a#box-metrics + // https://github.com/chartjs/Chart.js/issues/4737 + expando.reflow = !!node.offsetParent; + + node.classList.add(CSS_RENDER_MONITOR); +} + +function unwatchForRender(node) { + var expando = node[EXPANDO_KEY] || {}; + var proxy = expando.renderProxy; + + if (proxy) { + helpers.each(ANIMATION_START_EVENTS, function(type) { + removeEventListener(node, type, proxy); + }); + + delete expando.renderProxy; + } + + node.classList.remove(CSS_RENDER_MONITOR); +} + +function addResizeListener(node, listener, chart) { + var expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {}); + + // Let's keep track of this added resizer and thus avoid DOM query when removing it. + var resizer = expando.resizer = createResizer(throttled(function() { + if (expando.resizer) { + return listener(createEvent('resize', chart)); + } + })); + + // The resizer needs to be attached to the node parent, so we first need to be + // sure that `node` is attached to the DOM before injecting the resizer element. + watchForRender(node, function() { + if (expando.resizer) { + var container = node.parentNode; + if (container && container !== resizer.parentNode) { + container.insertBefore(resizer, container.firstChild); + } + + // The container size might have changed, let's reset the resizer state. + resizer._reset(); + } + }); +} + +function removeResizeListener(node) { + var expando = node[EXPANDO_KEY] || {}; + var resizer = expando.resizer; + + delete expando.resizer; + unwatchForRender(node); + + if (resizer && resizer.parentNode) { + resizer.parentNode.removeChild(resizer); + } +} + +function injectCSS(platform, css) { + // http://stackoverflow.com/q/3922139 + var style = platform._style || document.createElement('style'); + if (!platform._style) { + platform._style = style; + css = '/* Chart.js */\n' + css; + style.setAttribute('type', 'text/css'); + document.getElementsByTagName('head')[0].appendChild(style); + } + + style.appendChild(document.createTextNode(css)); +} + +module.exports = { + /** + * This property holds whether this platform is enabled for the current environment. + * Currently used by platform.js to select the proper implementation. + * @private + */ + _enabled: typeof window !== 'undefined' && typeof document !== 'undefined', + + initialize: function() { + var keyframes = 'from{opacity:0.99}to{opacity:1}'; + + injectCSS(this, + // DOM rendering detection + // https://davidwalsh.name/detect-node-insertion + '@-webkit-keyframes ' + CSS_RENDER_ANIMATION + '{' + keyframes + '}' + + '@keyframes ' + CSS_RENDER_ANIMATION + '{' + keyframes + '}' + + '.' + CSS_RENDER_MONITOR + '{' + + '-webkit-animation:' + CSS_RENDER_ANIMATION + ' 0.001s;' + + 'animation:' + CSS_RENDER_ANIMATION + ' 0.001s;' + + '}' + ); + }, + + acquireContext: function(item, config) { + if (typeof item === 'string') { + item = document.getElementById(item); + } else if (item.length) { + // Support for array based queries (such as jQuery) + item = item[0]; + } + + if (item && item.canvas) { + // Support for any object associated to a canvas (including a context2d) + item = item.canvas; + } + + // To prevent canvas fingerprinting, some add-ons undefine the getContext + // method, for example: https://github.com/kkapsner/CanvasBlocker + // https://github.com/chartjs/Chart.js/issues/2807 + var context = item && item.getContext && item.getContext('2d'); + + // `instanceof HTMLCanvasElement/CanvasRenderingContext2D` fails when the item is + // inside an iframe or when running in a protected environment. We could guess the + // types from their toString() value but let's keep things flexible and assume it's + // a sufficient condition if the item has a context2D which has item as `canvas`. + // https://github.com/chartjs/Chart.js/issues/3887 + // https://github.com/chartjs/Chart.js/issues/4102 + // https://github.com/chartjs/Chart.js/issues/4152 + if (context && context.canvas === item) { + initCanvas(item, config); + return context; + } + + return null; + }, + + releaseContext: function(context) { + var canvas = context.canvas; + if (!canvas[EXPANDO_KEY]) { + return; + } + + var initial = canvas[EXPANDO_KEY].initial; + ['height', 'width'].forEach(function(prop) { + var value = initial[prop]; + if (helpers.isNullOrUndef(value)) { + canvas.removeAttribute(prop); + } else { + canvas.setAttribute(prop, value); + } + }); + + helpers.each(initial.style || {}, function(value, key) { + canvas.style[key] = value; + }); + + // The canvas render size might have been changed (and thus the state stack discarded), + // we can't use save() and restore() to restore the initial state. So make sure that at + // least the canvas context is reset to the default state by setting the canvas width. + // https://www.w3.org/TR/2011/WD-html5-20110525/the-canvas-element.html + canvas.width = canvas.width; + + delete canvas[EXPANDO_KEY]; + }, + + addEventListener: function(chart, type, listener) { + var canvas = chart.canvas; + if (type === 'resize') { + // Note: the resize event is not supported on all browsers. + addResizeListener(canvas, listener, chart); + return; + } + + var expando = listener[EXPANDO_KEY] || (listener[EXPANDO_KEY] = {}); + var proxies = expando.proxies || (expando.proxies = {}); + var proxy = proxies[chart.id + '_' + type] = function(event) { + listener(fromNativeEvent(event, chart)); + }; + + addEventListener(canvas, type, proxy); + }, + + removeEventListener: function(chart, type, listener) { + var canvas = chart.canvas; + if (type === 'resize') { + // Note: the resize event is not supported on all browsers. + removeResizeListener(canvas, listener); + return; + } + + var expando = listener[EXPANDO_KEY] || {}; + var proxies = expando.proxies || {}; + var proxy = proxies[chart.id + '_' + type]; + if (!proxy) { + return; + } + + removeEventListener(canvas, type, proxy); + } +}; + +// DEPRECATIONS + +/** + * Provided for backward compatibility, use EventTarget.addEventListener instead. + * EventTarget.addEventListener compatibility: Chrome, Opera 7, Safari, FF1.5+, IE9+ + * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener + * @function Chart.helpers.addEvent + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers.addEvent = addEventListener; + +/** + * Provided for backward compatibility, use EventTarget.removeEventListener instead. + * EventTarget.removeEventListener compatibility: Chrome, Opera 7, Safari, FF1.5+, IE9+ + * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/removeEventListener + * @function Chart.helpers.removeEvent + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ +helpers.removeEvent = removeEventListener; + +},{"45":45}],48:[function(require,module,exports){ +'use strict'; + +var helpers = require(45); +var basic = require(46); +var dom = require(47); + +// @TODO Make possible to select another platform at build time. +var implementation = dom._enabled ? dom : basic; + +/** + * @namespace Chart.platform + * @see https://chartjs.gitbooks.io/proposals/content/Platform.html + * @since 2.4.0 + */ +module.exports = helpers.extend({ + /** + * @since 2.7.0 + */ + initialize: function() {}, + + /** + * Called at chart construction time, returns a context2d instance implementing + * the [W3C Canvas 2D Context API standard]{@link https://www.w3.org/TR/2dcontext/}. + * @param {*} item - The native item from which to acquire context (platform specific) + * @param {Object} options - The chart options + * @returns {CanvasRenderingContext2D} context2d instance + */ + acquireContext: function() {}, + + /** + * Called at chart destruction time, releases any resources associated to the context + * previously returned by the acquireContext() method. + * @param {CanvasRenderingContext2D} context - The context2d instance + * @returns {Boolean} true if the method succeeded, else false + */ + releaseContext: function() {}, + + /** + * Registers the specified listener on the given chart. + * @param {Chart} chart - Chart from which to listen for event + * @param {String} type - The ({@link IEvent}) type to listen for + * @param {Function} listener - Receives a notification (an object that implements + * the {@link IEvent} interface) when an event of the specified type occurs. + */ + addEventListener: function() {}, + + /** + * Removes the specified listener previously registered with addEventListener. + * @param {Chart} chart -Chart from which to remove the listener + * @param {String} type - The ({@link IEvent}) type to remove + * @param {Function} listener - The listener function to remove from the event target. + */ + removeEventListener: function() {} + +}, implementation); + +/** + * @interface IPlatform + * Allows abstracting platform dependencies away from the chart + * @borrows Chart.platform.acquireContext as acquireContext + * @borrows Chart.platform.releaseContext as releaseContext + * @borrows Chart.platform.addEventListener as addEventListener + * @borrows Chart.platform.removeEventListener as removeEventListener + */ + +/** + * @interface IEvent + * @prop {String} type - The event type name, possible values are: + * 'contextmenu', 'mouseenter', 'mousedown', 'mousemove', 'mouseup', 'mouseout', + * 'click', 'dblclick', 'keydown', 'keypress', 'keyup' and 'resize' + * @prop {*} native - The original native event (null for emulated events, e.g. 'resize') + * @prop {Number} x - The mouse x position, relative to the canvas (null for incompatible events) + * @prop {Number} y - The mouse y position, relative to the canvas (null for incompatible events) + */ + +},{"45":45,"46":46,"47":47}],49:[function(require,module,exports){ +/** + * Plugin based on discussion from the following Chart.js issues: + * @see https://github.com/chartjs/Chart.js/issues/2380#issuecomment-279961569 + * @see https://github.com/chartjs/Chart.js/issues/2440#issuecomment-256461897 + */ + +'use strict'; + +var defaults = require(25); +var elements = require(40); +var helpers = require(45); + +defaults._set('global', { + plugins: { + filler: { + propagate: true + } + } +}); + +module.exports = function() { + + var mappers = { + dataset: function(source) { + var index = source.fill; + var chart = source.chart; + var meta = chart.getDatasetMeta(index); + var visible = meta && chart.isDatasetVisible(index); + var points = (visible && meta.dataset._children) || []; + var length = points.length || 0; + + return !length ? null : function(point, i) { + return (i < length && points[i]._view) || null; + }; + }, + + boundary: function(source) { + var boundary = source.boundary; + var x = boundary ? boundary.x : null; + var y = boundary ? boundary.y : null; + + return function(point) { + return { + x: x === null ? point.x : x, + y: y === null ? point.y : y, + }; + }; + } + }; + + // @todo if (fill[0] === '#') + function decodeFill(el, index, count) { + var model = el._model || {}; + var fill = model.fill; + var target; + + if (fill === undefined) { + fill = !!model.backgroundColor; + } + + if (fill === false || fill === null) { + return false; + } + + if (fill === true) { + return 'origin'; + } + + target = parseFloat(fill, 10); + if (isFinite(target) && Math.floor(target) === target) { + if (fill[0] === '-' || fill[0] === '+') { + target = index + target; + } + + if (target === index || target < 0 || target >= count) { + return false; + } + + return target; + } + + switch (fill) { + // compatibility + case 'bottom': + return 'start'; + case 'top': + return 'end'; + case 'zero': + return 'origin'; + // supported boundaries + case 'origin': + case 'start': + case 'end': + return fill; + // invalid fill values + default: + return false; + } + } + + function computeBoundary(source) { + var model = source.el._model || {}; + var scale = source.el._scale || {}; + var fill = source.fill; + var target = null; + var horizontal; + + if (isFinite(fill)) { + return null; + } + + // Backward compatibility: until v3, we still need to support boundary values set on + // the model (scaleTop, scaleBottom and scaleZero) because some external plugins and + // controllers might still use it (e.g. the Smith chart). + + if (fill === 'start') { + target = model.scaleBottom === undefined ? scale.bottom : model.scaleBottom; + } else if (fill === 'end') { + target = model.scaleTop === undefined ? scale.top : model.scaleTop; + } else if (model.scaleZero !== undefined) { + target = model.scaleZero; + } else if (scale.getBasePosition) { + target = scale.getBasePosition(); + } else if (scale.getBasePixel) { + target = scale.getBasePixel(); + } + + if (target !== undefined && target !== null) { + if (target.x !== undefined && target.y !== undefined) { + return target; + } + + if (typeof target === 'number' && isFinite(target)) { + horizontal = scale.isHorizontal(); + return { + x: horizontal ? target : null, + y: horizontal ? null : target + }; + } + } + + return null; + } + + function resolveTarget(sources, index, propagate) { + var source = sources[index]; + var fill = source.fill; + var visited = [index]; + var target; + + if (!propagate) { + return fill; + } + + while (fill !== false && visited.indexOf(fill) === -1) { + if (!isFinite(fill)) { + return fill; + } + + target = sources[fill]; + if (!target) { + return false; + } + + if (target.visible) { + return fill; + } + + visited.push(fill); + fill = target.fill; + } + + return false; + } + + function createMapper(source) { + var fill = source.fill; + var type = 'dataset'; + + if (fill === false) { + return null; + } + + if (!isFinite(fill)) { + type = 'boundary'; + } + + return mappers[type](source); + } + + function isDrawable(point) { + return point && !point.skip; + } + + function drawArea(ctx, curve0, curve1, len0, len1) { + var i; + + if (!len0 || !len1) { + return; + } + + // building first area curve (normal) + ctx.moveTo(curve0[0].x, curve0[0].y); + for (i = 1; i < len0; ++i) { + helpers.canvas.lineTo(ctx, curve0[i - 1], curve0[i]); + } + + // joining the two area curves + ctx.lineTo(curve1[len1 - 1].x, curve1[len1 - 1].y); + + // building opposite area curve (reverse) + for (i = len1 - 1; i > 0; --i) { + helpers.canvas.lineTo(ctx, curve1[i], curve1[i - 1], true); + } + } + + function doFill(ctx, points, mapper, view, color, loop) { + var count = points.length; + var span = view.spanGaps; + var curve0 = []; + var curve1 = []; + var len0 = 0; + var len1 = 0; + var i, ilen, index, p0, p1, d0, d1; + + ctx.beginPath(); + + for (i = 0, ilen = (count + !!loop); i < ilen; ++i) { + index = i % count; + p0 = points[index]._view; + p1 = mapper(p0, index, view); + d0 = isDrawable(p0); + d1 = isDrawable(p1); + + if (d0 && d1) { + len0 = curve0.push(p0); + len1 = curve1.push(p1); + } else if (len0 && len1) { + if (!span) { + drawArea(ctx, curve0, curve1, len0, len1); + len0 = len1 = 0; + curve0 = []; + curve1 = []; + } else { + if (d0) { + curve0.push(p0); + } + if (d1) { + curve1.push(p1); + } + } + } + } + + drawArea(ctx, curve0, curve1, len0, len1); + + ctx.closePath(); + ctx.fillStyle = color; + ctx.fill(); + } + + return { + id: 'filler', + + afterDatasetsUpdate: function(chart, options) { + var count = (chart.data.datasets || []).length; + var propagate = options.propagate; + var sources = []; + var meta, i, el, source; + + for (i = 0; i < count; ++i) { + meta = chart.getDatasetMeta(i); + el = meta.dataset; + source = null; + + if (el && el._model && el instanceof elements.Line) { + source = { + visible: chart.isDatasetVisible(i), + fill: decodeFill(el, i, count), + chart: chart, + el: el + }; + } + + meta.$filler = source; + sources.push(source); + } + + for (i = 0; i < count; ++i) { + source = sources[i]; + if (!source) { + continue; + } + + source.fill = resolveTarget(sources, i, propagate); + source.boundary = computeBoundary(source); + source.mapper = createMapper(source); + } + }, + + beforeDatasetDraw: function(chart, args) { + var meta = args.meta.$filler; + if (!meta) { + return; + } + + var ctx = chart.ctx; + var el = meta.el; + var view = el._view; + var points = el._children || []; + var mapper = meta.mapper; + var color = view.backgroundColor || defaults.global.defaultColor; + + if (mapper && color && points.length) { + helpers.canvas.clipArea(ctx, chart.chartArea); + doFill(ctx, points, mapper, view, color, el._loop); + helpers.canvas.unclipArea(ctx); + } + } + }; +}; + +},{"25":25,"40":40,"45":45}],50:[function(require,module,exports){ +'use strict'; + +var defaults = require(25); +var Element = require(26); +var helpers = require(45); + +defaults._set('global', { + legend: { + display: true, + position: 'top', + fullWidth: true, + reverse: false, + weight: 1000, + + // a callback that will handle + onClick: function(e, legendItem) { + var index = legendItem.datasetIndex; + var ci = this.chart; + var meta = ci.getDatasetMeta(index); + + // See controller.isDatasetVisible comment + meta.hidden = meta.hidden === null ? !ci.data.datasets[index].hidden : null; + + // We hid a dataset ... rerender the chart + ci.update(); + }, + + onHover: null, + + labels: { + boxWidth: 40, + padding: 10, + // Generates labels shown in the legend + // Valid properties to return: + // text : text to display + // fillStyle : fill of coloured box + // strokeStyle: stroke of coloured box + // hidden : if this legend item refers to a hidden item + // lineCap : cap style for line + // lineDash + // lineDashOffset : + // lineJoin : + // lineWidth : + generateLabels: function(chart) { + var data = chart.data; + return helpers.isArray(data.datasets) ? data.datasets.map(function(dataset, i) { + return { + text: dataset.label, + fillStyle: (!helpers.isArray(dataset.backgroundColor) ? dataset.backgroundColor : dataset.backgroundColor[0]), + hidden: !chart.isDatasetVisible(i), + lineCap: dataset.borderCapStyle, + lineDash: dataset.borderDash, + lineDashOffset: dataset.borderDashOffset, + lineJoin: dataset.borderJoinStyle, + lineWidth: dataset.borderWidth, + strokeStyle: dataset.borderColor, + pointStyle: dataset.pointStyle, + + // Below is extra data used for toggling the datasets + datasetIndex: i + }; + }, this) : []; + } + } + }, + + legendCallback: function(chart) { + var text = []; + text.push('
        '); + for (var i = 0; i < chart.data.datasets.length; i++) { + text.push('
      • '); + if (chart.data.datasets[i].label) { + text.push(chart.data.datasets[i].label); + } + text.push('
      • '); + } + text.push('
      '); + return text.join(''); + } +}); + +module.exports = function(Chart) { + + var layout = Chart.layoutService; + var noop = helpers.noop; + + /** + * Helper function to get the box width based on the usePointStyle option + * @param labelopts {Object} the label options on the legend + * @param fontSize {Number} the label font size + * @return {Number} width of the color box area + */ + function getBoxWidth(labelOpts, fontSize) { + return labelOpts.usePointStyle ? + fontSize * Math.SQRT2 : + labelOpts.boxWidth; + } + + Chart.Legend = Element.extend({ + + initialize: function(config) { + helpers.extend(this, config); + + // Contains hit boxes for each dataset (in dataset order) + this.legendHitBoxes = []; + + // Are we in doughnut mode which has a different data type + this.doughnutMode = false; + }, + + // These methods are ordered by lifecycle. Utilities then follow. + // Any function defined here is inherited by all legend types. + // Any function can be extended by the legend type + + beforeUpdate: noop, + update: function(maxWidth, maxHeight, margins) { + var me = this; + + // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;) + me.beforeUpdate(); + + // Absorb the master measurements + me.maxWidth = maxWidth; + me.maxHeight = maxHeight; + me.margins = margins; + + // Dimensions + me.beforeSetDimensions(); + me.setDimensions(); + me.afterSetDimensions(); + // Labels + me.beforeBuildLabels(); + me.buildLabels(); + me.afterBuildLabels(); + + // Fit + me.beforeFit(); + me.fit(); + me.afterFit(); + // + me.afterUpdate(); + + return me.minSize; + }, + afterUpdate: noop, + + // + + beforeSetDimensions: noop, + setDimensions: function() { + var me = this; + // Set the unconstrained dimension before label rotation + if (me.isHorizontal()) { + // Reset position before calculating rotation + me.width = me.maxWidth; + me.left = 0; + me.right = me.width; + } else { + me.height = me.maxHeight; + + // Reset position before calculating rotation + me.top = 0; + me.bottom = me.height; + } + + // Reset padding + me.paddingLeft = 0; + me.paddingTop = 0; + me.paddingRight = 0; + me.paddingBottom = 0; + + // Reset minSize + me.minSize = { + width: 0, + height: 0 + }; + }, + afterSetDimensions: noop, + + // + + beforeBuildLabels: noop, + buildLabels: function() { + var me = this; + var labelOpts = me.options.labels || {}; + var legendItems = helpers.callback(labelOpts.generateLabels, [me.chart], me) || []; + + if (labelOpts.filter) { + legendItems = legendItems.filter(function(item) { + return labelOpts.filter(item, me.chart.data); + }); + } + + if (me.options.reverse) { + legendItems.reverse(); + } + + me.legendItems = legendItems; + }, + afterBuildLabels: noop, + + // + + beforeFit: noop, + fit: function() { + var me = this; + var opts = me.options; + var labelOpts = opts.labels; + var display = opts.display; + + var ctx = me.ctx; + + var globalDefault = defaults.global; + var valueOrDefault = helpers.valueOrDefault; + var fontSize = valueOrDefault(labelOpts.fontSize, globalDefault.defaultFontSize); + var fontStyle = valueOrDefault(labelOpts.fontStyle, globalDefault.defaultFontStyle); + var fontFamily = valueOrDefault(labelOpts.fontFamily, globalDefault.defaultFontFamily); + var labelFont = helpers.fontString(fontSize, fontStyle, fontFamily); + + // Reset hit boxes + var hitboxes = me.legendHitBoxes = []; + + var minSize = me.minSize; + var isHorizontal = me.isHorizontal(); + + if (isHorizontal) { + minSize.width = me.maxWidth; // fill all the width + minSize.height = display ? 10 : 0; + } else { + minSize.width = display ? 10 : 0; + minSize.height = me.maxHeight; // fill all the height + } + + // Increase sizes here + if (display) { + ctx.font = labelFont; + + if (isHorizontal) { + // Labels + + // Width of each line of legend boxes. Labels wrap onto multiple lines when there are too many to fit on one + var lineWidths = me.lineWidths = [0]; + var totalHeight = me.legendItems.length ? fontSize + (labelOpts.padding) : 0; + + ctx.textAlign = 'left'; + ctx.textBaseline = 'top'; + + helpers.each(me.legendItems, function(legendItem, i) { + var boxWidth = getBoxWidth(labelOpts, fontSize); + var width = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width; + + if (lineWidths[lineWidths.length - 1] + width + labelOpts.padding >= me.width) { + totalHeight += fontSize + (labelOpts.padding); + lineWidths[lineWidths.length] = me.left; + } + + // Store the hitbox width and height here. Final position will be updated in `draw` + hitboxes[i] = { + left: 0, + top: 0, + width: width, + height: fontSize + }; + + lineWidths[lineWidths.length - 1] += width + labelOpts.padding; + }); + + minSize.height += totalHeight; + + } else { + var vPadding = labelOpts.padding; + var columnWidths = me.columnWidths = []; + var totalWidth = labelOpts.padding; + var currentColWidth = 0; + var currentColHeight = 0; + var itemHeight = fontSize + vPadding; + + helpers.each(me.legendItems, function(legendItem, i) { + var boxWidth = getBoxWidth(labelOpts, fontSize); + var itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width; + + // If too tall, go to new column + if (currentColHeight + itemHeight > minSize.height) { + totalWidth += currentColWidth + labelOpts.padding; + columnWidths.push(currentColWidth); // previous column width + + currentColWidth = 0; + currentColHeight = 0; + } + + // Get max width + currentColWidth = Math.max(currentColWidth, itemWidth); + currentColHeight += itemHeight; + + // Store the hitbox width and height here. Final position will be updated in `draw` + hitboxes[i] = { + left: 0, + top: 0, + width: itemWidth, + height: fontSize + }; + }); + + totalWidth += currentColWidth; + columnWidths.push(currentColWidth); + minSize.width += totalWidth; + } + } + + me.width = minSize.width; + me.height = minSize.height; + }, + afterFit: noop, + + // Shared Methods + isHorizontal: function() { + return this.options.position === 'top' || this.options.position === 'bottom'; + }, + + // Actually draw the legend on the canvas + draw: function() { + var me = this; + var opts = me.options; + var labelOpts = opts.labels; + var globalDefault = defaults.global; + var lineDefault = globalDefault.elements.line; + var legendWidth = me.width; + var lineWidths = me.lineWidths; + + if (opts.display) { + var ctx = me.ctx; + var valueOrDefault = helpers.valueOrDefault; + var fontColor = valueOrDefault(labelOpts.fontColor, globalDefault.defaultFontColor); + var fontSize = valueOrDefault(labelOpts.fontSize, globalDefault.defaultFontSize); + var fontStyle = valueOrDefault(labelOpts.fontStyle, globalDefault.defaultFontStyle); + var fontFamily = valueOrDefault(labelOpts.fontFamily, globalDefault.defaultFontFamily); + var labelFont = helpers.fontString(fontSize, fontStyle, fontFamily); + var cursor; + + // Canvas setup + ctx.textAlign = 'left'; + ctx.textBaseline = 'middle'; + ctx.lineWidth = 0.5; + ctx.strokeStyle = fontColor; // for strikethrough effect + ctx.fillStyle = fontColor; // render in correct colour + ctx.font = labelFont; + + var boxWidth = getBoxWidth(labelOpts, fontSize); + var hitboxes = me.legendHitBoxes; + + // current position + var drawLegendBox = function(x, y, legendItem) { + if (isNaN(boxWidth) || boxWidth <= 0) { + return; + } + + // Set the ctx for the box + ctx.save(); + + ctx.fillStyle = valueOrDefault(legendItem.fillStyle, globalDefault.defaultColor); + ctx.lineCap = valueOrDefault(legendItem.lineCap, lineDefault.borderCapStyle); + ctx.lineDashOffset = valueOrDefault(legendItem.lineDashOffset, lineDefault.borderDashOffset); + ctx.lineJoin = valueOrDefault(legendItem.lineJoin, lineDefault.borderJoinStyle); + ctx.lineWidth = valueOrDefault(legendItem.lineWidth, lineDefault.borderWidth); + ctx.strokeStyle = valueOrDefault(legendItem.strokeStyle, globalDefault.defaultColor); + var isLineWidthZero = (valueOrDefault(legendItem.lineWidth, lineDefault.borderWidth) === 0); + + if (ctx.setLineDash) { + // IE 9 and 10 do not support line dash + ctx.setLineDash(valueOrDefault(legendItem.lineDash, lineDefault.borderDash)); + } + + if (opts.labels && opts.labels.usePointStyle) { + // Recalculate x and y for drawPoint() because its expecting + // x and y to be center of figure (instead of top left) + var radius = fontSize * Math.SQRT2 / 2; + var offSet = radius / Math.SQRT2; + var centerX = x + offSet; + var centerY = y + offSet; + + // Draw pointStyle as legend symbol + helpers.canvas.drawPoint(ctx, legendItem.pointStyle, radius, centerX, centerY); + } else { + // Draw box as legend symbol + if (!isLineWidthZero) { + ctx.strokeRect(x, y, boxWidth, fontSize); + } + ctx.fillRect(x, y, boxWidth, fontSize); + } + + ctx.restore(); + }; + var fillText = function(x, y, legendItem, textWidth) { + var halfFontSize = fontSize / 2; + var xLeft = boxWidth + halfFontSize + x; + var yMiddle = y + halfFontSize; + + ctx.fillText(legendItem.text, xLeft, yMiddle); + + if (legendItem.hidden) { + // Strikethrough the text if hidden + ctx.beginPath(); + ctx.lineWidth = 2; + ctx.moveTo(xLeft, yMiddle); + ctx.lineTo(xLeft + textWidth, yMiddle); + ctx.stroke(); + } + }; + + // Horizontal + var isHorizontal = me.isHorizontal(); + if (isHorizontal) { + cursor = { + x: me.left + ((legendWidth - lineWidths[0]) / 2), + y: me.top + labelOpts.padding, + line: 0 + }; + } else { + cursor = { + x: me.left + labelOpts.padding, + y: me.top + labelOpts.padding, + line: 0 + }; + } + + var itemHeight = fontSize + labelOpts.padding; + helpers.each(me.legendItems, function(legendItem, i) { + var textWidth = ctx.measureText(legendItem.text).width; + var width = boxWidth + (fontSize / 2) + textWidth; + var x = cursor.x; + var y = cursor.y; + + if (isHorizontal) { + if (x + width >= legendWidth) { + y = cursor.y += itemHeight; + cursor.line++; + x = cursor.x = me.left + ((legendWidth - lineWidths[cursor.line]) / 2); + } + } else if (y + itemHeight > me.bottom) { + x = cursor.x = x + me.columnWidths[cursor.line] + labelOpts.padding; + y = cursor.y = me.top + labelOpts.padding; + cursor.line++; + } + + drawLegendBox(x, y, legendItem); + + hitboxes[i].left = x; + hitboxes[i].top = y; + + // Fill the actual label + fillText(x, y, legendItem, textWidth); + + if (isHorizontal) { + cursor.x += width + (labelOpts.padding); + } else { + cursor.y += itemHeight; + } + + }); + } + }, + + /** + * Handle an event + * @private + * @param {IEvent} event - The event to handle + * @return {Boolean} true if a change occured + */ + handleEvent: function(e) { + var me = this; + var opts = me.options; + var type = e.type === 'mouseup' ? 'click' : e.type; + var changed = false; + + if (type === 'mousemove') { + if (!opts.onHover) { + return; + } + } else if (type === 'click') { + if (!opts.onClick) { + return; + } + } else { + return; + } + + // Chart event already has relative position in it + var x = e.x; + var y = e.y; + + if (x >= me.left && x <= me.right && y >= me.top && y <= me.bottom) { + // See if we are touching one of the dataset boxes + var lh = me.legendHitBoxes; + for (var i = 0; i < lh.length; ++i) { + var hitBox = lh[i]; + + if (x >= hitBox.left && x <= hitBox.left + hitBox.width && y >= hitBox.top && y <= hitBox.top + hitBox.height) { + // Touching an element + if (type === 'click') { + // use e.native for backwards compatibility + opts.onClick.call(me, e.native, me.legendItems[i]); + changed = true; + break; + } else if (type === 'mousemove') { + // use e.native for backwards compatibility + opts.onHover.call(me, e.native, me.legendItems[i]); + changed = true; + break; + } + } + } + } + + return changed; + } + }); + + function createNewLegendAndAttach(chart, legendOpts) { + var legend = new Chart.Legend({ + ctx: chart.ctx, + options: legendOpts, + chart: chart + }); + + layout.configure(chart, legend, legendOpts); + layout.addBox(chart, legend); + chart.legend = legend; + } + + return { + id: 'legend', + + beforeInit: function(chart) { + var legendOpts = chart.options.legend; + + if (legendOpts) { + createNewLegendAndAttach(chart, legendOpts); + } + }, + + beforeUpdate: function(chart) { + var legendOpts = chart.options.legend; + var legend = chart.legend; + + if (legendOpts) { + helpers.mergeIf(legendOpts, defaults.global.legend); + + if (legend) { + layout.configure(chart, legend, legendOpts); + legend.options = legendOpts; + } else { + createNewLegendAndAttach(chart, legendOpts); + } + } else if (legend) { + layout.removeBox(chart, legend); + delete chart.legend; + } + }, + + afterEvent: function(chart, e) { + var legend = chart.legend; + if (legend) { + legend.handleEvent(e); + } + } + }; +}; + +},{"25":25,"26":26,"45":45}],51:[function(require,module,exports){ +'use strict'; + +var defaults = require(25); +var Element = require(26); +var helpers = require(45); + +defaults._set('global', { + title: { + display: false, + fontStyle: 'bold', + fullWidth: true, + lineHeight: 1.2, + padding: 10, + position: 'top', + text: '', + weight: 2000 // by default greater than legend (1000) to be above + } +}); + +module.exports = function(Chart) { + + var layout = Chart.layoutService; + var noop = helpers.noop; + + Chart.Title = Element.extend({ + initialize: function(config) { + var me = this; + helpers.extend(me, config); + + // Contains hit boxes for each dataset (in dataset order) + me.legendHitBoxes = []; + }, + + // These methods are ordered by lifecycle. Utilities then follow. + + beforeUpdate: noop, + update: function(maxWidth, maxHeight, margins) { + var me = this; + + // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;) + me.beforeUpdate(); + + // Absorb the master measurements + me.maxWidth = maxWidth; + me.maxHeight = maxHeight; + me.margins = margins; + + // Dimensions + me.beforeSetDimensions(); + me.setDimensions(); + me.afterSetDimensions(); + // Labels + me.beforeBuildLabels(); + me.buildLabels(); + me.afterBuildLabels(); + + // Fit + me.beforeFit(); + me.fit(); + me.afterFit(); + // + me.afterUpdate(); + + return me.minSize; + + }, + afterUpdate: noop, + + // + + beforeSetDimensions: noop, + setDimensions: function() { + var me = this; + // Set the unconstrained dimension before label rotation + if (me.isHorizontal()) { + // Reset position before calculating rotation + me.width = me.maxWidth; + me.left = 0; + me.right = me.width; + } else { + me.height = me.maxHeight; + + // Reset position before calculating rotation + me.top = 0; + me.bottom = me.height; + } + + // Reset padding + me.paddingLeft = 0; + me.paddingTop = 0; + me.paddingRight = 0; + me.paddingBottom = 0; + + // Reset minSize + me.minSize = { + width: 0, + height: 0 + }; + }, + afterSetDimensions: noop, + + // + + beforeBuildLabels: noop, + buildLabels: noop, + afterBuildLabels: noop, + + // + + beforeFit: noop, + fit: function() { + var me = this; + var valueOrDefault = helpers.valueOrDefault; + var opts = me.options; + var display = opts.display; + var fontSize = valueOrDefault(opts.fontSize, defaults.global.defaultFontSize); + var minSize = me.minSize; + var lineCount = helpers.isArray(opts.text) ? opts.text.length : 1; + var lineHeight = helpers.options.toLineHeight(opts.lineHeight, fontSize); + var textSize = display ? (lineCount * lineHeight) + (opts.padding * 2) : 0; + + if (me.isHorizontal()) { + minSize.width = me.maxWidth; // fill all the width + minSize.height = textSize; + } else { + minSize.width = textSize; + minSize.height = me.maxHeight; // fill all the height + } + + me.width = minSize.width; + me.height = minSize.height; + + }, + afterFit: noop, + + // Shared Methods + isHorizontal: function() { + var pos = this.options.position; + return pos === 'top' || pos === 'bottom'; + }, + + // Actually draw the title block on the canvas + draw: function() { + var me = this; + var ctx = me.ctx; + var valueOrDefault = helpers.valueOrDefault; + var opts = me.options; + var globalDefaults = defaults.global; + + if (opts.display) { + var fontSize = valueOrDefault(opts.fontSize, globalDefaults.defaultFontSize); + var fontStyle = valueOrDefault(opts.fontStyle, globalDefaults.defaultFontStyle); + var fontFamily = valueOrDefault(opts.fontFamily, globalDefaults.defaultFontFamily); + var titleFont = helpers.fontString(fontSize, fontStyle, fontFamily); + var lineHeight = helpers.options.toLineHeight(opts.lineHeight, fontSize); + var offset = lineHeight / 2 + opts.padding; + var rotation = 0; + var top = me.top; + var left = me.left; + var bottom = me.bottom; + var right = me.right; + var maxWidth, titleX, titleY; + + ctx.fillStyle = valueOrDefault(opts.fontColor, globalDefaults.defaultFontColor); // render in correct colour + ctx.font = titleFont; + + // Horizontal + if (me.isHorizontal()) { + titleX = left + ((right - left) / 2); // midpoint of the width + titleY = top + offset; + maxWidth = right - left; + } else { + titleX = opts.position === 'left' ? left + offset : right - offset; + titleY = top + ((bottom - top) / 2); + maxWidth = bottom - top; + rotation = Math.PI * (opts.position === 'left' ? -0.5 : 0.5); + } + + ctx.save(); + ctx.translate(titleX, titleY); + ctx.rotate(rotation); + ctx.textAlign = 'center'; + ctx.textBaseline = 'middle'; + + var text = opts.text; + if (helpers.isArray(text)) { + var y = 0; + for (var i = 0; i < text.length; ++i) { + ctx.fillText(text[i], 0, y, maxWidth); + y += lineHeight; + } + } else { + ctx.fillText(text, 0, 0, maxWidth); + } + + ctx.restore(); + } + } + }); + + function createNewTitleBlockAndAttach(chart, titleOpts) { + var title = new Chart.Title({ + ctx: chart.ctx, + options: titleOpts, + chart: chart + }); + + layout.configure(chart, title, titleOpts); + layout.addBox(chart, title); + chart.titleBlock = title; + } + + return { + id: 'title', + + beforeInit: function(chart) { + var titleOpts = chart.options.title; + + if (titleOpts) { + createNewTitleBlockAndAttach(chart, titleOpts); + } + }, + + beforeUpdate: function(chart) { + var titleOpts = chart.options.title; + var titleBlock = chart.titleBlock; + + if (titleOpts) { + helpers.mergeIf(titleOpts, defaults.global.title); + + if (titleBlock) { + layout.configure(chart, titleBlock, titleOpts); + titleBlock.options = titleOpts; + } else { + createNewTitleBlockAndAttach(chart, titleOpts); + } + } else if (titleBlock) { + Chart.layoutService.removeBox(chart, titleBlock); + delete chart.titleBlock; + } + } + }; +}; + +},{"25":25,"26":26,"45":45}],52:[function(require,module,exports){ +'use strict'; + +module.exports = function(Chart) { + + // Default config for a category scale + var defaultConfig = { + position: 'bottom' + }; + + var DatasetScale = Chart.Scale.extend({ + /** + * Internal function to get the correct labels. If data.xLabels or data.yLabels are defined, use those + * else fall back to data.labels + * @private + */ + getLabels: function() { + var data = this.chart.data; + return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels; + }, + + determineDataLimits: function() { + var me = this; + var labels = me.getLabels(); + me.minIndex = 0; + me.maxIndex = labels.length - 1; + var findIndex; + + if (me.options.ticks.min !== undefined) { + // user specified min value + findIndex = labels.indexOf(me.options.ticks.min); + me.minIndex = findIndex !== -1 ? findIndex : me.minIndex; + } + + if (me.options.ticks.max !== undefined) { + // user specified max value + findIndex = labels.indexOf(me.options.ticks.max); + me.maxIndex = findIndex !== -1 ? findIndex : me.maxIndex; + } + + me.min = labels[me.minIndex]; + me.max = labels[me.maxIndex]; + }, + + buildTicks: function() { + var me = this; + var labels = me.getLabels(); + // If we are viewing some subset of labels, slice the original array + me.ticks = (me.minIndex === 0 && me.maxIndex === labels.length - 1) ? labels : labels.slice(me.minIndex, me.maxIndex + 1); + }, + + getLabelForIndex: function(index, datasetIndex) { + var me = this; + var data = me.chart.data; + var isHorizontal = me.isHorizontal(); + + if (data.yLabels && !isHorizontal) { + return me.getRightValue(data.datasets[datasetIndex].data[index]); + } + return me.ticks[index - me.minIndex]; + }, + + // Used to get data value locations. Value can either be an index or a numerical value + getPixelForValue: function(value, index) { + var me = this; + var offset = me.options.offset; + // 1 is added because we need the length but we have the indexes + var offsetAmt = Math.max((me.maxIndex + 1 - me.minIndex - (offset ? 0 : 1)), 1); + + // If value is a data object, then index is the index in the data array, + // not the index of the scale. We need to change that. + var valueCategory; + if (value !== undefined && value !== null) { + valueCategory = me.isHorizontal() ? value.x : value.y; + } + if (valueCategory !== undefined || (value !== undefined && isNaN(index))) { + var labels = me.getLabels(); + value = valueCategory || value; + var idx = labels.indexOf(value); + index = idx !== -1 ? idx : index; + } + + if (me.isHorizontal()) { + var valueWidth = me.width / offsetAmt; + var widthOffset = (valueWidth * (index - me.minIndex)); + + if (offset) { + widthOffset += (valueWidth / 2); + } + + return me.left + Math.round(widthOffset); + } + var valueHeight = me.height / offsetAmt; + var heightOffset = (valueHeight * (index - me.minIndex)); + + if (offset) { + heightOffset += (valueHeight / 2); + } + + return me.top + Math.round(heightOffset); + }, + getPixelForTick: function(index) { + return this.getPixelForValue(this.ticks[index], index + this.minIndex, null); + }, + getValueForPixel: function(pixel) { + var me = this; + var offset = me.options.offset; + var value; + var offsetAmt = Math.max((me._ticks.length - (offset ? 0 : 1)), 1); + var horz = me.isHorizontal(); + var valueDimension = (horz ? me.width : me.height) / offsetAmt; + + pixel -= horz ? me.left : me.top; + + if (offset) { + pixel -= (valueDimension / 2); + } + + if (pixel <= 0) { + value = 0; + } else { + value = Math.round(pixel / valueDimension); + } + + return value + me.minIndex; + }, + getBasePixel: function() { + return this.bottom; + } + }); + + Chart.scaleService.registerScaleType('category', DatasetScale, defaultConfig); + +}; + +},{}],53:[function(require,module,exports){ +'use strict'; + +var defaults = require(25); +var helpers = require(45); +var Ticks = require(34); + +module.exports = function(Chart) { + + var defaultConfig = { + position: 'left', + ticks: { + callback: Ticks.formatters.linear + } + }; + + var LinearScale = Chart.LinearScaleBase.extend({ + + determineDataLimits: function() { + var me = this; + var opts = me.options; + var chart = me.chart; + var data = chart.data; + var datasets = data.datasets; + var isHorizontal = me.isHorizontal(); + var DEFAULT_MIN = 0; + var DEFAULT_MAX = 1; + + function IDMatches(meta) { + return isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id; + } + + // First Calculate the range + me.min = null; + me.max = null; + + var hasStacks = opts.stacked; + if (hasStacks === undefined) { + helpers.each(datasets, function(dataset, datasetIndex) { + if (hasStacks) { + return; + } + + var meta = chart.getDatasetMeta(datasetIndex); + if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) && + meta.stack !== undefined) { + hasStacks = true; + } + }); + } + + if (opts.stacked || hasStacks) { + var valuesPerStack = {}; + + helpers.each(datasets, function(dataset, datasetIndex) { + var meta = chart.getDatasetMeta(datasetIndex); + var key = [ + meta.type, + // we have a separate stack for stack=undefined datasets when the opts.stacked is undefined + ((opts.stacked === undefined && meta.stack === undefined) ? datasetIndex : ''), + meta.stack + ].join('.'); + + if (valuesPerStack[key] === undefined) { + valuesPerStack[key] = { + positiveValues: [], + negativeValues: [] + }; + } + + // Store these per type + var positiveValues = valuesPerStack[key].positiveValues; + var negativeValues = valuesPerStack[key].negativeValues; + + if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { + helpers.each(dataset.data, function(rawValue, index) { + var value = +me.getRightValue(rawValue); + if (isNaN(value) || meta.data[index].hidden) { + return; + } + + positiveValues[index] = positiveValues[index] || 0; + negativeValues[index] = negativeValues[index] || 0; + + if (opts.relativePoints) { + positiveValues[index] = 100; + } else if (value < 0) { + negativeValues[index] += value; + } else { + positiveValues[index] += value; + } + }); + } + }); + + helpers.each(valuesPerStack, function(valuesForType) { + var values = valuesForType.positiveValues.concat(valuesForType.negativeValues); + var minVal = helpers.min(values); + var maxVal = helpers.max(values); + me.min = me.min === null ? minVal : Math.min(me.min, minVal); + me.max = me.max === null ? maxVal : Math.max(me.max, maxVal); + }); + + } else { + helpers.each(datasets, function(dataset, datasetIndex) { + var meta = chart.getDatasetMeta(datasetIndex); + if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { + helpers.each(dataset.data, function(rawValue, index) { + var value = +me.getRightValue(rawValue); + if (isNaN(value) || meta.data[index].hidden) { + return; + } + + if (me.min === null) { + me.min = value; + } else if (value < me.min) { + me.min = value; + } + + if (me.max === null) { + me.max = value; + } else if (value > me.max) { + me.max = value; + } + }); + } + }); + } + + me.min = isFinite(me.min) && !isNaN(me.min) ? me.min : DEFAULT_MIN; + me.max = isFinite(me.max) && !isNaN(me.max) ? me.max : DEFAULT_MAX; + + // Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero + this.handleTickRangeOptions(); + }, + getTickLimit: function() { + var maxTicks; + var me = this; + var tickOpts = me.options.ticks; + + if (me.isHorizontal()) { + maxTicks = Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(me.width / 50)); + } else { + // The factor of 2 used to scale the font size has been experimentally determined. + var tickFontSize = helpers.valueOrDefault(tickOpts.fontSize, defaults.global.defaultFontSize); + maxTicks = Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(me.height / (2 * tickFontSize))); + } + + return maxTicks; + }, + // Called after the ticks are built. We need + handleDirectionalChanges: function() { + if (!this.isHorizontal()) { + // We are in a vertical orientation. The top value is the highest. So reverse the array + this.ticks.reverse(); + } + }, + getLabelForIndex: function(index, datasetIndex) { + return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]); + }, + // Utils + getPixelForValue: function(value) { + // This must be called after fit has been run so that + // this.left, this.top, this.right, and this.bottom have been defined + var me = this; + var start = me.start; + + var rightValue = +me.getRightValue(value); + var pixel; + var range = me.end - start; + + if (me.isHorizontal()) { + pixel = me.left + (me.width / range * (rightValue - start)); + return Math.round(pixel); + } + + pixel = me.bottom - (me.height / range * (rightValue - start)); + return Math.round(pixel); + }, + getValueForPixel: function(pixel) { + var me = this; + var isHorizontal = me.isHorizontal(); + var innerDimension = isHorizontal ? me.width : me.height; + var offset = (isHorizontal ? pixel - me.left : me.bottom - pixel) / innerDimension; + return me.start + ((me.end - me.start) * offset); + }, + getPixelForTick: function(index) { + return this.getPixelForValue(this.ticksAsNumbers[index]); + } + }); + Chart.scaleService.registerScaleType('linear', LinearScale, defaultConfig); + +}; + +},{"25":25,"34":34,"45":45}],54:[function(require,module,exports){ +'use strict'; + +var helpers = require(45); +var Ticks = require(34); + +module.exports = function(Chart) { + + var noop = helpers.noop; + + Chart.LinearScaleBase = Chart.Scale.extend({ + getRightValue: function(value) { + if (typeof value === 'string') { + return +value; + } + return Chart.Scale.prototype.getRightValue.call(this, value); + }, + + handleTickRangeOptions: function() { + var me = this; + var opts = me.options; + var tickOpts = opts.ticks; + + // If we are forcing it to begin at 0, but 0 will already be rendered on the chart, + // do nothing since that would make the chart weird. If the user really wants a weird chart + // axis, they can manually override it + if (tickOpts.beginAtZero) { + var minSign = helpers.sign(me.min); + var maxSign = helpers.sign(me.max); + + if (minSign < 0 && maxSign < 0) { + // move the top up to 0 + me.max = 0; + } else if (minSign > 0 && maxSign > 0) { + // move the bottom down to 0 + me.min = 0; + } + } + + var setMin = tickOpts.min !== undefined || tickOpts.suggestedMin !== undefined; + var setMax = tickOpts.max !== undefined || tickOpts.suggestedMax !== undefined; + + if (tickOpts.min !== undefined) { + me.min = tickOpts.min; + } else if (tickOpts.suggestedMin !== undefined) { + if (me.min === null) { + me.min = tickOpts.suggestedMin; + } else { + me.min = Math.min(me.min, tickOpts.suggestedMin); + } + } + + if (tickOpts.max !== undefined) { + me.max = tickOpts.max; + } else if (tickOpts.suggestedMax !== undefined) { + if (me.max === null) { + me.max = tickOpts.suggestedMax; + } else { + me.max = Math.max(me.max, tickOpts.suggestedMax); + } + } + + if (setMin !== setMax) { + // We set the min or the max but not both. + // So ensure that our range is good + // Inverted or 0 length range can happen when + // ticks.min is set, and no datasets are visible + if (me.min >= me.max) { + if (setMin) { + me.max = me.min + 1; + } else { + me.min = me.max - 1; + } + } + } + + if (me.min === me.max) { + me.max++; + + if (!tickOpts.beginAtZero) { + me.min--; + } + } + }, + getTickLimit: noop, + handleDirectionalChanges: noop, + + buildTicks: function() { + var me = this; + var opts = me.options; + var tickOpts = opts.ticks; + + // Figure out what the max number of ticks we can support it is based on the size of + // the axis area. For now, we say that the minimum tick spacing in pixels must be 50 + // We also limit the maximum number of ticks to 11 which gives a nice 10 squares on + // the graph. Make sure we always have at least 2 ticks + var maxTicks = me.getTickLimit(); + maxTicks = Math.max(2, maxTicks); + + var numericGeneratorOptions = { + maxTicks: maxTicks, + min: tickOpts.min, + max: tickOpts.max, + stepSize: helpers.valueOrDefault(tickOpts.fixedStepSize, tickOpts.stepSize) + }; + var ticks = me.ticks = Ticks.generators.linear(numericGeneratorOptions, me); + + me.handleDirectionalChanges(); + + // At this point, we need to update our max and min given the tick values since we have expanded the + // range of the scale + me.max = helpers.max(ticks); + me.min = helpers.min(ticks); + + if (tickOpts.reverse) { + ticks.reverse(); + + me.start = me.max; + me.end = me.min; + } else { + me.start = me.min; + me.end = me.max; + } + }, + convertTicksToLabels: function() { + var me = this; + me.ticksAsNumbers = me.ticks.slice(); + me.zeroLineIndex = me.ticks.indexOf(0); + + Chart.Scale.prototype.convertTicksToLabels.call(me); + } + }); +}; + +},{"34":34,"45":45}],55:[function(require,module,exports){ +'use strict'; + +var helpers = require(45); +var Ticks = require(34); + +module.exports = function(Chart) { + + var defaultConfig = { + position: 'left', + + // label settings + ticks: { + callback: Ticks.formatters.logarithmic + } + }; + + var LogarithmicScale = Chart.Scale.extend({ + determineDataLimits: function() { + var me = this; + var opts = me.options; + var tickOpts = opts.ticks; + var chart = me.chart; + var data = chart.data; + var datasets = data.datasets; + var valueOrDefault = helpers.valueOrDefault; + var isHorizontal = me.isHorizontal(); + function IDMatches(meta) { + return isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id; + } + + // Calculate Range + me.min = null; + me.max = null; + me.minNotZero = null; + + var hasStacks = opts.stacked; + if (hasStacks === undefined) { + helpers.each(datasets, function(dataset, datasetIndex) { + if (hasStacks) { + return; + } + + var meta = chart.getDatasetMeta(datasetIndex); + if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) && + meta.stack !== undefined) { + hasStacks = true; + } + }); + } + + if (opts.stacked || hasStacks) { + var valuesPerStack = {}; + + helpers.each(datasets, function(dataset, datasetIndex) { + var meta = chart.getDatasetMeta(datasetIndex); + var key = [ + meta.type, + // we have a separate stack for stack=undefined datasets when the opts.stacked is undefined + ((opts.stacked === undefined && meta.stack === undefined) ? datasetIndex : ''), + meta.stack + ].join('.'); + + if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { + if (valuesPerStack[key] === undefined) { + valuesPerStack[key] = []; + } + + helpers.each(dataset.data, function(rawValue, index) { + var values = valuesPerStack[key]; + var value = +me.getRightValue(rawValue); + if (isNaN(value) || meta.data[index].hidden) { + return; + } + + values[index] = values[index] || 0; + + if (opts.relativePoints) { + values[index] = 100; + } else { + // Don't need to split positive and negative since the log scale can't handle a 0 crossing + values[index] += value; + } + }); + } + }); + + helpers.each(valuesPerStack, function(valuesForType) { + var minVal = helpers.min(valuesForType); + var maxVal = helpers.max(valuesForType); + me.min = me.min === null ? minVal : Math.min(me.min, minVal); + me.max = me.max === null ? maxVal : Math.max(me.max, maxVal); + }); + + } else { + helpers.each(datasets, function(dataset, datasetIndex) { + var meta = chart.getDatasetMeta(datasetIndex); + if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { + helpers.each(dataset.data, function(rawValue, index) { + var value = +me.getRightValue(rawValue); + if (isNaN(value) || meta.data[index].hidden) { + return; + } + + if (me.min === null) { + me.min = value; + } else if (value < me.min) { + me.min = value; + } + + if (me.max === null) { + me.max = value; + } else if (value > me.max) { + me.max = value; + } + + if (value !== 0 && (me.minNotZero === null || value < me.minNotZero)) { + me.minNotZero = value; + } + }); + } + }); + } + + me.min = valueOrDefault(tickOpts.min, me.min); + me.max = valueOrDefault(tickOpts.max, me.max); + + if (me.min === me.max) { + if (me.min !== 0 && me.min !== null) { + me.min = Math.pow(10, Math.floor(helpers.log10(me.min)) - 1); + me.max = Math.pow(10, Math.floor(helpers.log10(me.max)) + 1); + } else { + me.min = 1; + me.max = 10; + } + } + }, + buildTicks: function() { + var me = this; + var opts = me.options; + var tickOpts = opts.ticks; + + var generationOptions = { + min: tickOpts.min, + max: tickOpts.max + }; + var ticks = me.ticks = Ticks.generators.logarithmic(generationOptions, me); + + if (!me.isHorizontal()) { + // We are in a vertical orientation. The top value is the highest. So reverse the array + ticks.reverse(); + } + + // At this point, we need to update our max and min given the tick values since we have expanded the + // range of the scale + me.max = helpers.max(ticks); + me.min = helpers.min(ticks); + + if (tickOpts.reverse) { + ticks.reverse(); + + me.start = me.max; + me.end = me.min; + } else { + me.start = me.min; + me.end = me.max; + } + }, + convertTicksToLabels: function() { + this.tickValues = this.ticks.slice(); + + Chart.Scale.prototype.convertTicksToLabels.call(this); + }, + // Get the correct tooltip label + getLabelForIndex: function(index, datasetIndex) { + return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]); + }, + getPixelForTick: function(index) { + return this.getPixelForValue(this.tickValues[index]); + }, + getPixelForValue: function(value) { + var me = this; + var start = me.start; + var newVal = +me.getRightValue(value); + var opts = me.options; + var tickOpts = opts.ticks; + var innerDimension, pixel, range; + + if (me.isHorizontal()) { + range = helpers.log10(me.end) - helpers.log10(start); // todo: if start === 0 + if (newVal === 0) { + pixel = me.left; + } else { + innerDimension = me.width; + pixel = me.left + (innerDimension / range * (helpers.log10(newVal) - helpers.log10(start))); + } + } else { + // Bottom - top since pixels increase downward on a screen + innerDimension = me.height; + if (start === 0 && !tickOpts.reverse) { + range = helpers.log10(me.end) - helpers.log10(me.minNotZero); + if (newVal === start) { + pixel = me.bottom; + } else if (newVal === me.minNotZero) { + pixel = me.bottom - innerDimension * 0.02; + } else { + pixel = me.bottom - innerDimension * 0.02 - (innerDimension * 0.98 / range * (helpers.log10(newVal) - helpers.log10(me.minNotZero))); + } + } else if (me.end === 0 && tickOpts.reverse) { + range = helpers.log10(me.start) - helpers.log10(me.minNotZero); + if (newVal === me.end) { + pixel = me.top; + } else if (newVal === me.minNotZero) { + pixel = me.top + innerDimension * 0.02; + } else { + pixel = me.top + innerDimension * 0.02 + (innerDimension * 0.98 / range * (helpers.log10(newVal) - helpers.log10(me.minNotZero))); + } + } else if (newVal === 0) { + pixel = tickOpts.reverse ? me.top : me.bottom; + } else { + range = helpers.log10(me.end) - helpers.log10(start); + innerDimension = me.height; + pixel = me.bottom - (innerDimension / range * (helpers.log10(newVal) - helpers.log10(start))); + } + } + return pixel; + }, + getValueForPixel: function(pixel) { + var me = this; + var range = helpers.log10(me.end) - helpers.log10(me.start); + var value, innerDimension; + + if (me.isHorizontal()) { + innerDimension = me.width; + value = me.start * Math.pow(10, (pixel - me.left) * range / innerDimension); + } else { // todo: if start === 0 + innerDimension = me.height; + value = Math.pow(10, (me.bottom - pixel) * range / innerDimension) / me.start; + } + return value; + } + }); + Chart.scaleService.registerScaleType('logarithmic', LogarithmicScale, defaultConfig); + +}; + +},{"34":34,"45":45}],56:[function(require,module,exports){ +'use strict'; + +var defaults = require(25); +var helpers = require(45); +var Ticks = require(34); + +module.exports = function(Chart) { + + var globalDefaults = defaults.global; + + var defaultConfig = { + display: true, + + // Boolean - Whether to animate scaling the chart from the centre + animate: true, + position: 'chartArea', + + angleLines: { + display: true, + color: 'rgba(0, 0, 0, 0.1)', + lineWidth: 1 + }, + + gridLines: { + circular: false + }, + + // label settings + ticks: { + // Boolean - Show a backdrop to the scale label + showLabelBackdrop: true, + + // String - The colour of the label backdrop + backdropColor: 'rgba(255,255,255,0.75)', + + // Number - The backdrop padding above & below the label in pixels + backdropPaddingY: 2, + + // Number - The backdrop padding to the side of the label in pixels + backdropPaddingX: 2, + + callback: Ticks.formatters.linear + }, + + pointLabels: { + // Boolean - if true, show point labels + display: true, + + // Number - Point label font size in pixels + fontSize: 10, + + // Function - Used to convert point labels + callback: function(label) { + return label; + } + } + }; + + function getValueCount(scale) { + var opts = scale.options; + return opts.angleLines.display || opts.pointLabels.display ? scale.chart.data.labels.length : 0; + } + + function getPointLabelFontOptions(scale) { + var pointLabelOptions = scale.options.pointLabels; + var fontSize = helpers.valueOrDefault(pointLabelOptions.fontSize, globalDefaults.defaultFontSize); + var fontStyle = helpers.valueOrDefault(pointLabelOptions.fontStyle, globalDefaults.defaultFontStyle); + var fontFamily = helpers.valueOrDefault(pointLabelOptions.fontFamily, globalDefaults.defaultFontFamily); + var font = helpers.fontString(fontSize, fontStyle, fontFamily); + + return { + size: fontSize, + style: fontStyle, + family: fontFamily, + font: font + }; + } + + function measureLabelSize(ctx, fontSize, label) { + if (helpers.isArray(label)) { + return { + w: helpers.longestText(ctx, ctx.font, label), + h: (label.length * fontSize) + ((label.length - 1) * 1.5 * fontSize) + }; + } + + return { + w: ctx.measureText(label).width, + h: fontSize + }; + } + + function determineLimits(angle, pos, size, min, max) { + if (angle === min || angle === max) { + return { + start: pos - (size / 2), + end: pos + (size / 2) + }; + } else if (angle < min || angle > max) { + return { + start: pos - size - 5, + end: pos + }; + } + + return { + start: pos, + end: pos + size + 5 + }; + } + + /** + * Helper function to fit a radial linear scale with point labels + */ + function fitWithPointLabels(scale) { + /* + * Right, this is really confusing and there is a lot of maths going on here + * The gist of the problem is here: https://gist.github.com/nnnick/696cc9c55f4b0beb8fe9 + * + * Reaction: https://dl.dropboxusercontent.com/u/34601363/toomuchscience.gif + * + * Solution: + * + * We assume the radius of the polygon is half the size of the canvas at first + * at each index we check if the text overlaps. + * + * Where it does, we store that angle and that index. + * + * After finding the largest index and angle we calculate how much we need to remove + * from the shape radius to move the point inwards by that x. + * + * We average the left and right distances to get the maximum shape radius that can fit in the box + * along with labels. + * + * Once we have that, we can find the centre point for the chart, by taking the x text protrusion + * on each side, removing that from the size, halving it and adding the left x protrusion width. + * + * This will mean we have a shape fitted to the canvas, as large as it can be with the labels + * and position it in the most space efficient manner + * + * https://dl.dropboxusercontent.com/u/34601363/yeahscience.gif + */ + + var plFont = getPointLabelFontOptions(scale); + + // Get maximum radius of the polygon. Either half the height (minus the text width) or half the width. + // Use this to calculate the offset + change. - Make sure L/R protrusion is at least 0 to stop issues with centre points + var largestPossibleRadius = Math.min(scale.height / 2, scale.width / 2); + var furthestLimits = { + r: scale.width, + l: 0, + t: scale.height, + b: 0 + }; + var furthestAngles = {}; + var i, textSize, pointPosition; + + scale.ctx.font = plFont.font; + scale._pointLabelSizes = []; + + var valueCount = getValueCount(scale); + for (i = 0; i < valueCount; i++) { + pointPosition = scale.getPointPosition(i, largestPossibleRadius); + textSize = measureLabelSize(scale.ctx, plFont.size, scale.pointLabels[i] || ''); + scale._pointLabelSizes[i] = textSize; + + // Add quarter circle to make degree 0 mean top of circle + var angleRadians = scale.getIndexAngle(i); + var angle = helpers.toDegrees(angleRadians) % 360; + var hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180); + var vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270); + + if (hLimits.start < furthestLimits.l) { + furthestLimits.l = hLimits.start; + furthestAngles.l = angleRadians; + } + + if (hLimits.end > furthestLimits.r) { + furthestLimits.r = hLimits.end; + furthestAngles.r = angleRadians; + } + + if (vLimits.start < furthestLimits.t) { + furthestLimits.t = vLimits.start; + furthestAngles.t = angleRadians; + } + + if (vLimits.end > furthestLimits.b) { + furthestLimits.b = vLimits.end; + furthestAngles.b = angleRadians; + } + } + + scale.setReductions(largestPossibleRadius, furthestLimits, furthestAngles); + } + + /** + * Helper function to fit a radial linear scale with no point labels + */ + function fit(scale) { + var largestPossibleRadius = Math.min(scale.height / 2, scale.width / 2); + scale.drawingArea = Math.round(largestPossibleRadius); + scale.setCenterPoint(0, 0, 0, 0); + } + + function getTextAlignForAngle(angle) { + if (angle === 0 || angle === 180) { + return 'center'; + } else if (angle < 180) { + return 'left'; + } + + return 'right'; + } + + function fillText(ctx, text, position, fontSize) { + if (helpers.isArray(text)) { + var y = position.y; + var spacing = 1.5 * fontSize; + + for (var i = 0; i < text.length; ++i) { + ctx.fillText(text[i], position.x, y); + y += spacing; + } + } else { + ctx.fillText(text, position.x, position.y); + } + } + + function adjustPointPositionForLabelHeight(angle, textSize, position) { + if (angle === 90 || angle === 270) { + position.y -= (textSize.h / 2); + } else if (angle > 270 || angle < 90) { + position.y -= textSize.h; + } + } + + function drawPointLabels(scale) { + var ctx = scale.ctx; + var valueOrDefault = helpers.valueOrDefault; + var opts = scale.options; + var angleLineOpts = opts.angleLines; + var pointLabelOpts = opts.pointLabels; + + ctx.lineWidth = angleLineOpts.lineWidth; + ctx.strokeStyle = angleLineOpts.color; + + var outerDistance = scale.getDistanceFromCenterForValue(opts.ticks.reverse ? scale.min : scale.max); + + // Point Label Font + var plFont = getPointLabelFontOptions(scale); + + ctx.textBaseline = 'top'; + + for (var i = getValueCount(scale) - 1; i >= 0; i--) { + if (angleLineOpts.display) { + var outerPosition = scale.getPointPosition(i, outerDistance); + ctx.beginPath(); + ctx.moveTo(scale.xCenter, scale.yCenter); + ctx.lineTo(outerPosition.x, outerPosition.y); + ctx.stroke(); + ctx.closePath(); + } + + if (pointLabelOpts.display) { + // Extra 3px out for some label spacing + var pointLabelPosition = scale.getPointPosition(i, outerDistance + 5); + + // Keep this in loop since we may support array properties here + var pointLabelFontColor = valueOrDefault(pointLabelOpts.fontColor, globalDefaults.defaultFontColor); + ctx.font = plFont.font; + ctx.fillStyle = pointLabelFontColor; + + var angleRadians = scale.getIndexAngle(i); + var angle = helpers.toDegrees(angleRadians); + ctx.textAlign = getTextAlignForAngle(angle); + adjustPointPositionForLabelHeight(angle, scale._pointLabelSizes[i], pointLabelPosition); + fillText(ctx, scale.pointLabels[i] || '', pointLabelPosition, plFont.size); + } + } + } + + function drawRadiusLine(scale, gridLineOpts, radius, index) { + var ctx = scale.ctx; + ctx.strokeStyle = helpers.valueAtIndexOrDefault(gridLineOpts.color, index - 1); + ctx.lineWidth = helpers.valueAtIndexOrDefault(gridLineOpts.lineWidth, index - 1); + + if (scale.options.gridLines.circular) { + // Draw circular arcs between the points + ctx.beginPath(); + ctx.arc(scale.xCenter, scale.yCenter, radius, 0, Math.PI * 2); + ctx.closePath(); + ctx.stroke(); + } else { + // Draw straight lines connecting each index + var valueCount = getValueCount(scale); + + if (valueCount === 0) { + return; + } + + ctx.beginPath(); + var pointPosition = scale.getPointPosition(0, radius); + ctx.moveTo(pointPosition.x, pointPosition.y); + + for (var i = 1; i < valueCount; i++) { + pointPosition = scale.getPointPosition(i, radius); + ctx.lineTo(pointPosition.x, pointPosition.y); + } + + ctx.closePath(); + ctx.stroke(); + } + } + + function numberOrZero(param) { + return helpers.isNumber(param) ? param : 0; + } + + var LinearRadialScale = Chart.LinearScaleBase.extend({ + setDimensions: function() { + var me = this; + var opts = me.options; + var tickOpts = opts.ticks; + // Set the unconstrained dimension before label rotation + me.width = me.maxWidth; + me.height = me.maxHeight; + me.xCenter = Math.round(me.width / 2); + me.yCenter = Math.round(me.height / 2); + + var minSize = helpers.min([me.height, me.width]); + var tickFontSize = helpers.valueOrDefault(tickOpts.fontSize, globalDefaults.defaultFontSize); + me.drawingArea = opts.display ? (minSize / 2) - (tickFontSize / 2 + tickOpts.backdropPaddingY) : (minSize / 2); + }, + determineDataLimits: function() { + var me = this; + var chart = me.chart; + var min = Number.POSITIVE_INFINITY; + var max = Number.NEGATIVE_INFINITY; + + helpers.each(chart.data.datasets, function(dataset, datasetIndex) { + if (chart.isDatasetVisible(datasetIndex)) { + var meta = chart.getDatasetMeta(datasetIndex); + + helpers.each(dataset.data, function(rawValue, index) { + var value = +me.getRightValue(rawValue); + if (isNaN(value) || meta.data[index].hidden) { + return; + } + + min = Math.min(value, min); + max = Math.max(value, max); + }); + } + }); + + me.min = (min === Number.POSITIVE_INFINITY ? 0 : min); + me.max = (max === Number.NEGATIVE_INFINITY ? 0 : max); + + // Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero + me.handleTickRangeOptions(); + }, + getTickLimit: function() { + var tickOpts = this.options.ticks; + var tickFontSize = helpers.valueOrDefault(tickOpts.fontSize, globalDefaults.defaultFontSize); + return Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(this.drawingArea / (1.5 * tickFontSize))); + }, + convertTicksToLabels: function() { + var me = this; + + Chart.LinearScaleBase.prototype.convertTicksToLabels.call(me); + + // Point labels + me.pointLabels = me.chart.data.labels.map(me.options.pointLabels.callback, me); + }, + getLabelForIndex: function(index, datasetIndex) { + return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]); + }, + fit: function() { + if (this.options.pointLabels.display) { + fitWithPointLabels(this); + } else { + fit(this); + } + }, + /** + * Set radius reductions and determine new radius and center point + * @private + */ + setReductions: function(largestPossibleRadius, furthestLimits, furthestAngles) { + var me = this; + var radiusReductionLeft = furthestLimits.l / Math.sin(furthestAngles.l); + var radiusReductionRight = Math.max(furthestLimits.r - me.width, 0) / Math.sin(furthestAngles.r); + var radiusReductionTop = -furthestLimits.t / Math.cos(furthestAngles.t); + var radiusReductionBottom = -Math.max(furthestLimits.b - me.height, 0) / Math.cos(furthestAngles.b); + + radiusReductionLeft = numberOrZero(radiusReductionLeft); + radiusReductionRight = numberOrZero(radiusReductionRight); + radiusReductionTop = numberOrZero(radiusReductionTop); + radiusReductionBottom = numberOrZero(radiusReductionBottom); + + me.drawingArea = Math.min( + Math.round(largestPossibleRadius - (radiusReductionLeft + radiusReductionRight) / 2), + Math.round(largestPossibleRadius - (radiusReductionTop + radiusReductionBottom) / 2)); + me.setCenterPoint(radiusReductionLeft, radiusReductionRight, radiusReductionTop, radiusReductionBottom); + }, + setCenterPoint: function(leftMovement, rightMovement, topMovement, bottomMovement) { + var me = this; + var maxRight = me.width - rightMovement - me.drawingArea; + var maxLeft = leftMovement + me.drawingArea; + var maxTop = topMovement + me.drawingArea; + var maxBottom = me.height - bottomMovement - me.drawingArea; + + me.xCenter = Math.round(((maxLeft + maxRight) / 2) + me.left); + me.yCenter = Math.round(((maxTop + maxBottom) / 2) + me.top); + }, + + getIndexAngle: function(index) { + var angleMultiplier = (Math.PI * 2) / getValueCount(this); + var startAngle = this.chart.options && this.chart.options.startAngle ? + this.chart.options.startAngle : + 0; + + var startAngleRadians = startAngle * Math.PI * 2 / 360; + + // Start from the top instead of right, so remove a quarter of the circle + return index * angleMultiplier + startAngleRadians; + }, + getDistanceFromCenterForValue: function(value) { + var me = this; + + if (value === null) { + return 0; // null always in center + } + + // Take into account half font size + the yPadding of the top value + var scalingFactor = me.drawingArea / (me.max - me.min); + if (me.options.ticks.reverse) { + return (me.max - value) * scalingFactor; + } + return (value - me.min) * scalingFactor; + }, + getPointPosition: function(index, distanceFromCenter) { + var me = this; + var thisAngle = me.getIndexAngle(index) - (Math.PI / 2); + return { + x: Math.round(Math.cos(thisAngle) * distanceFromCenter) + me.xCenter, + y: Math.round(Math.sin(thisAngle) * distanceFromCenter) + me.yCenter + }; + }, + getPointPositionForValue: function(index, value) { + return this.getPointPosition(index, this.getDistanceFromCenterForValue(value)); + }, + + getBasePosition: function() { + var me = this; + var min = me.min; + var max = me.max; + + return me.getPointPositionForValue(0, + me.beginAtZero ? 0 : + min < 0 && max < 0 ? max : + min > 0 && max > 0 ? min : + 0); + }, + + draw: function() { + var me = this; + var opts = me.options; + var gridLineOpts = opts.gridLines; + var tickOpts = opts.ticks; + var valueOrDefault = helpers.valueOrDefault; + + if (opts.display) { + var ctx = me.ctx; + var startAngle = this.getIndexAngle(0); + + // Tick Font + var tickFontSize = valueOrDefault(tickOpts.fontSize, globalDefaults.defaultFontSize); + var tickFontStyle = valueOrDefault(tickOpts.fontStyle, globalDefaults.defaultFontStyle); + var tickFontFamily = valueOrDefault(tickOpts.fontFamily, globalDefaults.defaultFontFamily); + var tickLabelFont = helpers.fontString(tickFontSize, tickFontStyle, tickFontFamily); + + helpers.each(me.ticks, function(label, index) { + // Don't draw a centre value (if it is minimum) + if (index > 0 || tickOpts.reverse) { + var yCenterOffset = me.getDistanceFromCenterForValue(me.ticksAsNumbers[index]); + + // Draw circular lines around the scale + if (gridLineOpts.display && index !== 0) { + drawRadiusLine(me, gridLineOpts, yCenterOffset, index); + } + + if (tickOpts.display) { + var tickFontColor = valueOrDefault(tickOpts.fontColor, globalDefaults.defaultFontColor); + ctx.font = tickLabelFont; + + ctx.save(); + ctx.translate(me.xCenter, me.yCenter); + ctx.rotate(startAngle); + + if (tickOpts.showLabelBackdrop) { + var labelWidth = ctx.measureText(label).width; + ctx.fillStyle = tickOpts.backdropColor; + ctx.fillRect( + -labelWidth / 2 - tickOpts.backdropPaddingX, + -yCenterOffset - tickFontSize / 2 - tickOpts.backdropPaddingY, + labelWidth + tickOpts.backdropPaddingX * 2, + tickFontSize + tickOpts.backdropPaddingY * 2 + ); + } + + ctx.textAlign = 'center'; + ctx.textBaseline = 'middle'; + ctx.fillStyle = tickFontColor; + ctx.fillText(label, 0, -yCenterOffset); + ctx.restore(); + } + } + }); + + if (opts.angleLines.display || opts.pointLabels.display) { + drawPointLabels(me); + } + } + } + }); + Chart.scaleService.registerScaleType('radialLinear', LinearRadialScale, defaultConfig); + +}; + +},{"25":25,"34":34,"45":45}],57:[function(require,module,exports){ +/* global window: false */ +'use strict'; + +var moment = require(1); +moment = typeof moment === 'function' ? moment : window.moment; + +var defaults = require(25); +var helpers = require(45); + +// Integer constants are from the ES6 spec. +var MIN_INTEGER = Number.MIN_SAFE_INTEGER || -9007199254740991; +var MAX_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991; + +var INTERVALS = { + millisecond: { + common: true, + size: 1, + steps: [1, 2, 5, 10, 20, 50, 100, 250, 500] + }, + second: { + common: true, + size: 1000, + steps: [1, 2, 5, 10, 30] + }, + minute: { + common: true, + size: 60000, + steps: [1, 2, 5, 10, 30] + }, + hour: { + common: true, + size: 3600000, + steps: [1, 2, 3, 6, 12] + }, + day: { + common: true, + size: 86400000, + steps: [1, 2, 5] + }, + week: { + common: false, + size: 604800000, + steps: [1, 2, 3, 4] + }, + month: { + common: true, + size: 2.628e9, + steps: [1, 2, 3] + }, + quarter: { + common: false, + size: 7.884e9, + steps: [1, 2, 3, 4] + }, + year: { + common: true, + size: 3.154e10 + } +}; + +var UNITS = Object.keys(INTERVALS); + +function sorter(a, b) { + return a - b; +} + +function arrayUnique(items) { + var hash = {}; + var out = []; + var i, ilen, item; + + for (i = 0, ilen = items.length; i < ilen; ++i) { + item = items[i]; + if (!hash[item]) { + hash[item] = true; + out.push(item); + } + } + + return out; +} + +/** + * Returns an array of {time, pos} objects used to interpolate a specific `time` or position + * (`pos`) on the scale, by searching entries before and after the requested value. `pos` is + * a decimal between 0 and 1: 0 being the start of the scale (left or top) and 1 the other + * extremity (left + width or top + height). Note that it would be more optimized to directly + * store pre-computed pixels, but the scale dimensions are not guaranteed at the time we need + * to create the lookup table. The table ALWAYS contains at least two items: min and max. + * + * @param {Number[]} timestamps - timestamps sorted from lowest to highest. + * @param {String} distribution - If 'linear', timestamps will be spread linearly along the min + * and max range, so basically, the table will contains only two items: {min, 0} and {max, 1}. + * If 'series', timestamps will be positioned at the same distance from each other. In this + * case, only timestamps that break the time linearity are registered, meaning that in the + * best case, all timestamps are linear, the table contains only min and max. + */ +function buildLookupTable(timestamps, min, max, distribution) { + if (distribution === 'linear' || !timestamps.length) { + return [ + {time: min, pos: 0}, + {time: max, pos: 1} + ]; + } + + var table = []; + var items = [min]; + var i, ilen, prev, curr, next; + + for (i = 0, ilen = timestamps.length; i < ilen; ++i) { + curr = timestamps[i]; + if (curr > min && curr < max) { + items.push(curr); + } + } + + items.push(max); + + for (i = 0, ilen = items.length; i < ilen; ++i) { + next = items[i + 1]; + prev = items[i - 1]; + curr = items[i]; + + // only add points that breaks the scale linearity + if (prev === undefined || next === undefined || Math.round((next + prev) / 2) !== curr) { + table.push({time: curr, pos: i / (ilen - 1)}); + } + } + + return table; +} + +// @see adapted from http://www.anujgakhar.com/2014/03/01/binary-search-in-javascript/ +function lookup(table, key, value) { + var lo = 0; + var hi = table.length - 1; + var mid, i0, i1; + + while (lo >= 0 && lo <= hi) { + mid = (lo + hi) >> 1; + i0 = table[mid - 1] || null; + i1 = table[mid]; + + if (!i0) { + // given value is outside table (before first item) + return {lo: null, hi: i1}; + } else if (i1[key] < value) { + lo = mid + 1; + } else if (i0[key] > value) { + hi = mid - 1; + } else { + return {lo: i0, hi: i1}; + } + } + + // given value is outside table (after last item) + return {lo: i1, hi: null}; +} + +/** + * Linearly interpolates the given source `value` using the table items `skey` values and + * returns the associated `tkey` value. For example, interpolate(table, 'time', 42, 'pos') + * returns the position for a timestamp equal to 42. If value is out of bounds, values at + * index [0, 1] or [n - 1, n] are used for the interpolation. + */ +function interpolate(table, skey, sval, tkey) { + var range = lookup(table, skey, sval); + + // Note: the lookup table ALWAYS contains at least 2 items (min and max) + var prev = !range.lo ? table[0] : !range.hi ? table[table.length - 2] : range.lo; + var next = !range.lo ? table[1] : !range.hi ? table[table.length - 1] : range.hi; + + var span = next[skey] - prev[skey]; + var ratio = span ? (sval - prev[skey]) / span : 0; + var offset = (next[tkey] - prev[tkey]) * ratio; + + return prev[tkey] + offset; +} + +/** + * Convert the given value to a moment object using the given time options. + * @see http://momentjs.com/docs/#/parsing/ + */ +function momentify(value, options) { + var parser = options.parser; + var format = options.parser || options.format; + + if (typeof parser === 'function') { + return parser(value); + } + + if (typeof value === 'string' && typeof format === 'string') { + return moment(value, format); + } + + if (!(value instanceof moment)) { + value = moment(value); + } + + if (value.isValid()) { + return value; + } + + // Labels are in an incompatible moment format and no `parser` has been provided. + // The user might still use the deprecated `format` option to convert his inputs. + if (typeof format === 'function') { + return format(value); + } + + return value; +} + +function parse(input, scale) { + if (helpers.isNullOrUndef(input)) { + return null; + } + + var options = scale.options.time; + var value = momentify(scale.getRightValue(input), options); + if (!value.isValid()) { + return null; + } + + if (options.round) { + value.startOf(options.round); + } + + return value.valueOf(); +} + +/** + * Returns the number of unit to skip to be able to display up to `capacity` number of ticks + * in `unit` for the given `min` / `max` range and respecting the interval steps constraints. + */ +function determineStepSize(min, max, unit, capacity) { + var range = max - min; + var interval = INTERVALS[unit]; + var milliseconds = interval.size; + var steps = interval.steps; + var i, ilen, factor; + + if (!steps) { + return Math.ceil(range / ((capacity || 1) * milliseconds)); + } + + for (i = 0, ilen = steps.length; i < ilen; ++i) { + factor = steps[i]; + if (Math.ceil(range / (milliseconds * factor)) <= capacity) { + break; + } + } + + return factor; +} + +/** + * Figures out what unit results in an appropriate number of auto-generated ticks + */ +function determineUnitForAutoTicks(minUnit, min, max, capacity) { + var ilen = UNITS.length; + var i, interval, factor; + + for (i = UNITS.indexOf(minUnit); i < ilen - 1; ++i) { + interval = INTERVALS[UNITS[i]]; + factor = interval.steps ? interval.steps[interval.steps.length - 1] : MAX_INTEGER; + + if (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) { + return UNITS[i]; + } + } + + return UNITS[ilen - 1]; +} + +/** + * Figures out what unit to format a set of ticks with + */ +function determineUnitForFormatting(ticks, minUnit, min, max) { + var duration = moment.duration(moment(max).diff(moment(min))); + var ilen = UNITS.length; + var i, unit; + + for (i = ilen - 1; i >= UNITS.indexOf(minUnit); i--) { + unit = UNITS[i]; + if (INTERVALS[unit].common && duration.as(unit) >= ticks.length) { + return unit; + } + } + + return UNITS[minUnit ? UNITS.indexOf(minUnit) : 0]; +} + +function determineMajorUnit(unit) { + for (var i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i) { + if (INTERVALS[UNITS[i]].common) { + return UNITS[i]; + } + } +} + +/** + * Generates a maximum of `capacity` timestamps between min and max, rounded to the + * `minor` unit, aligned on the `major` unit and using the given scale time `options`. + * Important: this method can return ticks outside the min and max range, it's the + * responsibility of the calling code to clamp values if needed. + */ +function generate(min, max, capacity, options) { + var timeOpts = options.time; + var minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, capacity); + var major = determineMajorUnit(minor); + var stepSize = helpers.valueOrDefault(timeOpts.stepSize, timeOpts.unitStepSize); + var weekday = minor === 'week' ? timeOpts.isoWeekday : false; + var majorTicksEnabled = options.ticks.major.enabled; + var interval = INTERVALS[minor]; + var first = moment(min); + var last = moment(max); + var ticks = []; + var time; + + if (!stepSize) { + stepSize = determineStepSize(min, max, minor, capacity); + } + + // For 'week' unit, handle the first day of week option + if (weekday) { + first = first.isoWeekday(weekday); + last = last.isoWeekday(weekday); + } + + // Align first/last ticks on unit + first = first.startOf(weekday ? 'day' : minor); + last = last.startOf(weekday ? 'day' : minor); + + // Make sure that the last tick include max + if (last < max) { + last.add(1, minor); + } + + time = moment(first); + + if (majorTicksEnabled && major && !weekday && !timeOpts.round) { + // Align the first tick on the previous `minor` unit aligned on the `major` unit: + // we first aligned time on the previous `major` unit then add the number of full + // stepSize there is between first and the previous major time. + time.startOf(major); + time.add(~~((first - time) / (interval.size * stepSize)) * stepSize, minor); + } + + for (; time < last; time.add(stepSize, minor)) { + ticks.push(+time); + } + + ticks.push(+time); + + return ticks; +} + +/** + * Returns the right and left offsets from edges in the form of {left, right}. + * Offsets are added when the `offset` option is true. + */ +function computeOffsets(table, ticks, min, max, options) { + var left = 0; + var right = 0; + var upper, lower; + + if (options.offset && ticks.length) { + if (!options.time.min) { + upper = ticks.length > 1 ? ticks[1] : max; + lower = ticks[0]; + left = ( + interpolate(table, 'time', upper, 'pos') - + interpolate(table, 'time', lower, 'pos') + ) / 2; + } + if (!options.time.max) { + upper = ticks[ticks.length - 1]; + lower = ticks.length > 1 ? ticks[ticks.length - 2] : min; + right = ( + interpolate(table, 'time', upper, 'pos') - + interpolate(table, 'time', lower, 'pos') + ) / 2; + } + } + + return {left: left, right: right}; +} + +function ticksFromTimestamps(values, majorUnit) { + var ticks = []; + var i, ilen, value, major; + + for (i = 0, ilen = values.length; i < ilen; ++i) { + value = values[i]; + major = majorUnit ? value === +moment(value).startOf(majorUnit) : false; + + ticks.push({ + value: value, + major: major + }); + } + + return ticks; +} + +module.exports = function(Chart) { + + var defaultConfig = { + position: 'bottom', + + /** + * Data distribution along the scale: + * - 'linear': data are spread according to their time (distances can vary), + * - 'series': data are spread at the same distance from each other. + * @see https://github.com/chartjs/Chart.js/pull/4507 + * @since 2.7.0 + */ + distribution: 'linear', + + /** + * Scale boundary strategy (bypassed by min/max time options) + * - `data`: make sure data are fully visible, ticks outside are removed + * - `ticks`: make sure ticks are fully visible, data outside are truncated + * @see https://github.com/chartjs/Chart.js/pull/4556 + * @since 2.7.0 + */ + bounds: 'data', + + time: { + parser: false, // false == a pattern string from http://momentjs.com/docs/#/parsing/string-format/ or a custom callback that converts its argument to a moment + format: false, // DEPRECATED false == date objects, moment object, callback or a pattern string from http://momentjs.com/docs/#/parsing/string-format/ + unit: false, // false == automatic or override with week, month, year, etc. + round: false, // none, or override with week, month, year, etc. + displayFormat: false, // DEPRECATED + isoWeekday: false, // override week start day - see http://momentjs.com/docs/#/get-set/iso-weekday/ + minUnit: 'millisecond', + + // defaults to unit's corresponding unitFormat below or override using pattern string from http://momentjs.com/docs/#/displaying/format/ + displayFormats: { + millisecond: 'h:mm:ss.SSS a', // 11:20:01.123 AM, + second: 'h:mm:ss a', // 11:20:01 AM + minute: 'h:mm a', // 11:20 AM + hour: 'hA', // 5PM + day: 'MMM D', // Sep 4 + week: 'll', // Week 46, or maybe "[W]WW - YYYY" ? + month: 'MMM YYYY', // Sept 2015 + quarter: '[Q]Q - YYYY', // Q3 + year: 'YYYY' // 2015 + }, + }, + ticks: { + autoSkip: false, + + /** + * Ticks generation input values: + * - 'auto': generates "optimal" ticks based on scale size and time options. + * - 'data': generates ticks from data (including labels from data {t|x|y} objects). + * - 'labels': generates ticks from user given `data.labels` values ONLY. + * @see https://github.com/chartjs/Chart.js/pull/4507 + * @since 2.7.0 + */ + source: 'auto', + + major: { + enabled: false + } + } + }; + + var TimeScale = Chart.Scale.extend({ + initialize: function() { + if (!moment) { + throw new Error('Chart.js - Moment.js could not be found! You must include it before Chart.js to use the time scale. Download at https://momentjs.com'); + } + + this.mergeTicksOptions(); + + Chart.Scale.prototype.initialize.call(this); + }, + + update: function() { + var me = this; + var options = me.options; + + // DEPRECATIONS: output a message only one time per update + if (options.time && options.time.format) { + console.warn('options.time.format is deprecated and replaced by options.time.parser.'); + } + + return Chart.Scale.prototype.update.apply(me, arguments); + }, + + /** + * Allows data to be referenced via 't' attribute + */ + getRightValue: function(rawValue) { + if (rawValue && rawValue.t !== undefined) { + rawValue = rawValue.t; + } + return Chart.Scale.prototype.getRightValue.call(this, rawValue); + }, + + determineDataLimits: function() { + var me = this; + var chart = me.chart; + var timeOpts = me.options.time; + var min = MAX_INTEGER; + var max = MIN_INTEGER; + var timestamps = []; + var datasets = []; + var labels = []; + var i, j, ilen, jlen, data, timestamp; + + // Convert labels to timestamps + for (i = 0, ilen = chart.data.labels.length; i < ilen; ++i) { + labels.push(parse(chart.data.labels[i], me)); + } + + // Convert data to timestamps + for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) { + if (chart.isDatasetVisible(i)) { + data = chart.data.datasets[i].data; + + // Let's consider that all data have the same format. + if (helpers.isObject(data[0])) { + datasets[i] = []; + + for (j = 0, jlen = data.length; j < jlen; ++j) { + timestamp = parse(data[j], me); + timestamps.push(timestamp); + datasets[i][j] = timestamp; + } + } else { + timestamps.push.apply(timestamps, labels); + datasets[i] = labels.slice(0); + } + } else { + datasets[i] = []; + } + } + + if (labels.length) { + // Sort labels **after** data have been converted + labels = arrayUnique(labels).sort(sorter); + min = Math.min(min, labels[0]); + max = Math.max(max, labels[labels.length - 1]); + } + + if (timestamps.length) { + timestamps = arrayUnique(timestamps).sort(sorter); + min = Math.min(min, timestamps[0]); + max = Math.max(max, timestamps[timestamps.length - 1]); + } + + min = parse(timeOpts.min, me) || min; + max = parse(timeOpts.max, me) || max; + + // In case there is no valid min/max, let's use today limits + min = min === MAX_INTEGER ? +moment().startOf('day') : min; + max = max === MIN_INTEGER ? +moment().endOf('day') + 1 : max; + + // Make sure that max is strictly higher than min (required by the lookup table) + me.min = Math.min(min, max); + me.max = Math.max(min + 1, max); + + // PRIVATE + me._horizontal = me.isHorizontal(); + me._table = []; + me._timestamps = { + data: timestamps, + datasets: datasets, + labels: labels + }; + }, + + buildTicks: function() { + var me = this; + var min = me.min; + var max = me.max; + var options = me.options; + var timeOpts = options.time; + var timestamps = []; + var ticks = []; + var i, ilen, timestamp; + + switch (options.ticks.source) { + case 'data': + timestamps = me._timestamps.data; + break; + case 'labels': + timestamps = me._timestamps.labels; + break; + case 'auto': + default: + timestamps = generate(min, max, me.getLabelCapacity(min), options); + } + + if (options.bounds === 'ticks' && timestamps.length) { + min = timestamps[0]; + max = timestamps[timestamps.length - 1]; + } + + // Enforce limits with user min/max options + min = parse(timeOpts.min, me) || min; + max = parse(timeOpts.max, me) || max; + + // Remove ticks outside the min/max range + for (i = 0, ilen = timestamps.length; i < ilen; ++i) { + timestamp = timestamps[i]; + if (timestamp >= min && timestamp <= max) { + ticks.push(timestamp); + } + } + + me.min = min; + me.max = max; + + // PRIVATE + me._unit = timeOpts.unit || determineUnitForFormatting(ticks, timeOpts.minUnit, me.min, me.max); + me._majorUnit = determineMajorUnit(me._unit); + me._table = buildLookupTable(me._timestamps.data, min, max, options.distribution); + me._offsets = computeOffsets(me._table, ticks, min, max, options); + + return ticksFromTimestamps(ticks, me._majorUnit); + }, + + getLabelForIndex: function(index, datasetIndex) { + var me = this; + var data = me.chart.data; + var timeOpts = me.options.time; + var label = data.labels && index < data.labels.length ? data.labels[index] : ''; + var value = data.datasets[datasetIndex].data[index]; + + if (helpers.isObject(value)) { + label = me.getRightValue(value); + } + if (timeOpts.tooltipFormat) { + label = momentify(label, timeOpts).format(timeOpts.tooltipFormat); + } + + return label; + }, + + /** + * Function to format an individual tick mark + * @private + */ + tickFormatFunction: function(tick, index, ticks, formatOverride) { + var me = this; + var options = me.options; + var time = tick.valueOf(); + var formats = options.time.displayFormats; + var minorFormat = formats[me._unit]; + var majorUnit = me._majorUnit; + var majorFormat = formats[majorUnit]; + var majorTime = tick.clone().startOf(majorUnit).valueOf(); + var majorTickOpts = options.ticks.major; + var major = majorTickOpts.enabled && majorUnit && majorFormat && time === majorTime; + var label = tick.format(formatOverride ? formatOverride : major ? majorFormat : minorFormat); + var tickOpts = major ? majorTickOpts : options.ticks.minor; + var formatter = helpers.valueOrDefault(tickOpts.callback, tickOpts.userCallback); + + return formatter ? formatter(label, index, ticks) : label; + }, + + convertTicksToLabels: function(ticks) { + var labels = []; + var i, ilen; + + for (i = 0, ilen = ticks.length; i < ilen; ++i) { + labels.push(this.tickFormatFunction(moment(ticks[i].value), i, ticks)); + } + + return labels; + }, + + /** + * @private + */ + getPixelForOffset: function(time) { + var me = this; + var size = me._horizontal ? me.width : me.height; + var start = me._horizontal ? me.left : me.top; + var pos = interpolate(me._table, 'time', time, 'pos'); + + return start + size * (me._offsets.left + pos) / (me._offsets.left + 1 + me._offsets.right); + }, + + getPixelForValue: function(value, index, datasetIndex) { + var me = this; + var time = null; + + if (index !== undefined && datasetIndex !== undefined) { + time = me._timestamps.datasets[datasetIndex][index]; + } + + if (time === null) { + time = parse(value, me); + } + + if (time !== null) { + return me.getPixelForOffset(time); + } + }, + + getPixelForTick: function(index) { + var ticks = this.getTicks(); + return index >= 0 && index < ticks.length ? + this.getPixelForOffset(ticks[index].value) : + null; + }, + + getValueForPixel: function(pixel) { + var me = this; + var size = me._horizontal ? me.width : me.height; + var start = me._horizontal ? me.left : me.top; + var pos = (size ? (pixel - start) / size : 0) * (me._offsets.left + 1 + me._offsets.left) - me._offsets.right; + var time = interpolate(me._table, 'pos', pos, 'time'); + + return moment(time); + }, + + /** + * Crude approximation of what the label width might be + * @private + */ + getLabelWidth: function(label) { + var me = this; + var ticksOpts = me.options.ticks; + var tickLabelWidth = me.ctx.measureText(label).width; + var angle = helpers.toRadians(ticksOpts.maxRotation); + var cosRotation = Math.cos(angle); + var sinRotation = Math.sin(angle); + var tickFontSize = helpers.valueOrDefault(ticksOpts.fontSize, defaults.global.defaultFontSize); + + return (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation); + }, + + /** + * @private + */ + getLabelCapacity: function(exampleTime) { + var me = this; + + var formatOverride = me.options.time.displayFormats.millisecond; // Pick the longest format for guestimation + + var exampleLabel = me.tickFormatFunction(moment(exampleTime), 0, [], formatOverride); + var tickLabelWidth = me.getLabelWidth(exampleLabel); + var innerWidth = me.isHorizontal() ? me.width : me.height; + + return Math.floor(innerWidth / tickLabelWidth); + } + }); + + Chart.scaleService.registerScaleType('time', TimeScale, defaultConfig); +}; + +},{"1":1,"25":25,"45":45}]},{},[7])(7) +}); \ No newline at end of file diff --git a/generator-web/target/classes/static/vendor/chart.js/chart.min.js b/generator-web/target/classes/static/vendor/chart.js/chart.min.js new file mode 100644 index 0000000..2130e2a --- /dev/null +++ b/generator-web/target/classes/static/vendor/chart.js/chart.min.js @@ -0,0 +1,10 @@ +/*! + * Chart.js + * http://chartjs.org/ + * Version: 2.7.1 + * + * Copyright 2017 Nick Downie + * Released under the MIT license + * https://github.com/chartjs/Chart.js/blob/master/LICENSE.md + */ +!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).Chart=t()}}(function(){return function t(e,n,i){function a(r,l){if(!n[r]){if(!e[r]){var s="function"==typeof require&&require;if(!l&&s)return s(r,!0);if(o)return o(r,!0);var u=new Error("Cannot find module '"+r+"'");throw u.code="MODULE_NOT_FOUND",u}var d=n[r]={exports:{}};e[r][0].call(d.exports,function(t){var n=e[r][1][t];return a(n||t)},d,d.exports,t,e,n,i)}return n[r].exports}for(var o="function"==typeof require&&require,r=0;rn?(e+.05)/(n+.05):(n+.05)/(e+.05)},level:function(t){var e=this.contrast(t);return e>=7.1?"AAA":e>=4.5?"AA":""},dark:function(){var t=this.values.rgb;return(299*t[0]+587*t[1]+114*t[2])/1e3<128},light:function(){return!this.dark()},negate:function(){for(var t=[],e=0;e<3;e++)t[e]=255-this.values.rgb[e];return this.setValues("rgb",t),this},lighten:function(t){var e=this.values.hsl;return e[2]+=e[2]*t,this.setValues("hsl",e),this},darken:function(t){var e=this.values.hsl;return e[2]-=e[2]*t,this.setValues("hsl",e),this},saturate:function(t){var e=this.values.hsl;return e[1]+=e[1]*t,this.setValues("hsl",e),this},desaturate:function(t){var e=this.values.hsl;return e[1]-=e[1]*t,this.setValues("hsl",e),this},whiten:function(t){var e=this.values.hwb;return e[1]+=e[1]*t,this.setValues("hwb",e),this},blacken:function(t){var e=this.values.hwb;return e[2]+=e[2]*t,this.setValues("hwb",e),this},greyscale:function(){var t=this.values.rgb,e=.3*t[0]+.59*t[1]+.11*t[2];return this.setValues("rgb",[e,e,e]),this},clearer:function(t){var e=this.values.alpha;return this.setValues("alpha",e-e*t),this},opaquer:function(t){var e=this.values.alpha;return this.setValues("alpha",e+e*t),this},rotate:function(t){var e=this.values.hsl,n=(e[0]+t)%360;return e[0]=n<0?360+n:n,this.setValues("hsl",e),this},mix:function(t,e){var n=this,i=t,a=void 0===e?.5:e,o=2*a-1,r=n.alpha()-i.alpha(),l=((o*r==-1?o:(o+r)/(1+o*r))+1)/2,s=1-l;return this.rgb(l*n.red()+s*i.red(),l*n.green()+s*i.green(),l*n.blue()+s*i.blue()).alpha(n.alpha()*a+i.alpha()*(1-a))},toJSON:function(){return this.rgb()},clone:function(){var t,e,n=new o,i=this.values,a=n.values;for(var r in i)i.hasOwnProperty(r)&&(t=i[r],"[object Array]"===(e={}.toString.call(t))?a[r]=t.slice(0):"[object Number]"===e?a[r]=t:console.error("unexpected color value:",t));return n}},o.prototype.spaces={rgb:["red","green","blue"],hsl:["hue","saturation","lightness"],hsv:["hue","saturation","value"],hwb:["hue","whiteness","blackness"],cmyk:["cyan","magenta","yellow","black"]},o.prototype.maxes={rgb:[255,255,255],hsl:[360,100,100],hsv:[360,100,100],hwb:[360,100,100],cmyk:[100,100,100,100]},o.prototype.getValues=function(t){for(var e=this.values,n={},i=0;i.04045?Math.pow((e+.055)/1.055,2.4):e/12.92)+.3576*(n=n>.04045?Math.pow((n+.055)/1.055,2.4):n/12.92)+.1805*(i=i>.04045?Math.pow((i+.055)/1.055,2.4):i/12.92)),100*(.2126*e+.7152*n+.0722*i),100*(.0193*e+.1192*n+.9505*i)]}function d(t){var e,n,i,a=u(t),o=a[0],r=a[1],l=a[2];return o/=95.047,r/=100,l/=108.883,o=o>.008856?Math.pow(o,1/3):7.787*o+16/116,r=r>.008856?Math.pow(r,1/3):7.787*r+16/116,l=l>.008856?Math.pow(l,1/3):7.787*l+16/116,e=116*r-16,n=500*(o-r),i=200*(r-l),[e,n,i]}function c(t){var e,n,i,a,o,r=t[0]/360,l=t[1]/100,s=t[2]/100;if(0==l)return o=255*s,[o,o,o];e=2*s-(n=s<.5?s*(1+l):s+l-s*l),a=[0,0,0];for(var u=0;u<3;u++)(i=r+1/3*-(u-1))<0&&i++,i>1&&i--,o=6*i<1?e+6*(n-e)*i:2*i<1?n:3*i<2?e+(n-e)*(2/3-i)*6:e,a[u]=255*o;return a}function h(t){var e=t[0]/60,n=t[1]/100,i=t[2]/100,a=Math.floor(e)%6,o=e-Math.floor(e),r=255*i*(1-n),l=255*i*(1-n*o),s=255*i*(1-n*(1-o)),i=255*i;switch(a){case 0:return[i,s,r];case 1:return[l,i,r];case 2:return[r,i,s];case 3:return[r,l,i];case 4:return[s,r,i];case 5:return[i,r,l]}}function f(t){var e,n,i,a,o=t[0]/360,l=t[1]/100,s=t[2]/100,u=l+s;switch(u>1&&(l/=u,s/=u),e=Math.floor(6*o),n=1-s,i=6*o-e,0!=(1&e)&&(i=1-i),a=l+i*(n-l),e){default:case 6:case 0:r=n,g=a,b=l;break;case 1:r=a,g=n,b=l;break;case 2:r=l,g=n,b=a;break;case 3:r=l,g=a,b=n;break;case 4:r=a,g=l,b=n;break;case 5:r=n,g=l,b=a}return[255*r,255*g,255*b]}function p(t){var e,n,i,a=t[0]/100,o=t[1]/100,r=t[2]/100,l=t[3]/100;return e=1-Math.min(1,a*(1-l)+l),n=1-Math.min(1,o*(1-l)+l),i=1-Math.min(1,r*(1-l)+l),[255*e,255*n,255*i]}function v(t){var e,n,i,a=t[0]/100,o=t[1]/100,r=t[2]/100;return e=3.2406*a+-1.5372*o+-.4986*r,n=-.9689*a+1.8758*o+.0415*r,i=.0557*a+-.204*o+1.057*r,e=e>.0031308?1.055*Math.pow(e,1/2.4)-.055:e*=12.92,n=n>.0031308?1.055*Math.pow(n,1/2.4)-.055:n*=12.92,i=i>.0031308?1.055*Math.pow(i,1/2.4)-.055:i*=12.92,e=Math.min(Math.max(0,e),1),n=Math.min(Math.max(0,n),1),i=Math.min(Math.max(0,i),1),[255*e,255*n,255*i]}function m(t){var e,n,i,a=t[0],o=t[1],r=t[2];return a/=95.047,o/=100,r/=108.883,a=a>.008856?Math.pow(a,1/3):7.787*a+16/116,o=o>.008856?Math.pow(o,1/3):7.787*o+16/116,r=r>.008856?Math.pow(r,1/3):7.787*r+16/116,e=116*o-16,n=500*(a-o),i=200*(o-r),[e,n,i]}function x(t){var e,n,i,a,o=t[0],r=t[1],l=t[2];return o<=8?a=(n=100*o/903.3)/100*7.787+16/116:(n=100*Math.pow((o+16)/116,3),a=Math.pow(n/100,1/3)),e=e/95.047<=.008856?e=95.047*(r/500+a-16/116)/7.787:95.047*Math.pow(r/500+a,3),i=i/108.883<=.008859?i=108.883*(a-l/200-16/116)/7.787:108.883*Math.pow(a-l/200,3),[e,n,i]}function y(t){var e,n,i,a=t[0],o=t[1],r=t[2];return e=Math.atan2(r,o),(n=360*e/2/Math.PI)<0&&(n+=360),i=Math.sqrt(o*o+r*r),[a,i,n]}function k(t){return v(x(t))}function w(t){var e,n,i,a=t[0],o=t[1];return i=t[2]/360*2*Math.PI,e=o*Math.cos(i),n=o*Math.sin(i),[a,e,n]}function M(t){return S[t]}e.exports={rgb2hsl:i,rgb2hsv:a,rgb2hwb:o,rgb2cmyk:l,rgb2keyword:s,rgb2xyz:u,rgb2lab:d,rgb2lch:function(t){return y(d(t))},hsl2rgb:c,hsl2hsv:function(t){var e,n,i=t[0],a=t[1]/100,o=t[2]/100;return 0===o?[0,0,0]:(o*=2,a*=o<=1?o:2-o,n=(o+a)/2,e=2*a/(o+a),[i,100*e,100*n])},hsl2hwb:function(t){return o(c(t))},hsl2cmyk:function(t){return l(c(t))},hsl2keyword:function(t){return s(c(t))},hsv2rgb:h,hsv2hsl:function(t){var e,n,i=t[0],a=t[1]/100,o=t[2]/100;return n=(2-a)*o,e=a*o,e/=n<=1?n:2-n,e=e||0,n/=2,[i,100*e,100*n]},hsv2hwb:function(t){return o(h(t))},hsv2cmyk:function(t){return l(h(t))},hsv2keyword:function(t){return s(h(t))},hwb2rgb:f,hwb2hsl:function(t){return i(f(t))},hwb2hsv:function(t){return a(f(t))},hwb2cmyk:function(t){return l(f(t))},hwb2keyword:function(t){return s(f(t))},cmyk2rgb:p,cmyk2hsl:function(t){return i(p(t))},cmyk2hsv:function(t){return a(p(t))},cmyk2hwb:function(t){return o(p(t))},cmyk2keyword:function(t){return s(p(t))},keyword2rgb:M,keyword2hsl:function(t){return i(M(t))},keyword2hsv:function(t){return a(M(t))},keyword2hwb:function(t){return o(M(t))},keyword2cmyk:function(t){return l(M(t))},keyword2lab:function(t){return d(M(t))},keyword2xyz:function(t){return u(M(t))},xyz2rgb:v,xyz2lab:m,xyz2lch:function(t){return y(m(t))},lab2xyz:x,lab2rgb:k,lab2lch:y,lch2lab:w,lch2xyz:function(t){return x(w(t))},lch2rgb:function(t){return k(w(t))}};var S={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],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],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},C={};for(var _ in S)C[JSON.stringify(S[_])]=_},{}],5:[function(t,e,n){var i=t(4),a=function(){return new u};for(var o in i){a[o+"Raw"]=function(t){return function(e){return"number"==typeof e&&(e=Array.prototype.slice.call(arguments)),i[t](e)}}(o);var r=/(\w+)2(\w+)/.exec(o),l=r[1],s=r[2];(a[l]=a[l]||{})[s]=a[o]=function(t){return function(e){"number"==typeof e&&(e=Array.prototype.slice.call(arguments));var n=i[t](e);if("string"==typeof n||void 0===n)return n;for(var a=0;a0&&(t[0].yLabel?n=t[0].yLabel:e.labels.length>0&&t[0].index=0&&a>0)&&(v+=a));return o=c.getPixelForValue(v),r=c.getPixelForValue(v+f),l=(r-o)/2,{size:l,base:o,head:r,center:r+l/2}},calculateBarIndexPixels:function(t,e,n){var i,a,r,l,s,u,d=this,c=n.scale.options,h=d.getStackIndex(t),f=n.pixels,g=f[e],p=f.length,v=n.start,m=n.end;return 1===p?(i=g>v?g-v:m-g,a=g0&&(i=(g-f[e-1])/2,e===p-1&&(a=i)),e');var n=t.data,i=n.datasets,a=n.labels;if(i.length)for(var o=0;o'),a[o]&&e.push(a[o]),e.push("");return e.push(""),e.join("")},legend:{labels:{generateLabels:function(t){var e=t.data;return e.labels.length&&e.datasets.length?e.labels.map(function(n,i){var a=t.getDatasetMeta(0),r=e.datasets[0],l=a.data[i],s=l&&l.custom||{},u=o.valueAtIndexOrDefault,d=t.options.elements.arc;return{text:n,fillStyle:s.backgroundColor?s.backgroundColor:u(r.backgroundColor,i,d.backgroundColor),strokeStyle:s.borderColor?s.borderColor:u(r.borderColor,i,d.borderColor),lineWidth:s.borderWidth?s.borderWidth:u(r.borderWidth,i,d.borderWidth),hidden:isNaN(r.data[i])||a.data[i].hidden,index:i}}):[]}},onClick:function(t,e){var n,i,a,o=e.index,r=this.chart;for(n=0,i=(r.data.datasets||[]).length;n=Math.PI?-1:g<-Math.PI?1:0))+f,v={x:Math.cos(g),y:Math.sin(g)},m={x:Math.cos(p),y:Math.sin(p)},b=g<=0&&p>=0||g<=2*Math.PI&&2*Math.PI<=p,x=g<=.5*Math.PI&&.5*Math.PI<=p||g<=2.5*Math.PI&&2.5*Math.PI<=p,y=g<=-Math.PI&&-Math.PI<=p||g<=Math.PI&&Math.PI<=p,k=g<=.5*-Math.PI&&.5*-Math.PI<=p||g<=1.5*Math.PI&&1.5*Math.PI<=p,w=h/100,M={x:y?-1:Math.min(v.x*(v.x<0?1:w),m.x*(m.x<0?1:w)),y:k?-1:Math.min(v.y*(v.y<0?1:w),m.y*(m.y<0?1:w))},S={x:b?1:Math.max(v.x*(v.x>0?1:w),m.x*(m.x>0?1:w)),y:x?1:Math.max(v.y*(v.y>0?1:w),m.y*(m.y>0?1:w))},C={width:.5*(S.x-M.x),height:.5*(S.y-M.y)};u=Math.min(l/C.width,s/C.height),d={x:-.5*(S.x+M.x),y:-.5*(S.y+M.y)}}n.borderWidth=e.getMaxBorderWidth(c.data),n.outerRadius=Math.max((u-n.borderWidth)/2,0),n.innerRadius=Math.max(h?n.outerRadius/100*h:0,0),n.radiusLength=(n.outerRadius-n.innerRadius)/n.getVisibleDatasetCount(),n.offsetX=d.x*n.outerRadius,n.offsetY=d.y*n.outerRadius,c.total=e.calculateTotal(),e.outerRadius=n.outerRadius-n.radiusLength*e.getRingIndex(e.index),e.innerRadius=Math.max(e.outerRadius-n.radiusLength,0),o.each(c.data,function(n,i){e.updateElement(n,i,t)})},updateElement:function(t,e,n){var i=this,a=i.chart,r=a.chartArea,l=a.options,s=l.animation,u=(r.left+r.right)/2,d=(r.top+r.bottom)/2,c=l.rotation,h=l.rotation,f=i.getDataset(),g=n&&s.animateRotate?0:t.hidden?0:i.calculateCircumference(f.data[e])*(l.circumference/(2*Math.PI)),p=n&&s.animateScale?0:i.innerRadius,v=n&&s.animateScale?0:i.outerRadius,m=o.valueAtIndexOrDefault;o.extend(t,{_datasetIndex:i.index,_index:e,_model:{x:u+a.offsetX,y:d+a.offsetY,startAngle:c,endAngle:h,circumference:g,outerRadius:v,innerRadius:p,label:m(f.label,e,a.data.labels[e])}});var b=t._model;this.removeHoverStyle(t),n&&s.animateRotate||(b.startAngle=0===e?l.rotation:i.getMeta().data[e-1]._model.endAngle,b.endAngle=b.startAngle+b.circumference),t.pivot()},removeHoverStyle:function(e){t.DatasetController.prototype.removeHoverStyle.call(this,e,this.chart.options.elements.arc)},calculateTotal:function(){var t,e=this.getDataset(),n=this.getMeta(),i=0;return o.each(n.data,function(n,a){t=e.data[a],isNaN(t)||n.hidden||(i+=Math.abs(t))}),i},calculateCircumference:function(t){var e=this.getMeta().total;return e>0&&!isNaN(t)?2*Math.PI*(t/e):0},getMaxBorderWidth:function(t){for(var e,n,i=0,a=this.index,o=t.length,r=0;r(i=e>i?e:i)?n:i;return i}})}},{25:25,40:40,45:45}],18:[function(t,e,n){"use strict";var i=t(25),a=t(40),o=t(45);i._set("line",{showLines:!0,spanGaps:!1,hover:{mode:"label"},scales:{xAxes:[{type:"category",id:"x-axis-0"}],yAxes:[{type:"linear",id:"y-axis-0"}]}}),e.exports=function(t){function e(t,e){return o.valueOrDefault(t.showLine,e.showLines)}t.controllers.line=t.DatasetController.extend({datasetElementType:a.Line,dataElementType:a.Point,update:function(t){var n,i,a,r=this,l=r.getMeta(),s=l.dataset,u=l.data||[],d=r.chart.options,c=d.elements.line,h=r.getScaleForId(l.yAxisID),f=r.getDataset(),g=e(f,d);for(g&&(a=s.custom||{},void 0!==f.tension&&void 0===f.lineTension&&(f.lineTension=f.tension),s._scale=h,s._datasetIndex=r.index,s._children=u,s._model={spanGaps:f.spanGaps?f.spanGaps:d.spanGaps,tension:a.tension?a.tension:o.valueOrDefault(f.lineTension,c.tension),backgroundColor:a.backgroundColor?a.backgroundColor:f.backgroundColor||c.backgroundColor,borderWidth:a.borderWidth?a.borderWidth:f.borderWidth||c.borderWidth,borderColor:a.borderColor?a.borderColor:f.borderColor||c.borderColor,borderCapStyle:a.borderCapStyle?a.borderCapStyle:f.borderCapStyle||c.borderCapStyle,borderDash:a.borderDash?a.borderDash:f.borderDash||c.borderDash,borderDashOffset:a.borderDashOffset?a.borderDashOffset:f.borderDashOffset||c.borderDashOffset,borderJoinStyle:a.borderJoinStyle?a.borderJoinStyle:f.borderJoinStyle||c.borderJoinStyle,fill:a.fill?a.fill:void 0!==f.fill?f.fill:c.fill,steppedLine:a.steppedLine?a.steppedLine:o.valueOrDefault(f.steppedLine,c.stepped),cubicInterpolationMode:a.cubicInterpolationMode?a.cubicInterpolationMode:o.valueOrDefault(f.cubicInterpolationMode,c.cubicInterpolationMode)},s.pivot()),n=0,i=u.length;n');var n=t.data,i=n.datasets,a=n.labels;if(i.length)for(var o=0;o'),a[o]&&e.push(a[o]),e.push("");return e.push(""),e.join("")},legend:{labels:{generateLabels:function(t){var e=t.data;return e.labels.length&&e.datasets.length?e.labels.map(function(n,i){var a=t.getDatasetMeta(0),r=e.datasets[0],l=a.data[i].custom||{},s=o.valueAtIndexOrDefault,u=t.options.elements.arc;return{text:n,fillStyle:l.backgroundColor?l.backgroundColor:s(r.backgroundColor,i,u.backgroundColor),strokeStyle:l.borderColor?l.borderColor:s(r.borderColor,i,u.borderColor),lineWidth:l.borderWidth?l.borderWidth:s(r.borderWidth,i,u.borderWidth),hidden:isNaN(r.data[i])||a.data[i].hidden,index:i}}):[]}},onClick:function(t,e){var n,i,a,o=e.index,r=this.chart;for(n=0,i=(r.data.datasets||[]).length;n0&&!isNaN(t)?2*Math.PI/e:0}})}},{25:25,40:40,45:45}],20:[function(t,e,n){"use strict";var i=t(25),a=t(40),o=t(45);i._set("radar",{scale:{type:"radialLinear"},elements:{line:{tension:0}}}),e.exports=function(t){t.controllers.radar=t.DatasetController.extend({datasetElementType:a.Line,dataElementType:a.Point,linkScales:o.noop,update:function(t){var e=this,n=e.getMeta(),i=n.dataset,a=n.data,r=i.custom||{},l=e.getDataset(),s=e.chart.options.elements.line,u=e.chart.scale;void 0!==l.tension&&void 0===l.lineTension&&(l.lineTension=l.tension),o.extend(n.dataset,{_datasetIndex:e.index,_scale:u,_children:a,_loop:!0,_model:{tension:r.tension?r.tension:o.valueOrDefault(l.lineTension,s.tension),backgroundColor:r.backgroundColor?r.backgroundColor:l.backgroundColor||s.backgroundColor,borderWidth:r.borderWidth?r.borderWidth:l.borderWidth||s.borderWidth,borderColor:r.borderColor?r.borderColor:l.borderColor||s.borderColor,fill:r.fill?r.fill:void 0!==l.fill?l.fill:s.fill,borderCapStyle:r.borderCapStyle?r.borderCapStyle:l.borderCapStyle||s.borderCapStyle,borderDash:r.borderDash?r.borderDash:l.borderDash||s.borderDash,borderDashOffset:r.borderDashOffset?r.borderDashOffset:l.borderDashOffset||s.borderDashOffset,borderJoinStyle:r.borderJoinStyle?r.borderJoinStyle:l.borderJoinStyle||s.borderJoinStyle}}),n.dataset.pivot(),o.each(a,function(n,i){e.updateElement(n,i,t)},e),e.updateBezierControlPoints()},updateElement:function(t,e,n){var i=this,a=t.custom||{},r=i.getDataset(),l=i.chart.scale,s=i.chart.options.elements.point,u=l.getPointPositionForValue(e,r.data[e]);void 0!==r.radius&&void 0===r.pointRadius&&(r.pointRadius=r.radius),void 0!==r.hitRadius&&void 0===r.pointHitRadius&&(r.pointHitRadius=r.hitRadius),o.extend(t,{_datasetIndex:i.index,_index:e,_scale:l,_model:{x:n?l.xCenter:u.x,y:n?l.yCenter:u.y,tension:a.tension?a.tension:o.valueOrDefault(r.lineTension,i.chart.options.elements.line.tension),radius:a.radius?a.radius:o.valueAtIndexOrDefault(r.pointRadius,e,s.radius),backgroundColor:a.backgroundColor?a.backgroundColor:o.valueAtIndexOrDefault(r.pointBackgroundColor,e,s.backgroundColor),borderColor:a.borderColor?a.borderColor:o.valueAtIndexOrDefault(r.pointBorderColor,e,s.borderColor),borderWidth:a.borderWidth?a.borderWidth:o.valueAtIndexOrDefault(r.pointBorderWidth,e,s.borderWidth),pointStyle:a.pointStyle?a.pointStyle:o.valueAtIndexOrDefault(r.pointStyle,e,s.pointStyle),hitRadius:a.hitRadius?a.hitRadius:o.valueAtIndexOrDefault(r.pointHitRadius,e,s.hitRadius)}}),t._model.skip=a.skip?a.skip:isNaN(t._model.x)||isNaN(t._model.y)},updateBezierControlPoints:function(){var t=this.chart.chartArea,e=this.getMeta();o.each(e.data,function(n,i){var a=n._model,r=o.splineCurve(o.previousItem(e.data,i,!0)._model,a,o.nextItem(e.data,i,!0)._model,a.tension);a.controlPointPreviousX=Math.max(Math.min(r.previous.x,t.right),t.left),a.controlPointPreviousY=Math.max(Math.min(r.previous.y,t.bottom),t.top),a.controlPointNextX=Math.max(Math.min(r.next.x,t.right),t.left),a.controlPointNextY=Math.max(Math.min(r.next.y,t.bottom),t.top),n.pivot()})},setHoverStyle:function(t){var e=this.chart.data.datasets[t._datasetIndex],n=t.custom||{},i=t._index,a=t._model;a.radius=n.hoverRadius?n.hoverRadius:o.valueAtIndexOrDefault(e.pointHoverRadius,i,this.chart.options.elements.point.hoverRadius),a.backgroundColor=n.hoverBackgroundColor?n.hoverBackgroundColor:o.valueAtIndexOrDefault(e.pointHoverBackgroundColor,i,o.getHoverColor(a.backgroundColor)),a.borderColor=n.hoverBorderColor?n.hoverBorderColor:o.valueAtIndexOrDefault(e.pointHoverBorderColor,i,o.getHoverColor(a.borderColor)),a.borderWidth=n.hoverBorderWidth?n.hoverBorderWidth:o.valueAtIndexOrDefault(e.pointHoverBorderWidth,i,a.borderWidth)},removeHoverStyle:function(t){var e=this.chart.data.datasets[t._datasetIndex],n=t.custom||{},i=t._index,a=t._model,r=this.chart.options.elements.point;a.radius=n.radius?n.radius:o.valueAtIndexOrDefault(e.pointRadius,i,r.radius),a.backgroundColor=n.backgroundColor?n.backgroundColor:o.valueAtIndexOrDefault(e.pointBackgroundColor,i,r.backgroundColor),a.borderColor=n.borderColor?n.borderColor:o.valueAtIndexOrDefault(e.pointBorderColor,i,r.borderColor),a.borderWidth=n.borderWidth?n.borderWidth:o.valueAtIndexOrDefault(e.pointBorderWidth,i,r.borderWidth)}})}},{25:25,40:40,45:45}],21:[function(t,e,n){"use strict";t(25)._set("scatter",{hover:{mode:"single"},scales:{xAxes:[{id:"x-axis-1",type:"linear",position:"bottom"}],yAxes:[{id:"y-axis-1",type:"linear",position:"left"}]},showLines:!1,tooltips:{callbacks:{title:function(){return""},label:function(t){return"("+t.xLabel+", "+t.yLabel+")"}}}}),e.exports=function(t){t.controllers.scatter=t.controllers.line}},{25:25}],22:[function(t,e,n){"use strict";var i=t(25),a=t(26),o=t(45);i._set("global",{animation:{duration:1e3,easing:"easeOutQuart",onProgress:o.noop,onComplete:o.noop}}),e.exports=function(t){t.Animation=a.extend({chart:null,currentStep:0,numSteps:60,easing:"",render:null,onAnimationProgress:null,onAnimationComplete:null}),t.animationService={frameDuration:17,animations:[],dropFrames:0,request:null,addAnimation:function(t,e,n,i){var a,o,r=this.animations;for(e.chart=t,i||(t.animating=!0),a=0,o=r.length;a1&&(n=Math.floor(t.dropFrames),t.dropFrames=t.dropFrames%1),t.advance(1+n);var i=Date.now();t.dropFrames+=(i-e)/t.frameDuration,t.animations.length>0&&t.requestAnimationFrame()},advance:function(t){for(var e,n,i=this.animations,a=0;a=e.numSteps?(o.callback(e.onAnimationComplete,[e],n),n.animating=!1,i.splice(a,1)):++a}},Object.defineProperty(t.Animation.prototype,"animationObject",{get:function(){return this}}),Object.defineProperty(t.Animation.prototype,"chartInstance",{get:function(){return this.chart},set:function(t){this.chart=t}})}},{25:25,26:26,45:45}],23:[function(t,e,n){"use strict";var i=t(25),a=t(45),o=t(28),r=t(48);e.exports=function(t){function e(t){var e=(t=t||{}).data=t.data||{};return e.datasets=e.datasets||[],e.labels=e.labels||[],t.options=a.configMerge(i.global,i[t.type],t.options||{}),t}function n(t){var e=t.options;e.scale?t.scale.options=e.scale:e.scales&&e.scales.xAxes.concat(e.scales.yAxes).forEach(function(e){t.scales[e.id].options=e}),t.tooltip._options=e.tooltips}function l(t){return"top"===t||"bottom"===t}var s=t.plugins;t.types={},t.instances={},t.controllers={},a.extend(t.prototype,{construct:function(n,i){var o=this;i=e(i);var l=r.acquireContext(n,i),s=l&&l.canvas,u=s&&s.height,d=s&&s.width;o.id=a.uid(),o.ctx=l,o.canvas=s,o.config=i,o.width=d,o.height=u,o.aspectRatio=u?d/u:null,o.options=i.options,o._bufferedRender=!1,o.chart=o,o.controller=o,t.instances[o.id]=o,Object.defineProperty(o,"data",{get:function(){return o.config.data},set:function(t){o.config.data=t}}),l&&s?(o.initialize(),o.update()):console.error("Failed to create chart: can't acquire context from the given item")},initialize:function(){var t=this;return s.notify(t,"beforeInit"),a.retinaScale(t,t.options.devicePixelRatio),t.bindEvents(),t.options.responsive&&t.resize(!0),t.ensureScalesHaveIDs(),t.buildScales(),t.initToolTip(),s.notify(t,"afterInit"),t},clear:function(){return a.canvas.clear(this),this},stop:function(){return t.animationService.cancelAnimation(this),this},resize:function(t){var e=this,n=e.options,i=e.canvas,o=n.maintainAspectRatio&&e.aspectRatio||null,r=Math.max(0,Math.floor(a.getMaximumWidth(i))),l=Math.max(0,Math.floor(o?r/o:a.getMaximumHeight(i)));if((e.width!==r||e.height!==l)&&(i.width=e.width=r,i.height=e.height=l,i.style.width=r+"px",i.style.height=l+"px",a.retinaScale(e,n.devicePixelRatio),!t)){var u={width:r,height:l};s.notify(e,"resize",[u]),e.options.onResize&&e.options.onResize(e,u),e.stop(),e.update(e.options.responsiveAnimationDuration)}},ensureScalesHaveIDs:function(){var t=this.options,e=t.scales||{},n=t.scale;a.each(e.xAxes,function(t,e){t.id=t.id||"x-axis-"+e}),a.each(e.yAxes,function(t,e){t.id=t.id||"y-axis-"+e}),n&&(n.id=n.id||"scale")},buildScales:function(){var e=this,n=e.options,i=e.scales={},o=[];n.scales&&(o=o.concat((n.scales.xAxes||[]).map(function(t){return{options:t,dtype:"category",dposition:"bottom"}}),(n.scales.yAxes||[]).map(function(t){return{options:t,dtype:"linear",dposition:"left"}}))),n.scale&&o.push({options:n.scale,dtype:"radialLinear",isDefault:!0,dposition:"chartArea"}),a.each(o,function(n){var o=n.options,r=a.valueOrDefault(o.type,n.dtype),s=t.scaleService.getScaleConstructor(r);if(s){l(o.position)!==l(n.dposition)&&(o.position=n.dposition);var u=new s({id:o.id,options:o,ctx:e.ctx,chart:e});i[u.id]=u,u.mergeTicksOptions(),n.isDefault&&(e.scale=u)}}),t.scaleService.addScalesToLayout(this)},buildOrUpdateControllers:function(){var e=this,n=[],i=[];return a.each(e.data.datasets,function(a,o){var r=e.getDatasetMeta(o),l=a.type||e.config.type;if(r.type&&r.type!==l&&(e.destroyDatasetMeta(o),r=e.getDatasetMeta(o)),r.type=l,n.push(r.type),r.controller)r.controller.updateIndex(o);else{var s=t.controllers[r.type];if(void 0===s)throw new Error('"'+r.type+'" is not a chart type.');r.controller=new s(e,o),i.push(r.controller)}},e),i},resetElements:function(){var t=this;a.each(t.data.datasets,function(e,n){t.getDatasetMeta(n).controller.reset()},t)},reset:function(){this.resetElements(),this.tooltip.initialize()},update:function(t){var e=this;if(t&&"object"==typeof t||(t={duration:t,lazy:arguments[1]}),n(e),!1!==s.notify(e,"beforeUpdate")){e.tooltip._data=e.data;var i=e.buildOrUpdateControllers();a.each(e.data.datasets,function(t,n){e.getDatasetMeta(n).controller.buildOrUpdateElements()},e),e.updateLayout(),a.each(i,function(t){t.reset()}),e.updateDatasets(),e.tooltip.initialize(),e.lastActive=[],s.notify(e,"afterUpdate"),e._bufferedRender?e._bufferedRequest={duration:t.duration,easing:t.easing,lazy:t.lazy}:e.render(t)}},updateLayout:function(){var e=this;!1!==s.notify(e,"beforeLayout")&&(t.layoutService.update(this,this.width,this.height),s.notify(e,"afterScaleUpdate"),s.notify(e,"afterLayout"))},updateDatasets:function(){var t=this;if(!1!==s.notify(t,"beforeDatasetsUpdate")){for(var e=0,n=t.data.datasets.length;e=0;--n)e.isDatasetVisible(n)&&e.drawDataset(n,t);s.notify(e,"afterDatasetsDraw",[t])}},drawDataset:function(t,e){var n=this,i=n.getDatasetMeta(t),a={meta:i,index:t,easingValue:e};!1!==s.notify(n,"beforeDatasetDraw",[a])&&(i.controller.draw(e),s.notify(n,"afterDatasetDraw",[a]))},_drawTooltip:function(t){var e=this,n=e.tooltip,i={tooltip:n,easingValue:t};!1!==s.notify(e,"beforeTooltipDraw",[i])&&(n.draw(),s.notify(e,"afterTooltipDraw",[i]))},getElementAtEvent:function(t){return o.modes.single(this,t)},getElementsAtEvent:function(t){return o.modes.label(this,t,{intersect:!0})},getElementsAtXAxis:function(t){return o.modes["x-axis"](this,t,{intersect:!0})},getElementsAtEventForMode:function(t,e,n){var i=o.modes[e];return"function"==typeof i?i(this,t,n):[]},getDatasetAtEvent:function(t){return o.modes.dataset(this,t,{intersect:!0})},getDatasetMeta:function(t){var e=this,n=e.data.datasets[t];n._meta||(n._meta={});var i=n._meta[e.id];return i||(i=n._meta[e.id]={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null}),i},getVisibleDatasetCount:function(){for(var t=0,e=0,n=this.data.datasets.length;e0||(a.forEach(function(e){delete t[e]}),delete t._chartjs)}}var a=["push","pop","shift","splice","unshift"];t.DatasetController=function(t,e){this.initialize(t,e)},i.extend(t.DatasetController.prototype,{datasetElementType:null,dataElementType:null,initialize:function(t,e){var n=this;n.chart=t,n.index=e,n.linkScales(),n.addElements()},updateIndex:function(t){this.index=t},linkScales:function(){var t=this,e=t.getMeta(),n=t.getDataset();null===e.xAxisID&&(e.xAxisID=n.xAxisID||t.chart.options.scales.xAxes[0].id),null===e.yAxisID&&(e.yAxisID=n.yAxisID||t.chart.options.scales.yAxes[0].id)},getDataset:function(){return this.chart.data.datasets[this.index]},getMeta:function(){return this.chart.getDatasetMeta(this.index)},getScaleForId:function(t){return this.chart.scales[t]},reset:function(){this.update(!0)},destroy:function(){this._data&&n(this._data,this)},createMetaDataset:function(){var t=this,e=t.datasetElementType;return e&&new e({_chart:t.chart,_datasetIndex:t.index})},createMetaData:function(t){var e=this,n=e.dataElementType;return n&&new n({_chart:e.chart,_datasetIndex:e.index,_index:t})},addElements:function(){var t,e,n=this,i=n.getMeta(),a=n.getDataset().data||[],o=i.data;for(t=0,e=a.length;ti&&t.insertElements(i,a-i)},insertElements:function(t,e){for(var n=0;n=n[e].length&&n[e].push({}),!n[e][r].type||s.type&&s.type!==n[e][r].type?o.merge(n[e][r],[t.scaleService.getScaleDefaults(l),s]):o.merge(n[e][r],s)}else o._merger(e,n,i,a)}})},o.where=function(t,e){if(o.isArray(t)&&Array.prototype.filter)return t.filter(e);var n=[];return o.each(t,function(t){e(t)&&n.push(t)}),n},o.findIndex=Array.prototype.findIndex?function(t,e,n){return t.findIndex(e,n)}:function(t,e,n){n=void 0===n?t:n;for(var i=0,a=t.length;i=0;i--){var a=t[i];if(e(a))return a}},o.isNumber=function(t){return!isNaN(parseFloat(t))&&isFinite(t)},o.almostEquals=function(t,e,n){return Math.abs(t-e)t},o.max=function(t){return t.reduce(function(t,e){return isNaN(e)?t:Math.max(t,e)},Number.NEGATIVE_INFINITY)},o.min=function(t){return t.reduce(function(t,e){return isNaN(e)?t:Math.min(t,e)},Number.POSITIVE_INFINITY)},o.sign=Math.sign?function(t){return Math.sign(t)}:function(t){return 0==(t=+t)||isNaN(t)?t:t>0?1:-1},o.log10=Math.log10?function(t){return Math.log10(t)}:function(t){return Math.log(t)/Math.LN10},o.toRadians=function(t){return t*(Math.PI/180)},o.toDegrees=function(t){return t*(180/Math.PI)},o.getAngleFromPoint=function(t,e){var n=e.x-t.x,i=e.y-t.y,a=Math.sqrt(n*n+i*i),o=Math.atan2(i,n);return o<-.5*Math.PI&&(o+=2*Math.PI),{angle:o,distance:a}},o.distanceBetweenPoints=function(t,e){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))},o.aliasPixel=function(t){return t%2==0?0:.5},o.splineCurve=function(t,e,n,i){var a=t.skip?e:t,o=e,r=n.skip?e:n,l=Math.sqrt(Math.pow(o.x-a.x,2)+Math.pow(o.y-a.y,2)),s=Math.sqrt(Math.pow(r.x-o.x,2)+Math.pow(r.y-o.y,2)),u=l/(l+s),d=s/(l+s),c=i*(u=isNaN(u)?0:u),h=i*(d=isNaN(d)?0:d);return{previous:{x:o.x-c*(r.x-a.x),y:o.y-c*(r.y-a.y)},next:{x:o.x+h*(r.x-a.x),y:o.y+h*(r.y-a.y)}}},o.EPSILON=Number.EPSILON||1e-14,o.splineCurveMonotone=function(t){var e,n,i,a,r=(t||[]).map(function(t){return{model:t._model,deltaK:0,mK:0}}),l=r.length;for(e=0;e0?r[e-1]:null,(a=e0?r[e-1]:null,a=e=t.length-1?t[0]:t[e+1]:e>=t.length-1?t[t.length-1]:t[e+1]},o.previousItem=function(t,e,n){return n?e<=0?t[t.length-1]:t[e-1]:e<=0?t[0]:t[e-1]},o.niceNum=function(t,e){var n=Math.floor(o.log10(t)),i=t/Math.pow(10,n);return(e?i<1.5?1:i<3?2:i<7?5:10:i<=1?1:i<=2?2:i<=5?5:10)*Math.pow(10,n)},o.requestAnimFrame="undefined"==typeof window?function(t){t()}:window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){return window.setTimeout(t,1e3/60)},o.getRelativePosition=function(t,e){var n,i,a=t.originalEvent||t,r=t.currentTarget||t.srcElement,l=r.getBoundingClientRect(),s=a.touches;s&&s.length>0?(n=s[0].clientX,i=s[0].clientY):(n=a.clientX,i=a.clientY);var u=parseFloat(o.getStyle(r,"padding-left")),d=parseFloat(o.getStyle(r,"padding-top")),c=parseFloat(o.getStyle(r,"padding-right")),h=parseFloat(o.getStyle(r,"padding-bottom")),f=l.right-l.left-u-c,g=l.bottom-l.top-d-h;return n=Math.round((n-l.left-u)/f*r.width/e.currentDevicePixelRatio),i=Math.round((i-l.top-d)/g*r.height/e.currentDevicePixelRatio),{x:n,y:i}},o.getConstraintWidth=function(t){return r(t,"max-width","clientWidth")},o.getConstraintHeight=function(t){return r(t,"max-height","clientHeight")},o.getMaximumWidth=function(t){var e=t.parentNode;if(!e)return t.clientWidth;var n=parseInt(o.getStyle(e,"padding-left"),10),i=parseInt(o.getStyle(e,"padding-right"),10),a=e.clientWidth-n-i,r=o.getConstraintWidth(t);return isNaN(r)?a:Math.min(a,r)},o.getMaximumHeight=function(t){var e=t.parentNode;if(!e)return t.clientHeight;var n=parseInt(o.getStyle(e,"padding-top"),10),i=parseInt(o.getStyle(e,"padding-bottom"),10),a=e.clientHeight-n-i,r=o.getConstraintHeight(t);return isNaN(r)?a:Math.min(a,r)},o.getStyle=function(t,e){return t.currentStyle?t.currentStyle[e]:document.defaultView.getComputedStyle(t,null).getPropertyValue(e)},o.retinaScale=function(t,e){var n=t.currentDevicePixelRatio=e||window.devicePixelRatio||1;if(1!==n){var i=t.canvas,a=t.height,o=t.width;i.height=a*n,i.width=o*n,t.ctx.scale(n,n),i.style.height=a+"px",i.style.width=o+"px"}},o.fontString=function(t,e,n){return e+" "+t+"px "+n},o.longestText=function(t,e,n,i){var a=(i=i||{}).data=i.data||{},r=i.garbageCollect=i.garbageCollect||[];i.font!==e&&(a=i.data={},r=i.garbageCollect=[],i.font=e),t.font=e;var l=0;o.each(n,function(e){void 0!==e&&null!==e&&!0!==o.isArray(e)?l=o.measureText(t,a,r,l,e):o.isArray(e)&&o.each(e,function(e){void 0===e||null===e||o.isArray(e)||(l=o.measureText(t,a,r,l,e))})});var s=r.length/2;if(s>n.length){for(var u=0;ui&&(i=o),i},o.numberOfLabelLines=function(t){var e=1;return o.each(t,function(t){o.isArray(t)&&t.length>e&&(e=t.length)}),e},o.color=i?function(t){return t instanceof CanvasGradient&&(t=a.global.defaultColor),i(t)}:function(t){return console.error("Color.js not found!"),t},o.getHoverColor=function(t){return t instanceof CanvasPattern?t:o.color(t).saturate(.5).darken(.1).rgbString()}}},{25:25,3:3,45:45}],28:[function(t,e,n){"use strict";function i(t,e){return t.native?{x:t.x,y:t.y}:u.getRelativePosition(t,e)}function a(t,e){var n,i,a,o,r;for(i=0,o=t.data.datasets.length;i0&&(u=t.getDatasetMeta(u[0]._datasetIndex).data),u},"x-axis":function(t,e){return s(t,e,{intersect:!1})},point:function(t,e){return o(t,i(e,t))},nearest:function(t,e,n){var a=i(e,t);n.axis=n.axis||"xy";var o=l(n.axis),s=r(t,a,n.intersect,o);return s.length>1&&s.sort(function(t,e){var n=t.getArea()-e.getArea();return 0===n&&(n=t._datasetIndex-e._datasetIndex),n}),s.slice(0,1)},x:function(t,e,n){var o=i(e,t),r=[],l=!1;return a(t,function(t){t.inXRange(o.x)&&r.push(t),t.inRange(o.x,o.y)&&(l=!0)}),n.intersect&&!l&&(r=[]),r},y:function(t,e,n){var o=i(e,t),r=[],l=!1;return a(t,function(t){t.inYRange(o.y)&&r.push(t),t.inRange(o.x,o.y)&&(l=!0)}),n.intersect&&!l&&(r=[]),r}}}},{45:45}],29:[function(t,e,n){"use strict";t(25)._set("global",{responsive:!0,responsiveAnimationDuration:0,maintainAspectRatio:!0,events:["mousemove","mouseout","click","touchstart","touchmove"],hover:{onHover:null,mode:"nearest",intersect:!0,animationDuration:400},onClick:null,defaultColor:"rgba(0,0,0,0.1)",defaultFontColor:"#666",defaultFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",defaultFontSize:12,defaultFontStyle:"normal",showLines:!0,elements:{},layout:{padding:{top:0,right:0,bottom:0,left:0}}}),e.exports=function(){var t=function(t,e){return this.construct(t,e),this};return t.Chart=t,t}},{25:25}],30:[function(t,e,n){"use strict";var i=t(45);e.exports=function(t){function e(t,e){return i.where(t,function(t){return t.position===e})}function n(t,e){t.forEach(function(t,e){return t._tmpIndex_=e,t}),t.sort(function(t,n){var i=e?n:t,a=e?t:n;return i.weight===a.weight?i._tmpIndex_-a._tmpIndex_:i.weight-a.weight}),t.forEach(function(t){delete t._tmpIndex_})}t.layoutService={defaults:{},addBox:function(t,e){t.boxes||(t.boxes=[]),e.fullWidth=e.fullWidth||!1,e.position=e.position||"top",e.weight=e.weight||0,t.boxes.push(e)},removeBox:function(t,e){var n=t.boxes?t.boxes.indexOf(e):-1;-1!==n&&t.boxes.splice(n,1)},configure:function(t,e,n){for(var i,a=["fullWidth","position","weight"],o=a.length,r=0;rh&&st.maxHeight){s--;break}s++,c=u*d}t.labelRotation=s},afterCalculateTickRotation:function(){l.callback(this.options.afterCalculateTickRotation,[this])},beforeFit:function(){l.callback(this.options.beforeFit,[this])},fit:function(){var t=this,a=t.minSize={width:0,height:0},o=i(t._ticks),r=t.options,u=r.ticks,d=r.scaleLabel,c=r.gridLines,h=r.display,f=t.isHorizontal(),g=n(u),p=r.gridLines.tickMarkLength;if(a.width=f?t.isFullWidth()?t.maxWidth-t.margins.left-t.margins.right:t.maxWidth:h&&c.drawTicks?p:0,a.height=f?h&&c.drawTicks?p:0:t.maxHeight,d.display&&h){var v=s(d)+l.options.toPadding(d.padding).height;f?a.height+=v:a.width+=v}if(u.display&&h){var m=l.longestText(t.ctx,g.font,o,t.longestTextCache),b=l.numberOfLabelLines(o),x=.5*g.size,y=t.options.ticks.padding;if(f){t.longestLabelWidth=m;var k=l.toRadians(t.labelRotation),w=Math.cos(k),M=Math.sin(k)*m+g.size*b+x*(b-1)+x;a.height=Math.min(t.maxHeight,a.height+M+y),t.ctx.font=g.font;var S=e(t.ctx,o[0],g.font),C=e(t.ctx,o[o.length-1],g.font);0!==t.labelRotation?(t.paddingLeft="bottom"===r.position?w*S+3:w*x+3,t.paddingRight="bottom"===r.position?w*x+3:w*C+3):(t.paddingLeft=S/2+3,t.paddingRight=C/2+3)}else u.mirror?m=0:m+=y+x,a.width=Math.min(t.maxWidth,a.width+m),t.paddingTop=g.size/2,t.paddingBottom=g.size/2}t.handleMargins(),t.width=a.width,t.height=a.height},handleMargins:function(){var t=this;t.margins&&(t.paddingLeft=Math.max(t.paddingLeft-t.margins.left,0),t.paddingTop=Math.max(t.paddingTop-t.margins.top,0),t.paddingRight=Math.max(t.paddingRight-t.margins.right,0),t.paddingBottom=Math.max(t.paddingBottom-t.margins.bottom,0))},afterFit:function(){l.callback(this.options.afterFit,[this])},isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},isFullWidth:function(){return this.options.fullWidth},getRightValue:function(t){if(l.isNullOrUndef(t))return NaN;if("number"==typeof t&&!isFinite(t))return NaN;if(t)if(this.isHorizontal()){if(void 0!==t.x)return this.getRightValue(t.x)}else if(void 0!==t.y)return this.getRightValue(t.y);return t},getLabelForIndex:l.noop,getPixelForValue:l.noop,getValueForPixel:l.noop,getPixelForTick:function(t){var e=this,n=e.options.offset;if(e.isHorizontal()){var i=(e.width-(e.paddingLeft+e.paddingRight))/Math.max(e._ticks.length-(n?0:1),1),a=i*t+e.paddingLeft;n&&(a+=i/2);var o=e.left+Math.round(a);return o+=e.isFullWidth()?e.margins.left:0}var r=e.height-(e.paddingTop+e.paddingBottom);return e.top+t*(r/(e._ticks.length-1))},getPixelForDecimal:function(t){var e=this;if(e.isHorizontal()){var n=(e.width-(e.paddingLeft+e.paddingRight))*t+e.paddingLeft,i=e.left+Math.round(n);return i+=e.isFullWidth()?e.margins.left:0}return e.top+t*e.height},getBasePixel:function(){return this.getPixelForValue(this.getBaseValue())},getBaseValue:function(){var t=this,e=t.min,n=t.max;return t.beginAtZero?0:e<0&&n<0?n:e>0&&n>0?e:0},_autoSkip:function(t){var e,n,i,a,o=this,r=o.isHorizontal(),s=o.options.ticks.minor,u=t.length,d=l.toRadians(o.labelRotation),c=Math.cos(d),h=o.longestLabelWidth*c,f=[];for(s.maxTicksLimit&&(a=s.maxTicksLimit),r&&(e=!1,(h+s.autoSkipPadding)*u>o.width-(o.paddingLeft+o.paddingRight)&&(e=1+Math.floor((h+s.autoSkipPadding)*u/(o.width-(o.paddingLeft+o.paddingRight)))),a&&u>a&&(e=Math.max(e,Math.floor(u/a)))),n=0;n1&&n%e>0||n%e==0&&n+e>=u)&&n!==u-1&&delete i.label,f.push(i);return f},draw:function(t){var e=this,i=e.options;if(i.display){var r=e.ctx,u=o.global,d=i.ticks.minor,c=i.ticks.major||d,h=i.gridLines,f=i.scaleLabel,g=0!==e.labelRotation,p=e.isHorizontal(),v=d.autoSkip?e._autoSkip(e.getTicks()):e.getTicks(),m=l.valueOrDefault(d.fontColor,u.defaultFontColor),b=n(d),x=l.valueOrDefault(c.fontColor,u.defaultFontColor),y=n(c),k=h.drawTicks?h.tickMarkLength:0,w=l.valueOrDefault(f.fontColor,u.defaultFontColor),M=n(f),S=l.options.toPadding(f.padding),C=l.toRadians(e.labelRotation),_=[],D="right"===i.position?e.left:e.right-k,I="right"===i.position?e.left+k:e.right,P="bottom"===i.position?e.top:e.bottom-k,A="bottom"===i.position?e.top+k:e.bottom;if(l.each(v,function(n,o){if(!l.isNullOrUndef(n.label)){var r,s,c,f,m=n.label;o===e.zeroLineIndex&&i.offset===h.offsetGridLines?(r=h.zeroLineWidth,s=h.zeroLineColor,c=h.zeroLineBorderDash,f=h.zeroLineBorderDashOffset):(r=l.valueAtIndexOrDefault(h.lineWidth,o),s=l.valueAtIndexOrDefault(h.color,o),c=l.valueOrDefault(h.borderDash,u.borderDash),f=l.valueOrDefault(h.borderDashOffset,u.borderDashOffset));var b,x,y,w,M,S,T,F,O,R,L="middle",z="middle",B=d.padding;if(p){var W=k+B;"bottom"===i.position?(z=g?"middle":"top",L=g?"right":"center",R=e.top+W):(z=g?"middle":"bottom",L=g?"left":"center",R=e.bottom-W);var N=a(e,o,h.offsetGridLines&&v.length>1);N1);H0)n=t.stepSize;else{var o=i.niceNum(e.max-e.min,!1);n=i.niceNum(o/(t.maxTicks-1),!0)}var r=Math.floor(e.min/n)*n,l=Math.ceil(e.max/n)*n;t.min&&t.max&&t.stepSize&&i.almostWhole((t.max-t.min)/t.stepSize,n/1e3)&&(r=t.min,l=t.max);var s=(l-r)/n;s=i.almostEquals(s,Math.round(s),n/1e3)?Math.round(s):Math.ceil(s),a.push(void 0!==t.min?t.min:r);for(var u=1;u3?n[2]-n[1]:n[1]-n[0];Math.abs(a)>1&&t!==Math.floor(t)&&(a=t-Math.floor(t));var o=i.log10(Math.abs(a)),r="";if(0!==t){var l=-1*Math.floor(o);l=Math.max(Math.min(l,20),0),r=t.toFixed(l)}else r="0";return r},logarithmic:function(t,e,n){var a=t/Math.pow(10,Math.floor(i.log10(t)));return 0===t?"0":1===a||2===a||5===a||0===e||e===n.length-1?t.toExponential():""}}}},{45:45}],35:[function(t,e,n){"use strict";var i=t(25),a=t(26),o=t(45);i._set("global",{tooltips:{enabled:!0,custom:null,mode:"nearest",position:"average",intersect:!0,backgroundColor:"rgba(0,0,0,0.8)",titleFontStyle:"bold",titleSpacing:2,titleMarginBottom:6,titleFontColor:"#fff",titleAlign:"left",bodySpacing:2,bodyFontColor:"#fff",bodyAlign:"left",footerFontStyle:"bold",footerSpacing:2,footerMarginTop:6,footerFontColor:"#fff",footerAlign:"left",yPadding:6,xPadding:6,caretPadding:2,caretSize:5,cornerRadius:6,multiKeyBackground:"#fff",displayColors:!0,borderColor:"rgba(0,0,0,0)",borderWidth:0,callbacks:{beforeTitle:o.noop,title:function(t,e){var n="",i=e.labels,a=i?i.length:0;if(t.length>0){var o=t[0];o.xLabel?n=o.xLabel:a>0&&o.indexi.height-e.height&&(r="bottom");var l,s,u,d,c,h=(a.left+a.right)/2,f=(a.top+a.bottom)/2;"center"===r?(l=function(t){return t<=h},s=function(t){return t>h}):(l=function(t){return t<=e.width/2},s=function(t){return t>=i.width-e.width/2}),u=function(t){return t+e.width>i.width},d=function(t){return t-e.width<0},c=function(t){return t<=f?"top":"bottom"},l(n.x)?(o="left",u(n.x)&&(o="center",r=c(n.y))):s(n.x)&&(o="right",d(n.x)&&(o="center",r=c(n.y)));var g=t._options;return{xAlign:g.xAlign?g.xAlign:o,yAlign:g.yAlign?g.yAlign:r}}function d(t,e,n){var i=t.x,a=t.y,o=t.caretSize,r=t.caretPadding,l=t.cornerRadius,s=n.xAlign,u=n.yAlign,d=o+r,c=l+r;return"right"===s?i-=e.width:"center"===s&&(i-=e.width/2),"top"===u?a+=d:a-="bottom"===u?e.height+d:e.height/2,"center"===u?"left"===s?i+=d:"right"===s&&(i-=d):"left"===s?i-=c:"right"===s&&(i+=c),{x:i,y:a}}t.Tooltip=a.extend({initialize:function(){this._model=l(this._options),this._lastActive=[]},getTitle:function(){var t=this,e=t._options.callbacks,i=e.beforeTitle.apply(t,arguments),a=e.title.apply(t,arguments),o=e.afterTitle.apply(t,arguments),r=[];return r=n(r,i),r=n(r,a),r=n(r,o)},getBeforeBody:function(){var t=this._options.callbacks.beforeBody.apply(this,arguments);return o.isArray(t)?t:void 0!==t?[t]:[]},getBody:function(t,e){var i=this,a=i._options.callbacks,r=[];return o.each(t,function(t){var o={before:[],lines:[],after:[]};n(o.before,a.beforeLabel.call(i,t,e)),n(o.lines,a.label.call(i,t,e)),n(o.after,a.afterLabel.call(i,t,e)),r.push(o)}),r},getAfterBody:function(){var t=this._options.callbacks.afterBody.apply(this,arguments);return o.isArray(t)?t:void 0!==t?[t]:[]},getFooter:function(){var t=this,e=t._options.callbacks,i=e.beforeFooter.apply(t,arguments),a=e.footer.apply(t,arguments),o=e.afterFooter.apply(t,arguments),r=[];return r=n(r,i),r=n(r,a),r=n(r,o)},update:function(e){var n,i,a=this,c=a._options,h=a._model,f=a._model=l(c),g=a._active,p=a._data,v={xAlign:h.xAlign,yAlign:h.yAlign},m={x:h.x,y:h.y},b={width:h.width,height:h.height},x={x:h.caretX,y:h.caretY};if(g.length){f.opacity=1;var y=[],k=[];x=t.Tooltip.positioners[c.position].call(a,g,a._eventPosition);var w=[];for(n=0,i=g.length;n0&&i.stroke()},draw:function(){var t=this._chart.ctx,e=this._view;if(0!==e.opacity){var n={width:e.width,height:e.height},i={x:e.x,y:e.y},a=Math.abs(e.opacity<.001)?0:e.opacity,o=e.title.length||e.beforeBody.length||e.body.length||e.afterBody.length||e.footer.length;this._options.enabled&&o&&(this.drawBackground(i,e,t,n,a),i.x+=e.xPadding,i.y+=e.yPadding,this.drawTitle(i,e,t,a),this.drawBody(i,e,t,a),this.drawFooter(i,e,t,a))}},handleEvent:function(t){var e=this,n=e._options,i=!1;if(e._lastActive=e._lastActive||[],"mouseout"===t.type?e._active=[]:e._active=e._chart.getElementsAtEventForMode(t,n.mode,n),!(i=!o.arrayEquals(e._active,e._lastActive)))return!1;if(e._lastActive=e._active,n.enabled||n.custom){e._eventPosition={x:t.x,y:t.y};var a=e._model;e.update(!0),e.pivot(),i|=a.x!==e._model.x||a.y!==e._model.y}return i}}),t.Tooltip.positioners={average:function(t){if(!t.length)return!1;var e,n,i=0,a=0,o=0;for(e=0,n=t.length;es;)a-=2*Math.PI;for(;a=l&&a<=s,d=r>=n.innerRadius&&r<=n.outerRadius;return u&&d}return!1},getCenterPoint:function(){var t=this._view,e=(t.startAngle+t.endAngle)/2,n=(t.innerRadius+t.outerRadius)/2;return{x:t.x+Math.cos(e)*n,y:t.y+Math.sin(e)*n}},getArea:function(){var t=this._view;return Math.PI*((t.endAngle-t.startAngle)/(2*Math.PI))*(Math.pow(t.outerRadius,2)-Math.pow(t.innerRadius,2))},tooltipPosition:function(){var t=this._view,e=t.startAngle+(t.endAngle-t.startAngle)/2,n=(t.outerRadius-t.innerRadius)/2+t.innerRadius;return{x:t.x+Math.cos(e)*n,y:t.y+Math.sin(e)*n}},draw:function(){var t=this._chart.ctx,e=this._view,n=e.startAngle,i=e.endAngle;t.beginPath(),t.arc(e.x,e.y,e.outerRadius,n,i),t.arc(e.x,e.y,e.innerRadius,i,n,!0),t.closePath(),t.strokeStyle=e.borderColor,t.lineWidth=e.borderWidth,t.fillStyle=e.backgroundColor,t.fill(),t.lineJoin="bevel",e.borderWidth&&t.stroke()}})},{25:25,26:26,45:45}],37:[function(t,e,n){"use strict";var i=t(25),a=t(26),o=t(45),r=i.global;i._set("global",{elements:{line:{tension:.4,backgroundColor:r.defaultColor,borderWidth:3,borderColor:r.defaultColor,borderCapStyle:"butt",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",capBezierPoints:!0,fill:!0}}}),e.exports=a.extend({draw:function(){var t,e,n,i,a=this,l=a._view,s=a._chart.ctx,u=l.spanGaps,d=a._children.slice(),c=r.elements.line,h=-1;for(a._loop&&d.length&&d.push(d[0]),s.save(),s.lineCap=l.borderCapStyle||c.borderCapStyle,s.setLineDash&&s.setLineDash(l.borderDash||c.borderDash),s.lineDashOffset=l.borderDashOffset||c.borderDashOffset,s.lineJoin=l.borderJoinStyle||c.borderJoinStyle,s.lineWidth=l.borderWidth||c.borderWidth,s.strokeStyle=l.borderColor||r.defaultColor,s.beginPath(),h=-1,t=0;te?1:-1,r=1,l=u.borderSkipped||"left"):(e=u.x-u.width/2,n=u.x+u.width/2,i=u.y,o=1,r=(a=u.base)>i?1:-1,l=u.borderSkipped||"bottom"),d){var c=Math.min(Math.abs(e-n),Math.abs(i-a)),h=(d=d>c?c:d)/2,f=e+("left"!==l?h*o:0),g=n+("right"!==l?-h*o:0),p=i+("top"!==l?h*r:0),v=a+("bottom"!==l?-h*r:0);f!==g&&(i=p,a=v),p!==v&&(e=f,n=g)}s.beginPath(),s.fillStyle=u.backgroundColor,s.strokeStyle=u.borderColor,s.lineWidth=d;var m=[[e,a],[e,i],[n,i],[n,a]],b=["bottom","left","top","right"].indexOf(l,0);-1===b&&(b=0);var x=t(0);s.moveTo(x[0],x[1]);for(var y=1;y<4;y++)x=t(y),s.lineTo(x[0],x[1]);s.fill(),d&&s.stroke()},height:function(){var t=this._view;return t.base-t.y},inRange:function(t,e){var n=!1;if(this._view){var i=a(this);n=t>=i.left&&t<=i.right&&e>=i.top&&e<=i.bottom}return n},inLabelRange:function(t,e){var n=this;if(!n._view)return!1;var o=a(n);return i(n)?t>=o.left&&t<=o.right:e>=o.top&&e<=o.bottom},inXRange:function(t){var e=a(this);return t>=e.left&&t<=e.right},inYRange:function(t){var e=a(this);return t>=e.top&&t<=e.bottom},getCenterPoint:function(){var t,e,n=this._view;return i(this)?(t=n.x,e=(n.y+n.base)/2):(t=(n.x+n.base)/2,e=n.y),{x:t,y:e}},getArea:function(){var t=this._view;return t.width*Math.abs(t.y-t.base)},tooltipPosition:function(){var t=this._view;return{x:t.x,y:t.y}}})},{25:25,26:26}],40:[function(t,e,n){"use strict";e.exports={},e.exports.Arc=t(36),e.exports.Line=t(37),e.exports.Point=t(38),e.exports.Rectangle=t(39)},{36:36,37:37,38:38,39:39}],41:[function(t,e,n){"use strict";var i=t(42),n=e.exports={clear:function(t){t.ctx.clearRect(0,0,t.width,t.height)},roundedRect:function(t,e,n,i,a,o){if(o){var r=Math.min(o,i/2),l=Math.min(o,a/2);t.moveTo(e+r,n),t.lineTo(e+i-r,n),t.quadraticCurveTo(e+i,n,e+i,n+l),t.lineTo(e+i,n+a-l),t.quadraticCurveTo(e+i,n+a,e+i-r,n+a),t.lineTo(e+r,n+a),t.quadraticCurveTo(e,n+a,e,n+a-l),t.lineTo(e,n+l),t.quadraticCurveTo(e,n,e+r,n)}else t.rect(e,n,i,a)},drawPoint:function(t,e,n,i,a){var o,r,l,s,u,d;if(!e||"object"!=typeof e||"[object HTMLImageElement]"!==(o=e.toString())&&"[object HTMLCanvasElement]"!==o){if(!(isNaN(n)||n<=0)){switch(e){default:t.beginPath(),t.arc(i,a,n,0,2*Math.PI),t.closePath(),t.fill();break;case"triangle":t.beginPath(),u=(r=3*n/Math.sqrt(3))*Math.sqrt(3)/2,t.moveTo(i-r/2,a+u/3),t.lineTo(i+r/2,a+u/3),t.lineTo(i,a-2*u/3),t.closePath(),t.fill();break;case"rect":d=1/Math.SQRT2*n,t.beginPath(),t.fillRect(i-d,a-d,2*d,2*d),t.strokeRect(i-d,a-d,2*d,2*d);break;case"rectRounded":var c=n/Math.SQRT2,h=i-c,f=a-c,g=Math.SQRT2*n;t.beginPath(),this.roundedRect(t,h,f,g,g,n/2),t.closePath(),t.fill();break;case"rectRot":d=1/Math.SQRT2*n,t.beginPath(),t.moveTo(i-d,a),t.lineTo(i,a+d),t.lineTo(i+d,a),t.lineTo(i,a-d),t.closePath(),t.fill();break;case"cross":t.beginPath(),t.moveTo(i,a+n),t.lineTo(i,a-n),t.moveTo(i-n,a),t.lineTo(i+n,a),t.closePath();break;case"crossRot":t.beginPath(),l=Math.cos(Math.PI/4)*n,s=Math.sin(Math.PI/4)*n,t.moveTo(i-l,a-s),t.lineTo(i+l,a+s),t.moveTo(i-l,a+s),t.lineTo(i+l,a-s),t.closePath();break;case"star":t.beginPath(),t.moveTo(i,a+n),t.lineTo(i,a-n),t.moveTo(i-n,a),t.lineTo(i+n,a),l=Math.cos(Math.PI/4)*n,s=Math.sin(Math.PI/4)*n,t.moveTo(i-l,a-s),t.lineTo(i+l,a+s),t.moveTo(i-l,a+s),t.lineTo(i+l,a-s),t.closePath();break;case"line":t.beginPath(),t.moveTo(i-n,a),t.lineTo(i+n,a),t.closePath();break;case"dash":t.beginPath(),t.moveTo(i,a),t.lineTo(i+n,a),t.closePath()}t.stroke()}}else t.drawImage(e,i-e.width/2,a-e.height/2,e.width,e.height)},clipArea:function(t,e){t.save(),t.beginPath(),t.rect(e.left,e.top,e.right-e.left,e.bottom-e.top),t.clip()},unclipArea:function(t){t.restore()},lineTo:function(t,e,n,i){if(n.steppedLine)return"after"===n.steppedLine&&!i||"after"!==n.steppedLine&&i?t.lineTo(e.x,n.y):t.lineTo(n.x,e.y),void t.lineTo(n.x,n.y);n.tension?t.bezierCurveTo(i?e.controlPointPreviousX:e.controlPointNextX,i?e.controlPointPreviousY:e.controlPointNextY,i?n.controlPointNextX:n.controlPointPreviousX,i?n.controlPointNextY:n.controlPointPreviousY,n.x,n.y):t.lineTo(n.x,n.y)}};i.clear=n.clear,i.drawRoundedRectangle=function(t){t.beginPath(),n.roundedRect.apply(n,arguments),t.closePath()}},{42:42}],42:[function(t,e,n){"use strict";var i={noop:function(){},uid:function(){var t=0;return function(){return t++}}(),isNullOrUndef:function(t){return null===t||void 0===t},isArray:Array.isArray?Array.isArray:function(t){return"[object Array]"===Object.prototype.toString.call(t)},isObject:function(t){return null!==t&&"[object Object]"===Object.prototype.toString.call(t)},valueOrDefault:function(t,e){return void 0===t?e:t},valueAtIndexOrDefault:function(t,e,n){return i.valueOrDefault(i.isArray(t)?t[e]:t,n)},callback:function(t,e,n){if(t&&"function"==typeof t.call)return t.apply(n,e)},each:function(t,e,n,a){var o,r,l;if(i.isArray(t))if(r=t.length,a)for(o=r-1;o>=0;o--)e.call(n,t[o],o);else for(o=0;o=1?t:-(Math.sqrt(1-t*t)-1)},easeOutCirc:function(t){return Math.sqrt(1-(t-=1)*t)},easeInOutCirc:function(t){return(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:1===t?1:(n||(n=.3),i<1?(i=1,e=n/4):e=n/(2*Math.PI)*Math.asin(1/i),-i*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n))},easeOutElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:1===t?1:(n||(n=.3),i<1?(i=1,e=n/4):e=n/(2*Math.PI)*Math.asin(1/i),i*Math.pow(2,-10*t)*Math.sin((t-e)*(2*Math.PI)/n)+1)},easeInOutElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:2==(t/=.5)?1:(n||(n=.45),i<1?(i=1,e=n/4):e=n/(2*Math.PI)*Math.asin(1/i),t<1?i*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n)*-.5:i*Math.pow(2,-10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n)*.5+1)},easeInBack:function(t){var e=1.70158;return t*t*((e+1)*t-e)},easeOutBack:function(t){var e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},easeInOutBack:function(t){var e=1.70158;return(t/=.5)<1?t*t*((1+(e*=1.525))*t-e)*.5:.5*((t-=2)*t*((1+(e*=1.525))*t+e)+2)},easeInBounce:function(t){return 1-a.easeOutBounce(1-t)},easeOutBounce:function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},easeInOutBounce:function(t){return t<.5?.5*a.easeInBounce(2*t):.5*a.easeOutBounce(2*t-1)+.5}};e.exports={effects:a},i.easingEffects=a},{42:42}],44:[function(t,e,n){"use strict";var i=t(42);e.exports={toLineHeight:function(t,e){var n=(""+t).match(/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/);if(!n||"normal"===n[1])return 1.2*e;switch(t=+n[2],n[3]){case"px":return t;case"%":t/=100}return e*t},toPadding:function(t){var e,n,a,o;return i.isObject(t)?(e=+t.top||0,n=+t.right||0,a=+t.bottom||0,o=+t.left||0):e=n=a=o=+t||0,{top:e,right:n,bottom:a,left:o,height:e+a,width:o+n}},resolve:function(t,e,n){var a,o,r;for(a=0,o=t.length;a
      ';var a=e.childNodes[0],r=e.childNodes[1];e._reset=function(){a.scrollLeft=1e6,a.scrollTop=1e6,r.scrollLeft=1e6,r.scrollTop=1e6};var l=function(){e._reset(),t()};return o(a,"scroll",l.bind(a,"expand")),o(r,"scroll",l.bind(r,"shrink")),e}function c(t,e){var n=t[m]||(t[m]={}),i=n.renderProxy=function(t){t.animationName===y&&e()};v.each(k,function(e){o(t,e,i)}),n.reflow=!!t.offsetParent,t.classList.add(x)}function h(t){var e=t[m]||{},n=e.renderProxy;n&&(v.each(k,function(e){r(t,e,n)}),delete e.renderProxy),t.classList.remove(x)}function f(t,e,n){var i=t[m]||(t[m]={}),a=i.resizer=d(u(function(){if(i.resizer)return e(l("resize",n))}));c(t,function(){if(i.resizer){var e=t.parentNode;e&&e!==a.parentNode&&e.insertBefore(a,e.firstChild),a._reset()}})}function g(t){var e=t[m]||{},n=e.resizer;delete e.resizer,h(t),n&&n.parentNode&&n.parentNode.removeChild(n)}function p(t,e){var n=t._style||document.createElement("style");t._style||(t._style=n,e="/* Chart.js */\n"+e,n.setAttribute("type","text/css"),document.getElementsByTagName("head")[0].appendChild(n)),n.appendChild(document.createTextNode(e))}var v=t(45),m="$chartjs",b="chartjs-",x=b+"render-monitor",y=b+"render-animation",k=["animationstart","webkitAnimationStart"],w={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"},M=!!function(){var t=!1;try{var e=Object.defineProperty({},"passive",{get:function(){t=!0}});window.addEventListener("e",null,e)}catch(t){}return t}()&&{passive:!0};e.exports={_enabled:"undefined"!=typeof window&&"undefined"!=typeof document,initialize:function(){var t="from{opacity:0.99}to{opacity:1}";p(this,"@-webkit-keyframes "+y+"{"+t+"}@keyframes "+y+"{"+t+"}."+x+"{-webkit-animation:"+y+" 0.001s;animation:"+y+" 0.001s;}")},acquireContext:function(t,e){"string"==typeof t?t=document.getElementById(t):t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas);var n=t&&t.getContext&&t.getContext("2d");return n&&n.canvas===t?(a(t,e),n):null},releaseContext:function(t){var e=t.canvas;if(e[m]){var n=e[m].initial;["height","width"].forEach(function(t){var i=n[t];v.isNullOrUndef(i)?e.removeAttribute(t):e.setAttribute(t,i)}),v.each(n.style||{},function(t,n){e.style[n]=t}),e.width=e.width,delete e[m]}},addEventListener:function(t,e,n){var i=t.canvas;if("resize"!==e){var a=n[m]||(n[m]={});o(i,e,(a.proxies||(a.proxies={}))[t.id+"_"+e]=function(e){n(s(e,t))})}else f(i,n,t)},removeEventListener:function(t,e,n){var i=t.canvas;if("resize"!==e){var a=((n[m]||{}).proxies||{})[t.id+"_"+e];a&&r(i,e,a)}else g(i)}},v.addEvent=o,v.removeEvent=r},{45:45}],48:[function(t,e,n){"use strict";var i=t(45),a=t(46),o=t(47),r=o._enabled?o:a;e.exports=i.extend({initialize:function(){},acquireContext:function(){},releaseContext:function(){},addEventListener:function(){},removeEventListener:function(){}},r)},{45:45,46:46,47:47}],49:[function(t,e,n){"use strict";var i=t(25),a=t(40),o=t(45);i._set("global",{plugins:{filler:{propagate:!0}}}),e.exports=function(){function t(t,e,n){var i,a=t._model||{},o=a.fill;if(void 0===o&&(o=!!a.backgroundColor),!1===o||null===o)return!1;if(!0===o)return"origin";if(i=parseFloat(o,10),isFinite(i)&&Math.floor(i)===i)return"-"!==o[0]&&"+"!==o[0]||(i=e+i),!(i===e||i<0||i>=n)&&i;switch(o){case"bottom":return"start";case"top":return"end";case"zero":return"origin";case"origin":case"start":case"end":return o;default:return!1}}function e(t){var e,n=t.el._model||{},i=t.el._scale||{},a=t.fill,o=null;if(isFinite(a))return null;if("start"===a?o=void 0===n.scaleBottom?i.bottom:n.scaleBottom:"end"===a?o=void 0===n.scaleTop?i.top:n.scaleTop:void 0!==n.scaleZero?o=n.scaleZero:i.getBasePosition?o=i.getBasePosition():i.getBasePixel&&(o=i.getBasePixel()),void 0!==o&&null!==o){if(void 0!==o.x&&void 0!==o.y)return o;if("number"==typeof o&&isFinite(o))return e=i.isHorizontal(),{x:e?o:null,y:e?null:o}}return null}function n(t,e,n){var i,a=t[e].fill,o=[e];if(!n)return a;for(;!1!==a&&-1===o.indexOf(a);){if(!isFinite(a))return a;if(!(i=t[a]))return!1;if(i.visible)return a;o.push(a),a=i.fill}return!1}function r(t){var e=t.fill,n="dataset";return!1===e?null:(isFinite(e)||(n="boundary"),d[n](t))}function l(t){return t&&!t.skip}function s(t,e,n,i,a){var r;if(i&&a){for(t.moveTo(e[0].x,e[0].y),r=1;r0;--r)o.canvas.lineTo(t,n[r],n[r-1],!0)}}function u(t,e,n,i,a,o){var r,u,d,c,h,f,g,p=e.length,v=i.spanGaps,m=[],b=[],x=0,y=0;for(t.beginPath(),r=0,u=p+!!o;r');for(var n=0;n'),t.data.datasets[n].label&&e.push(t.data.datasets[n].label),e.push("");return e.push(""),e.join("")}}),e.exports=function(t){function e(t,e){return t.usePointStyle?e*Math.SQRT2:t.boxWidth}function n(e,n){var i=new t.Legend({ctx:e.ctx,options:n,chart:e});r.configure(e,i,n),r.addBox(e,i),e.legend=i}var r=t.layoutService,l=o.noop;return t.Legend=a.extend({initialize:function(t){o.extend(this,t),this.legendHitBoxes=[],this.doughnutMode=!1},beforeUpdate:l,update:function(t,e,n){var i=this;return i.beforeUpdate(),i.maxWidth=t,i.maxHeight=e,i.margins=n,i.beforeSetDimensions(),i.setDimensions(),i.afterSetDimensions(),i.beforeBuildLabels(),i.buildLabels(),i.afterBuildLabels(),i.beforeFit(),i.fit(),i.afterFit(),i.afterUpdate(),i.minSize},afterUpdate:l,beforeSetDimensions:l,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:l,beforeBuildLabels:l,buildLabels:function(){var t=this,e=t.options.labels||{},n=o.callback(e.generateLabels,[t.chart],t)||[];e.filter&&(n=n.filter(function(n){return e.filter(n,t.chart.data)})),t.options.reverse&&n.reverse(),t.legendItems=n},afterBuildLabels:l,beforeFit:l,fit:function(){var t=this,n=t.options,a=n.labels,r=n.display,l=t.ctx,s=i.global,u=o.valueOrDefault,d=u(a.fontSize,s.defaultFontSize),c=u(a.fontStyle,s.defaultFontStyle),h=u(a.fontFamily,s.defaultFontFamily),f=o.fontString(d,c,h),g=t.legendHitBoxes=[],p=t.minSize,v=t.isHorizontal();if(v?(p.width=t.maxWidth,p.height=r?10:0):(p.width=r?10:0,p.height=t.maxHeight),r)if(l.font=f,v){var m=t.lineWidths=[0],b=t.legendItems.length?d+a.padding:0;l.textAlign="left",l.textBaseline="top",o.each(t.legendItems,function(n,i){var o=e(a,d)+d/2+l.measureText(n.text).width;m[m.length-1]+o+a.padding>=t.width&&(b+=d+a.padding,m[m.length]=t.left),g[i]={left:0,top:0,width:o,height:d},m[m.length-1]+=o+a.padding}),p.height+=b}else{var x=a.padding,y=t.columnWidths=[],k=a.padding,w=0,M=0,S=d+x;o.each(t.legendItems,function(t,n){var i=e(a,d)+d/2+l.measureText(t.text).width;M+S>p.height&&(k+=w+a.padding,y.push(w),w=0,M=0),w=Math.max(w,i),M+=S,g[n]={left:0,top:0,width:i,height:d}}),k+=w,y.push(w),p.width+=k}t.width=p.width,t.height=p.height},afterFit:l,isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},draw:function(){var t=this,n=t.options,a=n.labels,r=i.global,l=r.elements.line,s=t.width,u=t.lineWidths;if(n.display){var d,c=t.ctx,h=o.valueOrDefault,f=h(a.fontColor,r.defaultFontColor),g=h(a.fontSize,r.defaultFontSize),p=h(a.fontStyle,r.defaultFontStyle),v=h(a.fontFamily,r.defaultFontFamily),m=o.fontString(g,p,v);c.textAlign="left",c.textBaseline="middle",c.lineWidth=.5,c.strokeStyle=f,c.fillStyle=f,c.font=m;var b=e(a,g),x=t.legendHitBoxes,y=function(t,e,i){if(!(isNaN(b)||b<=0)){c.save(),c.fillStyle=h(i.fillStyle,r.defaultColor),c.lineCap=h(i.lineCap,l.borderCapStyle),c.lineDashOffset=h(i.lineDashOffset,l.borderDashOffset),c.lineJoin=h(i.lineJoin,l.borderJoinStyle),c.lineWidth=h(i.lineWidth,l.borderWidth),c.strokeStyle=h(i.strokeStyle,r.defaultColor);var a=0===h(i.lineWidth,l.borderWidth);if(c.setLineDash&&c.setLineDash(h(i.lineDash,l.borderDash)),n.labels&&n.labels.usePointStyle){var s=g*Math.SQRT2/2,u=s/Math.SQRT2,d=t+u,f=e+u;o.canvas.drawPoint(c,i.pointStyle,s,d,f)}else a||c.strokeRect(t,e,b,g),c.fillRect(t,e,b,g);c.restore()}},k=function(t,e,n,i){var a=g/2,o=b+a+t,r=e+a;c.fillText(n.text,o,r),n.hidden&&(c.beginPath(),c.lineWidth=2,c.moveTo(o,r),c.lineTo(o+i,r),c.stroke())},w=t.isHorizontal();d=w?{x:t.left+(s-u[0])/2,y:t.top+a.padding,line:0}:{x:t.left+a.padding,y:t.top+a.padding,line:0};var M=g+a.padding;o.each(t.legendItems,function(e,n){var i=c.measureText(e.text).width,o=b+g/2+i,r=d.x,l=d.y;w?r+o>=s&&(l=d.y+=M,d.line++,r=d.x=t.left+(s-u[d.line])/2):l+M>t.bottom&&(r=d.x=r+t.columnWidths[d.line]+a.padding,l=d.y=t.top+a.padding,d.line++),y(r,l,e),x[n].left=r,x[n].top=l,k(r,l,e,i),w?d.x+=o+a.padding:d.y+=M})}},handleEvent:function(t){var e=this,n=e.options,i="mouseup"===t.type?"click":t.type,a=!1;if("mousemove"===i){if(!n.onHover)return}else{if("click"!==i)return;if(!n.onClick)return}var o=t.x,r=t.y;if(o>=e.left&&o<=e.right&&r>=e.top&&r<=e.bottom)for(var l=e.legendHitBoxes,s=0;s=u.left&&o<=u.left+u.width&&r>=u.top&&r<=u.top+u.height){if("click"===i){n.onClick.call(e,t.native,e.legendItems[s]),a=!0;break}if("mousemove"===i){n.onHover.call(e,t.native,e.legendItems[s]),a=!0;break}}}return a}}),{id:"legend",beforeInit:function(t){var e=t.options.legend;e&&n(t,e)},beforeUpdate:function(t){var e=t.options.legend,a=t.legend;e?(o.mergeIf(e,i.global.legend),a?(r.configure(t,a,e),a.options=e):n(t,e)):a&&(r.removeBox(t,a),delete t.legend)},afterEvent:function(t,e){var n=t.legend;n&&n.handleEvent(e)}}}},{25:25,26:26,45:45}],51:[function(t,e,n){"use strict";var i=t(25),a=t(26),o=t(45);i._set("global",{title:{display:!1,fontStyle:"bold",fullWidth:!0,lineHeight:1.2,padding:10,position:"top",text:"",weight:2e3}}),e.exports=function(t){function e(e,i){var a=new t.Title({ctx:e.ctx,options:i,chart:e});n.configure(e,a,i),n.addBox(e,a),e.titleBlock=a}var n=t.layoutService,r=o.noop;return t.Title=a.extend({initialize:function(t){var e=this;o.extend(e,t),e.legendHitBoxes=[]},beforeUpdate:r,update:function(t,e,n){var i=this;return i.beforeUpdate(),i.maxWidth=t,i.maxHeight=e,i.margins=n,i.beforeSetDimensions(),i.setDimensions(),i.afterSetDimensions(),i.beforeBuildLabels(),i.buildLabels(),i.afterBuildLabels(),i.beforeFit(),i.fit(),i.afterFit(),i.afterUpdate(),i.minSize},afterUpdate:r,beforeSetDimensions:r,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:r,beforeBuildLabels:r,buildLabels:r,afterBuildLabels:r,beforeFit:r,fit:function(){var t=this,e=o.valueOrDefault,n=t.options,a=n.display,r=e(n.fontSize,i.global.defaultFontSize),l=t.minSize,s=o.isArray(n.text)?n.text.length:1,u=o.options.toLineHeight(n.lineHeight,r),d=a?s*u+2*n.padding:0;t.isHorizontal()?(l.width=t.maxWidth,l.height=d):(l.width=d,l.height=t.maxHeight),t.width=l.width,t.height=l.height},afterFit:r,isHorizontal:function(){var t=this.options.position;return"top"===t||"bottom"===t},draw:function(){var t=this,e=t.ctx,n=o.valueOrDefault,a=t.options,r=i.global;if(a.display){var l,s,u,d=n(a.fontSize,r.defaultFontSize),c=n(a.fontStyle,r.defaultFontStyle),h=n(a.fontFamily,r.defaultFontFamily),f=o.fontString(d,c,h),g=o.options.toLineHeight(a.lineHeight,d),p=g/2+a.padding,v=0,m=t.top,b=t.left,x=t.bottom,y=t.right;e.fillStyle=n(a.fontColor,r.defaultFontColor),e.font=f,t.isHorizontal()?(s=b+(y-b)/2,u=m+p,l=y-b):(s="left"===a.position?b+p:y-p,u=m+(x-m)/2,l=x-m,v=Math.PI*("left"===a.position?-.5:.5)),e.save(),e.translate(s,u),e.rotate(v),e.textAlign="center",e.textBaseline="middle";var k=a.text;if(o.isArray(k))for(var w=0,M=0;Me.max&&(e.max=i))})});e.min=isFinite(e.min)&&!isNaN(e.min)?e.min:0,e.max=isFinite(e.max)&&!isNaN(e.max)?e.max:1,this.handleTickRangeOptions()},getTickLimit:function(){var t,e=this,n=e.options.ticks;if(e.isHorizontal())t=Math.min(n.maxTicksLimit?n.maxTicksLimit:11,Math.ceil(e.width/50));else{var o=a.valueOrDefault(n.fontSize,i.global.defaultFontSize);t=Math.min(n.maxTicksLimit?n.maxTicksLimit:11,Math.ceil(e.height/(2*o)))}return t},handleDirectionalChanges:function(){this.isHorizontal()||this.ticks.reverse()},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},getPixelForValue:function(t){var e,n=this,i=n.start,a=+n.getRightValue(t),o=n.end-i;return n.isHorizontal()?(e=n.left+n.width/o*(a-i),Math.round(e)):(e=n.bottom-n.height/o*(a-i),Math.round(e))},getValueForPixel:function(t){var e=this,n=e.isHorizontal(),i=n?e.width:e.height,a=(n?t-e.left:e.bottom-t)/i;return e.start+(e.end-e.start)*a},getPixelForTick:function(t){return this.getPixelForValue(this.ticksAsNumbers[t])}});t.scaleService.registerScaleType("linear",n,e)}},{25:25,34:34,45:45}],54:[function(t,e,n){"use strict";var i=t(45),a=t(34);e.exports=function(t){var e=i.noop;t.LinearScaleBase=t.Scale.extend({getRightValue:function(e){return"string"==typeof e?+e:t.Scale.prototype.getRightValue.call(this,e)},handleTickRangeOptions:function(){var t=this,e=t.options.ticks;if(e.beginAtZero){var n=i.sign(t.min),a=i.sign(t.max);n<0&&a<0?t.max=0:n>0&&a>0&&(t.min=0)}var o=void 0!==e.min||void 0!==e.suggestedMin,r=void 0!==e.max||void 0!==e.suggestedMax;void 0!==e.min?t.min=e.min:void 0!==e.suggestedMin&&(null===t.min?t.min=e.suggestedMin:t.min=Math.min(t.min,e.suggestedMin)),void 0!==e.max?t.max=e.max:void 0!==e.suggestedMax&&(null===t.max?t.max=e.suggestedMax:t.max=Math.max(t.max,e.suggestedMax)),o!==r&&t.min>=t.max&&(o?t.max=t.min+1:t.min=t.max-1),t.min===t.max&&(t.max++,e.beginAtZero||t.min--)},getTickLimit:e,handleDirectionalChanges:e,buildTicks:function(){var t=this,e=t.options.ticks,n=t.getTickLimit(),o={maxTicks:n=Math.max(2,n),min:e.min,max:e.max,stepSize:i.valueOrDefault(e.fixedStepSize,e.stepSize)},r=t.ticks=a.generators.linear(o,t);t.handleDirectionalChanges(),t.max=i.max(r),t.min=i.min(r),e.reverse?(r.reverse(),t.start=t.max,t.end=t.min):(t.start=t.min,t.end=t.max)},convertTicksToLabels:function(){var e=this;e.ticksAsNumbers=e.ticks.slice(),e.zeroLineIndex=e.ticks.indexOf(0),t.Scale.prototype.convertTicksToLabels.call(e)}})}},{34:34,45:45}],55:[function(t,e,n){"use strict";var i=t(45),a=t(34);e.exports=function(t){var e={position:"left",ticks:{callback:a.formatters.logarithmic}},n=t.Scale.extend({determineDataLimits:function(){function t(t){return s?t.xAxisID===e.id:t.yAxisID===e.id}var e=this,n=e.options,a=n.ticks,o=e.chart,r=o.data.datasets,l=i.valueOrDefault,s=e.isHorizontal();e.min=null,e.max=null,e.minNotZero=null;var u=n.stacked;if(void 0===u&&i.each(r,function(e,n){if(!u){var i=o.getDatasetMeta(n);o.isDatasetVisible(n)&&t(i)&&void 0!==i.stack&&(u=!0)}}),n.stacked||u){var d={};i.each(r,function(a,r){var l=o.getDatasetMeta(r),s=[l.type,void 0===n.stacked&&void 0===l.stack?r:"",l.stack].join(".");o.isDatasetVisible(r)&&t(l)&&(void 0===d[s]&&(d[s]=[]),i.each(a.data,function(t,i){var a=d[s],o=+e.getRightValue(t);isNaN(o)||l.data[i].hidden||(a[i]=a[i]||0,n.relativePoints?a[i]=100:a[i]+=o)}))}),i.each(d,function(t){var n=i.min(t),a=i.max(t);e.min=null===e.min?n:Math.min(e.min,n),e.max=null===e.max?a:Math.max(e.max,a)})}else i.each(r,function(n,a){var r=o.getDatasetMeta(a);o.isDatasetVisible(a)&&t(r)&&i.each(n.data,function(t,n){var i=+e.getRightValue(t);isNaN(i)||r.data[n].hidden||(null===e.min?e.min=i:ie.max&&(e.max=i),0!==i&&(null===e.minNotZero||ia?{start:e-n-5,end:e}:{start:e,end:e+n+5}}function s(t){var i,o,s,u=n(t),d=Math.min(t.height/2,t.width/2),c={r:t.width,l:0,t:t.height,b:0},h={};t.ctx.font=u.font,t._pointLabelSizes=[];var f=e(t);for(i=0;ic.r&&(c.r=v.end,h.r=g),m.startc.b&&(c.b=m.end,h.b=g)}t.setReductions(d,c,h)}function u(t){var e=Math.min(t.height/2,t.width/2);t.drawingArea=Math.round(e),t.setCenterPoint(0,0,0,0)}function d(t){return 0===t||180===t?"center":t<180?"left":"right"}function c(t,e,n,i){if(a.isArray(e))for(var o=n.y,r=1.5*i,l=0;l270||t<90)&&(n.y-=e.h)}function f(t){var i=t.ctx,o=a.valueOrDefault,r=t.options,l=r.angleLines,s=r.pointLabels;i.lineWidth=l.lineWidth,i.strokeStyle=l.color;var u=t.getDistanceFromCenterForValue(r.ticks.reverse?t.min:t.max),f=n(t);i.textBaseline="top";for(var g=e(t)-1;g>=0;g--){if(l.display){var p=t.getPointPosition(g,u);i.beginPath(),i.moveTo(t.xCenter,t.yCenter),i.lineTo(p.x,p.y),i.stroke(),i.closePath()}if(s.display){var m=t.getPointPosition(g,u+5),b=o(s.fontColor,v.defaultFontColor);i.font=f.font,i.fillStyle=b;var x=t.getIndexAngle(g),y=a.toDegrees(x);i.textAlign=d(y),h(y,t._pointLabelSizes[g],m),c(i,t.pointLabels[g]||"",m,f.size)}}}function g(t,n,i,o){var r=t.ctx;if(r.strokeStyle=a.valueAtIndexOrDefault(n.color,o-1),r.lineWidth=a.valueAtIndexOrDefault(n.lineWidth,o-1),t.options.gridLines.circular)r.beginPath(),r.arc(t.xCenter,t.yCenter,i,0,2*Math.PI),r.closePath(),r.stroke();else{var l=e(t);if(0===l)return;r.beginPath();var s=t.getPointPosition(0,i);r.moveTo(s.x,s.y);for(var u=1;u0&&n>0?e:0)},draw:function(){var t=this,e=t.options,n=e.gridLines,i=e.ticks,o=a.valueOrDefault;if(e.display){var r=t.ctx,l=this.getIndexAngle(0),s=o(i.fontSize,v.defaultFontSize),u=o(i.fontStyle,v.defaultFontStyle),d=o(i.fontFamily,v.defaultFontFamily),c=a.fontString(s,u,d);a.each(t.ticks,function(e,a){if(a>0||i.reverse){var u=t.getDistanceFromCenterForValue(t.ticksAsNumbers[a]);if(n.display&&0!==a&&g(t,n,u,a),i.display){var d=o(i.fontColor,v.defaultFontColor);if(r.font=c,r.save(),r.translate(t.xCenter,t.yCenter),r.rotate(l),i.showLabelBackdrop){var h=r.measureText(e).width;r.fillStyle=i.backdropColor,r.fillRect(-h/2-i.backdropPaddingX,-u-s/2-i.backdropPaddingY,h+2*i.backdropPaddingX,s+2*i.backdropPaddingY)}r.textAlign="center",r.textBaseline="middle",r.fillStyle=d,r.fillText(e,0,-u),r.restore()}}}),(e.angleLines.display||e.pointLabels.display)&&f(t)}}});t.scaleService.registerScaleType("radialLinear",b,m)}},{25:25,34:34,45:45}],57:[function(t,e,n){"use strict";function i(t,e){return t-e}function a(t){var e,n,i,a={},o=[];for(e=0,n=t.length;ee&&l=0&&r<=l;){if(i=r+l>>1,a=t[i-1]||null,o=t[i],!a)return{lo:null,hi:o};if(o[e]n))return{lo:a,hi:o};l=i-1}}return{lo:o,hi:null}}function l(t,e,n,i){var a=r(t,e,n),o=a.lo?a.hi?a.lo:t[t.length-2]:t[0],l=a.lo?a.hi?a.hi:t[t.length-1]:t[1],s=l[e]-o[e],u=s?(n-o[e])/s:0,d=(l[i]-o[i])*u;return o[i]+d}function s(t,e){var n=e.parser,i=e.parser||e.format;return"function"==typeof n?n(t):"string"==typeof t&&"string"==typeof i?m(t,i):(t instanceof m||(t=m(t)),t.isValid()?t:"function"==typeof i?i(t):t)}function u(t,e){if(x.isNullOrUndef(t))return null;var n=e.options.time,i=s(e.getRightValue(t),n);return i.isValid()?(n.round&&i.startOf(n.round),i.valueOf()):null}function d(t,e,n,i){var a,o,r,l=e-t,s=w[n],u=s.size,d=s.steps;if(!d)return Math.ceil(l/((i||1)*u));for(a=0,o=d.length;a=M.indexOf(e);a--)if(o=M[a],w[o].common&&r.as(o)>=t.length)return o;return M[e?M.indexOf(e):0]}function f(t){for(var e=M.indexOf(t)+1,n=M.length;e1?e[1]:i,r=e[0],s=(l(t,"time",o,"pos")-l(t,"time",r,"pos"))/2),a.time.max||(o=e[e.length-1],r=e.length>1?e[e.length-2]:n,u=(l(t,"time",o,"pos")-l(t,"time",r,"pos"))/2)),{left:s,right:u}}function v(t,e){var n,i,a,o,r=[];for(n=0,i=t.length;n=a&&n<=r&&c.push(n);return i.min=a,i.max=r,i._unit=s.unit||h(c,s.minUnit,i.min,i.max),i._majorUnit=f(i._unit),i._table=o(i._timestamps.data,a,r,l.distribution),i._offsets=p(i._table,c,a,r,l),v(c,i._majorUnit)},getLabelForIndex:function(t,e){var n=this,i=n.chart.data,a=n.options.time,o=i.labels&&t=0&&t li { + position: relative; } + +.fa-li { + left: -2em; + position: absolute; + text-align: center; + width: 2em; + line-height: inherit; } + +.fa-border { + border: solid 0.08em #eee; + border-radius: .1em; + padding: .2em .25em .15em; } + +.fa-pull-left { + float: left; } + +.fa-pull-right { + float: right; } + +.fa.fa-pull-left, +.fas.fa-pull-left, +.far.fa-pull-left, +.fal.fa-pull-left, +.fab.fa-pull-left { + margin-right: .3em; } + +.fa.fa-pull-right, +.fas.fa-pull-right, +.far.fa-pull-right, +.fal.fa-pull-right, +.fab.fa-pull-right { + margin-left: .3em; } + +.fa-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; } + +.fa-pulse { + -webkit-animation: fa-spin 1s infinite steps(8); + animation: fa-spin 1s infinite steps(8); } + +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); } + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); } } + +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); } + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); } } + +.fa-rotate-90 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; + -webkit-transform: rotate(90deg); + transform: rotate(90deg); } + +.fa-rotate-180 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; + -webkit-transform: rotate(180deg); + transform: rotate(180deg); } + +.fa-rotate-270 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; + -webkit-transform: rotate(270deg); + transform: rotate(270deg); } + +.fa-flip-horizontal { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; + -webkit-transform: scale(-1, 1); + transform: scale(-1, 1); } + +.fa-flip-vertical { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; + -webkit-transform: scale(1, -1); + transform: scale(1, -1); } + +.fa-flip-horizontal.fa-flip-vertical { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; + -webkit-transform: scale(-1, -1); + transform: scale(-1, -1); } + +:root .fa-rotate-90, +:root .fa-rotate-180, +:root .fa-rotate-270, +:root .fa-flip-horizontal, +:root .fa-flip-vertical { + -webkit-filter: none; + filter: none; } + +.fa-stack { + display: inline-block; + height: 2em; + line-height: 2em; + position: relative; + vertical-align: middle; + width: 2em; } + +.fa-stack-1x, +.fa-stack-2x { + left: 0; + position: absolute; + text-align: center; + width: 100%; } + +.fa-stack-1x { + line-height: inherit; } + +.fa-stack-2x { + font-size: 2em; } + +.fa-inverse { + color: #fff; } + +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen +readers do not read off random characters that represent icons */ +.fa-500px:before { + content: "\f26e"; } + +.fa-accessible-icon:before { + content: "\f368"; } + +.fa-accusoft:before { + content: "\f369"; } + +.fa-address-book:before { + content: "\f2b9"; } + +.fa-address-card:before { + content: "\f2bb"; } + +.fa-adjust:before { + content: "\f042"; } + +.fa-adn:before { + content: "\f170"; } + +.fa-adversal:before { + content: "\f36a"; } + +.fa-affiliatetheme:before { + content: "\f36b"; } + +.fa-algolia:before { + content: "\f36c"; } + +.fa-align-center:before { + content: "\f037"; } + +.fa-align-justify:before { + content: "\f039"; } + +.fa-align-left:before { + content: "\f036"; } + +.fa-align-right:before { + content: "\f038"; } + +.fa-amazon:before { + content: "\f270"; } + +.fa-amazon-pay:before { + content: "\f42c"; } + +.fa-ambulance:before { + content: "\f0f9"; } + +.fa-american-sign-language-interpreting:before { + content: "\f2a3"; } + +.fa-amilia:before { + content: "\f36d"; } + +.fa-anchor:before { + content: "\f13d"; } + +.fa-android:before { + content: "\f17b"; } + +.fa-angellist:before { + content: "\f209"; } + +.fa-angle-double-down:before { + content: "\f103"; } + +.fa-angle-double-left:before { + content: "\f100"; } + +.fa-angle-double-right:before { + content: "\f101"; } + +.fa-angle-double-up:before { + content: "\f102"; } + +.fa-angle-down:before { + content: "\f107"; } + +.fa-angle-left:before { + content: "\f104"; } + +.fa-angle-right:before { + content: "\f105"; } + +.fa-angle-up:before { + content: "\f106"; } + +.fa-angrycreative:before { + content: "\f36e"; } + +.fa-angular:before { + content: "\f420"; } + +.fa-app-store:before { + content: "\f36f"; } + +.fa-app-store-ios:before { + content: "\f370"; } + +.fa-apper:before { + content: "\f371"; } + +.fa-apple:before { + content: "\f179"; } + +.fa-apple-pay:before { + content: "\f415"; } + +.fa-archive:before { + content: "\f187"; } + +.fa-arrow-alt-circle-down:before { + content: "\f358"; } + +.fa-arrow-alt-circle-left:before { + content: "\f359"; } + +.fa-arrow-alt-circle-right:before { + content: "\f35a"; } + +.fa-arrow-alt-circle-up:before { + content: "\f35b"; } + +.fa-arrow-circle-down:before { + content: "\f0ab"; } + +.fa-arrow-circle-left:before { + content: "\f0a8"; } + +.fa-arrow-circle-right:before { + content: "\f0a9"; } + +.fa-arrow-circle-up:before { + content: "\f0aa"; } + +.fa-arrow-down:before { + content: "\f063"; } + +.fa-arrow-left:before { + content: "\f060"; } + +.fa-arrow-right:before { + content: "\f061"; } + +.fa-arrow-up:before { + content: "\f062"; } + +.fa-arrows-alt:before { + content: "\f0b2"; } + +.fa-arrows-alt-h:before { + content: "\f337"; } + +.fa-arrows-alt-v:before { + content: "\f338"; } + +.fa-assistive-listening-systems:before { + content: "\f2a2"; } + +.fa-asterisk:before { + content: "\f069"; } + +.fa-asymmetrik:before { + content: "\f372"; } + +.fa-at:before { + content: "\f1fa"; } + +.fa-audible:before { + content: "\f373"; } + +.fa-audio-description:before { + content: "\f29e"; } + +.fa-autoprefixer:before { + content: "\f41c"; } + +.fa-avianex:before { + content: "\f374"; } + +.fa-aviato:before { + content: "\f421"; } + +.fa-aws:before { + content: "\f375"; } + +.fa-backward:before { + content: "\f04a"; } + +.fa-balance-scale:before { + content: "\f24e"; } + +.fa-ban:before { + content: "\f05e"; } + +.fa-bandcamp:before { + content: "\f2d5"; } + +.fa-barcode:before { + content: "\f02a"; } + +.fa-bars:before { + content: "\f0c9"; } + +.fa-bath:before { + content: "\f2cd"; } + +.fa-battery-empty:before { + content: "\f244"; } + +.fa-battery-full:before { + content: "\f240"; } + +.fa-battery-half:before { + content: "\f242"; } + +.fa-battery-quarter:before { + content: "\f243"; } + +.fa-battery-three-quarters:before { + content: "\f241"; } + +.fa-bed:before { + content: "\f236"; } + +.fa-beer:before { + content: "\f0fc"; } + +.fa-behance:before { + content: "\f1b4"; } + +.fa-behance-square:before { + content: "\f1b5"; } + +.fa-bell:before { + content: "\f0f3"; } + +.fa-bell-slash:before { + content: "\f1f6"; } + +.fa-bicycle:before { + content: "\f206"; } + +.fa-bimobject:before { + content: "\f378"; } + +.fa-binoculars:before { + content: "\f1e5"; } + +.fa-birthday-cake:before { + content: "\f1fd"; } + +.fa-bitbucket:before { + content: "\f171"; } + +.fa-bitcoin:before { + content: "\f379"; } + +.fa-bity:before { + content: "\f37a"; } + +.fa-black-tie:before { + content: "\f27e"; } + +.fa-blackberry:before { + content: "\f37b"; } + +.fa-blind:before { + content: "\f29d"; } + +.fa-blogger:before { + content: "\f37c"; } + +.fa-blogger-b:before { + content: "\f37d"; } + +.fa-bluetooth:before { + content: "\f293"; } + +.fa-bluetooth-b:before { + content: "\f294"; } + +.fa-bold:before { + content: "\f032"; } + +.fa-bolt:before { + content: "\f0e7"; } + +.fa-bomb:before { + content: "\f1e2"; } + +.fa-book:before { + content: "\f02d"; } + +.fa-bookmark:before { + content: "\f02e"; } + +.fa-braille:before { + content: "\f2a1"; } + +.fa-briefcase:before { + content: "\f0b1"; } + +.fa-btc:before { + content: "\f15a"; } + +.fa-bug:before { + content: "\f188"; } + +.fa-building:before { + content: "\f1ad"; } + +.fa-bullhorn:before { + content: "\f0a1"; } + +.fa-bullseye:before { + content: "\f140"; } + +.fa-buromobelexperte:before { + content: "\f37f"; } + +.fa-bus:before { + content: "\f207"; } + +.fa-buysellads:before { + content: "\f20d"; } + +.fa-calculator:before { + content: "\f1ec"; } + +.fa-calendar:before { + content: "\f133"; } + +.fa-calendar-alt:before { + content: "\f073"; } + +.fa-calendar-check:before { + content: "\f274"; } + +.fa-calendar-minus:before { + content: "\f272"; } + +.fa-calendar-plus:before { + content: "\f271"; } + +.fa-calendar-times:before { + content: "\f273"; } + +.fa-camera:before { + content: "\f030"; } + +.fa-camera-retro:before { + content: "\f083"; } + +.fa-car:before { + content: "\f1b9"; } + +.fa-caret-down:before { + content: "\f0d7"; } + +.fa-caret-left:before { + content: "\f0d9"; } + +.fa-caret-right:before { + content: "\f0da"; } + +.fa-caret-square-down:before { + content: "\f150"; } + +.fa-caret-square-left:before { + content: "\f191"; } + +.fa-caret-square-right:before { + content: "\f152"; } + +.fa-caret-square-up:before { + content: "\f151"; } + +.fa-caret-up:before { + content: "\f0d8"; } + +.fa-cart-arrow-down:before { + content: "\f218"; } + +.fa-cart-plus:before { + content: "\f217"; } + +.fa-cc-amazon-pay:before { + content: "\f42d"; } + +.fa-cc-amex:before { + content: "\f1f3"; } + +.fa-cc-apple-pay:before { + content: "\f416"; } + +.fa-cc-diners-club:before { + content: "\f24c"; } + +.fa-cc-discover:before { + content: "\f1f2"; } + +.fa-cc-jcb:before { + content: "\f24b"; } + +.fa-cc-mastercard:before { + content: "\f1f1"; } + +.fa-cc-paypal:before { + content: "\f1f4"; } + +.fa-cc-stripe:before { + content: "\f1f5"; } + +.fa-cc-visa:before { + content: "\f1f0"; } + +.fa-centercode:before { + content: "\f380"; } + +.fa-certificate:before { + content: "\f0a3"; } + +.fa-chart-area:before { + content: "\f1fe"; } + +.fa-chart-bar:before { + content: "\f080"; } + +.fa-chart-line:before { + content: "\f201"; } + +.fa-chart-pie:before { + content: "\f200"; } + +.fa-check:before { + content: "\f00c"; } + +.fa-check-circle:before { + content: "\f058"; } + +.fa-check-square:before { + content: "\f14a"; } + +.fa-chevron-circle-down:before { + content: "\f13a"; } + +.fa-chevron-circle-left:before { + content: "\f137"; } + +.fa-chevron-circle-right:before { + content: "\f138"; } + +.fa-chevron-circle-up:before { + content: "\f139"; } + +.fa-chevron-down:before { + content: "\f078"; } + +.fa-chevron-left:before { + content: "\f053"; } + +.fa-chevron-right:before { + content: "\f054"; } + +.fa-chevron-up:before { + content: "\f077"; } + +.fa-child:before { + content: "\f1ae"; } + +.fa-chrome:before { + content: "\f268"; } + +.fa-circle:before { + content: "\f111"; } + +.fa-circle-notch:before { + content: "\f1ce"; } + +.fa-clipboard:before { + content: "\f328"; } + +.fa-clock:before { + content: "\f017"; } + +.fa-clone:before { + content: "\f24d"; } + +.fa-closed-captioning:before { + content: "\f20a"; } + +.fa-cloud:before { + content: "\f0c2"; } + +.fa-cloud-download-alt:before { + content: "\f381"; } + +.fa-cloud-upload-alt:before { + content: "\f382"; } + +.fa-cloudscale:before { + content: "\f383"; } + +.fa-cloudsmith:before { + content: "\f384"; } + +.fa-cloudversify:before { + content: "\f385"; } + +.fa-code:before { + content: "\f121"; } + +.fa-code-branch:before { + content: "\f126"; } + +.fa-codepen:before { + content: "\f1cb"; } + +.fa-codiepie:before { + content: "\f284"; } + +.fa-coffee:before { + content: "\f0f4"; } + +.fa-cog:before { + content: "\f013"; } + +.fa-cogs:before { + content: "\f085"; } + +.fa-columns:before { + content: "\f0db"; } + +.fa-comment:before { + content: "\f075"; } + +.fa-comment-alt:before { + content: "\f27a"; } + +.fa-comments:before { + content: "\f086"; } + +.fa-compass:before { + content: "\f14e"; } + +.fa-compress:before { + content: "\f066"; } + +.fa-connectdevelop:before { + content: "\f20e"; } + +.fa-contao:before { + content: "\f26d"; } + +.fa-copy:before { + content: "\f0c5"; } + +.fa-copyright:before { + content: "\f1f9"; } + +.fa-cpanel:before { + content: "\f388"; } + +.fa-creative-commons:before { + content: "\f25e"; } + +.fa-credit-card:before { + content: "\f09d"; } + +.fa-crop:before { + content: "\f125"; } + +.fa-crosshairs:before { + content: "\f05b"; } + +.fa-css3:before { + content: "\f13c"; } + +.fa-css3-alt:before { + content: "\f38b"; } + +.fa-cube:before { + content: "\f1b2"; } + +.fa-cubes:before { + content: "\f1b3"; } + +.fa-cut:before { + content: "\f0c4"; } + +.fa-cuttlefish:before { + content: "\f38c"; } + +.fa-d-and-d:before { + content: "\f38d"; } + +.fa-dashcube:before { + content: "\f210"; } + +.fa-database:before { + content: "\f1c0"; } + +.fa-deaf:before { + content: "\f2a4"; } + +.fa-delicious:before { + content: "\f1a5"; } + +.fa-deploydog:before { + content: "\f38e"; } + +.fa-deskpro:before { + content: "\f38f"; } + +.fa-desktop:before { + content: "\f108"; } + +.fa-deviantart:before { + content: "\f1bd"; } + +.fa-digg:before { + content: "\f1a6"; } + +.fa-digital-ocean:before { + content: "\f391"; } + +.fa-discord:before { + content: "\f392"; } + +.fa-discourse:before { + content: "\f393"; } + +.fa-dochub:before { + content: "\f394"; } + +.fa-docker:before { + content: "\f395"; } + +.fa-dollar-sign:before { + content: "\f155"; } + +.fa-dot-circle:before { + content: "\f192"; } + +.fa-download:before { + content: "\f019"; } + +.fa-draft2digital:before { + content: "\f396"; } + +.fa-dribbble:before { + content: "\f17d"; } + +.fa-dribbble-square:before { + content: "\f397"; } + +.fa-dropbox:before { + content: "\f16b"; } + +.fa-drupal:before { + content: "\f1a9"; } + +.fa-dyalog:before { + content: "\f399"; } + +.fa-earlybirds:before { + content: "\f39a"; } + +.fa-edge:before { + content: "\f282"; } + +.fa-edit:before { + content: "\f044"; } + +.fa-eject:before { + content: "\f052"; } + +.fa-ellipsis-h:before { + content: "\f141"; } + +.fa-ellipsis-v:before { + content: "\f142"; } + +.fa-ember:before { + content: "\f423"; } + +.fa-empire:before { + content: "\f1d1"; } + +.fa-envelope:before { + content: "\f0e0"; } + +.fa-envelope-open:before { + content: "\f2b6"; } + +.fa-envelope-square:before { + content: "\f199"; } + +.fa-envira:before { + content: "\f299"; } + +.fa-eraser:before { + content: "\f12d"; } + +.fa-erlang:before { + content: "\f39d"; } + +.fa-ethereum:before { + content: "\f42e"; } + +.fa-etsy:before { + content: "\f2d7"; } + +.fa-euro-sign:before { + content: "\f153"; } + +.fa-exchange-alt:before { + content: "\f362"; } + +.fa-exclamation:before { + content: "\f12a"; } + +.fa-exclamation-circle:before { + content: "\f06a"; } + +.fa-exclamation-triangle:before { + content: "\f071"; } + +.fa-expand:before { + content: "\f065"; } + +.fa-expand-arrows-alt:before { + content: "\f31e"; } + +.fa-expeditedssl:before { + content: "\f23e"; } + +.fa-external-link-alt:before { + content: "\f35d"; } + +.fa-external-link-square-alt:before { + content: "\f360"; } + +.fa-eye:before { + content: "\f06e"; } + +.fa-eye-dropper:before { + content: "\f1fb"; } + +.fa-eye-slash:before { + content: "\f070"; } + +.fa-facebook:before { + content: "\f09a"; } + +.fa-facebook-f:before { + content: "\f39e"; } + +.fa-facebook-messenger:before { + content: "\f39f"; } + +.fa-facebook-square:before { + content: "\f082"; } + +.fa-fast-backward:before { + content: "\f049"; } + +.fa-fast-forward:before { + content: "\f050"; } + +.fa-fax:before { + content: "\f1ac"; } + +.fa-female:before { + content: "\f182"; } + +.fa-fighter-jet:before { + content: "\f0fb"; } + +.fa-file:before { + content: "\f15b"; } + +.fa-file-alt:before { + content: "\f15c"; } + +.fa-file-archive:before { + content: "\f1c6"; } + +.fa-file-audio:before { + content: "\f1c7"; } + +.fa-file-code:before { + content: "\f1c9"; } + +.fa-file-excel:before { + content: "\f1c3"; } + +.fa-file-image:before { + content: "\f1c5"; } + +.fa-file-pdf:before { + content: "\f1c1"; } + +.fa-file-powerpoint:before { + content: "\f1c4"; } + +.fa-file-video:before { + content: "\f1c8"; } + +.fa-file-word:before { + content: "\f1c2"; } + +.fa-film:before { + content: "\f008"; } + +.fa-filter:before { + content: "\f0b0"; } + +.fa-fire:before { + content: "\f06d"; } + +.fa-fire-extinguisher:before { + content: "\f134"; } + +.fa-firefox:before { + content: "\f269"; } + +.fa-first-order:before { + content: "\f2b0"; } + +.fa-firstdraft:before { + content: "\f3a1"; } + +.fa-flag:before { + content: "\f024"; } + +.fa-flag-checkered:before { + content: "\f11e"; } + +.fa-flask:before { + content: "\f0c3"; } + +.fa-flickr:before { + content: "\f16e"; } + +.fa-fly:before { + content: "\f417"; } + +.fa-folder:before { + content: "\f07b"; } + +.fa-folder-open:before { + content: "\f07c"; } + +.fa-font:before { + content: "\f031"; } + +.fa-font-awesome:before { + content: "\f2b4"; } + +.fa-font-awesome-alt:before { + content: "\f35c"; } + +.fa-font-awesome-flag:before { + content: "\f425"; } + +.fa-fonticons:before { + content: "\f280"; } + +.fa-fonticons-fi:before { + content: "\f3a2"; } + +.fa-fort-awesome:before { + content: "\f286"; } + +.fa-fort-awesome-alt:before { + content: "\f3a3"; } + +.fa-forumbee:before { + content: "\f211"; } + +.fa-forward:before { + content: "\f04e"; } + +.fa-foursquare:before { + content: "\f180"; } + +.fa-free-code-camp:before { + content: "\f2c5"; } + +.fa-freebsd:before { + content: "\f3a4"; } + +.fa-frown:before { + content: "\f119"; } + +.fa-futbol:before { + content: "\f1e3"; } + +.fa-gamepad:before { + content: "\f11b"; } + +.fa-gavel:before { + content: "\f0e3"; } + +.fa-gem:before { + content: "\f3a5"; } + +.fa-genderless:before { + content: "\f22d"; } + +.fa-get-pocket:before { + content: "\f265"; } + +.fa-gg:before { + content: "\f260"; } + +.fa-gg-circle:before { + content: "\f261"; } + +.fa-gift:before { + content: "\f06b"; } + +.fa-git:before { + content: "\f1d3"; } + +.fa-git-square:before { + content: "\f1d2"; } + +.fa-github:before { + content: "\f09b"; } + +.fa-github-alt:before { + content: "\f113"; } + +.fa-github-square:before { + content: "\f092"; } + +.fa-gitkraken:before { + content: "\f3a6"; } + +.fa-gitlab:before { + content: "\f296"; } + +.fa-gitter:before { + content: "\f426"; } + +.fa-glass-martini:before { + content: "\f000"; } + +.fa-glide:before { + content: "\f2a5"; } + +.fa-glide-g:before { + content: "\f2a6"; } + +.fa-globe:before { + content: "\f0ac"; } + +.fa-gofore:before { + content: "\f3a7"; } + +.fa-goodreads:before { + content: "\f3a8"; } + +.fa-goodreads-g:before { + content: "\f3a9"; } + +.fa-google:before { + content: "\f1a0"; } + +.fa-google-drive:before { + content: "\f3aa"; } + +.fa-google-play:before { + content: "\f3ab"; } + +.fa-google-plus:before { + content: "\f2b3"; } + +.fa-google-plus-g:before { + content: "\f0d5"; } + +.fa-google-plus-square:before { + content: "\f0d4"; } + +.fa-google-wallet:before { + content: "\f1ee"; } + +.fa-graduation-cap:before { + content: "\f19d"; } + +.fa-gratipay:before { + content: "\f184"; } + +.fa-grav:before { + content: "\f2d6"; } + +.fa-gripfire:before { + content: "\f3ac"; } + +.fa-grunt:before { + content: "\f3ad"; } + +.fa-gulp:before { + content: "\f3ae"; } + +.fa-h-square:before { + content: "\f0fd"; } + +.fa-hacker-news:before { + content: "\f1d4"; } + +.fa-hacker-news-square:before { + content: "\f3af"; } + +.fa-hand-lizard:before { + content: "\f258"; } + +.fa-hand-paper:before { + content: "\f256"; } + +.fa-hand-peace:before { + content: "\f25b"; } + +.fa-hand-point-down:before { + content: "\f0a7"; } + +.fa-hand-point-left:before { + content: "\f0a5"; } + +.fa-hand-point-right:before { + content: "\f0a4"; } + +.fa-hand-point-up:before { + content: "\f0a6"; } + +.fa-hand-pointer:before { + content: "\f25a"; } + +.fa-hand-rock:before { + content: "\f255"; } + +.fa-hand-scissors:before { + content: "\f257"; } + +.fa-hand-spock:before { + content: "\f259"; } + +.fa-handshake:before { + content: "\f2b5"; } + +.fa-hashtag:before { + content: "\f292"; } + +.fa-hdd:before { + content: "\f0a0"; } + +.fa-heading:before { + content: "\f1dc"; } + +.fa-headphones:before { + content: "\f025"; } + +.fa-heart:before { + content: "\f004"; } + +.fa-heartbeat:before { + content: "\f21e"; } + +.fa-hire-a-helper:before { + content: "\f3b0"; } + +.fa-history:before { + content: "\f1da"; } + +.fa-home:before { + content: "\f015"; } + +.fa-hooli:before { + content: "\f427"; } + +.fa-hospital:before { + content: "\f0f8"; } + +.fa-hotjar:before { + content: "\f3b1"; } + +.fa-hourglass:before { + content: "\f254"; } + +.fa-hourglass-end:before { + content: "\f253"; } + +.fa-hourglass-half:before { + content: "\f252"; } + +.fa-hourglass-start:before { + content: "\f251"; } + +.fa-houzz:before { + content: "\f27c"; } + +.fa-html5:before { + content: "\f13b"; } + +.fa-hubspot:before { + content: "\f3b2"; } + +.fa-i-cursor:before { + content: "\f246"; } + +.fa-id-badge:before { + content: "\f2c1"; } + +.fa-id-card:before { + content: "\f2c2"; } + +.fa-image:before { + content: "\f03e"; } + +.fa-images:before { + content: "\f302"; } + +.fa-imdb:before { + content: "\f2d8"; } + +.fa-inbox:before { + content: "\f01c"; } + +.fa-indent:before { + content: "\f03c"; } + +.fa-industry:before { + content: "\f275"; } + +.fa-info:before { + content: "\f129"; } + +.fa-info-circle:before { + content: "\f05a"; } + +.fa-instagram:before { + content: "\f16d"; } + +.fa-internet-explorer:before { + content: "\f26b"; } + +.fa-ioxhost:before { + content: "\f208"; } + +.fa-italic:before { + content: "\f033"; } + +.fa-itunes:before { + content: "\f3b4"; } + +.fa-itunes-note:before { + content: "\f3b5"; } + +.fa-jenkins:before { + content: "\f3b6"; } + +.fa-joget:before { + content: "\f3b7"; } + +.fa-joomla:before { + content: "\f1aa"; } + +.fa-js:before { + content: "\f3b8"; } + +.fa-js-square:before { + content: "\f3b9"; } + +.fa-jsfiddle:before { + content: "\f1cc"; } + +.fa-key:before { + content: "\f084"; } + +.fa-keyboard:before { + content: "\f11c"; } + +.fa-keycdn:before { + content: "\f3ba"; } + +.fa-kickstarter:before { + content: "\f3bb"; } + +.fa-kickstarter-k:before { + content: "\f3bc"; } + +.fa-korvue:before { + content: "\f42f"; } + +.fa-language:before { + content: "\f1ab"; } + +.fa-laptop:before { + content: "\f109"; } + +.fa-laravel:before { + content: "\f3bd"; } + +.fa-lastfm:before { + content: "\f202"; } + +.fa-lastfm-square:before { + content: "\f203"; } + +.fa-leaf:before { + content: "\f06c"; } + +.fa-leanpub:before { + content: "\f212"; } + +.fa-lemon:before { + content: "\f094"; } + +.fa-less:before { + content: "\f41d"; } + +.fa-level-down-alt:before { + content: "\f3be"; } + +.fa-level-up-alt:before { + content: "\f3bf"; } + +.fa-life-ring:before { + content: "\f1cd"; } + +.fa-lightbulb:before { + content: "\f0eb"; } + +.fa-line:before { + content: "\f3c0"; } + +.fa-link:before { + content: "\f0c1"; } + +.fa-linkedin:before { + content: "\f08c"; } + +.fa-linkedin-in:before { + content: "\f0e1"; } + +.fa-linode:before { + content: "\f2b8"; } + +.fa-linux:before { + content: "\f17c"; } + +.fa-lira-sign:before { + content: "\f195"; } + +.fa-list:before { + content: "\f03a"; } + +.fa-list-alt:before { + content: "\f022"; } + +.fa-list-ol:before { + content: "\f0cb"; } + +.fa-list-ul:before { + content: "\f0ca"; } + +.fa-location-arrow:before { + content: "\f124"; } + +.fa-lock:before { + content: "\f023"; } + +.fa-lock-open:before { + content: "\f3c1"; } + +.fa-long-arrow-alt-down:before { + content: "\f309"; } + +.fa-long-arrow-alt-left:before { + content: "\f30a"; } + +.fa-long-arrow-alt-right:before { + content: "\f30b"; } + +.fa-long-arrow-alt-up:before { + content: "\f30c"; } + +.fa-low-vision:before { + content: "\f2a8"; } + +.fa-lyft:before { + content: "\f3c3"; } + +.fa-magento:before { + content: "\f3c4"; } + +.fa-magic:before { + content: "\f0d0"; } + +.fa-magnet:before { + content: "\f076"; } + +.fa-male:before { + content: "\f183"; } + +.fa-map:before { + content: "\f279"; } + +.fa-map-marker:before { + content: "\f041"; } + +.fa-map-marker-alt:before { + content: "\f3c5"; } + +.fa-map-pin:before { + content: "\f276"; } + +.fa-map-signs:before { + content: "\f277"; } + +.fa-mars:before { + content: "\f222"; } + +.fa-mars-double:before { + content: "\f227"; } + +.fa-mars-stroke:before { + content: "\f229"; } + +.fa-mars-stroke-h:before { + content: "\f22b"; } + +.fa-mars-stroke-v:before { + content: "\f22a"; } + +.fa-maxcdn:before { + content: "\f136"; } + +.fa-medapps:before { + content: "\f3c6"; } + +.fa-medium:before { + content: "\f23a"; } + +.fa-medium-m:before { + content: "\f3c7"; } + +.fa-medkit:before { + content: "\f0fa"; } + +.fa-medrt:before { + content: "\f3c8"; } + +.fa-meetup:before { + content: "\f2e0"; } + +.fa-meh:before { + content: "\f11a"; } + +.fa-mercury:before { + content: "\f223"; } + +.fa-microchip:before { + content: "\f2db"; } + +.fa-microphone:before { + content: "\f130"; } + +.fa-microphone-slash:before { + content: "\f131"; } + +.fa-microsoft:before { + content: "\f3ca"; } + +.fa-minus:before { + content: "\f068"; } + +.fa-minus-circle:before { + content: "\f056"; } + +.fa-minus-square:before { + content: "\f146"; } + +.fa-mix:before { + content: "\f3cb"; } + +.fa-mixcloud:before { + content: "\f289"; } + +.fa-mizuni:before { + content: "\f3cc"; } + +.fa-mobile:before { + content: "\f10b"; } + +.fa-mobile-alt:before { + content: "\f3cd"; } + +.fa-modx:before { + content: "\f285"; } + +.fa-monero:before { + content: "\f3d0"; } + +.fa-money-bill-alt:before { + content: "\f3d1"; } + +.fa-moon:before { + content: "\f186"; } + +.fa-motorcycle:before { + content: "\f21c"; } + +.fa-mouse-pointer:before { + content: "\f245"; } + +.fa-music:before { + content: "\f001"; } + +.fa-napster:before { + content: "\f3d2"; } + +.fa-neuter:before { + content: "\f22c"; } + +.fa-newspaper:before { + content: "\f1ea"; } + +.fa-nintendo-switch:before { + content: "\f418"; } + +.fa-node:before { + content: "\f419"; } + +.fa-node-js:before { + content: "\f3d3"; } + +.fa-npm:before { + content: "\f3d4"; } + +.fa-ns8:before { + content: "\f3d5"; } + +.fa-nutritionix:before { + content: "\f3d6"; } + +.fa-object-group:before { + content: "\f247"; } + +.fa-object-ungroup:before { + content: "\f248"; } + +.fa-odnoklassniki:before { + content: "\f263"; } + +.fa-odnoklassniki-square:before { + content: "\f264"; } + +.fa-opencart:before { + content: "\f23d"; } + +.fa-openid:before { + content: "\f19b"; } + +.fa-opera:before { + content: "\f26a"; } + +.fa-optin-monster:before { + content: "\f23c"; } + +.fa-osi:before { + content: "\f41a"; } + +.fa-outdent:before { + content: "\f03b"; } + +.fa-page4:before { + content: "\f3d7"; } + +.fa-pagelines:before { + content: "\f18c"; } + +.fa-paint-brush:before { + content: "\f1fc"; } + +.fa-palfed:before { + content: "\f3d8"; } + +.fa-paper-plane:before { + content: "\f1d8"; } + +.fa-paperclip:before { + content: "\f0c6"; } + +.fa-paragraph:before { + content: "\f1dd"; } + +.fa-paste:before { + content: "\f0ea"; } + +.fa-patreon:before { + content: "\f3d9"; } + +.fa-pause:before { + content: "\f04c"; } + +.fa-pause-circle:before { + content: "\f28b"; } + +.fa-paw:before { + content: "\f1b0"; } + +.fa-paypal:before { + content: "\f1ed"; } + +.fa-pen-square:before { + content: "\f14b"; } + +.fa-pencil-alt:before { + content: "\f303"; } + +.fa-percent:before { + content: "\f295"; } + +.fa-periscope:before { + content: "\f3da"; } + +.fa-phabricator:before { + content: "\f3db"; } + +.fa-phoenix-framework:before { + content: "\f3dc"; } + +.fa-phone:before { + content: "\f095"; } + +.fa-phone-square:before { + content: "\f098"; } + +.fa-phone-volume:before { + content: "\f2a0"; } + +.fa-pied-piper:before { + content: "\f2ae"; } + +.fa-pied-piper-alt:before { + content: "\f1a8"; } + +.fa-pied-piper-pp:before { + content: "\f1a7"; } + +.fa-pinterest:before { + content: "\f0d2"; } + +.fa-pinterest-p:before { + content: "\f231"; } + +.fa-pinterest-square:before { + content: "\f0d3"; } + +.fa-plane:before { + content: "\f072"; } + +.fa-play:before { + content: "\f04b"; } + +.fa-play-circle:before { + content: "\f144"; } + +.fa-playstation:before { + content: "\f3df"; } + +.fa-plug:before { + content: "\f1e6"; } + +.fa-plus:before { + content: "\f067"; } + +.fa-plus-circle:before { + content: "\f055"; } + +.fa-plus-square:before { + content: "\f0fe"; } + +.fa-podcast:before { + content: "\f2ce"; } + +.fa-pound-sign:before { + content: "\f154"; } + +.fa-power-off:before { + content: "\f011"; } + +.fa-print:before { + content: "\f02f"; } + +.fa-product-hunt:before { + content: "\f288"; } + +.fa-pushed:before { + content: "\f3e1"; } + +.fa-puzzle-piece:before { + content: "\f12e"; } + +.fa-python:before { + content: "\f3e2"; } + +.fa-qq:before { + content: "\f1d6"; } + +.fa-qrcode:before { + content: "\f029"; } + +.fa-question:before { + content: "\f128"; } + +.fa-question-circle:before { + content: "\f059"; } + +.fa-quora:before { + content: "\f2c4"; } + +.fa-quote-left:before { + content: "\f10d"; } + +.fa-quote-right:before { + content: "\f10e"; } + +.fa-random:before { + content: "\f074"; } + +.fa-ravelry:before { + content: "\f2d9"; } + +.fa-react:before { + content: "\f41b"; } + +.fa-rebel:before { + content: "\f1d0"; } + +.fa-recycle:before { + content: "\f1b8"; } + +.fa-red-river:before { + content: "\f3e3"; } + +.fa-reddit:before { + content: "\f1a1"; } + +.fa-reddit-alien:before { + content: "\f281"; } + +.fa-reddit-square:before { + content: "\f1a2"; } + +.fa-redo:before { + content: "\f01e"; } + +.fa-redo-alt:before { + content: "\f2f9"; } + +.fa-registered:before { + content: "\f25d"; } + +.fa-rendact:before { + content: "\f3e4"; } + +.fa-renren:before { + content: "\f18b"; } + +.fa-reply:before { + content: "\f3e5"; } + +.fa-reply-all:before { + content: "\f122"; } + +.fa-replyd:before { + content: "\f3e6"; } + +.fa-resolving:before { + content: "\f3e7"; } + +.fa-retweet:before { + content: "\f079"; } + +.fa-road:before { + content: "\f018"; } + +.fa-rocket:before { + content: "\f135"; } + +.fa-rocketchat:before { + content: "\f3e8"; } + +.fa-rockrms:before { + content: "\f3e9"; } + +.fa-rss:before { + content: "\f09e"; } + +.fa-rss-square:before { + content: "\f143"; } + +.fa-ruble-sign:before { + content: "\f158"; } + +.fa-rupee-sign:before { + content: "\f156"; } + +.fa-safari:before { + content: "\f267"; } + +.fa-sass:before { + content: "\f41e"; } + +.fa-save:before { + content: "\f0c7"; } + +.fa-schlix:before { + content: "\f3ea"; } + +.fa-scribd:before { + content: "\f28a"; } + +.fa-search:before { + content: "\f002"; } + +.fa-search-minus:before { + content: "\f010"; } + +.fa-search-plus:before { + content: "\f00e"; } + +.fa-searchengin:before { + content: "\f3eb"; } + +.fa-sellcast:before { + content: "\f2da"; } + +.fa-sellsy:before { + content: "\f213"; } + +.fa-server:before { + content: "\f233"; } + +.fa-servicestack:before { + content: "\f3ec"; } + +.fa-share:before { + content: "\f064"; } + +.fa-share-alt:before { + content: "\f1e0"; } + +.fa-share-alt-square:before { + content: "\f1e1"; } + +.fa-share-square:before { + content: "\f14d"; } + +.fa-shekel-sign:before { + content: "\f20b"; } + +.fa-shield-alt:before { + content: "\f3ed"; } + +.fa-ship:before { + content: "\f21a"; } + +.fa-shirtsinbulk:before { + content: "\f214"; } + +.fa-shopping-bag:before { + content: "\f290"; } + +.fa-shopping-basket:before { + content: "\f291"; } + +.fa-shopping-cart:before { + content: "\f07a"; } + +.fa-shower:before { + content: "\f2cc"; } + +.fa-sign-in-alt:before { + content: "\f2f6"; } + +.fa-sign-language:before { + content: "\f2a7"; } + +.fa-sign-out-alt:before { + content: "\f2f5"; } + +.fa-signal:before { + content: "\f012"; } + +.fa-simplybuilt:before { + content: "\f215"; } + +.fa-sistrix:before { + content: "\f3ee"; } + +.fa-sitemap:before { + content: "\f0e8"; } + +.fa-skyatlas:before { + content: "\f216"; } + +.fa-skype:before { + content: "\f17e"; } + +.fa-slack:before { + content: "\f198"; } + +.fa-slack-hash:before { + content: "\f3ef"; } + +.fa-sliders-h:before { + content: "\f1de"; } + +.fa-slideshare:before { + content: "\f1e7"; } + +.fa-smile:before { + content: "\f118"; } + +.fa-snapchat:before { + content: "\f2ab"; } + +.fa-snapchat-ghost:before { + content: "\f2ac"; } + +.fa-snapchat-square:before { + content: "\f2ad"; } + +.fa-snowflake:before { + content: "\f2dc"; } + +.fa-sort:before { + content: "\f0dc"; } + +.fa-sort-alpha-down:before { + content: "\f15d"; } + +.fa-sort-alpha-up:before { + content: "\f15e"; } + +.fa-sort-amount-down:before { + content: "\f160"; } + +.fa-sort-amount-up:before { + content: "\f161"; } + +.fa-sort-down:before { + content: "\f0dd"; } + +.fa-sort-numeric-down:before { + content: "\f162"; } + +.fa-sort-numeric-up:before { + content: "\f163"; } + +.fa-sort-up:before { + content: "\f0de"; } + +.fa-soundcloud:before { + content: "\f1be"; } + +.fa-space-shuttle:before { + content: "\f197"; } + +.fa-speakap:before { + content: "\f3f3"; } + +.fa-spinner:before { + content: "\f110"; } + +.fa-spotify:before { + content: "\f1bc"; } + +.fa-square:before { + content: "\f0c8"; } + +.fa-stack-exchange:before { + content: "\f18d"; } + +.fa-stack-overflow:before { + content: "\f16c"; } + +.fa-star:before { + content: "\f005"; } + +.fa-star-half:before { + content: "\f089"; } + +.fa-staylinked:before { + content: "\f3f5"; } + +.fa-steam:before { + content: "\f1b6"; } + +.fa-steam-square:before { + content: "\f1b7"; } + +.fa-steam-symbol:before { + content: "\f3f6"; } + +.fa-step-backward:before { + content: "\f048"; } + +.fa-step-forward:before { + content: "\f051"; } + +.fa-stethoscope:before { + content: "\f0f1"; } + +.fa-sticker-mule:before { + content: "\f3f7"; } + +.fa-sticky-note:before { + content: "\f249"; } + +.fa-stop:before { + content: "\f04d"; } + +.fa-stop-circle:before { + content: "\f28d"; } + +.fa-stopwatch:before { + content: "\f2f2"; } + +.fa-strava:before { + content: "\f428"; } + +.fa-street-view:before { + content: "\f21d"; } + +.fa-strikethrough:before { + content: "\f0cc"; } + +.fa-stripe:before { + content: "\f429"; } + +.fa-stripe-s:before { + content: "\f42a"; } + +.fa-studiovinari:before { + content: "\f3f8"; } + +.fa-stumbleupon:before { + content: "\f1a4"; } + +.fa-stumbleupon-circle:before { + content: "\f1a3"; } + +.fa-subscript:before { + content: "\f12c"; } + +.fa-subway:before { + content: "\f239"; } + +.fa-suitcase:before { + content: "\f0f2"; } + +.fa-sun:before { + content: "\f185"; } + +.fa-superpowers:before { + content: "\f2dd"; } + +.fa-superscript:before { + content: "\f12b"; } + +.fa-supple:before { + content: "\f3f9"; } + +.fa-sync:before { + content: "\f021"; } + +.fa-sync-alt:before { + content: "\f2f1"; } + +.fa-table:before { + content: "\f0ce"; } + +.fa-tablet:before { + content: "\f10a"; } + +.fa-tablet-alt:before { + content: "\f3fa"; } + +.fa-tachometer-alt:before { + content: "\f3fd"; } + +.fa-tag:before { + content: "\f02b"; } + +.fa-tags:before { + content: "\f02c"; } + +.fa-tasks:before { + content: "\f0ae"; } + +.fa-taxi:before { + content: "\f1ba"; } + +.fa-telegram:before { + content: "\f2c6"; } + +.fa-telegram-plane:before { + content: "\f3fe"; } + +.fa-tencent-weibo:before { + content: "\f1d5"; } + +.fa-terminal:before { + content: "\f120"; } + +.fa-text-height:before { + content: "\f034"; } + +.fa-text-width:before { + content: "\f035"; } + +.fa-th:before { + content: "\f00a"; } + +.fa-th-large:before { + content: "\f009"; } + +.fa-th-list:before { + content: "\f00b"; } + +.fa-themeisle:before { + content: "\f2b2"; } + +.fa-thermometer-empty:before { + content: "\f2cb"; } + +.fa-thermometer-full:before { + content: "\f2c7"; } + +.fa-thermometer-half:before { + content: "\f2c9"; } + +.fa-thermometer-quarter:before { + content: "\f2ca"; } + +.fa-thermometer-three-quarters:before { + content: "\f2c8"; } + +.fa-thumbs-down:before { + content: "\f165"; } + +.fa-thumbs-up:before { + content: "\f164"; } + +.fa-thumbtack:before { + content: "\f08d"; } + +.fa-ticket-alt:before { + content: "\f3ff"; } + +.fa-times:before { + content: "\f00d"; } + +.fa-times-circle:before { + content: "\f057"; } + +.fa-tint:before { + content: "\f043"; } + +.fa-toggle-off:before { + content: "\f204"; } + +.fa-toggle-on:before { + content: "\f205"; } + +.fa-trademark:before { + content: "\f25c"; } + +.fa-train:before { + content: "\f238"; } + +.fa-transgender:before { + content: "\f224"; } + +.fa-transgender-alt:before { + content: "\f225"; } + +.fa-trash:before { + content: "\f1f8"; } + +.fa-trash-alt:before { + content: "\f2ed"; } + +.fa-tree:before { + content: "\f1bb"; } + +.fa-trello:before { + content: "\f181"; } + +.fa-tripadvisor:before { + content: "\f262"; } + +.fa-trophy:before { + content: "\f091"; } + +.fa-truck:before { + content: "\f0d1"; } + +.fa-tty:before { + content: "\f1e4"; } + +.fa-tumblr:before { + content: "\f173"; } + +.fa-tumblr-square:before { + content: "\f174"; } + +.fa-tv:before { + content: "\f26c"; } + +.fa-twitch:before { + content: "\f1e8"; } + +.fa-twitter:before { + content: "\f099"; } + +.fa-twitter-square:before { + content: "\f081"; } + +.fa-typo3:before { + content: "\f42b"; } + +.fa-uber:before { + content: "\f402"; } + +.fa-uikit:before { + content: "\f403"; } + +.fa-umbrella:before { + content: "\f0e9"; } + +.fa-underline:before { + content: "\f0cd"; } + +.fa-undo:before { + content: "\f0e2"; } + +.fa-undo-alt:before { + content: "\f2ea"; } + +.fa-uniregistry:before { + content: "\f404"; } + +.fa-universal-access:before { + content: "\f29a"; } + +.fa-university:before { + content: "\f19c"; } + +.fa-unlink:before { + content: "\f127"; } + +.fa-unlock:before { + content: "\f09c"; } + +.fa-unlock-alt:before { + content: "\f13e"; } + +.fa-untappd:before { + content: "\f405"; } + +.fa-upload:before { + content: "\f093"; } + +.fa-usb:before { + content: "\f287"; } + +.fa-user:before { + content: "\f007"; } + +.fa-user-circle:before { + content: "\f2bd"; } + +.fa-user-md:before { + content: "\f0f0"; } + +.fa-user-plus:before { + content: "\f234"; } + +.fa-user-secret:before { + content: "\f21b"; } + +.fa-user-times:before { + content: "\f235"; } + +.fa-users:before { + content: "\f0c0"; } + +.fa-ussunnah:before { + content: "\f407"; } + +.fa-utensil-spoon:before { + content: "\f2e5"; } + +.fa-utensils:before { + content: "\f2e7"; } + +.fa-vaadin:before { + content: "\f408"; } + +.fa-venus:before { + content: "\f221"; } + +.fa-venus-double:before { + content: "\f226"; } + +.fa-venus-mars:before { + content: "\f228"; } + +.fa-viacoin:before { + content: "\f237"; } + +.fa-viadeo:before { + content: "\f2a9"; } + +.fa-viadeo-square:before { + content: "\f2aa"; } + +.fa-viber:before { + content: "\f409"; } + +.fa-video:before { + content: "\f03d"; } + +.fa-vimeo:before { + content: "\f40a"; } + +.fa-vimeo-square:before { + content: "\f194"; } + +.fa-vimeo-v:before { + content: "\f27d"; } + +.fa-vine:before { + content: "\f1ca"; } + +.fa-vk:before { + content: "\f189"; } + +.fa-vnv:before { + content: "\f40b"; } + +.fa-volume-down:before { + content: "\f027"; } + +.fa-volume-off:before { + content: "\f026"; } + +.fa-volume-up:before { + content: "\f028"; } + +.fa-vuejs:before { + content: "\f41f"; } + +.fa-weibo:before { + content: "\f18a"; } + +.fa-weixin:before { + content: "\f1d7"; } + +.fa-whatsapp:before { + content: "\f232"; } + +.fa-whatsapp-square:before { + content: "\f40c"; } + +.fa-wheelchair:before { + content: "\f193"; } + +.fa-whmcs:before { + content: "\f40d"; } + +.fa-wifi:before { + content: "\f1eb"; } + +.fa-wikipedia-w:before { + content: "\f266"; } + +.fa-window-close:before { + content: "\f410"; } + +.fa-window-maximize:before { + content: "\f2d0"; } + +.fa-window-minimize:before { + content: "\f2d1"; } + +.fa-window-restore:before { + content: "\f2d2"; } + +.fa-windows:before { + content: "\f17a"; } + +.fa-won-sign:before { + content: "\f159"; } + +.fa-wordpress:before { + content: "\f19a"; } + +.fa-wordpress-simple:before { + content: "\f411"; } + +.fa-wpbeginner:before { + content: "\f297"; } + +.fa-wpexplorer:before { + content: "\f2de"; } + +.fa-wpforms:before { + content: "\f298"; } + +.fa-wrench:before { + content: "\f0ad"; } + +.fa-xbox:before { + content: "\f412"; } + +.fa-xing:before { + content: "\f168"; } + +.fa-xing-square:before { + content: "\f169"; } + +.fa-y-combinator:before { + content: "\f23b"; } + +.fa-yahoo:before { + content: "\f19e"; } + +.fa-yandex:before { + content: "\f413"; } + +.fa-yandex-international:before { + content: "\f414"; } + +.fa-yelp:before { + content: "\f1e9"; } + +.fa-yen-sign:before { + content: "\f157"; } + +.fa-yoast:before { + content: "\f2b1"; } + +.fa-youtube:before { + content: "\f167"; } + +.sr-only { + border: 0; + clip: rect(0, 0, 0, 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; } + +.sr-only-focusable:active, .sr-only-focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; } +@font-face { + font-family: 'Font Awesome 5 Brands'; + font-style: normal; + font-weight: normal; + src: url("../webfonts/fa-brands-400.eot"); + src: url("../webfonts/fa-brands-400.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.woff") format("woff"), url("../webfonts/fa-brands-400.ttf") format("truetype"), url("../webfonts/fa-brands-400.svg#fontawesome") format("svg"); } + +.fab { + font-family: 'Font Awesome 5 Brands'; } +@font-face { + font-family: 'Font Awesome 5 Free'; + font-style: normal; + font-weight: 400; + src: url("../webfonts/fa-regular-400.eot"); + src: url("../webfonts/fa-regular-400.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.woff") format("woff"), url("../webfonts/fa-regular-400.ttf") format("truetype"), url("../webfonts/fa-regular-400.svg#fontawesome") format("svg"); } + +.far { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } +@font-face { + font-family: 'Font Awesome 5 Free'; + font-style: normal; + font-weight: 900; + src: url("../webfonts/fa-solid-900.eot"); + src: url("../webfonts/fa-solid-900.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.woff") format("woff"), url("../webfonts/fa-solid-900.ttf") format("truetype"), url("../webfonts/fa-solid-900.svg#fontawesome") format("svg"); } + +.fa, +.fas { + font-family: 'Font Awesome 5 Free'; + font-weight: 900; } diff --git a/generator-web/target/classes/static/vendor/font-awesome/css/fontawesome-all.min.css b/generator-web/target/classes/static/vendor/font-awesome/css/fontawesome-all.min.css new file mode 100644 index 0000000..4c6c943 --- /dev/null +++ b/generator-web/target/classes/static/vendor/font-awesome/css/fontawesome-all.min.css @@ -0,0 +1,5 @@ +/*! + * Font Awesome Free 5.0.2 by @fontawesome - http://fontawesome.com + * License - http://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +.fa,.fab,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:a 2s infinite linear;animation:a 2s infinite linear}.fa-pulse{-webkit-animation:a 1s infinite steps(8);animation:a 1s infinite steps(8)}@-webkit-keyframes a{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes a{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-aws:before{content:"\f375"}.fa-backward:before{content:"\f04a"}.fa-balance-scale:before{content:"\f24e"}.fa-ban:before{content:"\f05e"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bicycle:before{content:"\f206"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blind:before{content:"\f29d"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-braille:before{content:"\f2a1"}.fa-briefcase:before{content:"\f0b1"}.fa-btc:before{content:"\f15a"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-car:before{content:"\f1b9"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-certificate:before{content:"\f0a3"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-square:before{content:"\f14a"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-clipboard:before{content:"\f328"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comments:before{content:"\f086"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-credit-card:before{content:"\f09d"}.fa-crop:before{content:"\f125"}.fa-crosshairs:before{content:"\f05b"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-deviantart:before{content:"\f1bd"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dollar-sign:before{content:"\f155"}.fa-dot-circle:before{content:"\f192"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drupal:before{content:"\f1a9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-eject:before{content:"\f052"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-excel:before{content:"\f1c3"}.fa-file-image:before{content:"\f1c5"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fire:before{content:"\f06d"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-first-order:before{content:"\f2b0"}.fa-firstdraft:before{content:"\f3a1"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frown:before{content:"\f119"}.fa-futbol:before{content:"\f1e3"}.fa-gamepad:before{content:"\f11b"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-gift:before{content:"\f06b"}.fa-git:before{content:"\f1d3"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-martini:before{content:"\f000"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-gofore:before{content:"\f3a7"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-handshake:before{content:"\f2b5"}.fa-hashtag:before{content:"\f292"}.fa-hdd:before{content:"\f0a0"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-heart:before{content:"\f004"}.fa-heartbeat:before{content:"\f21e"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hospital:before{content:"\f0f8"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-houzz:before{content:"\f27c"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-internet-explorer:before{content:"\f26b"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-jenkins:before{content:"\f3b6"}.fa-joget:before{content:"\f3b7"}.fa-joomla:before{content:"\f1aa"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-key:before{content:"\f084"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-korvue:before{content:"\f42f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-male:before{content:"\f183"}.fa-map:before{content:"\f279"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-maxcdn:before{content:"\f136"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-meh:before{content:"\f11a"}.fa-mercury:before{content:"\f223"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-moon:before{content:"\f186"}.fa-motorcycle:before{content:"\f21c"}.fa-mouse-pointer:before{content:"\f245"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nintendo-switch:before{content:"\f418"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-osi:before{content:"\f41a"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-paint-brush:before{content:"\f1fc"}.fa-palfed:before{content:"\f3d8"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-paragraph:before{content:"\f1dd"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-percent:before{content:"\f295"}.fa-periscope:before{content:"\f3da"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phone:before{content:"\f095"}.fa-phone-square:before{content:"\f098"}.fa-phone-volume:before{content:"\f2a0"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-plane:before{content:"\f072"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-print:before{content:"\f02f"}.fa-product-hunt:before{content:"\f288"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-random:before{content:"\f074"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-rebel:before{content:"\f1d0"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-rendact:before{content:"\f3e4"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-resolving:before{content:"\f3e7"}.fa-retweet:before{content:"\f079"}.fa-road:before{content:"\f018"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-rupee-sign:before{content:"\f156"}.fa-safari:before{content:"\f267"}.fa-sass:before{content:"\f41e"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-scribd:before{content:"\f28a"}.fa-search:before{content:"\f002"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before{content:"\f21a"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shower:before{content:"\f2cc"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowflake:before{content:"\f2dc"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-spinner:before{content:"\f110"}.fa-spotify:before{content:"\f1bc"}.fa-square:before{content:"\f0c8"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-star:before{content:"\f005"}.fa-star-half:before{content:"\f089"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-strava:before{content:"\f428"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-table:before{content:"\f0ce"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-trademark:before{content:"\f25c"}.fa-train:before{content:"\f238"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-uikit:before{content:"\f403"}.fa-umbrella:before{content:"\f0e9"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-circle:before{content:"\f2bd"}.fa-user-md:before{content:"\f0f0"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-volume-down:before{content:"\f027"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vuejs:before{content:"\f41f"}.fa-weibo:before{content:"\f18a"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wrench:before{content:"\f0ad"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:Font Awesome\ 5 Brands;font-style:normal;font-weight:400;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:Font Awesome\ 5 Brands}@font-face{font-family:Font Awesome\ 5 Free;font-style:normal;font-weight:400;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}.far{font-weight:400}@font-face{font-family:Font Awesome\ 5 Free;font-style:normal;font-weight:900;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.far,.fas{font-family:Font Awesome\ 5 Free}.fa,.fas{font-weight:900} \ No newline at end of file diff --git a/generator-web/target/classes/static/vendor/font-awesome/css/fontawesome.css b/generator-web/target/classes/static/vendor/font-awesome/css/fontawesome.css new file mode 100644 index 0000000..3f52059 --- /dev/null +++ b/generator-web/target/classes/static/vendor/font-awesome/css/fontawesome.css @@ -0,0 +1,2573 @@ +/*! + * Font Awesome Free 5.0.2 by @fontawesome - http://fontawesome.com + * License - http://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +.fa, +.fas, +.far, +.fal, +.fab { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + display: inline-block; + font-style: normal; + font-variant: normal; + text-rendering: auto; + line-height: 1; } + +.fa-lg { + font-size: 1.33333em; + line-height: 0.75em; + vertical-align: -.0667em; } + +.fa-xs { + font-size: .75em; } + +.fa-sm { + font-size: .875em; } + +.fa-1x { + font-size: 1em; } + +.fa-2x { + font-size: 2em; } + +.fa-3x { + font-size: 3em; } + +.fa-4x { + font-size: 4em; } + +.fa-5x { + font-size: 5em; } + +.fa-6x { + font-size: 6em; } + +.fa-7x { + font-size: 7em; } + +.fa-8x { + font-size: 8em; } + +.fa-9x { + font-size: 9em; } + +.fa-10x { + font-size: 10em; } + +.fa-fw { + text-align: center; + width: 1.25em; } + +.fa-ul { + list-style-type: none; + margin-left: 2.5em; + padding-left: 0; } + .fa-ul > li { + position: relative; } + +.fa-li { + left: -2em; + position: absolute; + text-align: center; + width: 2em; + line-height: inherit; } + +.fa-border { + border: solid 0.08em #eee; + border-radius: .1em; + padding: .2em .25em .15em; } + +.fa-pull-left { + float: left; } + +.fa-pull-right { + float: right; } + +.fa.fa-pull-left, +.fas.fa-pull-left, +.far.fa-pull-left, +.fal.fa-pull-left, +.fab.fa-pull-left { + margin-right: .3em; } + +.fa.fa-pull-right, +.fas.fa-pull-right, +.far.fa-pull-right, +.fal.fa-pull-right, +.fab.fa-pull-right { + margin-left: .3em; } + +.fa-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; } + +.fa-pulse { + -webkit-animation: fa-spin 1s infinite steps(8); + animation: fa-spin 1s infinite steps(8); } + +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); } + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); } } + +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); } + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); } } + +.fa-rotate-90 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; + -webkit-transform: rotate(90deg); + transform: rotate(90deg); } + +.fa-rotate-180 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; + -webkit-transform: rotate(180deg); + transform: rotate(180deg); } + +.fa-rotate-270 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; + -webkit-transform: rotate(270deg); + transform: rotate(270deg); } + +.fa-flip-horizontal { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; + -webkit-transform: scale(-1, 1); + transform: scale(-1, 1); } + +.fa-flip-vertical { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; + -webkit-transform: scale(1, -1); + transform: scale(1, -1); } + +.fa-flip-horizontal.fa-flip-vertical { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; + -webkit-transform: scale(-1, -1); + transform: scale(-1, -1); } + +:root .fa-rotate-90, +:root .fa-rotate-180, +:root .fa-rotate-270, +:root .fa-flip-horizontal, +:root .fa-flip-vertical { + -webkit-filter: none; + filter: none; } + +.fa-stack { + display: inline-block; + height: 2em; + line-height: 2em; + position: relative; + vertical-align: middle; + width: 2em; } + +.fa-stack-1x, +.fa-stack-2x { + left: 0; + position: absolute; + text-align: center; + width: 100%; } + +.fa-stack-1x { + line-height: inherit; } + +.fa-stack-2x { + font-size: 2em; } + +.fa-inverse { + color: #fff; } + +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen +readers do not read off random characters that represent icons */ +.fa-500px:before { + content: "\f26e"; } + +.fa-accessible-icon:before { + content: "\f368"; } + +.fa-accusoft:before { + content: "\f369"; } + +.fa-address-book:before { + content: "\f2b9"; } + +.fa-address-card:before { + content: "\f2bb"; } + +.fa-adjust:before { + content: "\f042"; } + +.fa-adn:before { + content: "\f170"; } + +.fa-adversal:before { + content: "\f36a"; } + +.fa-affiliatetheme:before { + content: "\f36b"; } + +.fa-algolia:before { + content: "\f36c"; } + +.fa-align-center:before { + content: "\f037"; } + +.fa-align-justify:before { + content: "\f039"; } + +.fa-align-left:before { + content: "\f036"; } + +.fa-align-right:before { + content: "\f038"; } + +.fa-amazon:before { + content: "\f270"; } + +.fa-amazon-pay:before { + content: "\f42c"; } + +.fa-ambulance:before { + content: "\f0f9"; } + +.fa-american-sign-language-interpreting:before { + content: "\f2a3"; } + +.fa-amilia:before { + content: "\f36d"; } + +.fa-anchor:before { + content: "\f13d"; } + +.fa-android:before { + content: "\f17b"; } + +.fa-angellist:before { + content: "\f209"; } + +.fa-angle-double-down:before { + content: "\f103"; } + +.fa-angle-double-left:before { + content: "\f100"; } + +.fa-angle-double-right:before { + content: "\f101"; } + +.fa-angle-double-up:before { + content: "\f102"; } + +.fa-angle-down:before { + content: "\f107"; } + +.fa-angle-left:before { + content: "\f104"; } + +.fa-angle-right:before { + content: "\f105"; } + +.fa-angle-up:before { + content: "\f106"; } + +.fa-angrycreative:before { + content: "\f36e"; } + +.fa-angular:before { + content: "\f420"; } + +.fa-app-store:before { + content: "\f36f"; } + +.fa-app-store-ios:before { + content: "\f370"; } + +.fa-apper:before { + content: "\f371"; } + +.fa-apple:before { + content: "\f179"; } + +.fa-apple-pay:before { + content: "\f415"; } + +.fa-archive:before { + content: "\f187"; } + +.fa-arrow-alt-circle-down:before { + content: "\f358"; } + +.fa-arrow-alt-circle-left:before { + content: "\f359"; } + +.fa-arrow-alt-circle-right:before { + content: "\f35a"; } + +.fa-arrow-alt-circle-up:before { + content: "\f35b"; } + +.fa-arrow-circle-down:before { + content: "\f0ab"; } + +.fa-arrow-circle-left:before { + content: "\f0a8"; } + +.fa-arrow-circle-right:before { + content: "\f0a9"; } + +.fa-arrow-circle-up:before { + content: "\f0aa"; } + +.fa-arrow-down:before { + content: "\f063"; } + +.fa-arrow-left:before { + content: "\f060"; } + +.fa-arrow-right:before { + content: "\f061"; } + +.fa-arrow-up:before { + content: "\f062"; } + +.fa-arrows-alt:before { + content: "\f0b2"; } + +.fa-arrows-alt-h:before { + content: "\f337"; } + +.fa-arrows-alt-v:before { + content: "\f338"; } + +.fa-assistive-listening-systems:before { + content: "\f2a2"; } + +.fa-asterisk:before { + content: "\f069"; } + +.fa-asymmetrik:before { + content: "\f372"; } + +.fa-at:before { + content: "\f1fa"; } + +.fa-audible:before { + content: "\f373"; } + +.fa-audio-description:before { + content: "\f29e"; } + +.fa-autoprefixer:before { + content: "\f41c"; } + +.fa-avianex:before { + content: "\f374"; } + +.fa-aviato:before { + content: "\f421"; } + +.fa-aws:before { + content: "\f375"; } + +.fa-backward:before { + content: "\f04a"; } + +.fa-balance-scale:before { + content: "\f24e"; } + +.fa-ban:before { + content: "\f05e"; } + +.fa-bandcamp:before { + content: "\f2d5"; } + +.fa-barcode:before { + content: "\f02a"; } + +.fa-bars:before { + content: "\f0c9"; } + +.fa-bath:before { + content: "\f2cd"; } + +.fa-battery-empty:before { + content: "\f244"; } + +.fa-battery-full:before { + content: "\f240"; } + +.fa-battery-half:before { + content: "\f242"; } + +.fa-battery-quarter:before { + content: "\f243"; } + +.fa-battery-three-quarters:before { + content: "\f241"; } + +.fa-bed:before { + content: "\f236"; } + +.fa-beer:before { + content: "\f0fc"; } + +.fa-behance:before { + content: "\f1b4"; } + +.fa-behance-square:before { + content: "\f1b5"; } + +.fa-bell:before { + content: "\f0f3"; } + +.fa-bell-slash:before { + content: "\f1f6"; } + +.fa-bicycle:before { + content: "\f206"; } + +.fa-bimobject:before { + content: "\f378"; } + +.fa-binoculars:before { + content: "\f1e5"; } + +.fa-birthday-cake:before { + content: "\f1fd"; } + +.fa-bitbucket:before { + content: "\f171"; } + +.fa-bitcoin:before { + content: "\f379"; } + +.fa-bity:before { + content: "\f37a"; } + +.fa-black-tie:before { + content: "\f27e"; } + +.fa-blackberry:before { + content: "\f37b"; } + +.fa-blind:before { + content: "\f29d"; } + +.fa-blogger:before { + content: "\f37c"; } + +.fa-blogger-b:before { + content: "\f37d"; } + +.fa-bluetooth:before { + content: "\f293"; } + +.fa-bluetooth-b:before { + content: "\f294"; } + +.fa-bold:before { + content: "\f032"; } + +.fa-bolt:before { + content: "\f0e7"; } + +.fa-bomb:before { + content: "\f1e2"; } + +.fa-book:before { + content: "\f02d"; } + +.fa-bookmark:before { + content: "\f02e"; } + +.fa-braille:before { + content: "\f2a1"; } + +.fa-briefcase:before { + content: "\f0b1"; } + +.fa-btc:before { + content: "\f15a"; } + +.fa-bug:before { + content: "\f188"; } + +.fa-building:before { + content: "\f1ad"; } + +.fa-bullhorn:before { + content: "\f0a1"; } + +.fa-bullseye:before { + content: "\f140"; } + +.fa-buromobelexperte:before { + content: "\f37f"; } + +.fa-bus:before { + content: "\f207"; } + +.fa-buysellads:before { + content: "\f20d"; } + +.fa-calculator:before { + content: "\f1ec"; } + +.fa-calendar:before { + content: "\f133"; } + +.fa-calendar-alt:before { + content: "\f073"; } + +.fa-calendar-check:before { + content: "\f274"; } + +.fa-calendar-minus:before { + content: "\f272"; } + +.fa-calendar-plus:before { + content: "\f271"; } + +.fa-calendar-times:before { + content: "\f273"; } + +.fa-camera:before { + content: "\f030"; } + +.fa-camera-retro:before { + content: "\f083"; } + +.fa-car:before { + content: "\f1b9"; } + +.fa-caret-down:before { + content: "\f0d7"; } + +.fa-caret-left:before { + content: "\f0d9"; } + +.fa-caret-right:before { + content: "\f0da"; } + +.fa-caret-square-down:before { + content: "\f150"; } + +.fa-caret-square-left:before { + content: "\f191"; } + +.fa-caret-square-right:before { + content: "\f152"; } + +.fa-caret-square-up:before { + content: "\f151"; } + +.fa-caret-up:before { + content: "\f0d8"; } + +.fa-cart-arrow-down:before { + content: "\f218"; } + +.fa-cart-plus:before { + content: "\f217"; } + +.fa-cc-amazon-pay:before { + content: "\f42d"; } + +.fa-cc-amex:before { + content: "\f1f3"; } + +.fa-cc-apple-pay:before { + content: "\f416"; } + +.fa-cc-diners-club:before { + content: "\f24c"; } + +.fa-cc-discover:before { + content: "\f1f2"; } + +.fa-cc-jcb:before { + content: "\f24b"; } + +.fa-cc-mastercard:before { + content: "\f1f1"; } + +.fa-cc-paypal:before { + content: "\f1f4"; } + +.fa-cc-stripe:before { + content: "\f1f5"; } + +.fa-cc-visa:before { + content: "\f1f0"; } + +.fa-centercode:before { + content: "\f380"; } + +.fa-certificate:before { + content: "\f0a3"; } + +.fa-chart-area:before { + content: "\f1fe"; } + +.fa-chart-bar:before { + content: "\f080"; } + +.fa-chart-line:before { + content: "\f201"; } + +.fa-chart-pie:before { + content: "\f200"; } + +.fa-check:before { + content: "\f00c"; } + +.fa-check-circle:before { + content: "\f058"; } + +.fa-check-square:before { + content: "\f14a"; } + +.fa-chevron-circle-down:before { + content: "\f13a"; } + +.fa-chevron-circle-left:before { + content: "\f137"; } + +.fa-chevron-circle-right:before { + content: "\f138"; } + +.fa-chevron-circle-up:before { + content: "\f139"; } + +.fa-chevron-down:before { + content: "\f078"; } + +.fa-chevron-left:before { + content: "\f053"; } + +.fa-chevron-right:before { + content: "\f054"; } + +.fa-chevron-up:before { + content: "\f077"; } + +.fa-child:before { + content: "\f1ae"; } + +.fa-chrome:before { + content: "\f268"; } + +.fa-circle:before { + content: "\f111"; } + +.fa-circle-notch:before { + content: "\f1ce"; } + +.fa-clipboard:before { + content: "\f328"; } + +.fa-clock:before { + content: "\f017"; } + +.fa-clone:before { + content: "\f24d"; } + +.fa-closed-captioning:before { + content: "\f20a"; } + +.fa-cloud:before { + content: "\f0c2"; } + +.fa-cloud-download-alt:before { + content: "\f381"; } + +.fa-cloud-upload-alt:before { + content: "\f382"; } + +.fa-cloudscale:before { + content: "\f383"; } + +.fa-cloudsmith:before { + content: "\f384"; } + +.fa-cloudversify:before { + content: "\f385"; } + +.fa-code:before { + content: "\f121"; } + +.fa-code-branch:before { + content: "\f126"; } + +.fa-codepen:before { + content: "\f1cb"; } + +.fa-codiepie:before { + content: "\f284"; } + +.fa-coffee:before { + content: "\f0f4"; } + +.fa-cog:before { + content: "\f013"; } + +.fa-cogs:before { + content: "\f085"; } + +.fa-columns:before { + content: "\f0db"; } + +.fa-comment:before { + content: "\f075"; } + +.fa-comment-alt:before { + content: "\f27a"; } + +.fa-comments:before { + content: "\f086"; } + +.fa-compass:before { + content: "\f14e"; } + +.fa-compress:before { + content: "\f066"; } + +.fa-connectdevelop:before { + content: "\f20e"; } + +.fa-contao:before { + content: "\f26d"; } + +.fa-copy:before { + content: "\f0c5"; } + +.fa-copyright:before { + content: "\f1f9"; } + +.fa-cpanel:before { + content: "\f388"; } + +.fa-creative-commons:before { + content: "\f25e"; } + +.fa-credit-card:before { + content: "\f09d"; } + +.fa-crop:before { + content: "\f125"; } + +.fa-crosshairs:before { + content: "\f05b"; } + +.fa-css3:before { + content: "\f13c"; } + +.fa-css3-alt:before { + content: "\f38b"; } + +.fa-cube:before { + content: "\f1b2"; } + +.fa-cubes:before { + content: "\f1b3"; } + +.fa-cut:before { + content: "\f0c4"; } + +.fa-cuttlefish:before { + content: "\f38c"; } + +.fa-d-and-d:before { + content: "\f38d"; } + +.fa-dashcube:before { + content: "\f210"; } + +.fa-database:before { + content: "\f1c0"; } + +.fa-deaf:before { + content: "\f2a4"; } + +.fa-delicious:before { + content: "\f1a5"; } + +.fa-deploydog:before { + content: "\f38e"; } + +.fa-deskpro:before { + content: "\f38f"; } + +.fa-desktop:before { + content: "\f108"; } + +.fa-deviantart:before { + content: "\f1bd"; } + +.fa-digg:before { + content: "\f1a6"; } + +.fa-digital-ocean:before { + content: "\f391"; } + +.fa-discord:before { + content: "\f392"; } + +.fa-discourse:before { + content: "\f393"; } + +.fa-dochub:before { + content: "\f394"; } + +.fa-docker:before { + content: "\f395"; } + +.fa-dollar-sign:before { + content: "\f155"; } + +.fa-dot-circle:before { + content: "\f192"; } + +.fa-download:before { + content: "\f019"; } + +.fa-draft2digital:before { + content: "\f396"; } + +.fa-dribbble:before { + content: "\f17d"; } + +.fa-dribbble-square:before { + content: "\f397"; } + +.fa-dropbox:before { + content: "\f16b"; } + +.fa-drupal:before { + content: "\f1a9"; } + +.fa-dyalog:before { + content: "\f399"; } + +.fa-earlybirds:before { + content: "\f39a"; } + +.fa-edge:before { + content: "\f282"; } + +.fa-edit:before { + content: "\f044"; } + +.fa-eject:before { + content: "\f052"; } + +.fa-ellipsis-h:before { + content: "\f141"; } + +.fa-ellipsis-v:before { + content: "\f142"; } + +.fa-ember:before { + content: "\f423"; } + +.fa-empire:before { + content: "\f1d1"; } + +.fa-envelope:before { + content: "\f0e0"; } + +.fa-envelope-open:before { + content: "\f2b6"; } + +.fa-envelope-square:before { + content: "\f199"; } + +.fa-envira:before { + content: "\f299"; } + +.fa-eraser:before { + content: "\f12d"; } + +.fa-erlang:before { + content: "\f39d"; } + +.fa-ethereum:before { + content: "\f42e"; } + +.fa-etsy:before { + content: "\f2d7"; } + +.fa-euro-sign:before { + content: "\f153"; } + +.fa-exchange-alt:before { + content: "\f362"; } + +.fa-exclamation:before { + content: "\f12a"; } + +.fa-exclamation-circle:before { + content: "\f06a"; } + +.fa-exclamation-triangle:before { + content: "\f071"; } + +.fa-expand:before { + content: "\f065"; } + +.fa-expand-arrows-alt:before { + content: "\f31e"; } + +.fa-expeditedssl:before { + content: "\f23e"; } + +.fa-external-link-alt:before { + content: "\f35d"; } + +.fa-external-link-square-alt:before { + content: "\f360"; } + +.fa-eye:before { + content: "\f06e"; } + +.fa-eye-dropper:before { + content: "\f1fb"; } + +.fa-eye-slash:before { + content: "\f070"; } + +.fa-facebook:before { + content: "\f09a"; } + +.fa-facebook-f:before { + content: "\f39e"; } + +.fa-facebook-messenger:before { + content: "\f39f"; } + +.fa-facebook-square:before { + content: "\f082"; } + +.fa-fast-backward:before { + content: "\f049"; } + +.fa-fast-forward:before { + content: "\f050"; } + +.fa-fax:before { + content: "\f1ac"; } + +.fa-female:before { + content: "\f182"; } + +.fa-fighter-jet:before { + content: "\f0fb"; } + +.fa-file:before { + content: "\f15b"; } + +.fa-file-alt:before { + content: "\f15c"; } + +.fa-file-archive:before { + content: "\f1c6"; } + +.fa-file-audio:before { + content: "\f1c7"; } + +.fa-file-code:before { + content: "\f1c9"; } + +.fa-file-excel:before { + content: "\f1c3"; } + +.fa-file-image:before { + content: "\f1c5"; } + +.fa-file-pdf:before { + content: "\f1c1"; } + +.fa-file-powerpoint:before { + content: "\f1c4"; } + +.fa-file-video:before { + content: "\f1c8"; } + +.fa-file-word:before { + content: "\f1c2"; } + +.fa-film:before { + content: "\f008"; } + +.fa-filter:before { + content: "\f0b0"; } + +.fa-fire:before { + content: "\f06d"; } + +.fa-fire-extinguisher:before { + content: "\f134"; } + +.fa-firefox:before { + content: "\f269"; } + +.fa-first-order:before { + content: "\f2b0"; } + +.fa-firstdraft:before { + content: "\f3a1"; } + +.fa-flag:before { + content: "\f024"; } + +.fa-flag-checkered:before { + content: "\f11e"; } + +.fa-flask:before { + content: "\f0c3"; } + +.fa-flickr:before { + content: "\f16e"; } + +.fa-fly:before { + content: "\f417"; } + +.fa-folder:before { + content: "\f07b"; } + +.fa-folder-open:before { + content: "\f07c"; } + +.fa-font:before { + content: "\f031"; } + +.fa-font-awesome:before { + content: "\f2b4"; } + +.fa-font-awesome-alt:before { + content: "\f35c"; } + +.fa-font-awesome-flag:before { + content: "\f425"; } + +.fa-fonticons:before { + content: "\f280"; } + +.fa-fonticons-fi:before { + content: "\f3a2"; } + +.fa-fort-awesome:before { + content: "\f286"; } + +.fa-fort-awesome-alt:before { + content: "\f3a3"; } + +.fa-forumbee:before { + content: "\f211"; } + +.fa-forward:before { + content: "\f04e"; } + +.fa-foursquare:before { + content: "\f180"; } + +.fa-free-code-camp:before { + content: "\f2c5"; } + +.fa-freebsd:before { + content: "\f3a4"; } + +.fa-frown:before { + content: "\f119"; } + +.fa-futbol:before { + content: "\f1e3"; } + +.fa-gamepad:before { + content: "\f11b"; } + +.fa-gavel:before { + content: "\f0e3"; } + +.fa-gem:before { + content: "\f3a5"; } + +.fa-genderless:before { + content: "\f22d"; } + +.fa-get-pocket:before { + content: "\f265"; } + +.fa-gg:before { + content: "\f260"; } + +.fa-gg-circle:before { + content: "\f261"; } + +.fa-gift:before { + content: "\f06b"; } + +.fa-git:before { + content: "\f1d3"; } + +.fa-git-square:before { + content: "\f1d2"; } + +.fa-github:before { + content: "\f09b"; } + +.fa-github-alt:before { + content: "\f113"; } + +.fa-github-square:before { + content: "\f092"; } + +.fa-gitkraken:before { + content: "\f3a6"; } + +.fa-gitlab:before { + content: "\f296"; } + +.fa-gitter:before { + content: "\f426"; } + +.fa-glass-martini:before { + content: "\f000"; } + +.fa-glide:before { + content: "\f2a5"; } + +.fa-glide-g:before { + content: "\f2a6"; } + +.fa-globe:before { + content: "\f0ac"; } + +.fa-gofore:before { + content: "\f3a7"; } + +.fa-goodreads:before { + content: "\f3a8"; } + +.fa-goodreads-g:before { + content: "\f3a9"; } + +.fa-google:before { + content: "\f1a0"; } + +.fa-google-drive:before { + content: "\f3aa"; } + +.fa-google-play:before { + content: "\f3ab"; } + +.fa-google-plus:before { + content: "\f2b3"; } + +.fa-google-plus-g:before { + content: "\f0d5"; } + +.fa-google-plus-square:before { + content: "\f0d4"; } + +.fa-google-wallet:before { + content: "\f1ee"; } + +.fa-graduation-cap:before { + content: "\f19d"; } + +.fa-gratipay:before { + content: "\f184"; } + +.fa-grav:before { + content: "\f2d6"; } + +.fa-gripfire:before { + content: "\f3ac"; } + +.fa-grunt:before { + content: "\f3ad"; } + +.fa-gulp:before { + content: "\f3ae"; } + +.fa-h-square:before { + content: "\f0fd"; } + +.fa-hacker-news:before { + content: "\f1d4"; } + +.fa-hacker-news-square:before { + content: "\f3af"; } + +.fa-hand-lizard:before { + content: "\f258"; } + +.fa-hand-paper:before { + content: "\f256"; } + +.fa-hand-peace:before { + content: "\f25b"; } + +.fa-hand-point-down:before { + content: "\f0a7"; } + +.fa-hand-point-left:before { + content: "\f0a5"; } + +.fa-hand-point-right:before { + content: "\f0a4"; } + +.fa-hand-point-up:before { + content: "\f0a6"; } + +.fa-hand-pointer:before { + content: "\f25a"; } + +.fa-hand-rock:before { + content: "\f255"; } + +.fa-hand-scissors:before { + content: "\f257"; } + +.fa-hand-spock:before { + content: "\f259"; } + +.fa-handshake:before { + content: "\f2b5"; } + +.fa-hashtag:before { + content: "\f292"; } + +.fa-hdd:before { + content: "\f0a0"; } + +.fa-heading:before { + content: "\f1dc"; } + +.fa-headphones:before { + content: "\f025"; } + +.fa-heart:before { + content: "\f004"; } + +.fa-heartbeat:before { + content: "\f21e"; } + +.fa-hire-a-helper:before { + content: "\f3b0"; } + +.fa-history:before { + content: "\f1da"; } + +.fa-home:before { + content: "\f015"; } + +.fa-hooli:before { + content: "\f427"; } + +.fa-hospital:before { + content: "\f0f8"; } + +.fa-hotjar:before { + content: "\f3b1"; } + +.fa-hourglass:before { + content: "\f254"; } + +.fa-hourglass-end:before { + content: "\f253"; } + +.fa-hourglass-half:before { + content: "\f252"; } + +.fa-hourglass-start:before { + content: "\f251"; } + +.fa-houzz:before { + content: "\f27c"; } + +.fa-html5:before { + content: "\f13b"; } + +.fa-hubspot:before { + content: "\f3b2"; } + +.fa-i-cursor:before { + content: "\f246"; } + +.fa-id-badge:before { + content: "\f2c1"; } + +.fa-id-card:before { + content: "\f2c2"; } + +.fa-image:before { + content: "\f03e"; } + +.fa-images:before { + content: "\f302"; } + +.fa-imdb:before { + content: "\f2d8"; } + +.fa-inbox:before { + content: "\f01c"; } + +.fa-indent:before { + content: "\f03c"; } + +.fa-industry:before { + content: "\f275"; } + +.fa-info:before { + content: "\f129"; } + +.fa-info-circle:before { + content: "\f05a"; } + +.fa-instagram:before { + content: "\f16d"; } + +.fa-internet-explorer:before { + content: "\f26b"; } + +.fa-ioxhost:before { + content: "\f208"; } + +.fa-italic:before { + content: "\f033"; } + +.fa-itunes:before { + content: "\f3b4"; } + +.fa-itunes-note:before { + content: "\f3b5"; } + +.fa-jenkins:before { + content: "\f3b6"; } + +.fa-joget:before { + content: "\f3b7"; } + +.fa-joomla:before { + content: "\f1aa"; } + +.fa-js:before { + content: "\f3b8"; } + +.fa-js-square:before { + content: "\f3b9"; } + +.fa-jsfiddle:before { + content: "\f1cc"; } + +.fa-key:before { + content: "\f084"; } + +.fa-keyboard:before { + content: "\f11c"; } + +.fa-keycdn:before { + content: "\f3ba"; } + +.fa-kickstarter:before { + content: "\f3bb"; } + +.fa-kickstarter-k:before { + content: "\f3bc"; } + +.fa-korvue:before { + content: "\f42f"; } + +.fa-language:before { + content: "\f1ab"; } + +.fa-laptop:before { + content: "\f109"; } + +.fa-laravel:before { + content: "\f3bd"; } + +.fa-lastfm:before { + content: "\f202"; } + +.fa-lastfm-square:before { + content: "\f203"; } + +.fa-leaf:before { + content: "\f06c"; } + +.fa-leanpub:before { + content: "\f212"; } + +.fa-lemon:before { + content: "\f094"; } + +.fa-less:before { + content: "\f41d"; } + +.fa-level-down-alt:before { + content: "\f3be"; } + +.fa-level-up-alt:before { + content: "\f3bf"; } + +.fa-life-ring:before { + content: "\f1cd"; } + +.fa-lightbulb:before { + content: "\f0eb"; } + +.fa-line:before { + content: "\f3c0"; } + +.fa-link:before { + content: "\f0c1"; } + +.fa-linkedin:before { + content: "\f08c"; } + +.fa-linkedin-in:before { + content: "\f0e1"; } + +.fa-linode:before { + content: "\f2b8"; } + +.fa-linux:before { + content: "\f17c"; } + +.fa-lira-sign:before { + content: "\f195"; } + +.fa-list:before { + content: "\f03a"; } + +.fa-list-alt:before { + content: "\f022"; } + +.fa-list-ol:before { + content: "\f0cb"; } + +.fa-list-ul:before { + content: "\f0ca"; } + +.fa-location-arrow:before { + content: "\f124"; } + +.fa-lock:before { + content: "\f023"; } + +.fa-lock-open:before { + content: "\f3c1"; } + +.fa-long-arrow-alt-down:before { + content: "\f309"; } + +.fa-long-arrow-alt-left:before { + content: "\f30a"; } + +.fa-long-arrow-alt-right:before { + content: "\f30b"; } + +.fa-long-arrow-alt-up:before { + content: "\f30c"; } + +.fa-low-vision:before { + content: "\f2a8"; } + +.fa-lyft:before { + content: "\f3c3"; } + +.fa-magento:before { + content: "\f3c4"; } + +.fa-magic:before { + content: "\f0d0"; } + +.fa-magnet:before { + content: "\f076"; } + +.fa-male:before { + content: "\f183"; } + +.fa-map:before { + content: "\f279"; } + +.fa-map-marker:before { + content: "\f041"; } + +.fa-map-marker-alt:before { + content: "\f3c5"; } + +.fa-map-pin:before { + content: "\f276"; } + +.fa-map-signs:before { + content: "\f277"; } + +.fa-mars:before { + content: "\f222"; } + +.fa-mars-double:before { + content: "\f227"; } + +.fa-mars-stroke:before { + content: "\f229"; } + +.fa-mars-stroke-h:before { + content: "\f22b"; } + +.fa-mars-stroke-v:before { + content: "\f22a"; } + +.fa-maxcdn:before { + content: "\f136"; } + +.fa-medapps:before { + content: "\f3c6"; } + +.fa-medium:before { + content: "\f23a"; } + +.fa-medium-m:before { + content: "\f3c7"; } + +.fa-medkit:before { + content: "\f0fa"; } + +.fa-medrt:before { + content: "\f3c8"; } + +.fa-meetup:before { + content: "\f2e0"; } + +.fa-meh:before { + content: "\f11a"; } + +.fa-mercury:before { + content: "\f223"; } + +.fa-microchip:before { + content: "\f2db"; } + +.fa-microphone:before { + content: "\f130"; } + +.fa-microphone-slash:before { + content: "\f131"; } + +.fa-microsoft:before { + content: "\f3ca"; } + +.fa-minus:before { + content: "\f068"; } + +.fa-minus-circle:before { + content: "\f056"; } + +.fa-minus-square:before { + content: "\f146"; } + +.fa-mix:before { + content: "\f3cb"; } + +.fa-mixcloud:before { + content: "\f289"; } + +.fa-mizuni:before { + content: "\f3cc"; } + +.fa-mobile:before { + content: "\f10b"; } + +.fa-mobile-alt:before { + content: "\f3cd"; } + +.fa-modx:before { + content: "\f285"; } + +.fa-monero:before { + content: "\f3d0"; } + +.fa-money-bill-alt:before { + content: "\f3d1"; } + +.fa-moon:before { + content: "\f186"; } + +.fa-motorcycle:before { + content: "\f21c"; } + +.fa-mouse-pointer:before { + content: "\f245"; } + +.fa-music:before { + content: "\f001"; } + +.fa-napster:before { + content: "\f3d2"; } + +.fa-neuter:before { + content: "\f22c"; } + +.fa-newspaper:before { + content: "\f1ea"; } + +.fa-nintendo-switch:before { + content: "\f418"; } + +.fa-node:before { + content: "\f419"; } + +.fa-node-js:before { + content: "\f3d3"; } + +.fa-npm:before { + content: "\f3d4"; } + +.fa-ns8:before { + content: "\f3d5"; } + +.fa-nutritionix:before { + content: "\f3d6"; } + +.fa-object-group:before { + content: "\f247"; } + +.fa-object-ungroup:before { + content: "\f248"; } + +.fa-odnoklassniki:before { + content: "\f263"; } + +.fa-odnoklassniki-square:before { + content: "\f264"; } + +.fa-opencart:before { + content: "\f23d"; } + +.fa-openid:before { + content: "\f19b"; } + +.fa-opera:before { + content: "\f26a"; } + +.fa-optin-monster:before { + content: "\f23c"; } + +.fa-osi:before { + content: "\f41a"; } + +.fa-outdent:before { + content: "\f03b"; } + +.fa-page4:before { + content: "\f3d7"; } + +.fa-pagelines:before { + content: "\f18c"; } + +.fa-paint-brush:before { + content: "\f1fc"; } + +.fa-palfed:before { + content: "\f3d8"; } + +.fa-paper-plane:before { + content: "\f1d8"; } + +.fa-paperclip:before { + content: "\f0c6"; } + +.fa-paragraph:before { + content: "\f1dd"; } + +.fa-paste:before { + content: "\f0ea"; } + +.fa-patreon:before { + content: "\f3d9"; } + +.fa-pause:before { + content: "\f04c"; } + +.fa-pause-circle:before { + content: "\f28b"; } + +.fa-paw:before { + content: "\f1b0"; } + +.fa-paypal:before { + content: "\f1ed"; } + +.fa-pen-square:before { + content: "\f14b"; } + +.fa-pencil-alt:before { + content: "\f303"; } + +.fa-percent:before { + content: "\f295"; } + +.fa-periscope:before { + content: "\f3da"; } + +.fa-phabricator:before { + content: "\f3db"; } + +.fa-phoenix-framework:before { + content: "\f3dc"; } + +.fa-phone:before { + content: "\f095"; } + +.fa-phone-square:before { + content: "\f098"; } + +.fa-phone-volume:before { + content: "\f2a0"; } + +.fa-pied-piper:before { + content: "\f2ae"; } + +.fa-pied-piper-alt:before { + content: "\f1a8"; } + +.fa-pied-piper-pp:before { + content: "\f1a7"; } + +.fa-pinterest:before { + content: "\f0d2"; } + +.fa-pinterest-p:before { + content: "\f231"; } + +.fa-pinterest-square:before { + content: "\f0d3"; } + +.fa-plane:before { + content: "\f072"; } + +.fa-play:before { + content: "\f04b"; } + +.fa-play-circle:before { + content: "\f144"; } + +.fa-playstation:before { + content: "\f3df"; } + +.fa-plug:before { + content: "\f1e6"; } + +.fa-plus:before { + content: "\f067"; } + +.fa-plus-circle:before { + content: "\f055"; } + +.fa-plus-square:before { + content: "\f0fe"; } + +.fa-podcast:before { + content: "\f2ce"; } + +.fa-pound-sign:before { + content: "\f154"; } + +.fa-power-off:before { + content: "\f011"; } + +.fa-print:before { + content: "\f02f"; } + +.fa-product-hunt:before { + content: "\f288"; } + +.fa-pushed:before { + content: "\f3e1"; } + +.fa-puzzle-piece:before { + content: "\f12e"; } + +.fa-python:before { + content: "\f3e2"; } + +.fa-qq:before { + content: "\f1d6"; } + +.fa-qrcode:before { + content: "\f029"; } + +.fa-question:before { + content: "\f128"; } + +.fa-question-circle:before { + content: "\f059"; } + +.fa-quora:before { + content: "\f2c4"; } + +.fa-quote-left:before { + content: "\f10d"; } + +.fa-quote-right:before { + content: "\f10e"; } + +.fa-random:before { + content: "\f074"; } + +.fa-ravelry:before { + content: "\f2d9"; } + +.fa-react:before { + content: "\f41b"; } + +.fa-rebel:before { + content: "\f1d0"; } + +.fa-recycle:before { + content: "\f1b8"; } + +.fa-red-river:before { + content: "\f3e3"; } + +.fa-reddit:before { + content: "\f1a1"; } + +.fa-reddit-alien:before { + content: "\f281"; } + +.fa-reddit-square:before { + content: "\f1a2"; } + +.fa-redo:before { + content: "\f01e"; } + +.fa-redo-alt:before { + content: "\f2f9"; } + +.fa-registered:before { + content: "\f25d"; } + +.fa-rendact:before { + content: "\f3e4"; } + +.fa-renren:before { + content: "\f18b"; } + +.fa-reply:before { + content: "\f3e5"; } + +.fa-reply-all:before { + content: "\f122"; } + +.fa-replyd:before { + content: "\f3e6"; } + +.fa-resolving:before { + content: "\f3e7"; } + +.fa-retweet:before { + content: "\f079"; } + +.fa-road:before { + content: "\f018"; } + +.fa-rocket:before { + content: "\f135"; } + +.fa-rocketchat:before { + content: "\f3e8"; } + +.fa-rockrms:before { + content: "\f3e9"; } + +.fa-rss:before { + content: "\f09e"; } + +.fa-rss-square:before { + content: "\f143"; } + +.fa-ruble-sign:before { + content: "\f158"; } + +.fa-rupee-sign:before { + content: "\f156"; } + +.fa-safari:before { + content: "\f267"; } + +.fa-sass:before { + content: "\f41e"; } + +.fa-save:before { + content: "\f0c7"; } + +.fa-schlix:before { + content: "\f3ea"; } + +.fa-scribd:before { + content: "\f28a"; } + +.fa-search:before { + content: "\f002"; } + +.fa-search-minus:before { + content: "\f010"; } + +.fa-search-plus:before { + content: "\f00e"; } + +.fa-searchengin:before { + content: "\f3eb"; } + +.fa-sellcast:before { + content: "\f2da"; } + +.fa-sellsy:before { + content: "\f213"; } + +.fa-server:before { + content: "\f233"; } + +.fa-servicestack:before { + content: "\f3ec"; } + +.fa-share:before { + content: "\f064"; } + +.fa-share-alt:before { + content: "\f1e0"; } + +.fa-share-alt-square:before { + content: "\f1e1"; } + +.fa-share-square:before { + content: "\f14d"; } + +.fa-shekel-sign:before { + content: "\f20b"; } + +.fa-shield-alt:before { + content: "\f3ed"; } + +.fa-ship:before { + content: "\f21a"; } + +.fa-shirtsinbulk:before { + content: "\f214"; } + +.fa-shopping-bag:before { + content: "\f290"; } + +.fa-shopping-basket:before { + content: "\f291"; } + +.fa-shopping-cart:before { + content: "\f07a"; } + +.fa-shower:before { + content: "\f2cc"; } + +.fa-sign-in-alt:before { + content: "\f2f6"; } + +.fa-sign-language:before { + content: "\f2a7"; } + +.fa-sign-out-alt:before { + content: "\f2f5"; } + +.fa-signal:before { + content: "\f012"; } + +.fa-simplybuilt:before { + content: "\f215"; } + +.fa-sistrix:before { + content: "\f3ee"; } + +.fa-sitemap:before { + content: "\f0e8"; } + +.fa-skyatlas:before { + content: "\f216"; } + +.fa-skype:before { + content: "\f17e"; } + +.fa-slack:before { + content: "\f198"; } + +.fa-slack-hash:before { + content: "\f3ef"; } + +.fa-sliders-h:before { + content: "\f1de"; } + +.fa-slideshare:before { + content: "\f1e7"; } + +.fa-smile:before { + content: "\f118"; } + +.fa-snapchat:before { + content: "\f2ab"; } + +.fa-snapchat-ghost:before { + content: "\f2ac"; } + +.fa-snapchat-square:before { + content: "\f2ad"; } + +.fa-snowflake:before { + content: "\f2dc"; } + +.fa-sort:before { + content: "\f0dc"; } + +.fa-sort-alpha-down:before { + content: "\f15d"; } + +.fa-sort-alpha-up:before { + content: "\f15e"; } + +.fa-sort-amount-down:before { + content: "\f160"; } + +.fa-sort-amount-up:before { + content: "\f161"; } + +.fa-sort-down:before { + content: "\f0dd"; } + +.fa-sort-numeric-down:before { + content: "\f162"; } + +.fa-sort-numeric-up:before { + content: "\f163"; } + +.fa-sort-up:before { + content: "\f0de"; } + +.fa-soundcloud:before { + content: "\f1be"; } + +.fa-space-shuttle:before { + content: "\f197"; } + +.fa-speakap:before { + content: "\f3f3"; } + +.fa-spinner:before { + content: "\f110"; } + +.fa-spotify:before { + content: "\f1bc"; } + +.fa-square:before { + content: "\f0c8"; } + +.fa-stack-exchange:before { + content: "\f18d"; } + +.fa-stack-overflow:before { + content: "\f16c"; } + +.fa-star:before { + content: "\f005"; } + +.fa-star-half:before { + content: "\f089"; } + +.fa-staylinked:before { + content: "\f3f5"; } + +.fa-steam:before { + content: "\f1b6"; } + +.fa-steam-square:before { + content: "\f1b7"; } + +.fa-steam-symbol:before { + content: "\f3f6"; } + +.fa-step-backward:before { + content: "\f048"; } + +.fa-step-forward:before { + content: "\f051"; } + +.fa-stethoscope:before { + content: "\f0f1"; } + +.fa-sticker-mule:before { + content: "\f3f7"; } + +.fa-sticky-note:before { + content: "\f249"; } + +.fa-stop:before { + content: "\f04d"; } + +.fa-stop-circle:before { + content: "\f28d"; } + +.fa-stopwatch:before { + content: "\f2f2"; } + +.fa-strava:before { + content: "\f428"; } + +.fa-street-view:before { + content: "\f21d"; } + +.fa-strikethrough:before { + content: "\f0cc"; } + +.fa-stripe:before { + content: "\f429"; } + +.fa-stripe-s:before { + content: "\f42a"; } + +.fa-studiovinari:before { + content: "\f3f8"; } + +.fa-stumbleupon:before { + content: "\f1a4"; } + +.fa-stumbleupon-circle:before { + content: "\f1a3"; } + +.fa-subscript:before { + content: "\f12c"; } + +.fa-subway:before { + content: "\f239"; } + +.fa-suitcase:before { + content: "\f0f2"; } + +.fa-sun:before { + content: "\f185"; } + +.fa-superpowers:before { + content: "\f2dd"; } + +.fa-superscript:before { + content: "\f12b"; } + +.fa-supple:before { + content: "\f3f9"; } + +.fa-sync:before { + content: "\f021"; } + +.fa-sync-alt:before { + content: "\f2f1"; } + +.fa-table:before { + content: "\f0ce"; } + +.fa-tablet:before { + content: "\f10a"; } + +.fa-tablet-alt:before { + content: "\f3fa"; } + +.fa-tachometer-alt:before { + content: "\f3fd"; } + +.fa-tag:before { + content: "\f02b"; } + +.fa-tags:before { + content: "\f02c"; } + +.fa-tasks:before { + content: "\f0ae"; } + +.fa-taxi:before { + content: "\f1ba"; } + +.fa-telegram:before { + content: "\f2c6"; } + +.fa-telegram-plane:before { + content: "\f3fe"; } + +.fa-tencent-weibo:before { + content: "\f1d5"; } + +.fa-terminal:before { + content: "\f120"; } + +.fa-text-height:before { + content: "\f034"; } + +.fa-text-width:before { + content: "\f035"; } + +.fa-th:before { + content: "\f00a"; } + +.fa-th-large:before { + content: "\f009"; } + +.fa-th-list:before { + content: "\f00b"; } + +.fa-themeisle:before { + content: "\f2b2"; } + +.fa-thermometer-empty:before { + content: "\f2cb"; } + +.fa-thermometer-full:before { + content: "\f2c7"; } + +.fa-thermometer-half:before { + content: "\f2c9"; } + +.fa-thermometer-quarter:before { + content: "\f2ca"; } + +.fa-thermometer-three-quarters:before { + content: "\f2c8"; } + +.fa-thumbs-down:before { + content: "\f165"; } + +.fa-thumbs-up:before { + content: "\f164"; } + +.fa-thumbtack:before { + content: "\f08d"; } + +.fa-ticket-alt:before { + content: "\f3ff"; } + +.fa-times:before { + content: "\f00d"; } + +.fa-times-circle:before { + content: "\f057"; } + +.fa-tint:before { + content: "\f043"; } + +.fa-toggle-off:before { + content: "\f204"; } + +.fa-toggle-on:before { + content: "\f205"; } + +.fa-trademark:before { + content: "\f25c"; } + +.fa-train:before { + content: "\f238"; } + +.fa-transgender:before { + content: "\f224"; } + +.fa-transgender-alt:before { + content: "\f225"; } + +.fa-trash:before { + content: "\f1f8"; } + +.fa-trash-alt:before { + content: "\f2ed"; } + +.fa-tree:before { + content: "\f1bb"; } + +.fa-trello:before { + content: "\f181"; } + +.fa-tripadvisor:before { + content: "\f262"; } + +.fa-trophy:before { + content: "\f091"; } + +.fa-truck:before { + content: "\f0d1"; } + +.fa-tty:before { + content: "\f1e4"; } + +.fa-tumblr:before { + content: "\f173"; } + +.fa-tumblr-square:before { + content: "\f174"; } + +.fa-tv:before { + content: "\f26c"; } + +.fa-twitch:before { + content: "\f1e8"; } + +.fa-twitter:before { + content: "\f099"; } + +.fa-twitter-square:before { + content: "\f081"; } + +.fa-typo3:before { + content: "\f42b"; } + +.fa-uber:before { + content: "\f402"; } + +.fa-uikit:before { + content: "\f403"; } + +.fa-umbrella:before { + content: "\f0e9"; } + +.fa-underline:before { + content: "\f0cd"; } + +.fa-undo:before { + content: "\f0e2"; } + +.fa-undo-alt:before { + content: "\f2ea"; } + +.fa-uniregistry:before { + content: "\f404"; } + +.fa-universal-access:before { + content: "\f29a"; } + +.fa-university:before { + content: "\f19c"; } + +.fa-unlink:before { + content: "\f127"; } + +.fa-unlock:before { + content: "\f09c"; } + +.fa-unlock-alt:before { + content: "\f13e"; } + +.fa-untappd:before { + content: "\f405"; } + +.fa-upload:before { + content: "\f093"; } + +.fa-usb:before { + content: "\f287"; } + +.fa-user:before { + content: "\f007"; } + +.fa-user-circle:before { + content: "\f2bd"; } + +.fa-user-md:before { + content: "\f0f0"; } + +.fa-user-plus:before { + content: "\f234"; } + +.fa-user-secret:before { + content: "\f21b"; } + +.fa-user-times:before { + content: "\f235"; } + +.fa-users:before { + content: "\f0c0"; } + +.fa-ussunnah:before { + content: "\f407"; } + +.fa-utensil-spoon:before { + content: "\f2e5"; } + +.fa-utensils:before { + content: "\f2e7"; } + +.fa-vaadin:before { + content: "\f408"; } + +.fa-venus:before { + content: "\f221"; } + +.fa-venus-double:before { + content: "\f226"; } + +.fa-venus-mars:before { + content: "\f228"; } + +.fa-viacoin:before { + content: "\f237"; } + +.fa-viadeo:before { + content: "\f2a9"; } + +.fa-viadeo-square:before { + content: "\f2aa"; } + +.fa-viber:before { + content: "\f409"; } + +.fa-video:before { + content: "\f03d"; } + +.fa-vimeo:before { + content: "\f40a"; } + +.fa-vimeo-square:before { + content: "\f194"; } + +.fa-vimeo-v:before { + content: "\f27d"; } + +.fa-vine:before { + content: "\f1ca"; } + +.fa-vk:before { + content: "\f189"; } + +.fa-vnv:before { + content: "\f40b"; } + +.fa-volume-down:before { + content: "\f027"; } + +.fa-volume-off:before { + content: "\f026"; } + +.fa-volume-up:before { + content: "\f028"; } + +.fa-vuejs:before { + content: "\f41f"; } + +.fa-weibo:before { + content: "\f18a"; } + +.fa-weixin:before { + content: "\f1d7"; } + +.fa-whatsapp:before { + content: "\f232"; } + +.fa-whatsapp-square:before { + content: "\f40c"; } + +.fa-wheelchair:before { + content: "\f193"; } + +.fa-whmcs:before { + content: "\f40d"; } + +.fa-wifi:before { + content: "\f1eb"; } + +.fa-wikipedia-w:before { + content: "\f266"; } + +.fa-window-close:before { + content: "\f410"; } + +.fa-window-maximize:before { + content: "\f2d0"; } + +.fa-window-minimize:before { + content: "\f2d1"; } + +.fa-window-restore:before { + content: "\f2d2"; } + +.fa-windows:before { + content: "\f17a"; } + +.fa-won-sign:before { + content: "\f159"; } + +.fa-wordpress:before { + content: "\f19a"; } + +.fa-wordpress-simple:before { + content: "\f411"; } + +.fa-wpbeginner:before { + content: "\f297"; } + +.fa-wpexplorer:before { + content: "\f2de"; } + +.fa-wpforms:before { + content: "\f298"; } + +.fa-wrench:before { + content: "\f0ad"; } + +.fa-xbox:before { + content: "\f412"; } + +.fa-xing:before { + content: "\f168"; } + +.fa-xing-square:before { + content: "\f169"; } + +.fa-y-combinator:before { + content: "\f23b"; } + +.fa-yahoo:before { + content: "\f19e"; } + +.fa-yandex:before { + content: "\f413"; } + +.fa-yandex-international:before { + content: "\f414"; } + +.fa-yelp:before { + content: "\f1e9"; } + +.fa-yen-sign:before { + content: "\f157"; } + +.fa-yoast:before { + content: "\f2b1"; } + +.fa-youtube:before { + content: "\f167"; } + +.sr-only { + border: 0; + clip: rect(0, 0, 0, 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; } + +.sr-only-focusable:active, .sr-only-focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; } diff --git a/generator-web/target/classes/static/vendor/font-awesome/css/fontawesome.min.css b/generator-web/target/classes/static/vendor/font-awesome/css/fontawesome.min.css new file mode 100644 index 0000000..2683476 --- /dev/null +++ b/generator-web/target/classes/static/vendor/font-awesome/css/fontawesome.min.css @@ -0,0 +1,5 @@ +/*! + * Font Awesome Free 5.0.2 by @fontawesome - http://fontawesome.com + * License - http://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +.fa,.fab,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:a 2s infinite linear;animation:a 2s infinite linear}.fa-pulse{-webkit-animation:a 1s infinite steps(8);animation:a 1s infinite steps(8)}@-webkit-keyframes a{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes a{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-aws:before{content:"\f375"}.fa-backward:before{content:"\f04a"}.fa-balance-scale:before{content:"\f24e"}.fa-ban:before{content:"\f05e"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bicycle:before{content:"\f206"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blind:before{content:"\f29d"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-braille:before{content:"\f2a1"}.fa-briefcase:before{content:"\f0b1"}.fa-btc:before{content:"\f15a"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-car:before{content:"\f1b9"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-certificate:before{content:"\f0a3"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-square:before{content:"\f14a"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-clipboard:before{content:"\f328"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comments:before{content:"\f086"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-credit-card:before{content:"\f09d"}.fa-crop:before{content:"\f125"}.fa-crosshairs:before{content:"\f05b"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-deviantart:before{content:"\f1bd"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dollar-sign:before{content:"\f155"}.fa-dot-circle:before{content:"\f192"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drupal:before{content:"\f1a9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-eject:before{content:"\f052"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-excel:before{content:"\f1c3"}.fa-file-image:before{content:"\f1c5"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fire:before{content:"\f06d"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-first-order:before{content:"\f2b0"}.fa-firstdraft:before{content:"\f3a1"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frown:before{content:"\f119"}.fa-futbol:before{content:"\f1e3"}.fa-gamepad:before{content:"\f11b"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-gift:before{content:"\f06b"}.fa-git:before{content:"\f1d3"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-martini:before{content:"\f000"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-gofore:before{content:"\f3a7"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-handshake:before{content:"\f2b5"}.fa-hashtag:before{content:"\f292"}.fa-hdd:before{content:"\f0a0"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-heart:before{content:"\f004"}.fa-heartbeat:before{content:"\f21e"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hospital:before{content:"\f0f8"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-houzz:before{content:"\f27c"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-internet-explorer:before{content:"\f26b"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-jenkins:before{content:"\f3b6"}.fa-joget:before{content:"\f3b7"}.fa-joomla:before{content:"\f1aa"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-key:before{content:"\f084"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-korvue:before{content:"\f42f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-male:before{content:"\f183"}.fa-map:before{content:"\f279"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-maxcdn:before{content:"\f136"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-meh:before{content:"\f11a"}.fa-mercury:before{content:"\f223"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-moon:before{content:"\f186"}.fa-motorcycle:before{content:"\f21c"}.fa-mouse-pointer:before{content:"\f245"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nintendo-switch:before{content:"\f418"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-osi:before{content:"\f41a"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-paint-brush:before{content:"\f1fc"}.fa-palfed:before{content:"\f3d8"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-paragraph:before{content:"\f1dd"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-percent:before{content:"\f295"}.fa-periscope:before{content:"\f3da"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phone:before{content:"\f095"}.fa-phone-square:before{content:"\f098"}.fa-phone-volume:before{content:"\f2a0"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-plane:before{content:"\f072"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-print:before{content:"\f02f"}.fa-product-hunt:before{content:"\f288"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-random:before{content:"\f074"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-rebel:before{content:"\f1d0"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-rendact:before{content:"\f3e4"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-resolving:before{content:"\f3e7"}.fa-retweet:before{content:"\f079"}.fa-road:before{content:"\f018"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-rupee-sign:before{content:"\f156"}.fa-safari:before{content:"\f267"}.fa-sass:before{content:"\f41e"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-scribd:before{content:"\f28a"}.fa-search:before{content:"\f002"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before{content:"\f21a"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shower:before{content:"\f2cc"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowflake:before{content:"\f2dc"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-spinner:before{content:"\f110"}.fa-spotify:before{content:"\f1bc"}.fa-square:before{content:"\f0c8"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-star:before{content:"\f005"}.fa-star-half:before{content:"\f089"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-strava:before{content:"\f428"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-table:before{content:"\f0ce"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-trademark:before{content:"\f25c"}.fa-train:before{content:"\f238"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-uikit:before{content:"\f403"}.fa-umbrella:before{content:"\f0e9"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-circle:before{content:"\f2bd"}.fa-user-md:before{content:"\f0f0"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-volume-down:before{content:"\f027"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vuejs:before{content:"\f41f"}.fa-weibo:before{content:"\f18a"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wrench:before{content:"\f0ad"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto} \ No newline at end of file diff --git a/generator-web/target/classes/static/vendor/font-awesome/webfonts/fa-brands-400.eot b/generator-web/target/classes/static/vendor/font-awesome/webfonts/fa-brands-400.eot new file mode 100644 index 0000000000000000000000000000000000000000..b5abfeb4321c0e0aaada15a29463bf3c5f5c6b38 GIT binary patch literal 97180 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%0DWf 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 PN~nc5l(~UC@r?Qp2LGi} literal 0 HcmV?d00001 diff --git a/generator-web/target/classes/static/vendor/font-awesome/webfonts/fa-brands-400.svg b/generator-web/target/classes/static/vendor/font-awesome/webfonts/fa-brands-400.svg new file mode 100644 index 0000000..2b28036 --- /dev/null +++ b/generator-web/target/classes/static/vendor/font-awesome/webfonts/fa-brands-400.svg @@ -0,0 +1,990 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/generator-web/target/classes/static/vendor/font-awesome/webfonts/fa-brands-400.ttf b/generator-web/target/classes/static/vendor/font-awesome/webfonts/fa-brands-400.ttf new file mode 100644 index 0000000000000000000000000000000000000000..9afb0bee9c665dfc614b574482878154fb02ea61 GIT binary patch literal 96944 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 literal 0 HcmV?d00001 diff --git a/generator-web/target/classes/static/vendor/font-awesome/webfonts/fa-brands-400.woff b/generator-web/target/classes/static/vendor/font-awesome/webfonts/fa-brands-400.woff new file mode 100644 index 0000000000000000000000000000000000000000..0bd6662f0209d6d8d2573c9baf3c85897c91c2a6 GIT binary patch literal 62811 zcmV)&K#ae4Pew)n0RR910QFn|3jhEB0eY|i0RR91000000000000000000000000- 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�)|P-9pN5i1^$`+zw02p%fWY%C*t0A5US(B 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 UQ&bkgOx2eBxozA303KNYc2ICDO#lD@ literal 0 HcmV?d00001 diff --git a/generator-web/target/classes/static/vendor/font-awesome/webfonts/fa-brands-400.woff2 b/generator-web/target/classes/static/vendor/font-awesome/webfonts/fa-brands-400.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..1b30dc51faf9204501ad1a002714aa844c655d1f GIT binary patch literal 53794 zcmV(~K+nH-Pew8T0RR910MaA?3jhEB0eY|i0MXC@0RR9100000000000000000000 z0000SR0dW6t3nEelLUkK8UZ!}Bm;^R3xx~-1Rw>5DhHi6Tl6V$L)rF)LZzMv+_mkN zCkY=`AUEBV$3YbMteMeZ<6sP)d{FlP|DTs2MaD`CUOEOaK~>)unM-ZKU1Y0Pt0iQc z*t2a9M~{_^DWt2Mk>BT7&c3Sm3G3EQ!qKdYY$5Jis;RA3Yb|!)c{B|w97E5NN5XR4 z9sCk?YMi0%a^eZ^l;ET@+i>h;Tf%gcf2Mvxf6+4U=-dKgPhPWL*9&ktHAzJv9_3IF z5P)qEM9VEug774m03;v~03?uCvkGx~&{(R?@EFc4ZsnUF7mwfh3H|nda&mc1cKJ-d z^Lt9A|F^opwqY+C9qr{ofqU|G6aw8u#|j{2`)zjvA>jE_@1>Z)bW%E)1@KcyX*#Mx zGKiU+PRin(Q8GexJD@vz^o4Zelt#pVjM4U;s330Hq?v~z7D*%$(Wg@x@|A>S+E3{J z+O(v0)Fy1A89R2+7$5^L2y*Mj$>h$}9lzeba;7|}7b+t7l7{Ek=DYrvTtsoy-EjeZ zP1F$;5@}PS7=;yJVQ!*Wh?UbJ>U6qUIiu%N5!^(GYt-vB0-&-D6A02FoT+n2`^&aG zf4vR=BUCCE2X&bS%-MWwD37x*T=yHSUk@VHs0aVcYz&wnSLY-q~a` zmt}hpl7+cJ$n;7`<-UtMBGU8m^6>As4Blgz1qK*)VEgsGR(@^O{hm^7UR;EUGEuS$ znddV+Keyh`{qHyq^yV@BT}g{h_Vq-z$6TeQxF>yBkx4aJUcJcGp}6c#>)vt z<*;LhZm|2yYW=Is_5YbMyUhQ0dGeHz5T;BUNjS;Fc;GtI)y0f9h`#r;dv>v@+E&Hi zRc5upjA<{>IANT?&v=-jO#p1ET7YyFV0TIvLk1SI*;vP)SNTQDZFgIeD_b9;?>^+z zIsE^*wEx#hX6Ga`f$egfhBCwsP-6g_SkN6mO6R?m*@OQF6KN_%-nrxlx_h&0=sF&W17KvA?KaqzAfvU*A*ap)n6`G z&$8dHvMoS`Ex9F`gr0wMwRYxGggtY$7}={d7p>3Mrm-mhzy&@mVc5iAV%LaR@Gs67 zVyY~CRx!;S=*<}afMLcsAI=k&W;mK)3bD$evZ$^s!3c&}l%=JB~eF3o4;4nDn-i` z*K@sgBkMG4a$|#NlVF3W-}~qm|NlUf0Gb*CXz~a&ITE@l4FNPY4S+KzQD?|rV@!0$ z7=D0~*l0~HyIaz!IaXZnv)Rec7#m%BL3ZJ$>4nD_a6C*H5za7_nK-RYAH2|=Y$a(^ zhGNdQ&y2Izk++w7ncxPm5n>R+h~S^E(qU}&FX*<5^3Wkhf;B4^rLJE8Ka5RRuF5EM z+88)2O1%3bPNkl>8y7H8SQfgQe*Dt6wW80wvzh{iQ zw+8#D=4}V#gBe3jf@$S^^TSIfh*$XuhUD9PD6Irx7$%Lji?zmfn2eG1VW$!{3Wq!ZLSrb+eHjtK&qL z+2xo^ekltox}?&|ET=scRoR8YmhHM~7b>XHqH#J{lyF1+P0grgn)4$^fp8w*X zdh+6xIaj_U!NSB!l|f~jBPwWcBpOSm)Y;g}bly8YOdcF|1^^CZT`+yu=#tcytaHdY z&!lBwIGv$BxBSXGm(|#|gEkqFSPP4_sHS!8ZIyg3J?M!~`S$Prp=F5^_n)`5;K5&@ zbfkFcvZ?Kmzt~s;g?4PU!H$OUkF8%%zFrPcd|e`j0}fpl%vVa6OKF^P#yL0KS_VF% zb?U$7SN@TShWLb}#?u?IESgX{67%;g)-J zezx{vt1D|*KJ8-jYEVOHbL;dju3OU_v`)T#+|wonJlt_xkU)F6IV_Pv4`DV&ND^a2 zij9nEFT_Nl3E$v3V6LCJpJwSzU*37{LdZnV{9{NC+)H(WPgwzlvD zMVJV|6ozS^1Tx@>C0w|QNt4`-f%#V}hm>uXg&1U@{`!zJv(pY~>gr{b32g21nXi1~ z2e+~*5&2nn)+s9u(9c-ToPz136CA_fy&={)Bh_d^EeSDoV&$1dMk-?y68Dt&q`Pjs zA|ORe`SKYC<6k1`KY#hhP3yxRx?mRed&EAdS_`*Avd5}LWT!%#$rv$Vs)pL?X{dol znrfznR@&*Hqt3eOqNl-z8fLgL#xXbEB$G`u-3&9$GTR&rEVRrjt8HM(ngdUMB>t2F zM2Hk6TC8|UGNj9tMJ0#YR(ZDD}0isDLVT2cq!=3}jsQ!qj;LMFD4IMwh4AE<>uT3gxEcj}~ZXY62 zUuUr`yu}3zC#;yJrjzBiAuXfr(q%;N0k;&Sj$ojCCnhimz~&f4;U)|cus;Ur#3Tk8 z*aCx09Du^5( zEsLI618X8}h(@F>&OzE?8>9nm_$X$37xf^RC_uyh=J|;sJU{Yiu(TXf0nvvy1 zkQEq$ti=BSd5&0(JdcHu7h-u=fX|Uvu|Dz|_Ca39zQ`Lm6?u~wMBc*3$lJsQ`+WVjY(glkYWaUQA`Mnl!Z z%&7WU6x9&Rpc-LURAXF+YJ!4lieI6cVJK8{{0=3@J1DavZy1OrsFAn}HHz4W8ja^s zWAF@WEH**Sz?`U=m>sn`ZCeZMjarAjQ0s{i)CN3_+K8u6o3JNpGqDA=1wWxIFh9yN z8nXhPLs{colr0uR*&$F47#Zb*Gf=+7N|Ya_MoGbxz?Y~1tcwc5BB)?Ihzh|jsL(=g zVZaBdaNLiIz%Qso%z#S5^r#dZgi0lLpwft4sB~+cOkt!D6qZ2e^C4I z57d7A3v~c*qYhy!)M4T<>IgA}I*MaZ`Pczf9NC=!K0%$t?x<750O}?tLEXX$sN2{W zbq8mo?&4F_JtWjaq8Igu*oo5N9`s6Vhqk~lXiE%>w!-jeYm9)l!H8&EjDohq=xBS4 zg?7N0Xh)2VcEWgQXN-?_!Gvg6OpNxx=bYZ`ZVrDpTXVebK%>01iOGR?Fz!NYY287cocmD zkE3tm3G}V-?KYyZJHX56yLbhCFM7KVypDbl?L9_%_5^9$Qv`d4?DrhUH)wo^eueMR zuki!=4Sqzw#n0$>7(l;ALx03?(4X)p^cMp98_|URPPCwZ5N+t6L>KxO(T9$l|C9bu z8JP|x$xJ99v!QY_7fO>wp$u6Z3d!DYkZMy-uh`RBKHy}qr!wZ@}aeo0kI$ez0$fkOrUr+_)uCO8O|3N4rE6)hVPOKy|JD!H8IiYEp6 zAxmA(t1idpp_Dy`m7|{=4jJ5MNaSbu9^ipB2ey84djy9$vm7~+E}!Oh-) zyi+A9m1Z25V=RdVY%HI4Ho@NRtr^>d+uMzDj)jKYd!A^iz_jVt>c$HnCsP8W6+=-L zMnj``UNX?xxyVd&(2f(KJEauUu=kRC9czE1v+z|WS;vC6*Ts7AYg6i(pDiUc+E+57 z)M(jkT^~s)uAO49F-|PF;5}D0Bj#uwvzhuPkuQ8)Z$rdrJ=c9(b%e+p4gegrVGm1- zmG|h}#1dh=>1O7<1Rw$RiE;dd1gB&!Avd7&T;|&7u1$BFdb;iou1ZavC!XDS_suW- zIS*kG5>5egsV{k@z;GtO6rKk$JwYr>0Mjy%HJ&jiXihQVAr^?V&p1@=eoj8;FO}%w zmj4l@NP)mLg~N1;G0QZ-leA!85jCaS?fwg&3Lkl^42QvHg*|oioj!3Y3piH0_t!7p z^WIsByY2R^nJuvAp8VHkDa}WN^P|EA8aj2vujibkC*Ip_*8T=jDQOBY^|`v_M+SF8 zQ}QM4186N*o_kLd@5%Cp+PFv1^wV{>w#AwX`?tas_J^RH3jXhH)~5(O3V#Rimfv{` zTAd|;%=vB%mH~=vepV2N%LNrJ=l)T;i|OIIeYN-22ANNi>TD3*wse@PNwMhquH#}4 ze4>Z#oo&;#1&KA!qSjXqo}YO!_RV2+>#9^^AE#UccAR7PD16;*4+fn3po;DKh1EC= zOY7>3wGZ!LTbA)Ax{5cT0{8=1XPM&DFTU_}lM<4v6~E0A2fTCJ-C>Ns_u@7ylhPJQ2alif zIB~^5}kU=Y17>jpzq?ZW`l6?cW-`g#X0E7~sv-Mg{SBHq03uqvX^<(dc;& z9*Q?a#)vVzySxw5R_{iS;w>G1!=KWpHU#&C7S-y2$HYxkc6|U~2KT0c^NF{Jwo7&s z5dWdnC8>x2f!DXuB9=o%iI41!x-@e`J=M(?U&Z8~Za-PUGp6o?hv0W?x}HHJoRwYc-?~r?$mqhnC7{xS5{U+C;#Z-htJgdGD(l310=j1jrX4`(osy%wB^Bh#fGpVgz1yfs+ zPK2JnwCV%5PBM1yN|}iQ;oS5z8-#czw2)cpNCx+PNF9qb~%L^0hyr@pW`?Pe|a`~{@MNbbok^09>C};)^mHSmA@lcsZ8jrzw0jL zY{M+Qm6dI7PKT_>9o-}rAuDn-o)Lx7Uajm*yRcHv{5rtu#WY4DUI{&-jb~AcX0qXN zymCKUIKj1!zKR>}`IX zq_NK&Q2`p7FJNy-=~t@`I4!4}Y^-e57Uf|4dF54AX)MPAbZ=ijNlSVtsn_eM`c}B~ zEDxY1fC@XSeeQvYgiX46#}lKnnVA&Z+^hYvhH1I#`49`f{g=If68rk@_I+)Y$)Zs6 zv!qMmdub=|2RxzZ^eBu^N8F(xBmXRZm~uE&rS1_{;$ZQF2Rg|jmFA)41Yw)xps6x~ z@78uOhfK%fV*}>4p*}G%i0L{?nwIOaap3{?=K8cfx>xUW6D#`rZjb}cI%cA{Ft=$` zOw42i&8t-JlAQ;?8JeV1@nqvOt4Wer;r&#`M?B?Frqr@N zITFekN1_6!lx>De9M4z|HJ$h$>}fxUc5F`yInowntkR+_aOR)o zlFQcvF4tbkw3H{_3e!9(jG2qydw!LEPkeNFu6#N(_n-d^-=6Sox=DA$3tirlunCU) z^B23HmzV#z?mvUXL-O))`MlcSTRo^QKJ^{t-mM%y-(B&XH~&-nk0&^=(@PTvQr45H zq#f?N=Be}t=MDd-*kN1D`095a6WQ!+U+=SVPS7HQRqnB0?VdBZ+@Gd?j@kKjel<+!s%prA1xx)L^0BK|h?bEAm!*u{S%tyqU z!Hr5Ws!3pE^(PV@MYutE>p!^g?HTsxvmS(*)2l}g$&umfGsZAvY>;KSl!J=EQIy?Wj^ia@<`d8edY>h-hi?1o9G4nZvt2|jX z$I31xhY=vMmMczf#QE~x!${;CCW-jw&B{)JdpnC$wqJ_$R4;@iEg+Pmp8cP?mR? z_G!BDPC76-)^5-HB6e~X!6Qp*gbY0PE1uCUOe9BoE-;J22P6T>Wyr{RB`^I}aGJIJ zSvsCq1v87h{bR#wf1eH*$a>-}!?Z#A-oPirqx(l!(Vkz~^BdLQ;wtCOca1`GVeB|x zfUPIf^7A#!GWmD{tI%zJgn3iGRw~T8EpCh@d!u!Tx*6OYK@IAv%4rnBg2dMf@@vF* z60fw%?TUFU}lGR*0O1HRwKtQaJidDXHST1Ya}qtW?s#S0hQR zukC@Ruivg$=xn&>n1{LEP2r6A3YMtujIJ*A{>QFjP`6hc03zNu!yP^w>xg1qxrsL%DA@)R4Zo6@Mj3nc}Jj8VWZk!?}C zuCg4f__N5D%ZQ}eN@5o9HcG9B=%NIn&v5rckq3}asuFU6O8$eGLSRXLX50K^hq=>T zDZP!x7zxezGb@%0ceL^q?{5mu^(JZlWkSdxbRFs< zi-=kDhNQ-;2bG9u`jp18hc=BlRIS110e6+5L|a*%RIT_2Y%PLSZx%u=?|IK(Ju2F% z2Z=ILd|rkXRHQSdSEI*!s+nY4p->@(42KZU{Uj5)Fwv9@B#g(zMn?@rT4HRyj%O*@ zsD{$QJy-EOtQ_RMLIEApWJl^UjCrnAL#_lqC0o!q5*9UUCXm1Z3J+4!+yy+4m3u`= zN9u0Xz*P>{18CQT6ufgvMU_eUyLgFh$ANP&oSL7p{rwtM;4AK&VoT1ux43{iGRy=7 zfy@#@MIMQn4F*w@?$WvQRHeu*^nziL4dl2J$S?avkkITBJG~`|qjHPG0;*5do>C5I zS}xt3xFgd31S7GX9~j&o7Kb6G_{!T611+EPPZ{w;*Ms1IKNDup9?# z*bWNl>Nrn9P`iIBlsa~LlsxYe?14qyHc@p{_J{9sBJxS&#Nf@}ZBpU#TEo7ywj`&~ zx3~A2hzymAG7+-f@b~+@c0TqC5S?5>$_=i?fVm7z#x}m?=+>AfT<5XYcI*hW%|iXoCJDWl%LRRFY9wY4G~6*!Aa=tUnb-X3B86EcLX~fwsWsrShm{ zN(~8q6Z20$8CrWVhC0Rl>bbzv`KmIIfr|2${=YU6ersaH2)Zn>i?4Xb92*QO+6g~` zf|5RQaN_WLzoaDL8GQ zW=ryZsWiD=LCangi&KD*F+|GI@JJbUisBbogRK_OIzh&S4Ck!a5$yvf*kuYzIWCYJ zvoP5G^NfoGkpL!3{TMRRs>d%iG3EXMt=$v;<&ij7>V->91B&?#(s|AYVC*lM?p$6+ zMKB+i=5XOg_X8In*REEp!E5n@mygaodhu{?yYm+%Zcm$U%FpG(Q?|AF8{BvH{^RQF z#={YNu7&&Kl=#noX6_e(zlDUOZ_XFnet(>@x4QErz3<9_D`naHY%Bq%M?`qq2 zP1>@7V$o(#P8Y-d0PB&_t$6IBWm!Lb4qrW#bK05H+Bs)JI<+)~5=P}NdaPYtch!b> zm7vuJJi9gNIV}(2rny*@!?pi>X0&EzW|KqL<@?9&)GM95FJkgK7F`y0{D1luysaZj z#8{!~VOXy>jwxgy!(BVu2|R4a2PW40ELJm+o@>oQ%8WIh4thjGE7lTkK~CB%k+*C@ z=piq4tg)3en>Jqi z$!DA8h-Y?PooMGZj%O1#xw(4fqwk!1yYUzI)9m;O`psetvs-t`oPt?__ILhpmVe&h-V3h7ppUdmH8cC0ekDL zp3)EytmQW=XcI)))h?x}w+cDaQ-4;rC{W)Sb_--TSU#L#j79uu(NKg&`f)q}M zHT_iVuvcx^>l96}91H+!}>M{O0u4kRl0 zuZ?JO1W~eB!I2`DT4#avNU5O#2K6mxZo|~$Pt2T6zc@R)&;+4?7c0B*-lc2807HQn5dKY7UO(BZDfLSHurkj%%Y^i8Vo z)y&4v;)@HDC-Y(ba`}u_Wv;Zxxmzc;hyN9aB)cExp5~wKl-Gm1v(*9 zMG!4VDu?_Z9gxpPmK@d|druxmT28GurOp9xR@b(-Ur73ty`)|CW=aF{A7D;8o{W8kAsE-E~%?@3yWG4YTNg;rs~2q(9e*^6nZ zJP&(bDJkc5g}}5i^$$)}LqJ~6QX(viP2?by^O_dv+RW*e%FoLkZWpBi`bzE~b2l#c z-%^9j^#|jl6k}~w56JoJo2C1d6YKHBc$9hv$q?j#q$;~u^KSwHffQI_k3F}+Bk#uR z-O<8lUy;P$!`xFU6PEHkFPiz1(xiczmVTybF{NEJWSu)Q)Hy%+;x}I|@+R`8#dzdY zx@km%W@VE@)hDZQ!faoje7@F$!Zae#IaB38EE3ab176J9BD7y^Rljlt@TOno*Z!Q8 zDP`$ki0JLp@Xhd~l8@G+k(FEAM!sfe(hDdC{=~hBq2H|@TR8Yf^RHsGSWR9sBQrb0 zm#I5}Kd$$zOFmz;M%k5#M)BVNsbwg1=t@Ehf*KK0jCCd;RjoR-B}vh>Q?hsT){M5q zIXo$NRfI7QdmJ!8H%&XJLq>^>EY_Pa0cx^N2W-YP8(ARA80aSj3sKvY^b^K6#x!Bb z)JcEz0}-Gr5* zXNRaa2?=#NQhIn>lo=T9VzOY|U3gmPrE;uXTv{}jEU$02&>yeK-TdC@SGh=i(k_la zB@UhU=9R>0l<<>B&F$B0mo=PPULL$5wyEe=$n-zv;Z%}m3biQWgTvCClc|B%?fK(T zjszOYR_bhFkCjXx`^i0<=NhdLqdLJELjEt{OJ(A;W;>`T?vMZaOZfk~dhCJhqg{^kmHOwx9RY~_%VaH}^Egum< z7*JRc&hc@k!7t{OGgX$L>0aMuJhDCexb6z{bFo?>7-cN zU(H#ce>dlyKT&!|JqmV-YnnO%$EFo*7v`CTY1$IR2O_fr&-*~WH=b`S>x|Y_6u?iV z52FYCF%Uj5H0bLBqh@8n`BuHLk}T<~^9zS=29N%3AXpKKzwYe#H)VZQmKN_FNbPyM z<2y6&E}Xi5^!{`w9_ba^v&p4M#WI_*>3r^V@1UYeC~_uQN@7tPf(?!~$zX1vXmk;A z-Cjbh0b@uFKNGpLdn$RQESW00=J(5*RX6Erhlq}5z3BzX9=c!Eh;vzHX#NC23u|?u zLDo3P1ZU%neQrP(_lKt@9&eDkb=Cn$+|D_LXAPzBYOYPf`a0)l|K2pXe1E^v02GW~ z*{6T}p}GICrH-gW%CM8fXLya&iU{6|>m?%T(bJ(I$5aV!OgYv7Pw*pNx?__Q(&TtU z4Yqii&!VjDhj|2I@~qzT&j;+}`x`1fIW#g7gcf6a9$Y_HrS9`Wt!X!nE!6Sp%rMP` zk?7bc5`lWp@nB=((CXi06h0AVL4s$_v* zS8em&lB5@uY)74HVs{hly0i(jUEI-ZdF~}__BUUZZ-uF4Ggi3JKr{g}lz=!Yx~<5z zH$SYX(k#nKVkNE47;`mYLzxDfjIBGt&ErWC0eKt#(y9;4Q63%YnSa?bBLSjiH~}DK zr)E&fXJF7M_VN@NpaM9N0JnVxh!j>|EMDDbigU&?Q&BHqPa8(g{mpkGlbiq)1@BE&S(Xjrb#Fx0d?)L{X@q8=0wSTp`=B@N+lZE@+iGX|i zR@!nI*H}lw7we3|jD`W~kVtn3Aw)6POF3^U@12S3J<7nYot-dkXZMd&j&p9x@Z23g zOt_w!FkJj7O`4CLx&764e^S{samMpv#1w~qO4)6jj@+ER-$N`@KtR0#T9;U>Cn*ML zVzr~Y7~^-ciiD#02wR6rm%AyEAR&Pg2n8hED1eEAt+?T8iR~{+o>Y#-`Tj>##9Mp* zfSs5cb_D=;3H981p^abi(yXQ`Rg{84@n zd3P*=x8kiWE>XUdQX<>Y3$xF?-1(M_3f?guRe~B1IC`FVW^bv@+#FJgWZZniLnF?^ zFFCb2w$cu*4K#(96^dqfl2rU1h%#};N&$cXb)t#xXaNC|EK?>psX{$>YR%84gB2_h zbVH7KsB^`hBylQ$bduA8Z-stVeKijRGuO*Yi4zqw?wDat*K}y#<-xqH*~B1m(a&(j zmRzT7A%ua7VP=)O7Gnj80RmIj3h_zBAO*o!xT7)O|6T2Y%C(%@3lI?uis?uIB$Dj* zzofGa7KtO+6$$qxA%He%*jNf)oljOxq*kouyv^82!*Ni+llgpWlsukPcowp#0a_L$ znw)DbUINP76cuP2#via5&%_;3@KiEUp|+!UR#2-%N}W|Jc<-=T_=~GGPE#Umg;SZj zzNP%**GZ!$D>XR#mjj&FOb$4@nayRnXa3@>?rdR|GW41{W5f=0DL0vN&>Ayh`lLMs zJ4ZWnnav15kBZwJjdIGTd@}&-0?b%vZn?~_wP?#Hc#tN8EV8$gDqUFFRVz}3Zn8a3 zc`qrn4wCzjXC%Z1v^Aw~1*vm@@SJjIZhy>U$YWr5H3{Fb%O55E3lM*A{!}A$@y+#j zQmd{?pz5IUoV^p{$e(9=t1p%^`a+s|>!;;S#RL2Hlz6>uA_~E$Wf9b;v6&@7!3y-9SK^hRGNV9CDpFA=7 z{k2-%w=DxdG2*4%Td@Kbv(R2XSC?;J;i(y!wCDSpdMPW$`!?=XFLW%$+i1ob$Xp%eqF(>bLqb{^p;rU7K0m?<)=k1OJ9!A?YP2(kvj zMP`yhQB+UYY?bPLd-t~(iOFb?EwUTOZdr4s>~Qd|3>j=O_4?wyMGCi=I<>@Qc(rMq z!Q4;U!K_|;3tC{0DezH6!(6hea&~|YvuFs~S~%gK&0=tS$L9hq6HvoQ&`hLBF#~FP zj5}ZEOmCfQorGkiU*Lb=uZZ_Ppe$2)9w>L2EJ@2$lEbLlt++I~h1srGVzy@Dl68=@ zY)TNEqZKq0A;3(`Ygpvwg_el`S)_V9Xp&$Ha9d(B+cUlw(H}-KNw!4XDR-u`Rhcn) zcryr)DXVK%-J8?0cb?cCO4RshLV+dfFgckaY zY$I4q`%*As)IMO6(tk5{P#K4p4r*Vos$z;PK?Lc5@JO-T$ju6CK% z=0u~U=rB!E=hIWWYmgk7M-P4~C$$}YmDyJ;PiUp$J zsT)3dt1Qe|wa0#?OF&)#pV87&`nqO^)$@Wt1&NLqy+&g`RLaX*i=Twy#OQ&u zt9WSc%^vx?%l-3VH)%7)SfOA$J1`V*+Z%%!GXbrt8nKOb&TDMS$Y?3$qy%98tr9XP z_~0|yO{N3axAf$MgLVXAeLPfPM5?CnhJwN;7@$b#b*c13bLIIM9cj{TQPfu1?@_Hc zwRX`EK}u-5OzzgU5Jjyr)8a_8G^i)SH4 za|8TE@&9X63y4`FX-)*GBDJT~tQB+01E^9U{LTh*&YC%>Y3E0?4g8)@Ro~; zGCjTbrN*Y`glBb5@0yfnM7kFSO**)SEa$^&xmUbh zqBihN8m2irN<_+X%b;7LlDW=p1BouYs3ctt7!`@Y%vpr=PQw&YdaSLmD=kFs@vb;1 z%WR@lCSAIR=pyv9N^1Qz$EJbnD;UN2L|`{S%V>artgWS)N|7Q%;lhLlnTX&U$&fXg zb)0uf0rE0H?!Y-Pq(xeCEJ<*V2*MA$a&}j(#L7Gc+(R=(Wh4OY?n%2wl#p%*G67wT z0QmqN#O0~=vXwMznbHAh$?2^qsfz`VnpHErOj-a| zmd63KlvkU#>eQB5{8zqOo$H@drC1mll2`6eW&O`G;I7;&SHH}zvw37;W^Nk#4J1hp zuAAv?XvA7e!aFTUOLB6@RcPIJwh7&t2D5g1*Q{Qcrzz=2;GA~r&+KwHIOB0Th{T!B z=N7(kXZDjjM)^De6=(ce$vy30)KBE;_KSFO*9a)6p0yzv#(1_h)>yqxWZ?Hxe47OI za_%rKo!*_1X-V=*MIye>-7!BT@zeyPcrm=gT>i0-#B1eYNB1TwzdCQO zje>qAS|j;!rQq!RT=YgOy0Fx(%7S&miFBIeT+U4k(NBuYo9pAXM~8d`#aEwH<2y+M z)*cV*(T)Z;;p`qt#CLA((ifZ6O=zEP49(kLTpcC@zd&Pl`|gdu{`CIOW4rwvcv;!* z@TufF(~xqfSG#-gWJoY>m#&xOe}qeR*nEW)^Cp6W+kuMwF}>!G zL4ns@atS>K{5vXUMyW*Cc$XIosl?{S2MRJpg}HsoqLBcCPvd4eyp7M?vnNwlCZs|O zkNZG!h##}uNnLz}$qV-2TCz5!6|>aw&dq`O*>=PVtHc}2M(-1Rz-Ux#=$^IY)l6^$ zYLrpD?$96kHKubQ15U4VpMLUDxboW2smDye>$1q+)s(?@X>9&{<(rAN_VXa0{C&l8 z@t?sp${H0YvhWpXP$$il=%|qI3-M~4a|B%>N$WGG>Lg9d^7khs-UQxUxKDY3X6E*Z zSN3(IiY{joO)J=Dj47K^aEq?dI)3#EZX5~27~N|4U|fahP}X}KP$E(8SGdPbZp>J3 zDbHH73^;TTU|MKI@yanESoP=B5CB&rqJGxHIbZ?zsd9kAcgZp;LxU#Tl=&4vB(QCUi*rK&7!1lqvWH7$ZK@XgSa|>k&7|Hi5HLCS39MBusfxDhaQ-lLg<9VV8E7bk5;s#o0iWxrkl^A7i3KBuL}j(=tmkJd4ymcN zkkIZnrSzj2K4mT>x66#&L&iW}33!ta_=0oRk5d!*LS#~+-byG;gaXU*s7dc3Bfb2K zT(wY?xkW^_eXk>Ci4pWg&CfIiK@mUc(+y}V^N!Y=K6l#fuyF^S=)I;*?U>yCbwjOr zuaT3bCW}60{~~TOe*f^4;Xw;I&6G_395X%$40K14SW?X1Rw`|fWSKIQB|1^Ae7%L@ zPY_hfEL$u~$HcgYPIIj_PYX@6a?Je&YCcy%(zqcYuR0Q;*W zWhLgKv>{5T-r@)jKp(XuwvM^H1QYZG~zx=siHaQUb?5^mL2~niJpsnst9=J?W0kaR6@k|xjTFOv3np?|q zXps|GqQ_H80j8=?xLKi=Oow6M9!K%CbQng9uTgk8_gj{d06Ty_fThUwAe3JUvcBUi#4n)|BO<9cTSMFPpYVN^G z+(%D!Fr-vlmYx~kN=*L*(Ej24+dtOoQ5Uf8QHDD%+v*nvr;m?qq^%#QU^zY6=(n`W zi35??(0AOP9Q3}EVa@G_J#;spO&$b&{3c8uNkMG^k>VE1-$SE==gxFRclpP@Um@34 zKXj_gd(ySbTUXKBuxd#*BfAECN*t4qCju_ASYgVfBGRbTEV8v~*k=#-dnv4LH`d-B zOrX8~;LMiTS?K{9uv_cWGCF_#XL6a2C${~E8msYiReJ`9hQsZ)hPl)AirA{3x*q=N z;V5|X^kR^QrPYxUOFfn^coR;X;9bc4->nHh-%-)g#Y`^#9WRX?3UmN(SAdJuO|rdvdg= zug+0s-EdI}8|2Eyn&6oj_euBW>8JIuIsLC4$)3HA7GD`NYXA=7n~fcQYtnd4FM7Q3 zP9W`U{hta^6n1vpEu#myEvrKRnB2W6IoF*0la%{42>}N?!g5C)=T2H&ao7Ut*lmB>#Ky(tt62;yCnWO^HRR(|F6m}m;0U|Ew* z_r}`L=%N%eGqdrc7Oa#@o2Z~KPF4wcxV;+nWJozJWxWpcUp#b(^vC>J;b+-LJiL7* zFSLl&GPZ;~wQ>X~q2xxx_cC1U&6R2v8VGGI$Ov*vF6fV7cxwT!@GB2hldP9Dy`PclNL`Z{A%_Qy|c(PcVEtP;ews31)un~-#M z8PXXa3{3|*i@u>Dj7DW;Am5H?WvPhI2l7kow};K0-XL^AWVvH@9=Xn=vEJ~i_(DC= z-?jWI;R`4cVc4-F=A!`2>2JHmk4ZhhEE(4L#M~s)c+DP;nfq9LTv}UMS?U&agP|87 z@$3W85AkszMdd@LKgu`ON+wC=p@I=7AORu;8g#l@lB)w@KtEvBPDDu6Nxkwr6|E&G zHn=MPZCQ?DwldRaHE7)3*%w zliiJS8!V(Yc`^x@rP)ZT`BLpk6;DVru#V+)C_b5}sU3sg@7R3QvZ~n|?drL33Pi#r zEyvWlbK&!`eb1Zby(%RcD+iB_AHS|^qW_Ea_(S0n(RJ!ZZpq}#ic#=m)cbwprjF|= zXC+dSxi}Bm-ONfuZx?N$&13tagTI=Qs7Z{l0&Ct9{_E|g6`5!zv$M4v*nbl@Yxygh zHRJ>|am}V-z32&gA;H{(0MNj`X>BtL8J#62M{3ux3Z5HmC|b^!0QaN+T`lNhx-mn7 zFm*Uq=a*Q^f7h(=gLS{Z+CO8oN}-M2ZeBIJzw?<=s8}$^CM*8b=Gjs_-6Vq~V&svsX`%*Y_@z!x*bo zPqWLca~n@-n>O1SYH1B(y84^9`Ch*nxa+yu75@Qs_ys#X^t=@7Dl2i&wd))lTS_gj zI3}i*+B!?Zfwu1$afTD}CjmzX@I!B-6{#rGI?e;lf56@X%w$Td^#bD*&}4clwr;Uw z%2A*OC6dC~$tj?ymsEb2sp+#{TPfXX$xssXk#@4Nz4M2=^^^|YwcRWTs7VfiVXZr% zkf1tHV(xp7##I|W2z5J?Zb%=kFbEG9(FARxavnoodcFIs1{Cf3!-ESmh*7}A-y24f ztmO_34JpJ*m@IcTUa@g6RG< z{J3Ha%zS$H$C70{`2N23nO6VR=o9bU?|eF=udLK1+s5zrvM{wOpQp1WG^AanZgRtn zuN!&drMm%RV&;xR$==AqjjM@SI$4#!H;q=IyJXINexBq?iLBuM>iDb~2Yqip^x2%% zTW%LEvM|Lshy`qLyLQU`RU?`4fQ_we&ge~hDpetQA>P>z{gESG5lJ>$#!XdFA_O9W z^i(VY9h>^B8~kisxCZF*@Ziqg!Gc!eF5$lk%K@^+B%Lm2w?BbyY4-`0qjJb1!z4iuBzpto@6~oYQ74lws0vE_GXLN`|DR+AcvktSzX(`An!MW z)<{_a4Z>cJFJ4b_s-nZd=&Bk<0`_jn4M%R?&IDTvM-%ACN?Q<$wX@z;k0d&R!_V?p z)V~6I9N1L*`wF;5i*5pZYZ1*9az~3-t80HLRT4`6P>id3aO?>KG^Xhj1#Y zb|21zfMIESVyKuV*T?K$;R_2H}+7wb;+7t_)kX(nG5R+o+}W9HbiqO0F+RTjho zQa;7B3c~w^Yfrc6iZfKtAJL^YYpD85_(R96%*`He%zP=f6~^y}tER5<>|zYfRY`t| zIPPKo##ox;afGmn1F7t7S}Js9Q+r>4ll>=p=%SF^N`tc+NV4cLs%3bY93e?dwsW?B z8StvxZZR6AbqjDaqoQ*AQ^@DVEYlo*3f<%_;eQA3I{edOA z<}lx2AIX%;)az10S9r zncC-04Ne>#8Xx?8d|$IUt~I}Cj*NeRmN_Ti`M^82x;U=8?oJ>2{Mc8Hm;vLR!y#4r z{Z}v64g2FGf1%-bQ!S#xezE;Yp)cmw=$2DHATP!CDl4Lh!v}cQxsPpQ7xl@A{QfKd z{G?~2+=eTyxAMoxCo9^@FKVPe{|K2beM~>j8G7dG(uw{v%-^!2SA*C*AcJRpnt7%@jw-5bL`Lm0z@vB-6QCMlKW-WqX;QLMKmMRIMTb;06J z<3HhbpP^BpW>LCA{&?&YrOnFe)OX-|Q>NL->F2-SYX3dB=K$+UeRI|J*z@4@pVyuS z)i(eA*gqPtZ3W)DI?_i~AJk+2xUTm4TdlE=0QKJ0nHSG7#!U|%wAW92^d5acZzO#% zVWe1`fXOE-Ns{QchG8wp=r}@2IZ$w86?>#32BlC62&$p?*%JAPMmk`OoQ_9@m{fTw zFY+P2Uy+FanPFzn;m34*+x?Js0zZlP9mfsMS~ngSuf4x(G?@@?(pqD)&HZEC;@4uP*KW?7GNeAgH|tY$G@p*{jM}Ts z9l4wKG>h^ajIdV;ELN%-48sNV=D~8YswxGUt9pKa)1^wUdKB;1;txR(TxE6%GGAap z*cmuS0BoP!o(XdPSh%_^Sj&hua?hDMZqCt(eSfp!{?LJi#PnzMWibYUL`Mf7e;Ha* ze6)O z=lFv7%=1rtuZ}h)NMxU4^xEEiMcDI>dmCN*qwbF- zH}8M3d(RogM!g*#oNvobu1>Us{B=6$G$^%%WGJ2~%W_I#Vzd^|`qViaFcZU^w$}N) zh+k7))hK+VCiFF>mMMztkrRV^2Hl>4zo`Do>sa{=n72}rl}gd#T)pcMB}bF*x@q`? z@xC%lX#rZY>amVC9|*lA02nhih9$yBrpV}*kkxEQ_vvEbM2j;|(P2Uez_GLK^hBIrTlL;k@R4rjLFDvemFLuM7;MP~(Cs;*q=a@vUM zRqdqE7|7Lhfkpy^CXvZ<2`B(jgJei?-1Z@#7113gPdL(H*I5MpY}>Vx>C&Kf(9Rw2 z(Dg>fH$D5#4&Adxy`M~0yPi{RyU%g=e(CBZ?N09h;DDh=hXIFmVt<>#R+#&acM9PnhGT9Dgj}*M5pfh@L9$FYy_T} zv1xl>PW8T@Z8S`f*9Qq(f9|2%3-_v=ysYb@zZ*zSDGzs3Xi9RJAsb^_SCyDjW5yM$B~V5a4^ z*f~zuJfki%>hF1fqno|()Wd@}j$@k3rMda3y&s0`S7j+v@VvRMe3q4}#I`>(^I#N_ z!pOXqkQgrsPPHaAXO|euQgIvq;iGuY1FHgLA;e`EFyP!s=r}bW1#CIizBrCgAPD9b z#$N?0jZ*l?XR)#}=Ik4L`GqxMO=8+un_${^LazroPZcnq8Y#T8J5xbewC)(2e7avM zH=xn^hIIHwotLr8`e>zw1Q3YBK6toQ;Vzv_OKN>uejy90Wwgg|P<2Zc_HJ#@Kl_~9 z2HN}iDNFZXzIkxc6v@LE?;oGJAlg^8z{P)$bf>mho}9y#j4%urN;Sn1G8{onKFLYK zwWUJQ@maw>+y+PIWi?g4bVeHXZyY?w*8A>WnS)z)gMlBjHAUzFQgc$wPir1Ut>Tlh zWqjI*xHq>a`H1B%MFrH1u{~Z%uZ@W3RDSHBWtWgx*_6Og6}kT!{xY-d16Q76yycd= zvHet*iSirfoV(C3&#YB`s|HN(!yvtp@mc<50*K?SE#hfULJrK#JT|nr>23FT2K|KY zHrPz9$`YF&qmU+Oqs*hFa(` zjx)RbLx{vPQPkW6K%oO@zHpIrd@v3T^Qm%D5UYsR0h4mC|CehzDLPF{Gf2qaybi?Z zDsr%c)vH-<{-?hJno$3iK-E`}@C@t+PCq=9Xfc&3i@$L?fTgM^pi1u`9;ESzlpJn7xuZ^ILY^%2%h~GT(YZ>&X0ZfHT~*=8B?EK<`?_q zGNAax#dtQR(VyG;3OLrZyYhI*Srw3`7_rft_OH_s2IY`^&`6jRqYhbQNpe#bt7em? zZVUimCOVaqC{#Qe-BKwI9-*xaGoJ4dLHd!Je}@Hekb_HbKRWT`y$x1}r)h}qGD%)) z$Yj{=98(`0RF}fjVm|`tnba6*_1lp{RoiGiSEu+lV?Pn^y7bq`hi?DmJSBa8f*F#~ zW{DN~`5T}1ZIYRpFqG>y)8QS5!fqiu8>T1G^-J0|Z!av)Ithl@YSe$#m?s))V?$w1 zN4f}RcFF#(u2LV+P8oP|t5p0F%=GU}A{9 zqsng|x>@xTI`+bxe>J|+^f#k$PvT?eP!v@@y)x59c_&70S!o8Y`_NPeE9@WInofGpCNqzm9rk>%NjEED z^_}gRIi|wo)DyqszhGP5+1}CdFwHBy-=M8HU%`93vbCIjoo^LdBEMI9T;1ksk==do z$;q|JNC&2KXJ!mt88oxF8Ew=jZ~x3#1Y_@Wx>YD^II**+!K+%8G3_rd9Ux9vcQaX7 zJpEJ>BTErrke8H=H=uj8WLmBG0WL4w%VFZ6mjkHV4ytmBzZ{~lXCEZ6_WIj)A|M!! zf&YPEPAA#_8nDsw98qJBNE}UNGu1q`KO7Go&@HU)-tacp&xg)gT{zXH^=~hF03-S* z#kvBoI6>{DNcSfIPfj&Ofqs4h>J9AweAP|s;Tia@8*As|(YtHce|&kBQ@h?6pqOr! z*_$i$r3mJJqX2lpQP1e{#BGZo6M5Wj+^bCSm9h=p$pBJf)%xO{PPtQkR}tKx@+Vtm zTOnW*MPv9gqrEDiJ@@PVdjY>U-t|@%MIEEa7z+k*LO3yK+i`Q{8vCy8kWk;Sy$@Ij zE5Cnul{f;cG_h*ShmmjT|QnDS2KrZE-)wJX$uC_pSGLI=B+OUP3~ix>Rj$^Sxwm2THS{^t}Q zU$k=40^P)^od7X>GOqanJm$M(pEypf9KLupj$5h+72zRhtI9Jl{2N=zg6GcorIzTI zU8K87Sk0=-Y7I)LcKbgxiW~o%4uRDUB#h*JBR&|D<=wK>01X^lj#oR^WYj-WQpnfl zL8&FBF(SWYbNz>L=p0L*i=%Nf)xe%_@CaV$WWP8-bxH1nQX;eHKRDsOVd0;A5!^pA zfTFhZI&m0HLq8IZ#ADDl#r1WjeBT)#OSRtwIv(I0ip{c`B+qSw>ku1bwErKAt&(kM zc%0Oj<6gw~%N)g?zC6V-n6=Q@!TX02kr{u?Jm3g z^-*2DcdNdtoZP&5>C)o40nyvu8~XfPFllha$EqtcrpMQJR~}JoS{pyUkD#2WQ358sgxgg`i`}r%3cw-3Vc_MS&tj5?FJsr^<1Uubo*JzL4CD*oHfW zA$jgxVWih+b82{ePNgn1W@>cQ^jHRX4ykl8+`|i^?8~;pq>u?gq{t$8oWhIIY$+QV z`!EIC33)2}|M6P9am;D3ayxDyWpURPv0s(#0GHcd>KV1Se-Pn5rm# zchp9rpFMkDKb%61lUh5~smbJZoiVAW*&RdmgEJ@OE*3j|pzlu@1d#?pkp!dAF*$Yv z!vrWA%ULfx@p~7+Xub5py$J^6;EnOBkOdIW6TmM_2N3-DI6V3PagLLYicmxl)GZLqjv2_Ws=_cDQPoZ9I+^Jbu@^&7 zKF)Wa4nW&uJqCNDD&6?)!uP7=_J-w|)0n;NuD#hutv@aqrlZiSE7#Ki=Qn#cT3~-^ zn{*CWdNB*MpD(i;_-A|mvpk#LkLFaZ#=_q}5(|=5)(COiL4PAXE3CwrR{R(Sctbs> z(u2Uee$9QatYw}^W}wrsX<)&aGrw7FW9MXoqFD*7wIxa=PSzZ$`l6BEU-?)9SLr*P zx@st{Vb`z&kuc1Wgq?JQf}U2Ey2zib0GXfa7(c`!MjhQz#HMa!k_>(*_sBL%s8bho z>k(=wpFuKrfBQ=P?kK+`rxn1pD+1?g;R2rg5`Vi0O{1m}snpae1WhAKh+-mjoIjn- zsAaH4ktu?#7e3QOf~j=LzW-tioc#8`{~Q?4a&)ba-9zO(lgk^&^`xXgWsqfgjQEhd&=2 zvU(bQi8@Etd+t3N+J+Df=AFU^#f1}{DnnrkVpEMK`U(DtT^{v$jeItKrS5^^R2$;r--T1Bsa)fcC(Y4{K@sllNbTRJcfGaL(mbuTA38-I`~ zSUeQ-;oO8Ln)sMwv48UfOASiDUEbUUbN;Jpx#QnSY2>~5$LB=LKwWs#iGo{|T<2%> zC&iiqbbpe^2wC3(HXn^uWiPrM?a14aFR&lRcsw`IajdmmtF}`P7Og4ZkJ1rYdA|A6 zuL-6XZI9Y$2cW~0!;sF>pf`p8`pL9#f$7upa8v5iFpsxc1cBC^U{kQ@j*Uji)}T@Y zbciwvez+Ezkhc>e(w2vNysH_(9;S?9eXNcC5ec`De$JN?*XP&a<`=DpG)DWdz0N#8 zCDC2OM%^~SX8U^8NoK$FYfxZuQD94PU|>-TSCqi>3gv775K$Yrsc0om;_osr*lm5} zSQQl({G7rftF(2v5_Yqoh18sxr$jtGO}c2_f|ESkhcj<=Z- z7_UTv@t&hrwvI=B;RTCuZsks>$3B@GsH2G6N5`jBV}B*Py~bA?mQ&TXJsl8))Xly_vLcx--H^+gmIY(+ z3mGr;f5C0p|KM5g2=t`xhey}PbA-28cqawVG^9nb8fP1pilmJ&S))ilU!@trHM0@m z%a9&2?!b2YzaPuu=UW7t7#^KlMlJQE>3-W9pq3T%U*{9jJB4DB{qa+JRphH**m*Hh{IvEr7qfI#&eg@1eKqVd*AeSl z5$D36cmCuAaeAvhCQ{>w2!|-K)((gZEegAQ^^C}c&c_T8x?|veJlj1n?BXxaR(HX9 z4Bz!zJ^cO5T+r(E5IE5vAb{cm{A1Yygp@`9=CoQ8);!mP3 z=db8>oD}cl?-TD&=~(dwU-Ll4VBKwGHr!<~RCf#Uxw)N#XHY*fDVUz3hX5tjT#!T+ zhn|-)EnF87HL1{)DuOC6? zD0#{N1!JICCPf(-rJyh(S%k4Lmva`6V(K((aeomtO^qcII2smJ@^8rt=|OH>iU=V6 zt80c(9mYnre5YBiiYfv{Xj=&rmof_>0@I?~@9=r!8Adb%l_M@~PFjM7Ytglck40Z( zLzOus1Y>-X(5=G*(K0wjmFu3YQ1k^cNeBwm>mDv?Uzql$Z=@DO(#fy;uMDima`pAt zfimNt-=)e7h6{qoo7XH|g-KLJoHg(DWEO9itq0%AY?{A_Y@uuM`Mqo6iOP+-+J8#}t-6w|1S*4v^CE2Jp3L zeetZLI`^ln+z$?|;D~*UzT-S}l2D-b@#4-Pv6*2$HLEsupVhmkCeY$F9W*ZT)D@CC zH2XxZfFHkHBMu6mWT_DA-%3;*ECn>z~9gN{UXI8^R?hV)j`T(qEm<~DkO)O8kPW~3SrWbLtgCv{f}_Knl&9nIT3x> zj0J*mjhU0YDI)CmBuHj?VTpmsGg&-}_oS$MjlSdlC<98AntkYuka!7%&u-g+`@@;A3TgLHqiZ7O75uRP-oa8=(t<{*e^xa^z%W zXM`UNPd#L$zb1H zUTo`L+H_i<9rU_@fq(qFSRACRiCRLoaQNZ|tu0**OL0a=)EM4(6gs8={bSF2o%CZ4 zeSx^%vNvwj3yCXOblY~hCCZI{jZmTpTFb`NovbACi6KOt6XZBsl4c=`8#YJmNX4*f zyh~|rf1Eoio2#g&kIRCm{zf_C?S37%so+2+jBVAj>BxQ?bBxh6#lB4}k5 zT{83c$XCn6puZUlrm z#4=SgW?38Q6tomUP!i)Q%N6A`l!u_xi)F8GI^O{?g0N6D8^g$3g#*omD{F7)F)C(J za<4Yeg@n+xk@v&s30d=#cOWRr_4iR2X+7J#e-VRHy}7NvA9|BQ!Eh?Zo%>E|wb(>L zNtV32!6ozAKN*#@N89=8pi7>=4~YZghc<`ioLHiWtd$Y?Kx3wG_gV zNKi(5k}U?|BPcFa#$z!b_K4@5?4Gzv!s!f=_zzQ&~ zpz1_%R_;@|V4FvqXr#y3$KX38G>H+riD!{C2!DmqGe=F^=*5^JDaT&kA*@T7XH_8S zK6=-eF+*Ki>(^9=^8k^9$U`u^?!+hzkt7f)R0>2oRXi#>^9Y8{C)4qJJse0f+#MWq zv5i@uk3tCp)6e2NMEHf|%kn&hcaRiIAvw+Jawk0y5{Njmo^pN4t;qG}& zVq$7gblPe-$}-fFaG5krgP3Qvaj$48PWEGiG*6aClQ^a1Us*eo=@ciWuE-2ANenHL zM&%?VJ%Y6jk7ru*F?fN80RM}Jztc=|j%|vQrWTJDzo22Nz!9DSyu2`;b1HvyC#{rn zy^)R)NlY%A({6Mc`SlW-CqYTltCEY=ch20e5KTZ~;DF}~;_oD}iB0<5F9y8=qTk07 z`Ra$UbEI{d`RME+1q0uwTM?QDz?+V`kMe!A_WH1t=-uk=*y zsM{=Gemh^+A@H{6_hlk%i^4+SVH*iPhv>4}GQHU}!XJ?N#YF;fBFq7%;=~AL;UvJ2 z%p~w(ko(nF&p(m*(GzB0uxGs z8>h5aGw9UL((J}})R}ydl_mUnO9g2quamE-h*8Aw3goFC-FOGSr$@@?Ja5qxR#FCA zz>f1$PXt&hn57no-wN{u3IU(AOk_6Y9!y{1JG%qf4s_@PkN42-mIb)F{q6Fi?2-gX z-Dd2GxH8{WO4v=K;aZ$GjlVyGsfWPT_XMUIOzfD-tp-mOsI=+1sZ#wgES08dtlCFv zwUws@OwP1Nbd+=yUmXV;`qL;RcqH-^Nh!ogywTB_X~6#8uSoc;a#Mz|Q#q;LDvjbx z{G-JjcA|n@u6!}8%P?)E$>iaKBvcTU;X0%yPzeGXdjdku?A4UjWFv~0g4?8zFifke zISGe0a6UlnWK~O(T&aU_4w1s76C*_m!6Cp>9*Y94fY=Soj42P->N;tm>Jvb-bQhr$ zC8n7ZnYe>whq2_0l?&a&Q6KhZ?jcslYw@LBEO?X_%~FEr!#c=4#8zPhWd;Ueuu+II z6@p~a+%maT2M}x~jPM{FU_6M2K}f1o!k6sXdq~pQsUc44KP7;J71$%3cJcx_tIP#M z;20`(y{wH(Zp9#iwx33^s?W{pG5x%nA&%Jr)Gx2p{gB5Xs>M2pl3y&Dp0ma}&#Bc)iM#D>H$ zxRCq{O}LasK2-X-N0x-bvN$nP7M-=(QO*;o8a*7cCP8Dt9-@vHB}lAaoM|JPCQo%O zDliPm&o{7LCV^>kg775W;}Baks8U}b2(CP+6ACuze&LJW^F)ySSDFporNwN)EAcD9 zueV%A$v=SaS~EK}c!Q)dtG$$!lpL@37P!<+Hgh(6wc6M9VI7yee=Bw){{2m@8%-1D zkaU|@qA0HzAD0@fm?2TkJdS9!h#VU{U(;%Efylj{9S&+rvy;fcT*%7SfN79(W^~Eq zou7uw^^ehz9*PLjOtMZmaQ2L+U4b`lA|K+kcr6G5tuJGny-NMe_C=q?hRe8JQJ$1| z8HfGinWlCPo`$7Qsw?8Cn(`TsC=v_D?3fkan*qjV3B>fZ~$kd3}k+Hf|vF4AesTSJffxb3TT z%C4J>hZiOHO+N2}+P(DeCSTZx=%ut|wlxPBMgT5!;6WZ1~DLcaWre*yN`zaSWezAm)e)&lI^hS*{-$zkI?a-IoNDv$HwT+0+=W z%Kotff9B}?Lkfd}3PEFV;RCy&Fc2s&Y13#3-h}(-!eP9F8D0_2DqLSy2M)vjdEGR~ zH``K5FVp*tgTvSe>oO1w%Q07&S>{R|Qv}jwTFNjO_8Ui~($l-IxW{-C9`I#`O5>jk zgHc^3Ql_9i#4qkK&H^Cc5N0eaK0G=kTxv~COtz*+rza$tBC@CD8l@nx2+7MY zv8Go}uWFjVKDg1q@QGdGtJ({Zs$^*IFYzgJX}-RURY|E(C0-(zf~?}Kam_E0{OoZ~ zCiKoE$;_^eyTF9_K9Ii5FHaXP9rR2<0*{3-a%mNFn}wxgO+#}u$oN-6xIQXya2J&I zUfXMTh8F*V))iYNV%c^6JmdFeFL^h99kA`NM@#M-=<@*#Z(Pze3@)Rkg+NDqkjV_m z*9y}fRk?JQ8(qcQry28eFGZS$tjFloZDaayz9d%*9yhPkhzC*T3Oy4%aL?RdCs;0vfNVJ(>j4}mO*cg&X z@@8XW+{9-HUyq0r3lSKCxv-34j#jjNqKHj?cnkP`dQCu2k%ULa;5DIP#s&k$)oj&Q z=l6tr1pRkOms9DR^ZUQ%{e+k0kw?J+emOb5fde4mEg|>d5gb9=AKiR`yfLc7(QB>Z z{SvCfBC_`AzBn+@dEP32f&CsDk(f}UnMCN$w=3Xd(Hd1;Ug(C<2Hn&=@Tfm*(!GR{ z1m3u$rds#e?%cdMc2fMh1TqPvFE~9e@So!WNB;@TJI6@0$W`MszD@TJD&KJ$m0l`H z0@fV+s|@E3Q4r2)Pu}~~WS(|+!t<`9j{i9Z4rhC*DqI{meAGGRUAg<&*-peGBp4GhqsP$cm5e^BAv=k=Qt$VhP z_uDpR-@jZzw+$&3)K0%dIkTr{2Wm~?5Uf-p+RnGN!)jh$aT(P#Xq%B0TuDQD_-e= zLsZD-i*^?|2cPucjm50A4OK8y`))?w(E0;e-}BIJ^Q6D)ZfR0i3nu<8L+Ev=D-6pa zg4-eM_&*(RK|bZ24(&LWM)%rUR+LKq<^Th|wOcB@(36l#r|zl>Kty>TwI7nmnk0U@ zT_eNuagzA3^I)JHl$dj$J=`+8y1{)w#&~=JwW9FbT`x4|05v~F`m$f881d->+Y8NA zz;WD9a=PM{f}r|UNl4{#)O!)??I(E1QElWs+TUcB%zPtwt!~vX31u4 zbQ_XjL}i#>%+3=hhL(i^)6ItW2Elleo)yrdEel{tir)QA;tFJ38DG}1)c?J|V7y4m z3h2?6MPejH-xYx*Ip1YE`w^m?2nJgm7@g_Z!A<1?G!axj_&NM(!Hp@icsH(c~e?#&&WGhC6@vG$fGxwi-;(vo)f{Of;Blq*uJ zcPH5;dG>tP&o*?v>Jf(bxDcFt)!=X77 zv^bud#I8=ViuM-;@$Bf1oWx&pzo?k>qUVeW9Rt)C7>|Vy#P5Xf8rbwd#hN@kaDMi? z{jx_2#vj5g<{yHLqiCWiI>Cx&P%t=31)$5OxFu$AU=uX@s&wgIwlBB;*a_voOSfe& zRr;p2Y&wqf(Cho_Q^VJDTSu#&-!_&t?|+W)@Z+26)5bn!LQ8@|i$b114Ji!?E}3Z1 z@}aqcc@~}^=9NTdGY~Og6Y)g`%}X~_W-b}EOZsE@P#ZCV7Tn9%+xX7`8d@3P}Zsk%}2 zjk3GV|Bfy?cX1eD$K4N5oW!}|-JZcs<-F=jkrA0ZY(Cl3ipW);S}^EXEHc|R_d@nB zP@h6S?!b(;U7_)@n-RpZCmuKQy7MQxzSzEsAC)+R-}CCYD2Wi~TSGW&i;u8NTz<1h zQ0W&9D6y?6t;ym9nN1$AFpKsR&y$>*0T329I5_z7Gc6}_&VTdwKjVzBE403cmuF~7 z(!4r`Oxm39dpzjD%kSp5oKr-iOtsy|*}Uh+o3+l(R>{(;LXrb3#JkiSX#fc5A_`9=S~qBiQ-;-+3-Hm|qv`^B>kUiYzU$-h zK2{&IgVnJCBSEIF5%FJ}YrIP@(m zgy_V9r(*2smw1$V^Cs5!SRY|KatukEIg|GE-QgMYuUaqPUnO`;CCc4!d%AGfRsx2i zpi1kr5AE_lQ%b|*ID59JR5zq-cT>twzcuocsu2Jz)=(IU9M4PcN&408?4|VU9v~Omxef_s-proYQ zZz@$LklX`VZ_ax}9=}l@q_>ax_xjPPI`5ki5HNkM*nL|u6xf@0dG&Aa!FZFYP&ZNU zeyDt5`LEf$^)L6oWdwotS-2jS&fWt&C^(C0sO~GT2!cqUd{1YlX43Ecy`)qNgBxF0 z-xF<_eXUyyPM1;k-^ve&;d;3x+}g4~MF~!PDcKq^A#Gi8YV`PoLRCU#QPD_9hWb0x zeb*LgxW{iGAWldal|}S-I+R^qFyN!KRZC%uC3-!LDydR%5kT{@Eq~UC$JDe#61%};6k}~0 zNG@(!J7nrSVFJF9B^$0-T-(e5MIx;=<5j{aIAQCb)itbYEs`sZfIWCimttRXCyAWO zP~{j>4So5ihN&|h#y88TH7F*cCnR4judLj&An5er|BIEIB3kr;S;Mn<*OY6=H zc=WA*wQ#}t7oW;jg{~~go$-C3ap3!ezH#RlIQ~5C+vWU#ZXR1+<96@%e?%<^haDH5 zkCe0f3ltpZq$cWR);kkw7-KGqulasW^T#K&{ZXt>EHSrueR4g?);7~ zLG0kqy>xe|j$s@X>|MgT55e?~&+cq@2TSmiwo1Lmy$1S|GM!^3o;w_ob|q#>vI%z? zKkKEhr?`I)!=LT^lM`bDnX+YbPEQ)m@_oCfZLbi&6Y6u$5~=VT4lN!5jQ=gpmFY!G z(qBjlE89~vCipmltk3x9ACayv&-GsYAt?#Ki@`Ij!c(~gy$JjdEz1$@(3#7!m)$on zm|08|rLl&v6PV4Dy|qg?kTGW>A8Jdv@rZ-^mr_O-sk}uVOJ?jBc2X4hp!%wXwIR?c zLT7^{LWwqBS*}W{wBK!>vu7s%VOQnVW#H@5puE7qyk>*;*AcZV+SDDE4i{V0jBrsi zYHKfb&^k!%jfl4 zq_KP)eB_KZFwgiPtTHsTe5yhFrxEoaHvC0=c6?Oe|3}eb`LJ zwx@bD{YzSQCC0dhQ;iG*qjrlqAb4DT@I)-+hF0Ne9HiXxmI zOaMZdpia$4X5r4TAaD)`@wm4j6Yq;$G{tciY9l$i>+go3XyS*kYG3 zT61r70{`x4kWZ|)cWjP9`?JW#VCHv4M{*~)gEE`7MzRcYPb67=A}fn)v9urWfZKD` zMT{!sIgFyOM=4csmL@WGtAt_P1L~TWc`$h_W13I9ENXWa@ z*R(z%Aa=u#eqOnf7Mp*ay>Y>+EhRV0yXX~ALig$Jz8$UA6Tt#+yb;eq!6pnJWws)R z{(ukkCd`FfS9(ya_`qLmiHC-JfWwsAa#^giH=x6;Wr7<1VC4aWJRTXPWD4&WqV2E= z9A1j07Odbe6|$er!kyRhcv=HLDW25Y>DY}M_mM;#Z;r@*l30CD!>xZ@zL~*^I2}nr z@OB(5P_0xN+m|59377*%^7d$Lm?RXD0tRf`uKf$b9$iNJL*4n zp5XeJ0f7qDs1J$?(Hi?ueSb+Q0J9~3x_nfb=%cTg+{i92HvZ&R=ilbKU0a{x z__WMZpTL5kG53F5JCx*OiqqbV3S$G*#=Z*=wRxrq*kPE8eWY8u5e}ESO+(fWciFB5Rz;=636?6C3gS|ts=&&vY!tPVuEGh1+DT9$*)R>`((?w= z{s`ih7D9nj2hdv1&6|{_B8UndaPX>g8R<_Eo^>7(rVNarKM=DgK;Gv}e_a${otZW# z4rNyw94c|R+J{wAw@{hHVQMzMLRe@* zIw;Zfw$hABkPXlR^jyk4$`oMsy9V^ck=yl`A2M*PS6YBzA&UA1RB?=$Il0$WOi z^Eyg*AHM;>R#R9ChOJhM=w-fELphF!l%WXzAO=SnufAXqHxxo9Pvf$u`7bX;lanhS zia0M}3WBL}@M$hQ?Yp0Lkesx+{<9KWSx&`A??S!5hIsjlt1JZ&#u$TpRMV{ zwxg`Fx%e2h+r9z*E2h?nqD*FX;21*+{Bp~7a{K71J3GaUAMx&u14`~PTJi8?*+@pL zp>g@H3yW{f(=KUy;S*dC7+BD1(C&INyXJnd!haH{kwNcU2tZ)pL zM_B)OywQj0JN(!G`CNa0Lw}=$?e1J9W4A8%bIa&v$*WYsY)Qj}um;&oDf{>?quMxd zgDsx~r+w9E_lb^Tt>&z4RxTQp^)6C2_iSDM*jU)EPeB6&n`(Be7VH!-qntX01Z!-I z>*6}#dPMv9homiWN6}X$rc% zI!2t+m24K{wPCk1IH~@rXJLhW>l1)-baH@@t1pmrQU)XnND7S6wAPjY9z$&ksji6r zI&ENgMO=!>yCBfys9vP$@psXLgqDPc$4$DOGk8_lU#srV++P@uvw7YLV=x&Z`*80x z2aS!VChsrrQrGqiuMXzij++<}8d?&faq;ibEHYP{0=)}TOmStq*G~Cb79CP;S2K74 zEv+=tH%@Lym=PZX_v{?%+u%x&s5Hd++^M8J;EUa}yg?M$e|@OB-bp-IP>L3^ocy=9 zfn3E{zdzkB-2g{GxW5TWBRH{y0RrDTO>5K_#c21eTn_8@=n99mU-e-5`&L|(ai)JU z5Lf4V2Jn3+)pW%sx_cTUBa9eI!cfk?XK1e{vmHCN5Yd^z5Z&`9QC)FX;Mc8*EfJ9( zD$O=Q35VHcM6@vOyeE|vaS3IS5~$6Y9($K-)W_?^{wfFXp9U93CfDh`h`gVX&6Uhv z?paHU8Vx?zq3sfyBuhfFey#bI3~bCzJej>|Q__P`JD2;eXeh;lyJrT!pz_ynu=5o5 z%Xm_9Q7qjyxwjsc5^JBciI1a@9N62L@??YZcqoYUKB45I+&_MF9gonW;GmL8{wyyE z2~`i?knoSwy{oD+8zjZUj@~Oe!7iCIf~-lX=(8b*oT*g6XBTkd;n`VGhHBB5gs@;Y zeD^sRgnGt>m#)iMkh6Wo#)ZB7>FfV>^pbw&HdY-2Rm}URCzM`%2;4#FWc%0V|E-rk zTRXZ<Ll_ zwxE(QQJiV>0M;3sxEnWeJ(=$LrV%M+ts-sAH6&oZ@%tUtK;pJ6@nLor_`X%J(UKa% z_uR%z!&w8PVAegchrdrsvY*M2;jd4x7@#>rjPnX1;FBebFlzLaGY>L z#ciDNjmtSbC|jJQE<)zi5Cu;8vdkdM0`sxi(~*h#BD_dcbaWfpDbA}ZahL#JjYI@b zs0odnJNeuC{1>W!EIQen~O|b=oLbU-LT!)*Wr&f7RVm^2{?H@z((}yR%Nk;v0 zCUnn3`>YEteGuJJc|!jur(ptamVKjc+IL=2(m~*epj1V{*MG5Ro+yAGO!&L6F>qwr z*)h{dP1IQh5qs5YW|bft78n$_uQ0XkkCnfy>n-1+MdjKd@>G^OQfDkceVPp%f(Goi zo(Dv^R_*^i@n~^m0P0t{fBVQXea!3`+($Fky_pJzhQR_C+#%jfzZxQO?RYg+ushKn z!({We7tR*gG5U8b=zmE8Rhif4294j(l{DY8Bbbcg5C=m3C3ftt->g`~yx9*uMBlLp z=X6~JlIG{%D=UV=KnP3`Dyb^;NaHiZVQ04lP*F{#o+Fa-EZt?7{`z4{Vm`1QxZRpw zN99 zLd3aEk*&8~6h$jW@@fIZI4-9LE;BRDodHNV?qJFLcG~WIM;`=;zU{L;4M7T8q_4cz zv*C9STDqc`EQeI|w1A0e>*^RdAEt7m_O&8*O@^$+HM=FdH`cbej?2L?YioOx#XUF~ zfuO$!X5*74Zrn}azOFS*-i5U8jo=UnitVgjmp0Mghf7z%T27HH9ml@c;94i~jl?N} z+E3Y)PYSUbN~ib2KPvhPT!6ZEvGiW`jM8{;4rJGBn2lKC9;;D{A`ktMy&t=h0+eF; zUSn#QfJieM_7SNy;n@AzZx4|zZKaC6a+X3$VA>uf+raabSrn6AO5hlbtQZ31u0RtU zxgyeQGmfQNk(+Fc?4?G!pl>Pv6XDU+-bml%+!YEEZJk$u(w_q1P8!HASfwz)?4)`Z zWkt%X=Hd-_vF&NSiLrBsDT`>qTW~is+keMShN=Fkjg21=%$p{Jn;Wau9dmXTbHC+O zFUrke6^X*?5{}VYX~*J)7F9+bcJaxz)Bfic?ws7ro>FF~Bf-^xTgXI8q)#LUmH7H~ zFF1aC^0{fwRQG?Q=GU6F852I6ZBfqWVjOL5=AA4sF;kBfX+T; zJk`RdjU~72*@N4vG^45-<_Gw%oO^aQ4@>R{!0Gw zqx>d`+g)3`n}(aH>aLN?z#?ss%22hy>VnXjS-va_wdT@ zvl%uxlORPNCH8KjIfTAL9wO3oH{7vEMkMNr7ZFAH0f!hSc_D`zk9YNV(68R<#=}Lt zRmxzC|K$+GfN-_Z;wQ-!ESZzw7}ElhCaZE#V0C+Htm_0PH=qWrRMjoR?9VU)?zmN~ zlEu}s<%#V2u;abE<18BI&yVT3>$~Tqi84refPS<$r8gA?QikkFm1(ez@n%C}XCBb+ zU@XqJDdb|YYSq}du^Z{#A3*JQG7Hb6n^S-RB~p=U063rH>Y*5RQ>w>AJqtVglEgpk zJj7?cJQf?$e@ zl0tDJ_MK}`?k&Hab&1T7%bI0X?e3KzQtIAppNdZr(526`bbeYA49*e?J~#0A9Uk(| zy&ASC6(SqW1G6=v4k4z48>u8I!6UsW{z=%A_%JypJSrLuOL`q0 zu9k!@+*{((r8cgrJwl)M%+c3h67`;9wcCpNeauZqxro&$LH@B(o%OfKUP`QuEz9>oCzEbK!qFQ%)*Cj-q{-KgyaJ^nJKsJfId&J_XXm(# z2fn+)Sx2%X5?1D$jM>@7+T4KkZ12N%OJ~1zXvY<&Y+5iqc-F7>6R^7^Tha>oreE9} zoIpxpf=;4-)*(ql8g!c^f@MuTmwM7ZopEHhxdl?KyaN&f#7yktV& zuai9cBVtmXKuo7vD(vnv8DhF&;^6aR+eNA091u*5Qc}AkeFuK&CQbBPZ-fWsEO;qt zTI!!F>nYxVE|DxGOOZ)Z>Fu=0MHZEp(h9uh9?5YS-R8b;X*vm z=ZFT~r<9}aSSUA6!P&(h`m-W^Es@Z4Dz=dz<$N+q*S0E$_8%!fn)WQ#YX^Tqq!2=A zHnik8*M=GS4Y$fKrd+O*5~gJwnf!Te*B<4DQ^t9duidVZE<(2TA^0%avO`6KNk(rD zo*glg3demWB6BEB0|o2RhK5KuQi!bIOYGF>9S7;>cvm1q4|1k_=&{ z%-QT67Do%nOQHBv=}cI?^z@4b$mWqWu5`F1hLn4_hwe6=Fmsv5~tL{($iaAm?i{R5Ebd0_cI)$r?3rC9!_4_Mzi#qa- z6c_FgrV8I&PP;xSd7QWj(;|kU6mFUUn(x%AxstCJ7S!+!oX#4q#V|G zrTIv4;cAgnc=t%^wM_p-433n;!1~Pek%Ap-3izXRzF@m^q#}V2la^&qWgPZcq$wKX z2lM)9e{-1s(CY21rL&LR*NXUzD~plQr>Wa1+n+7DeEA-SU%MmTTQ2!*mcCs}#Nb?G zKw?NK`c`Xi)6-b98?GRqW7_DBAG8I&SyN7^hA2@&J7M;zf%-(Chpb7!vGXp~cB(jv z-Rkg7))%28B3u5c;F>b=XuqT*R|Bg8Om#ZRsvSpeJiH_H{ISK+>5!BRMve|0-NI48 zsM0@{nBTRIF7v8%G#ylY^A9IC&o+Gd@%#$I^9)O6+49lrM|7bjJ7@!_c_FkoTEiifLvF`W7a8SRK_ zl!iCF(^}$S56YaR(A0VMFd^QN(F#gu@h<`gHuj!V5DSqvI#;RNiD>2EUTumVd@qxb zwd8)#6Yt{m7t1Edc#2xNSmxBk*3CW|)$~>-f0Wf2U3Fcr|JJ+aNm2_~=vaeu^miX- znLLWNh8{_yrZF|aF{{aCgvqQ)Q+V4iTlX9XEk8v_r0htxloP?m{|so-3YtTk>fGH& zHq5nFHx_iCNbdsEKgz$>r8T-UNgpc1vQGM}hWi#{hsr4@V6Cx5w^lAKU0-Dz*08p+ z%5nzQQXngpHyMoaRcXw567jvi6h29I!uI(u)ym;G^e{@{sQx^m=309};m z>7Stp=D!-LJ3Hz7?Vnwf6Gfk{ta`%SD7!Ckcepu&=;(1i8<3vDF99D_>)AB&J(1@O z-QH4kGi>`qe~UfVWw$!R1S=S~K#PU-7ryGZOF`o2%LGE$ur_pc@4I-psKOZ5+Z$%A z@RPz^bH*JMsb%e2i<~MO2i`K)6H{1EPnhY6q+3}1C1ORuZ@&e|#3i8U2~Nt8D1>}5 zPA_BfxI2d7!~GN9$ zNsQlY%W||6%DX*~aLRD3j}bC%_XS?GbC*`m6hkyl|1f-4KNV({(O66U+*!Rz$nzkw z;k3RO!{D;*Vwd>a2p!hQ!fZK6XB&3X>TnUnj4B+u-$^KnqsI5JPd zaaCyo={IS0y_14$gszc~Mkz9*WutOkT-4URK~jXb@09oDLQp8m^~$}){O&D2cAAoN z`{emMET2ejv39Er z;upe;v^FHfiYN6B5>7S(*nU5UV>AFb8A_6sFc@ES0Y-$IoU9OHUe0Ue^l}reCpelj zH9$075C6deyL)qB?j_lOKEjy{F(32EB52)1r zr-$56mz3}YFbYahMx7CF^iR*wo7cYCcswBl2B4DNEEm)d9)jZgf?F z?uCxt`*gTSbBlBNpA-kAZe4O&xl5YTrQ1|vkMLxI0<*l+`sCWpbw#ag%(RH({;i^>0keNUraFEGbHS#WpFeiDl~BDOF1og- z+ch?* zvwPmzt*J2w7*=gH?P1w?eJ3nJt*cT_> zgEH+xrJI%nElCCq$3t}G8TO0=LdTF^F*t+=GBWJCa&>=p1~Ex;xB1koTumvI8luUA z%I{wDa6+WJCxBZ3kQw=oe{ZBG-yCH}K#@5MV{B6h_PGc%qDEdV-ccGMP#{4@R28!# z8cG(%7p44$Uv}@ilf99b zrzxJIh4x4C(xvilT@x4e^(aicW6U}vb<)z^9b6Rb&+@%V`W;y%G6sAUMQrCIZ}FZtVdH5|EY$|eDjOH zJ)(lOzv_O?oyo(+Q=Klmc58Z>sBg zc>MW5&8kt;)yT~|`iuoPr(OWL;Wg-b{S0r6u4yhW)6KyoTv@+< zVEuT^InOi2M%X>i0oUl1Ll^A}&%dnP5YBm4#4X}I<%Vs@eDg!adj9JqIvQUuTXvvi z-?A+k0_Vw)(39x!?NzH6G&)qRLz}^#xL>~%oQqngHHhj(^JX4}J$~S^Pf3edk2KMr+qIyCp(-Ou&X&ujyFTgtIma8k_X|Z=vj$dFkN( zs9YT5KK0;&Sp^G%=irm^5{`F*6nUVBwSLmJi^OsEe?5liKo+A0Wv- zDYkwL;Z!irfzUtEw6C%xT0s0 zW9z0KlDNHT>n$mvh}MS-u_uw*ZI(W`yJpASr5JC)J@w2&TZ0k;}mgz9mzPl;p1DZvYNq?c%r@u=@s! z5Q0su!yt%2foIFS1MTZ+M5$bQ9d4F{VSyv-O(j-LEvBI;A59_5qH>A>Mj!~r5C(=~ zv%Vp?n@+??ChEr?cKVKFp|0T@80S`gF<5Twc_{l&2JrJrlC0bSxh(P1VPp9#Gdl*x zk%#g(kiSNq#JG08oFMBPB*e^byOxD!1XR}YE0P;?SfKOlpjLWykDJdTnw&BDWa)&R2GXfr2}d; zvZo;L@(|%dY-~)-W!})8f`TodHUz~j$tP1)j5MuJzQxTGik<%9|C!$h?y66Uq(m3H`e&& zPxsB={X880sFuy<=&2^)1W^NbcNfk)wP+-MR|Nt7*k98I8yKvzyB-EL@c69!nfqR{ zaFjJ&v2$A1L2NmeHLYJa{rL|cKVglrRQsyFhR!g5*hpvG{=5CmpNP($7L*eJX*CsO z`2Dj_Z7Ty$-${Of!5EG2&)*uVt^7Bwmgl<|LNOrd&d8Xe6TVO(LA z@)~74@W(IyACHMKi=lQ?J5fbo&E`_g7|9f_QCu*m+yBN}pyW0l()aFxWqEkyq1B~E z>4mT(VTZ%cFKgC`>{Qk*)R%wq+#7pzj7}zi> zl9GwLdA=@F$6l|)I(wC%Z;n6_LleXNBrR2X>^Un*Hv)f}#N>`$B(A19aaWiYE=prn zvKA^wCV3#`35nZg`!2768hEN0%Y_tp2thpD8&b5xLu>lp9&)H3#$hIs_t&RQAuuhD&`qh9V_9ys=7 z;tH-MH*oXdGg?0Q8SBmAT;oO~aeG-}!L}8m@iED%1vSn-b7S`C(-QL5jRpl&R2KL< z`OXU(TtoJnoq%XlFNE*FD=bzUZZ?a3C(yj>C zvScg=xtP07nP2np5;q%3c&pi-VYVY**gQp3m9{Jfy>bJab_7a0*u)Yk6f7`v=8Ina zaMEm^_~!2gk%5%TY(i}b8r>O_Xd4+}@8n>9T>XR$t97ophL)L|ewHl?1@gXgE3f9y zQMtJk{QdJX|M37~@}}*6>s@;G4{pqoX3JAhcBc2xuWs`C;`LzS|5DWA5ID*kV{yxW zOnPzo09ZcCNc}8}q)G!K51{r=HbJ+dGM{qd^?~QH2tqm z7j&&HT@GG;_4SF1^~kcG6ffWjc1N5IX$|4R~c-_4nDI`XX!>kzkdA^Gb|pV%UmQJ0l&Fz8Y&m1R&D#R^`Y zFAxeYf-a7zJl&c>SwPuFj&#a_ ztMR{3usqTqOTe70axNqrm=kUP;^_w7Xmzn`?dB?d5ASZOj~dfl=`HC02hgow`=z2Y zjtzhr5oEML_gR&I1Ic=wN*0t+>rE^E+~~P@^vaM0NS|*h+G^IF&RKh<#!x7SYLJu{BOQOfE&@zRTKa4;u54@=i|-a~PFtmg{xQNGBt3Q(~M zzyC^f2KJN7(~?TZTUYstl*peTFXf*j^+SRpz{`<(EzbC=W!Jp?} zS*B2AwqD>bkKSjf`@n6JWXJN~hXDYMBv~4s(82bi0oG9L(e)*9=)OY-5cE6D1PLk_h9&S3`-qFa{$Kizk6fSMD zs&9LEFZ?q(?T_sDT>T2MGf8D}$~FEeGKF2uKbTd3u0o`f)_d3uOj{%MS>df4lTb5t z+>%WsUgEPKc5|4uw_a1^dU56*677FJ3hT1km72DUf3klxk#7?_lT}uy+{?d2rgW$U z7cz@b)nQU(YQb`RS9x-2V(YEet%{xd-JP6#o-sRP0nP-Rv+waKU0B} z{=Oa8C6GY)6OUB3E5_xKvdeI(5Kg;5E|pLGOB>^oOTp5_eCTRW>FXr9?>XaLk>jbh zM@Zd&JZodzYYP(l(=a(5I zXEkvNJEU@gUv0$^rb5SU<5e@?G0PZllPk7Bhbg1)4`b8`x0ct&t!BPwme9Zb-nxRr zJ)f`itR@XG$5zjssB6EeE{0);C}LP8!7kf^z;#mr=j`Pfzs~6I%MDh4naph65Olya z9p@@)UqmsSzgTCwMO*6EHJ_6jP3W35SX;;>1A#)DqNyAf7( zuDQke9f_=Jg_!6`p7bXEVC>ZBRk z*>YPGap!5eby|%*P#zX(|E%8(qw}N3ABZL0X`37ZrZ3k^R6ZI0x(s7L&{!}~zq-b4 zKHb=`hjG5q;dATHbHyz!>o^{)CR#(kozR;fB9fm(@!| zaBx}6t{K@2%d1mTsL`{F%`FS6r<;5BF20`cm47mAeQ(`<`w%SMDyy-6vVO6^Y2|KOZc5=00TiaaSP$u_vG2+9g5-bG(=(vZmkv}@Nl%_$pEQT)7ebAk@GZ&`X}-R9P&NJef@Wya{9 zUFq&rFhj7k@G|2;QzW=eWxMY9c$T|zdBVEnNPk1Uah znkaPl=mLQ{1@6$90Jr~O4%}KaU&C|@Fz36}8nl##J|{zIa!vVEU8G#O2~vNh{!%P*I%G=g&teC|yYO&YU@$jLOjAe{`SdTjsYc z6`{W!*1J`QHqTPU{iMxR7HY~5`2Rh%{J=x|O;!?F59j5CF)?ckn;U5PD#F@LwAjS^ zF*%M;b^7WK1Q!?3AMo!9?(y#`v}*>bRtal)0Edj9LVrM!v3qpNe$_=-3vp8^0iA5p zW$be%WD|TK>P#?~LV20soYK^hn%V)Sxo^w;ZgL6p5d>)9bw{1u^2W9Z6Zs9r%@*l-OpF z4menRLVZhf!zxkCC(O1{u4$&DcS z6R&VnajE=E^q=U5>8Ns!rWJ$+#G9ec^2DtPqo1M=8+nCWTtOvTXX?4T;VY<;&4*CrZ2o>=z) z%si)WEozAF9=QkBo%m==T01X>z0NMANEHDFrGEL5oO)f|&$m-p?R=Vn^Lvu9RE71VFKSr6$ z+QdTpOQW>?4}S+{#Sj@Wu9ASo=`b;#=KlsX7tPAZr# z@@{pbJU7WC4F4D|W%WnS&UIh6DJY13O6bcC#p5O}`CFCorCWKTM8`3zfU>>siC~X9 z;gv`E&0}e)_U7g1nU^-IWABiw>gO2ejf+}RO){@n-#SG5>VRv8d@P>qJ?#!&iD7(u z4P?)D4HXUp>YCqs53fLrU4;_@vNL%uDK`3*fMsI{daiQU=^m$_|1+rPM4qb@mWrj- z7%gs#qUY~3IWdIS8zZXEZ$Hnm%sA6^(U#lx|Bk^~ zs;P#2=DNlOwBIo;$Q)(`TvU3-Z8CJ(-Bm7)_TtN;W9ZhWC5Ntcuv7_Hgc%o|Ykp>} zzYSE7j9`bG?!UO>Y}P;i2o)?2em!w4*z*7@^gs`6wt?XWJ5>=2D2}T|%V3LR?oT`x z<2s0OPQk%ZH(A{k6haQjvr4s}STOFAH#m%%o5 zHM#@sh#Ax*3&s&0%$R6mfVT~IWwv^b97J2uX=`bF?g_dRfSCu7{`~Bl2#Mg}@4dGF zWDzM9u#rhZC+gt|m(TLU1fnkbHPA)q|hFiC~{(+VK z!K>KA#LK04(Ra@4z&o0|QE#s6Sn(2EUkBXPya{~Mu8q1In63zT9q1Ik!6<3DucNSy za-2LDJH-*K3@4jU2IQrA(6Ibr;oZXJ8=L2lMpDkCl+6s9ndVN(c)*uRKG9EtfjBXnrV98OvY?8hj4GlK(`!+eDdi7cNCLHe^M*g&m`QF{qzB;)< z7b}^Nnl`pBF4b&vOg^A5^2A|DIUYQ2ufo5@yBt=_;DX<5LA8(KSgL|wW){0fcnS)R zgPz6zn(HbQq6xOOS#?-5!e6E zWj-cR>x{E6&v>Dl&fb!oVlY4L{c)V{skoX>@?(=A7Ex#@-&TB*qG1wFc0d0(G5!~+ zr|L8Kc~|JJCu4%lE7yOTx9gX&Z*kj3ZpVKc>+mgf+r^(kzm5I!Tb#xluTK1CpE-8@ zxA;IGytMG`|8YNE_yoT*AR()7Ukv;9{xrd*f~*{&FcW-w88{qRdOx03jJL%3uEiI| zS=Rb$DZ+NCp_YrD7rGjfFr63IsUcN^dfhOVuJ>Gbp{rBPJXnvIuDf=2c&b}i$AXld z>UEnw=l%H?y6eGT@7X$komT6w{TB7K^K{;q$#td4u2=#_6@Ja4!Z6|@l1rN>eTmX> z$2*_;^4As>o?`6cmD08fP9+zuwbSmC@I;|v*ydQ<-o8Xa{pT6Z2TXp?uS=(om*};I zD8F2QZ>EMrki^}E3eZ_k>AXF)wxK7T-MZ+rcwk$*k4OKj3Z=TZ*+3>LhDM z8ry0e%s=nPE^qo3himA39xKms{fHyY6;+DzNIV`xgVFXb-VB})Su66}1D wFtgX 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 literal 0 HcmV?d00001 diff --git a/generator-web/target/classes/static/vendor/font-awesome/webfonts/fa-regular-400.eot b/generator-web/target/classes/static/vendor/font-awesome/webfonts/fa-regular-400.eot new file mode 100644 index 0000000000000000000000000000000000000000..acd09edf88322a326d9f8415a643d0d07a87cb30 GIT binary patch literal 31004 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 literal 0 HcmV?d00001 diff --git a/generator-web/target/classes/static/vendor/font-awesome/webfonts/fa-regular-400.svg b/generator-web/target/classes/static/vendor/font-awesome/webfonts/fa-regular-400.svg new file mode 100644 index 0000000..fdaf256 --- /dev/null +++ b/generator-web/target/classes/static/vendor/font-awesome/webfonts/fa-regular-400.svg @@ -0,0 +1,363 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/generator-web/target/classes/static/vendor/font-awesome/webfonts/fa-regular-400.ttf b/generator-web/target/classes/static/vendor/font-awesome/webfonts/fa-regular-400.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1a09a74feb12d5fb4af504f829923cfa2c61bc6d GIT binary patch literal 30776 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 literal 0 HcmV?d00001 diff --git a/generator-web/target/classes/static/vendor/font-awesome/webfonts/fa-regular-400.woff2 b/generator-web/target/classes/static/vendor/font-awesome/webfonts/fa-regular-400.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..4cd7573f573d95f5006f021946d34971c67e1412 GIT binary patch literal 12176 zcmV;BFK^IyPew8T0RR91056aL3jhEB0C+e6053cM0RR9100000000000000000000 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 SA5u;qalMIESQEuF0002MZLOIA literal 0 HcmV?d00001 diff --git a/generator-web/target/classes/static/vendor/font-awesome/webfonts/fa-solid-900.eot b/generator-web/target/classes/static/vendor/font-awesome/webfonts/fa-solid-900.eot new file mode 100644 index 0000000000000000000000000000000000000000..6154a9c68cfe075077941446be87e07194d2f90e GIT binary patch literal 97828 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 NdTNmc3vjks|2L{AwOjxI literal 0 HcmV?d00001 diff --git a/generator-web/target/classes/static/vendor/font-awesome/webfonts/fa-solid-900.svg b/generator-web/target/classes/static/vendor/font-awesome/webfonts/fa-solid-900.svg new file mode 100644 index 0000000..516446c --- /dev/null +++ b/generator-web/target/classes/static/vendor/font-awesome/webfonts/fa-solid-900.svg @@ -0,0 +1,1413 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/generator-web/target/classes/static/vendor/font-awesome/webfonts/fa-solid-900.ttf b/generator-web/target/classes/static/vendor/font-awesome/webfonts/fa-solid-900.ttf new file mode 100644 index 0000000000000000000000000000000000000000..e2b9c72d1fca3149f7ea99ef0a2181ea62386804 GIT binary patch literal 97608 zcmeEvd4OC+oqyGP{f>U!{rc{nqi3djdZv3aGnxC!HJKcQ5JCtc3E>_fga{#oByxm+ z!)XM;$Yn%u10qIcS!7WGQ5sZaUBsaKb6H_=R74h6x4Q>fMCklJ->UAOp2-AR*FSe= zKCkN4t5>hiZ+*Yt`c@6&j4>A*V=C)9`owjM<2N<$VvG+VbnWpccJ?fMZ1qLB|0M3$ zpL5|^+m3(Ygohb(wlG#de%_YLH~qN!3mX_~dyw(LS2mw})<%2nSFS+ZabRFG0vvN4 zZup-Bnl@j!^RmsYhx(A-Ym6C7w_J42S>r~>ZpKSJnOP;%I~;>=T(Rw-+I=C z=f3x;&;O9|bM`Q%yu0n99Xl^f4Z0cMbRA=nXBhI%Glw#GHg@Q(L+>irQb^?we^G=W z^u=Yrx%W)({68`mlE=@_&g^@y}tesm~4RcgHuk`aRA35(Vq%Ys(h(}L3LO9b)p?sY0Wg3F-EWStItoUyE+as0fP3EieIpw4LP54C} zGyG&^csVXZ9`JlJ?xFW9>qfz|a@>mil;TrgqOz3R>_hnFyVQng55zC0l{xgDGBQ1X z#ph$Pob;T>OYaohXzbAYB9HVeL;geWiF!rZC~fjn_+)=Y_?U=``Yop={iS=9mC`({ zTu8Gr&*FU%x0pYMA9`=3m@c_vMTjuuZ3KA)WZo#=p?76|g}p(UinP;@lMGV@o`V_`Tk-W zBX}OCbm5KxO!_C|7UNNP#WRYF9}Q4}b^vp?(;??qqkvFKsvRyk1cW<`pCEM;fd(_P zN>_1WR<((J12so68KTeG{fW7!+BpUB>v{dD$@?7r;hv-f5n%07~P zA^T$X)$Dlo*V*4?-^vzpuAH6o=VH0~Tw|^y*PZLn&CLzxmgbh_j?Jygot!%(cW&<5 z+@9QRxjS;7$$d6=Pwt`I!?}OVeJl4*xfgOT<$j)fHTQb%KXY&A3VEJ4@~(VUzCJ%Y zKaii3KPJB_e|mmP{?h!e{7w0r^S9>j$lsO!eE$CYf&4e}kLSOY|91YF{0sS?)f0|Gy+!OT^EfYf%r%s$cF*51=8{Al9EiQi28 ze&XGU_a_d$(_$DUTF?A61^f?~}?i%D*T- z6Td%KURU14@7u~dN3q^VMN>J$}ztH;UiQD*c|XZdZ4zmlS_5Q*Tgj zR6kk%y+z%N-&@sv;`c6ffARM|^*;6f!++5czRMfR6Z}`#t2KL|VefACZGt|lV`49L)*2-^!gtmYU^95`bdxFhn zZ}PqT(@Y1QGC;T9^!!a5Aq2A zJUbJ!%^U1mHjCAV{1o;%b`_rkxvYtOhCRdni#^Krv%h2ecrT=srR)msU>{+d z__2JHJfT+xXYmQ*0jk&qI6`dy7BLckydjKf8pz%uMcMUu3=PS;)0+=3zD@ULW(b z0Q0g>us`rm@EX3DFX21c7QUH1$^Gm*>_6Gp`KQ=N`7!Lz>>9R{Kgt)e|6rfx*I_oe zoe%Rc53!Z(ANg_Y9JZ02%g$yN|2kXBKE?L(RlJW!*(jgQPi9xL6WMyUj@`lMu^agb z{2*V=UtkZj2l)B?0=|V`$S>mC_~-at?0&BCYk7~Z}SJ)ARpif{!fq#`}hGi#+upZc{3Ygr?NBH>HJ=P9~)ptv2FZRb~4+*Pv_s_ zb^I#!68|pu@&JE;e~~}UT^Nlv_h8h<+0%SIe}X^BdN5M2W*w}XbwV1R&Fk4XMst#1 z!7gGg>{a&f>=pJ4_G9)OJIH>(USuz@f8t-@%lY5473>&xEL+Zg3p(KB7Td*J`EGs& zKa>5Gck)Nr9G2qUY#~cBC)>l%fnMMz?9-TO75*6eCHoa*`rzu z+s-m9$MWnwuJdYM%UAHzK!W1T<}u_emh*31ZX46A}0iP7F>@6 z|2w$01YZjmni~Q?5w2f?&xae309|F-padu^%Z4RDYgslb!M4JME{Xv9%d*uHpu{X2 zlVHDrTQ9+nhMSN8oo3la2~cd7O-g`vvuu+Ds5r|uOR%58O-b-);ie_{_u;lk@E^dP zB>}q6vaJ$~+%^e*6Wn$Q(%WTcOJIIr*$xS4tys2G0&@n-c1d9NVA*a7%p)w@BY_!( zWqT#qn{c7SBS2flvi%a6Z&-Ff0y7WG4oVQOoE?(DY{as2B#58RQn~%vCH) z?F6vb;Zptp%wH@^`3Bgp;VzQEoW`f?vwxr z!m`vh0J{S2B@*CDSoTs0@Fy%wZ4WRi6SWh-sm*su@KLz*J^((3Wp_(}qhZ-G3Gg;7 zOLYx^%VF8;B*5>m?DZ1hd|37d2}WsrLV{Dis4oKiZn!jN0R9!Yw@H9kV%ggzh`?s= zkl-{H_etb+gSF?65!ximdXHtmt)zlN`R|l*#{-q_u&4$1phJI zha|xBvFyVV;Qm3V^m%yd(0gyCUj=l%5EpV$O zAbqf0wFIr1vD#1Prw@rdy2e(~XIEuK;8~mZSFpNP{f5S^{z*%bg$r36bS6&IyneS&p6o><+kVB_Kbt96bZrjd1B5 zfKwWv9Rz+5?gj}?-=S{Yryx@C)Hm zodWzKxYPy!-v*c30N|g4OKku^s%5!rB-s6Mua)2$-0LMch206hg|Hwln~S#FO6 zBx08Pv;<^hmb+Dg-30eG3CPPVNA(3@-InD(BLNwjkkiS{(AqhrxMfC_kCTF=vBxsd3N9h8L%J-NABzBg2T!I}B_X!Dp z3*2u>K%Qs0j07ZmmU~(PGCs>aBLQij<-RKcxu4~}Cjkur%TXBs=mJ>oSqW$bSndZB z&=0U2)e!(q0n7c91at;0_ag~t4_J=+3c#ojyd(jQ0?Yke0=fm3dqsl%Ke+!c!CTEca^(_HDSYNkCV@a=(#agK%G$-~({ql;8=tzmtGY zgXR8Hf>ynA)b;?Qar%w~G#)JXCkZwN_gx8SL0In3672JE-;;o5gyr6sfR2Ra3KGzk zKtUh@y$Q>633fVMhXlVDt|kGk3d`#f(66w(ApuPb%Uco*V<+#DfcAyuqY}`=uzZyS zLmlR8BshJmR)T*EZcKvL!7T!s8642_g{4NPb?oAS$`pC@^d^g;^68sFfpO%0gkmYZcU_XU>hXki~yh{RF zLYBWr0{TLh|GWgFKD%E6Iz*PgR|48ZmcLH|dPSC}dI6weWO?dO0NVriOA`DXxCbQ2 zE-C+Y31}i&{u>g|NwWOo60{DOr!fi85@P<_63|$({L>Q9U9$W$66{xSsVxD1C*0>G z_-El#`vLqjaDOPl_rd*V2~PF#yaY6$EdL`3TA$2QKLGe#xYTa|PVc=aLAFkLDg(gj zy_Y3;5H9sgfPVz;ZzMS6g*>%4z%y{)l;97;{k;VL65N~wzaDO0f?o;uj}m+%+_xq8 z*>L|P0SzsiKz$L|Yj9NwXl>a9+J*rAEt^1pB9Il+UE(h6Mjm z#JXbp>fCi(>+Y`))o-dlP(R*K(=gI-S;NB(Z^YyAW$`WXTjP(#-$@K5)+FvsJm1I~ zFKNsqt>jSh(WX$-+NOi4k<|IACsS{xhtpT3-)w1Z8Eg6BteRQ(&-!`m;?@JL*|yzn zkG99#m$mP2e|L8K>d#IgvR-bN0=7b?$X@Uzlgkn?LWA zdH2uz+5ENhA6Q^7*tp=X1)1U0@T%b_76uk>Sh#oLzl=mic8$EcXz8M_EP8M8ip8H? z{K}H6mi%Gqz|z~7zIIgLsL`Xov#fsE3r9ze-gxwbN58Rr)$#|989L^YV}5wdyDK)X zxMjsl$NG+4e(au=dygA9?yBRmtIk+;S%j1#Xr@hfX%Yk#(GXx+AT_pf_?y}tgG^#@LhowV(wXExMqSij+kliN?e^OUWp zjGx+f>e;8>e(J-g{^7K$)2=)1;nP>2e%a{Z?eDmCnb9bJ5|EA$hw{Cjc%^7{P|7RO}lP-?vrai`OwWZH=lCz1GfZj+48BqpL%w0 z>)vbj{_xY0Pd{|4b?exz&)!^}Ft z`TKV5yZf`T&+hu{&+baywfe3tcRl#I)t}q@xj&G0`%nh!a2fC{12kXro`D6tFV)8T z`%=k7qaOB$BE1O;>@7c;^rd?uA-yrxHxLZzZM-psR|gjINY7xj9?O}JYKEbOVxhu# zC>9IxIJ_c6UNbF2L#u~|4#YzHL$RPY8ebKUdV@S}Xf2x2MQ;>F>Dna%M&xybURga< zI7m;ry)~Kye}eYRO|#BmsGj!>^S%z=X!EGQr=EvwZZ6q= z!}cZO@=njX?(TJ&CB@q%+yBhBb+6mFuA8dRfj;pv);qt5dTaoXyAX94o>~u@=n=Aq z)bUUxIPJbU*{D-E>QHniKI$~a4X3yi9_IVWTNtHlg`Xc?isIzAx6nhnJS83SA7YdK z=O(?Ad49Sw&;I_t0rcDm@}Z+Ar=rvHI6cpU)1Fu6%~z4l$}Cs<`Id5?KQWoP$~=!v z22bYsuzIGv(m0~LYvI!9lXX2k&&}xDRL_Vj>pAW;4lz-$xE98bR0duVtFp2`UM@o6 z>B-Fg<+=_|t7~IgT~5#U^t#@UjEZbi=Jy_nugay95&8j@N+Rx80* z5oM_3$wn_1PO-;^B0U5Bz48hlCfDR&! z&=%YBSvDwV3&FPdhES}~MX9vJ4!SoMGSbWAhb2J?V{9KP9C}u{2GVdJGzPm!+r>M$ z(G!VA^kh%Ouz50V=&4Sg8d#_d^TC07t{b{BQ1(PX*==rgpxX3$niB?xd2eH?Iih2E(UVGdz_bM~4K}9IsR2Z#7ovj$k*LwA)A#Ugkx&QcNnfM4q0MFZY};qJ z+G@^NV%TcC>d@!T(q=W95nC}sp2ikeK($@baHunE8CJO25wN^r9=5H3!{IhfH{WsC z8_rPW8_ubpiJeBDdA#(xqnI974MnT1@>ExQqA_Q}q3I_Z9!FwD+sc@s_#=it7}XRz z;#U-prdt@P#v;oVt`E7KhUsiSJgO&J5mht!)U=NluNh8C0mMN;J7tu`(2yKU+R4FQ zsw7nQz#ys|twVhl)Ro$%e{wn=M&Ik;I*3LzT&BQb)O)((Ep$yeXM5tVRMX}yo10Ru zxT$MPVWPHF)6JyamhS4KS*9=6G`Mf|gE9y9Y%Yxk4f#R1P&iif_Hq!GtdJfQT%kdLQ;)i`%q>4 zP;J43q9j+u-zap^q{I*6 z8nCUxHgUJtvL7t-s(i$@L?m1ak8vNxC}eT{Ns%7~Q;NJO$jfv59cZQ8w6fj|cC)dA z_YHHfp3Ovyiv3gy77!J5{>~&jT6pDXQ`dKZ0PWCq^JqgG(Tob_w0oyl+o7sEH1AH3 zrRm?&${)fVg`!YjhM)8 z;g^(M-hk}#EC0eb#!*-IQaL8)C&4Iyd-h9lx!+F=?h%styASxboF_orJISVwhl#3{ zM*%e+M>FBU*3I%Md@}^WzPqF_3kBM(Uv;lP~@>e?b zH=^2Q_9FGO%D1N^wXEWc6<*oaPeC8^G}(tW7u$LO@=+2pQ<1HKd;vMBKM5LMnw_CY z3im>WD)D_Cd;w2}dqH{m=Mf0$mdNX$JNGUD)j`7CiW7vZ{f4s4+!(i%=0#XcT=A8Ww7efqqG=AqS8g6z+!B z0TmeOg&wBA4~#p0i93hXL$Ui(WlwWoe}|Gz*_?QMh&6bsrH$xIzA7IyLAcr>yQ=F1 z^2G-i55`?ali{k5xP3l%T~D3ia7Uf~&J)HYJASitI1Jv`47kFEdhjOLIs4buIYte@Z@mOgc|0>d<*B z0}d+^c0?{(>Ocx#LfU9=jJpi~J=(h;?VSdh=!9(P1*a@#k_OBq7~(oe32LZ;*Q3P^ z5@Kjli$*Xq2U7giTW)b`T2Kp_H>uoqrCc^wZ!$v&(VRzqw0+eoE$D1?YWmvyT(<4H zZ>_H3HmDsTT+V$z0Kf7$Y(Cc^>u5x%%zAr@nKsaNl6`?-j26`m2vL+lni9j1cx0nv z#0(-rZ+8#1E$E3#y<>0yfzEIE~^#`2J+TtA2qKBPsL)Gef)^1$elS(%C zG*s27+|<37yZwe1NgvhTJtyLi8jjiNg-iOnp(YIn+5~Kv#YzR&zw{d$KE<% zng<|IJL>D5*817KhIT+R`arN~j>Jw^tjybFT|5|#U}X6*q-ZLPCZ^oFGtTNjpxT*n zyErfVzqH>}0v`q%yWY9ZecXe8NW$h>3C=T@M7R9J|P~$JLl>bnPMU zE=N^>$E~^!XJeytcD>a&Z`r)YvE_RoJ3L4*Wa7fpMnh2eyneq|c!CYaH@P!1=XAf@ z?LTFH)Z~$-2>$l(_01eC5`>ks2I*RfUDW3ldHcE2XuVsgls( zwV`!-VaYR(bkp7b-v8Av23Ww^{~Jg-4Lid_@rf^hG(&tKs5}iW%X%@R6XT>f_ zp_#p&pf}j*hw$fC)iWV}!Eu`ogeCThc=2$v4ervmOp!|5ZVt!A1JOn3ay1`CFG-+h zhI_-waH4;zUL3>?!xpp*!&1RgZXwQL>Pss~3a&D1F&-Zo8Oe;qLgVznXIpzM+ZO_z zq5fa-jph&Y6(bQ&9Pvv_3!{Ah5k5CM_E&vR0|h_g_X_WgkAJ}D{+jZA@b~T>8~Yo7 z?*r@e{z3+tqM4g-vOX7K-Uxt#p#7SOoG1Ge;bc*!se^X9$dzfO$t|I@SoUaPY*gq! zM&-&LKXa(%fMxUee$eKT5x$wa<#QRiW;fO{WLul%`q?<-k9)D7p%Ij7K6(r>@Rh2V z1st3PbxH&JMR4AcupxCf#hIq^hHvXC>Rc?+znl=R>GV4XyA0>USm?2x&hw^Q-=zP&~R6pi44o)t=P5KyqRLplzDT^@Q`60=`W@b?E{(_(FZ6@`y9wi*`ZaJhX-sSjLGT-Z!4flU)GOgo6ueM0VqivCW!HwcH4ii=3WvC9xQ(ycma1v0 zKgt)A2H^ca8;Vc`Y!CF*>0m4M)Pf|%^98gyhO)++j@33d*Zz8TLruUs%d$0Hi~8H$ zc!_^c51HiI7^%}t3(T&^GWFR@(>;x`pxYa$>d{GkE_9d~v_S^@*apzzqytA@F>QlU z1J{ns+Q>1=2gVPCO%@nT5SBt@QLzHVAMqhiW^zHQGLQALXxqZIg0kY)fHYHS!H-eXo0ZT zyWMG=1a8^tt`9{U=Oyview3@vW32ZEBgwf-=OvZoyuv=Oqb*4ygVUUC+V%;~mYbUN zrmC?|HMA?C*{VnP=&Cx~vJ#y=IC<(ytYY{KXB7aUrORxbchtP(K&$Jfsz7%wK9HEZ zY<_ZuFEWY|qa5R|j?|2H#amud+J~!-MmkQUw_NF5(gkW>(rr31^VeY%QC%Gm6K+%t z7%&W&-qJ|zEiW`DgVeIrX(51-4B6WsEKOTU6(PaiKI#b66;Qijq>_>2dt8q40`4xe z>;oGt+o{#Sglpbxg=Aw8qy@eI6@wA8^Yvrs*(UhNr<}xS;a&nGUCAy5nxc1=$9| z2cEg(^vq$Jm_9L=j*MXXER6UN1us-a5wBBX^tyN^67v=Idx8$tr|MQDuzg1Fh(pz# z4qbORb=Bce4Cyx%M`ifxP;9UGiG>c17NeG4n-*0j!AC$vbj_nXz0Ilck^I6g;@kXc zw3!psvIhN;X|z;207*oLz+R7$mR3oSqG20Nr;^>Ywk!mC(EG4~1ye{-{a6Mi=@(kG z-Kwr!X=+y~N;c7?Rad#Rt$~`Frka|+zYMkMHWpwI`35w1b(LdrgQ}~WjG#|hs3__S zs&P=&zkA9Cx67(_^WF4LQ_Yw6Ii1I!Nke*d=#zJNs+?~3*SDlmH&>gAJ4Ew5^m~_M zUTVU4nv4EMnh7x+q^6gKioeYCkt|G)L04eRLkg`ZAm*x&&bzB)P4Pg;U;P9TlSG29 z-)pH&_oTkJG-|s&vFhV4c85+_SJxPP-tKK^8iL@eAR??1U|A41oTh6@dwS?DL$C4I zG-R}^8|%W2AcI)kqzDS?1_3+(GVTS4CCuA;esXh{aL#M5ZA6y%15(C3^)duKUT^DzBFz%Q*kN4FWhCeWL=Jqp( zhR&QbdzK%QU`^j~RU`+~Wf5Q*Mx9?ZEYkLo3k3y4xibz0Bo&j6(7#S?^Cf74!`K9I z4HxwnVSiehon=P2Fc>RzZ9`l)tt~2J&~uw&94BEbMiwDQWAEh2unW1MsOKX!Us*|~ zQh%UEjg~xrt4Cwtlkhhp6?YymKDfWWcsC{R`!fYjiz%aIWGbJN8aqBJKar8Q`~Qm2 z5&4dwA>$ZJ`!Oq%9L}1diWW*Esgx!Wv40Q}7&@oK_0|w_(T6Q%VR7EZALG&2h?@CUaVZX}59y z9I-(K*fNDE-P=pAOG`$P+Lp<8_OGSq8)k?!R1QNOk}mK&$_VskYt*-=gmNZ~I$^}wy{>0+y?aSb3hNZ9n&iAjp)zco$1fA6p5ihxxg`A< zMe9qA6k|cVh`YKs4DhxUv@dw@-a|W)a_(RzI^LCv#A9saq{%Eu@8s%Q;LaA9eNF9tLHg8!C z<{kEN6wo5C(58YPvg|IY=IpW`q1Q`)LwhMIU5b2y;K@sNugBw*jEgGg6G`fbEvn47 zhWp7rht->D_s!Gpsoa(E!_)3DX`%msRH75|F+(f7L|va_sK7i@3_ZHQ8nW!K495#% zP))f&g(y;_ba~fiN{=pAlp|enfWpM39Cm%#HyLjV{gTw{MCizOuxsgL0FF5y{J|93 zUpWhq79F<35m=RrNrP4zqEjn_lp>Xt)BnGH&L1s+oRsXyW$j>MF$yPg6j#==arsP@ zHe*fB7|7#>))Xol%JorA_QgU?8u(nT@E%n>cWB1*6fUY1-!1wk3Ec;Wq1wgV3yBdl zkLrE-Usv0jFz1+N)A6CIh_8u3uX}z6E-{B=4G7z(93QIOqcMkiey6I&@XA_My~P0* zjbstYXUabGSM?mNq}MHykPlZ3D6tIeJHq8d;_8^bpa&5tX^4v}BB6cn{fvM2%Qz zgIlliUgfRQ-LRG4Gx^!L{4DR9TzgK~e!rcF-G5jC$!;DUL=igMCD22jh8!ia;7>D^ zmy`uyGw1PcvD!P+QkhtQN_Ug;b|9sda-R^2TTF-0S)y=BX#CJ1#NF|?22Fc$%dVEi zwh3!`#Z;Vi-T+pmy1?atO@iYKcaU=(gP5}{q8gyAh@<0Stjz0MF{$<>h4n}mfm zuL?JJbTo%8y~=df1-hyN!;}2caG4Fm-PZsZ>?GT?Vx+9rVEWW5v zn0%XJ%Xhvk-yzNbbqaA!PnBL-Sou9UUdJ(BX?$SUYGn@rHyP0+nGwtc?VliSN_NV^ zJy(F9Tmf76w@saIn|u)4e}x0#Uaz196=~C$q8w4W#Ji}HmWfv7dn*&zt*X0`Kzs@h zw{bUCH+ReL9hUFubOsh{q*M}Ian~dx7~5Y=dg=fx-2FjmSLT^UPqQS(=&C&fN6evb zhL4up2mQcFZHg6EGKe7~EuAMSn{u?&T=Wjn)bEIW3|+Lk)SSTDHu{fHD1s&pCehb1 zj7Ta|E9BS)vIHdKiS(poF9(?zK>SaImvvZi*^2JfGmH z>ztE+!fmUaif3z^kn7tfH!qCE1FmYL))!60JN>?{1m_K5U(DnuiFIX{IXmDw=(NV< ztXkTyFugq3m+`+W4+%a~=Y8US|A(dfNS9c1!Fr(6nDloV*6i8NnCct0Lyo{gk4c7vAMi9Y+p4XI+}UXvc4bnNPi=#es(dQ?9$jEV5+d6G zvFckniO^7P#;O|%6HcID27imVs6rK8!Bg@6b?Y1+^&~!aisEvN6!}2DSwwpNmvgpj zT>JFqCp8s9vL-u+_*N74RxPDnJ2QT9y6`vsp7a=%^3U|=(=s_W$(~kls-rW8PA@|H zaw>|r>>;1HJV!opd4qg(k>j{rm$aT*T&6CPMX?^|7dmtFgfhcNCaQu6<047rvm$7)Z{Esw*)(pdA6#mVKI3K{yt0t4e%qDmXKZhPve1 zNcWrO$Bj@$b$y*S_Fzo}PfZ_U?J4%-@;()OZ_0jybWtvuvbU?!n5~$id2TtyiVX(8 z{kUlajACX2Vk6q&<(s0@!wO;1rn@W|4fIX_9+m6db4}Bar1uz=rgN30$9gQD!t#Oo zLq&Z~*++nFONZ~-s@Oh&5{S=GbyCG4!D-bwH8V8kL|=d%{85vAfhIs`Qlq&s5JDppkd7z&rQ&TqxvA*;q(ziB-!E}R+k_&h-ZrZHq* z0wo3UW;*On&ABUu!g%Fe(+ax!*L5w~{_%^Kbgk=m2l!|G;I@2cFBJOco`q-oaA1KS zte3rP3f%T9;;wU{ZlHqq2a7`$io40h()XB;8udf$xZKWk6#y zkZlt9mJ~Zm0&uTis@ltnfCap`z&TDbPNGu^@^Pq-N$?SYbo@qPv@>zA6wrmwkep2) z1K;As2_VPfOVGzxsuwiD;$y-TMl%@KQOTFXxH%LdOB0OqBR!pZIL6zG&O@prIB!lM zn5bV{ttx&+Q-ibX>)L**Xi893L&ZlmisI)w%!}&l+9w;23NWsywGKzv6Npwfb<|Yx zYE`XQx#HtB9d-Es9Ut&e6chFjSoggb*5f^LZbpT6ppy@P$r4uFqzr*DUVj9+Lm7h& zQ(!?u7{a@XK<(jG4Yqc*vGXY`B2h4DlbT$`|=KrYf`t2Edv z44gozz=KLpRB(p1%9>@`|zWtj0?(OW&sX<8W24&92@w3@BwQ#!V@ zFeY6-B3&xCw6nZg=oXvkTsaK_$6%1=%6e|75Ok%CMYeh+t{~C_!K<_*i$pBiH3N<@ zxD9ld6UwPCpq#|gq-Y~bKb@*E59K693VzXB2BHYULO0DtVtYy$j22o)htY&Ekc3FD zrz5m3j)C_#s!wA8c}k~XG>n~WIJ4+)n@fd34eAKk4z8G%?$Zo3nW6b~%T&0-4mh9< z_4%epfm}8k-Z;0ZY;M)*u-#r=3j`gy*JC@J zs>@JRhgVg-4pq^`bB|Yd1OuAxb<=aVf$nOn!?vqAXuF#q^gH}!O$)3g{b5(5iIz6F zZ8o~XeppPVYfU_kH~2N5S)0bjGGEwgbb2td6pypf74m7Sk&2l<&EL>pTVI=2ln6Oo zx$j81bL+^Rt^DQOxtl0=lD8WN|3Nxj+Tp{d^B+9v?+pS|d5QP-?;qd4f0`zA4F5fl z7)+XDegT{I{jm3wwp~IFhjv{zFx`V;#}J`uU)Uy;%@TS`%OYiuGIHGYtBzi{-~9Y;oO9+-RTm6k4a4V&Hr0+K5ioS7Qy$4vc||cR z^7uiyJ7N}&@G+We=q#0AD9gnD1MI{cq;k{Jf-E>z7(}_Dna~8S#I%}9gXzIo6+0j! zQBd{t_+WR}LNH-m*Sy$_*CFgL=AXy01_V1)M9ek8N*1_T*#RFW{=%^3^n~I;PsOpr>n4iPriXbyauBwlC>QVq#xLrM3j5 z9Lx?W6iH<3nA|s8sWJKfCQV7Gp0Km%&M%t3O`5+fJ=f>$cB1C7N9$M z8vTUMdl{zF)1els;N!sz(&E{q`9^uEwr2pRi&d!Uic7bHm=T4dt5Si-AKeWt7bz6U zw5jmhvR6a6ZS5w`f2|12Py`AUceKn?@vy4GZx>!I#S*W`*JX5BuTP1+4}Q`ASpqX; zNpygPFN|%1*l}IK=A+b@Ipn@;I`Bgr@L?@aL=V822BtMW%ie6+moLU9R=LT9L*-U@ zDVpFLHY4_45y`Y?EjC7VIain36}rMHa#9dePibo{Sz%#)N6ZmqD~tUjuJi%L7X(&B1=dfGkI z#^5VxO$ci#5VGFSKn1&p+7OqqqGokD6pHM9h+!1NN8;JTTPOk;{kI_ zd7Q}o>{6Kl?!A~dqZ}9Sl}8MomkWXS%4wi~looaQTlKDUmx*dycCM?QYH)hMzlo>q z3$0o7be6TS{jdN@0mhG%!eo+PKXMwyL~oMx25knK`+dw~Pebz@V{vG9Ku@W8h-0TM zIHXqrYafn=jdXtyCbIu^(DvJ&gI2^k=z;H`KaR&x-{}Kz= ztMsMI`KndC@Y)@VZeYv+-Fg|{`T|CG8d7_=*a^D`?LduykH}relNlf_d?^p;7lY|R z%0&>qek0vI2+5-8i}L?C%VTZycs5#|vn-FxxzXp_yxHg5=yZ8*UbpV~P54>6ZXG#U z={(zXp)24>X9`vUY9ljUiuLtW*OHmT+pQklu1Jby#bR@(4G$@CV^vLj6>~R70C~JMx()3;4 z%EzB{II5Oa?W{KF(9jk`Pb730&*R3Z-iZee#{=Jx?dOrsIp{L5p09!AQ(e8Inxt4n z=7|Is2?YEItcI-gK+%Hw5R+YL3%zBbS>)Kw2pg^9USCMBLc50c7t=2KMDZTf57Z9E z0#ojJra05W+)?;VGKP5x}Om{%2|o)#9lj^h$5irF!gT})QOC2)Pz5w z_zKWK#X=e1^3tSeTg!bJgf$hAl2Enbu1l&8yFl?rpmN*KBwdFP*)TEEJV~M~aX}=-Oq&>D0yb)y*vqmr@1k(%)SzsZxKy zR~IajG}hf&N*ooKX7w%H^<=86f77ns03khA~qGEmIOb8F*Ps`v<(CnQH+u-kMk)c zEqH0QWp99u$v#-9>~mV44L0uqyMn3Bwr=b8wtBm7v+Uh&pBsN8(xI&?2deP~UZ_5R zIgpkp#R_A$*V}EMZBkr1WRe`TtFU8)tdYV0hN`1IRme`rtLUkP%0SQbVWNf;erW+j z8k3Tim1YJMkKcBRs=j=h<>A)Ls`{EE6D8EAO5 z76-qOp1*8yk9FG1YN*?VS4_NvSK@^~Y~my8EX`Z8eEB?1H)|n%FUbdz@AcB@Ma>np zNxV!mDffz6D4e;I33>{2wv314TG)n9*DChIb}OLNj?k_Z4_$g|({{$^%h+j{;)r@d zUA%+;;vo0f(2fmByvyVnRUpmK_;R_jv01KP6t0nOMml0mL#%utmZSfdVhhz4(?J~~4J+??@Sf*xeV{9P@yb7h8kkfaYW*M-r$5Zk6JX>ol8}HYNNw&2kB`L2k*^oe_+mk^q8p^L@( zHm#yk{ZhU#M?{Ten&)k7>}|0RG20%sLwq9<%f0vBxODsKhY-BqrY9|UBxvxDZd?K- zCd~=sIP>&gI(NMp5-#yK#1Es$NH<07vh)svzLn++l9VPHY<-eXMnj78i~8{|x1BJ4 zYhC2s4h5u+bZ=0U+lt;BeZwvOF!YdaNcOeW%P)!~D60{LhsmuE4$e8Qp&rUlP3L-N zT64s7XEdlg>U3uk1V_`_H7D0r!#D%%H)bgp%)FJu??!PxPQ!oJB6ao_^4Lbn7Fr#JwF z6Z@8_w{%9bq|Ne-CpTskD4V8OV;Cj!lg0rDB%$;d&o!#lFT4}1txeU|E;PmB9j;Rk zru-;9Ox1pIkHat=dvsXJsIZ&LC`({BWs4n@;ACNILaR)q?2kmtTYs{d++C^1x%mTPPD!QM&VuiV()kut460tiBvI28s~vW# zI2FL3Agf79Lo2urYb#J#bUP!CBS1#ZE(#AhIHbz+asN>H6>k&~xG0HZLo$BDSmk%$E-tX7FLDaC>f(RgGoO)F}R zMsy$&?UppEzZ)wy(E%f^M|eZr>pS__6>WymG=GlSG|U%9m$kNPs_8L9dg0qePw%WY z5ourZaC1#{DA*bdR981u+YT(f-?vI_AL``oZO6E3T*I^0M52haZPrM59?sdbkO2Qd z(Q}MTMDpOdRjaEOQm78p%&)FZ^<0!5CY=X5;v)Qa>L81YGyfp2h_friNidkcp|zS~ zVO1182fHPUmh7hWc4bc6ien!UMJjm;hVM?7od~V@+4i64_c8VB|Ke4 zo)jiN@KviiKnPS@UoC%??=0+_{#ki|UFBz)0UAwmKJ8s;hK*ZmOF?$joiOo2k~F)}L1pQr0jD=?Kr5KU zZ?t!ijxQ_580-bn7GsFi07`tUtLmdIrpIIM@O3R|beUZvBVDGeaY>hN2ZgqLw5n@t zb~LCt99l3s?(^M_14G>RuXY{fQ_WUW^&RC}eZL!FxBGmSp*gT~1bY%`eh1?wY%(%9 z4Iu$-;v(Wl4__gGI4?W1?6imfYnaOR_Psbb;n87seTs@X7%}AFBNG@+a%F8;`D>V+eW1gHev)* z-DCYf9EBP#HB8zFqB?`(-*}Kcgb1B1&XlI{YE9tg!O}Nr-UKw7&T3aEnNs<*eCJE>cB-3I%8vnnVLNW1q_gSgX3KO;>1M*fOifV#gd)>oTidu~jjIUQjF@ z^}CEXPshYcE&ZP%*v#YDVcBc2HHtQpSG1c}Icd|%5fv_q!3)lPfb3|(FmRahY<@l_ z^NjviE^y(`T;q!r%wHN0aiyh2;c?9I!wyAUKVK0Z5;6HQk#C&ER?#AN0v}CjW=QuFycDt7*R3wg#9Xp7O@Fn zq-l^DGdJb@`ST%?Bn`D$^8{6R3`Z%%?KGUtGHByWEjfC|>4sZB%Bo4|ZvBkYalTjB z=MEjEyN%0>?M8aK$#zT9e?I-7Rx2rJq6w^GNp=exb!KXjT(GV#9gDqoh_%4*q2)Yq zbuBa2x=${qXS-TdwPiCP=091Vn)nY`DV(XXo{fU@OZD~kU<|;Rd@yB%h@cw!VDFS! z5Nv-GC#K;UIujNsQMBQ!+Q=lOqW-!IwVgMqkq+aUi@I7iHBVw7yikZT z97bs+ayMm?oKuA(byF}LOF?Vna)GZ?Be-kET{BKou67t9g=4F&uGL|-0lm_^#sxDC z=B-Zs08BC*9c^yQ={l9X2Xq{;eP*q5Ws2^0cvY9b{wRlbgB;w@&y~vxbMeDVI&+5i z&-C%CBE1j`?a-r*p~oF9PTsl{|Bd`J>`UyMpd6E3D^YIIBH6DvK?wRHQHykvi2R>i zQ#<70+{m=&+O+%rY4?ATyO|cBzkzPvqCr#^j!7LxhCmpm2NY7+T4Y0UKa-F9id(HP z3MPHqW{Nr)#>YYwn-0^#Rg#*iA;g>%CQq9XOq0mLr0*Sid6X{8%RUh{E#BlCXez85 zJSk)hVr)r$-vFrzd=eT2j73WRI~n6~Yqh)PajZUPFzgcIr|I7S_KaI$9< z=Zg)|*;}`{N;xFm-y5cF)Lz|O+Sb{C>%g=W39 zh={WY8_7+N|9t7^QlDtE{~+$ZZN+`>TP;@nOOoD*q#h6?e2l65k2nu8|VDQ*+f=PHp$#n=f5YWw!IaR%kMz-wS`+M(6JyoanQ>V`P&bR!(@9WzWR`xPQHiC*zUqlc|IlD*J z7kwX6{MsUgiah97mgL~WVQop)5!K+KJuz)b`K3jlx>w_Jny~*M1tx-s@lS>}6L?k% z<7dOJ1da>6ucOUocxTi#c6~VJPiBMZWT~LSnK+Rw!aJGN(39KTBirY#TyQtL4jLAO zt@Qf>aah+1cnzcZR(hxFZ5;8+TE7|omqpdtLnHzb4~5{LoK31PH1B;hurPjARhuG0-* z>7*rV(1oXH8w*~?@51KwD6lV+;9*LLb&KmeX~iIuMQjEgUgcd!qSG_zlBI`}nfIn` zkOO$RVUhU-m`s*n+4zNwyKhbfz_$P9{DA{JTqR$y*Q=VQHXrKP6AI(s15Ue%+yrD( zB~UdaP7Yt3tirLYbCdn+I#=_UPx}04MA5tM^Zz%VjzH*?TG-#!+t!`~R%Q=) z+-|Fe>KZ>0*j-pbXNvlmV8N%xs2|f_bnLVC*_`#|kTzOYXtKK%DOH$L5S@Uon0MpS$Ic3X{@9S($YmTp0rDrptda6Rtg$5*XoyEgu6 zIG-Ojf|5~6rAmgxZ4ktRx$i#gdhfuhB0x3zm<~)+1(vuff@RELH5RjHpj(D1u?qAP zRHxY4`9}5h_HePf&ARYHYg@Gx+Mcc$mzQ(7MlM&r+^D>e+rK~8QT1JkEeGZ4Xz##4 zZ**EdxFxZ3vgo@Q$im3QzT%{E?dwlW4_izf_J{s4%9R{6g3{ue*!O2x`10H z9)RaAj1wANfb%oBfUj_YbH-c9k4ocnVFU8C3|Y_zs$vti0WiX9$u7*4CUhuvAWx67 zf(%U`03*6qVgGRTt-I^HoBz0H^^)DU-g-YIwY@C)9;UEe_uu+0Y^|@+zx>Z68GOrA zlC<+@XC#@%I_{ij%g`eN^U~5Ic17bmCX8tXI6qZ)?xzK#Y(DrkoNerMuy5e09tGlM z3K|fggTN1g$YO|UIvD~mX4}*a<5w7-otdDDnHZu6%=uN)3P1ydiJc;H@`;{3w<9%M z%Ox>+4Z%?@wS&(H0zN`h#NUMMP?!K5>tU3ZP}&NWYMmm?WXiSKpg)sM&(_Kr9zX90 zk>4Y{m@kKXKsGddp)yvhkI`+ZNx1EkY%T}^0~0ox?7<=OSK!s=bH^0>55w>^^FG7) zuh;s)08?DMkpEit8+t6JKl}ZVpE{;L^nK3X2wzbR@+#pfi}30n$JpAA`%ggmQ<^3b z+$NVWd{H2&U{unush7aqR6q)VDdkgn349HB(3m~JQSdOou)E%281FE?XojL`DIE=& z`L`x-+BV>O*f1V8zR1g84h?L(Df!XX8K0yJ43+O?p5C3kjg_JDU^Y8g9$KGU_AR^- zA+J}caOlv2Z+ULrJ(#Cc8+pEyx{h?_=UBX*y%V!KBwgsspyGkgA>5c8DP#)n3FNRu zE=tnG@hQ&~7 z{s3yJUkyxOd)KwofuCG%7~8BAoMnQ_{Urb0uLM!-i3a3YOvb^>vA)mi9X$w)2Yyh< zp{f{LryPt4@X?#u@xa9MkJ~xdQjRjgFkwCi{<-a8dj#R1SKD)_Q|vP9Et>lBGQG|z zTC|FeK79wq3pDsDLcCWo(L2}>dYUVRyK_F|g*aPX4}KhZm71URS_S(bfCo<~A@c!* z@AQ7i@*nZ#UzfF+?Dc~qf^prPFn#3=hKIfv;y>@xc=so{mWy7GUUaiHK9$I7Mehui z5ocpQ98Ma^g6;n0%|b@?zD1Aw{v?!@{^y9go1t1FQ?3&z!B3IwvH<5a@gh=XVUvU30lQb zx;BXmBusFLt)<$aA;}H?RY14#134;IC_^}XA8=`$IL){qy=w#hP;aa!nu-Oqr1dGd zAIWe#^2vH%$*6>b16I0}hLlS_+q8IA;Pj%ufSV$d;&zYtP2rP0HSVa`Cp zYW^Vv@6iFDlsuWpEddt6fY7S7P!f%5QS17Hf!%itxMGz0boi>_Q?h{hDJ!W3VyS3PtT*Hjq$BRPv_9*8l8(ORybEU49>}mZ|KWo; z-$SU_#EX#)72gXTOTa|i@6(FWee{)7hpqo78UUX}p?T05t7Dke$%7;A>I0!21P+L2 z)1)`#i4Hs0#OqOZof+p3v?nhotdlYSs#nbv%sh?cj=wV=!#Ko$Cs$PEs1**KunJK% zFvMasqMxbJvX-PJEpA+)e>7KxotKa5b=ue&uLN!mB1s{Js2q*FE&@&t)xmu8 zUDWLpMC)MMfr*az8ZgN28eN*q=WuW(T1Ugxv5bC9S4H z|1E00)6d@SXTG`R-$oF!Na(|V&R75asStcmL%;K2C}LzoANKhMtiV;lXyC2B0`a>T z`wwzCJqfO84ARCu;6*n`yH0$;m{va5fvO!ZAygOH1<{6}gFp|tl$?{mN)_ZpBRUQk z3p7J8;((45i_f!JEV%^0rLR(bh-|L^V!#4vDtH_NQw1$1w z#eOUJtiJ?(5umk3LN{1Aib!$R%3~Ap=)Oq3&+iM5w{XypqU|ohCx-|Apjcou=V@_t(C44WIiJ1RzL|Mzs(GnuYRVO2sVUg8%9oq$e%C6x2kbrQBMsh1dPEe>jaY9; z4H!$rKLw%IYPrJVjfJ8>BE?Idm;&-%tA~O&5+C(re?q%47-AY~pU?XNZG{fIKQXS^X<+e4GVbCRxfNuCZmS~`iE{)B;0@h)kO5FX%}$&88u5vh zuT^Np%jI&bxN$cl29)!ks~v1;bG?Hl?bwen4uT$h7y7C-j#`FLPlV8Aw20NibgRLy z&GGRO$|sjt(ul%26ys*k>vto>xwK;#NEo13?EVnf0EhZ*v153LgqY{MU(eQdzkW~M z3@Q5XcFTLhYehnm&;UyzWNOEb?ZY~_*g9@VpP6XpUrS@`ldzL_jQT7lx>VyAT1jwzGQv;>GrJ^KVSU zgMDgA3d{BXf%LU=$Qii1C>wWt1-1EwhQgkx5AM3qtZv4ef z#*>=%)~zaDS=5d6LZ8Q60jZD>zMxX*)70jq)fNFN@NI-KovT`Uaf~xUJmyBLBLZPf zDxzJ3%LR;2pBB}}8zQ7p-;UG-%&;HO&6qx3JT!)re&4G}2J8zVueHPAak6^Sh;57s;dXz#fn263BiZ=z|< z*~Zr+Ak9qMQ;4^rBpjzzk zxhjN;UH*l@_`-PL3%-*C635`$v__(a&DFl4p>OAk#SLvm7Mzz+GeNUov{w7jOtW7AEdA{yL&p!7NMq^DiQYix~6q(`g z5eDufb-v?V$AoT_Y^@XnEy-ovj?7NNgK5T=*8G^%8$`*G?o`g*N?z4#481Ko7%zF19qz!c5hO; zwY3k8MDt#|jmj_5HgW+Hm&;XjztsEeLSdv(*vnQAA+GjOgpZYBa_p$*5*;2XG+#J! zNT%cR5z@9~S6n(ynjJcGmJ+1c1y1uf+@O6!_v*;&(%%1$M&S z05l`pTo>k(6{=S4C>DpBYxxl8p*^we$-?L|!#W$|c;@e+1e4e&P)D3AA38$K5oU#Q;+`8Bd>wK1*AWR5=A#*|8|iu=K7z|OP9s%> zAT+TUvgZ1YBZi-^AI8Q(;T@Yi=7*XF$DVc8*kH$nlPubR+V#6^0D7Vlo>qdQjda_b zKnY2hxH(Z0NB*DUwtm>rb!HlCn!(q_Z4gy?>0?-Hk~a^Cl$J+oU0MJ@)hZKda4{_u zxyeJp65s|;vIJLGwsn>WeC9}7CGmBJ~ZwD|E?DEF@xseTscx0Q`wz<>}hV>R5CoCQ-zaQzaQm zVJ$_1_lH-Fgu@XP21H3hl)1dmhg0)J{=C+|n_dm(&QBupmy*9L9I90O@xO8-Lwygo z#l89M;|Z@%kq~sis{{h3DR~k8RF;u~)`ysxmV%pmOC^4$pr`B5S+0W%h+=HPl2{0% zEju9olND$%f%_x5w>s&LAy>MQJk3>jsjtv%#(_c0Kh&fMLN`Pt?T5swNO|~!vsH=$ z*Fp>tThLrl{lOrpEG6mUiMjY^<#R@Z>vX^%l%d}wr+!kN;6H5$!`3ty5lYM=EGV=D z3FJjBG`wv3>cTwqLJFuXK7 zk<@_bmSin#`V}n|%cmk&?AqJAxJ6?o9C!7d7pegRq?CAxp8>O}u%}_aTttg=a3bCe zZ%Fz`!n(()))HO|2m&l&GRMo|eX*>lh&VuB1J z8$F1l<#MhBV(vnr)7`?y`q8|*jgt$ac3i(-JX6# zh%(2wXTyzHjPGJ;zR}53ypiwusSsqC#ZPPgL&r5@d_KXBpgnC!_j?3)?4m}uq7S%y zMiqn8`R~lZGz|EEOxK8#MvVi>lfu~mZ^l9a_$6P^3_)AQCug65 zfHOg|2E2ci=aEL5RN!r6Sp)GciRdA!r9qBKRYT9(RxBM#*Z7=Wub~*T?5u8pt;Qv| z5WFMx4e88J&wK#^r~d>r`%<(qdM**#5sAhw2&{-=Eut5J2v2c@Bl6sPb}86*t38CJk}K*5hhGoM^v4Gh4`*`T=g@5Lh-4-Uj>v5 zr{Nqgwv+_+BRIyc_`(2-2SAeXY7g(&d1Tj=?rk_71T@E_+YPJ;}NyMr-`qGU~(cH893y2$>mra z85;23cFExyz&^jOuIfpV`8bR%eUUI=BsQz$+b!oG==P@*tm4Smur=tRP`gb2){&~(`VATll)H-+ZK2xUJU`JHUEmqwIxrt zVmh=68(E)?sWvxmcMF=o28$^&g@(IUEZBzXZ&u1KpyQ_v+)tnyv(<9(~=mpmUO#5qI^I51(FA|Ml_404D7JAtWkN~al$fNo`+^vaTi2^D-|)e`Q2c{q~uIu{)=u9@-_;E8@FYD5CCjb z)(kVQL#PPC*ym>fq~9Q?69Y&k%}PhG8v#;T)$dM=zXOI=Fl28xSi0|usUOjGJm3T2oZp{3T}LSV0Zs1 z&en3uQ6HEeI(rux>qx@bi@&bXG z8W>}edWVv-JaJAizmgsNRFU3ohT5`0ourM%37RlY5pZugN?MS@!Z)r~r5y)Q%0_!LkX6xj(J1Sqm2>h+R?DV$4V zU?gnf=n^wBdY9lTM!{JCVXapYNNh}yk%=*|>{U>5qRKo}##IBgDJ_P0AF?{wU+PQh zde2oeZwZ9fs)aSI?~Fh5bQErxzhal41$Yk$4x zK99#HnMoKcW0VLgYR`;9!X+HAPP#!zwo|~6S4z~VGtL2?IgaOxa}ES0e!*G$RbtI3 zVvM*G(l zIIaUiZ@ZD%!MuYZ!DH27dUsS(K;aYn%cHYQP163-CmvSyc;OT37f<*1KRJS z+&P*%=pTinkn=p@yPF_?CisYu&ZQ-_U@U^{6kBGbPo?|E0fiTs3_CQwOHT&`kbk~9 zz16Fa$<2S_<+ZhCzA57zb~nyphsK16XwU@)&h$3_^^H`1dUg_(wG1+dpIQvrMZI~%~aHctdBjS6fz(6Sj2U0jFdrovHW zm?lB8xHRlQ_b02M`hp*lT|uAld30KpV{?i0ZzZ1qi2y7BxwkH02QNVu({Q~s;C|!8 zSXc%J{Z%J;+b(gurvT!@cjXF7ZCe>TzgLM57- zs|e*GG#u>P(7YtMYBy{4WcTfxiN$92?aTIT=x&lRn$Kgk zT!x>D3o^Ny*q1~Q5;D8(u=%TqdcxLKM&6h@Azf!G9ZrG3LEyM~9mzV6 zuE33-#1U=McLaNbPQjV#RwrVw;~zf^y(%fU!TFG1E6Q$b8*D-uSqfbToKg}yb8 z-~g1vk&aHmcS5O))6wMAJJwsYu3cZAwZWA=RC9O$UPa_Fq*LKn|v z;x$-l!qA_U$y>@UgxjtsKwZX56yb{F0u!hirwQ{+fZbcxBkVtms3lfd1ETv{ESq0h zU1iW8hhVgAHn`f=E$n*ByJQ>128h3pD zDqt?z#be+>jYeu^&Vzve#bi$uf&>Y|Cvrt0fXJ@Nt4%Omv2h9;AAgrM?u$tfCc`YJYd<1quJ_q4-oc=bRK)7!7LcRc< zA%wr+(O&7kGGSlQYdgCx_4Ze~kAnA}qMnPziXuf6X<$H7A_Q@J>2edI;d!4-H|(<7 z><2@uNpM(`H07rAD2Mo&k~nka{5FWB5)UQ(SACFCparJ<2-Ctck0^^ESeg!Zc~|m8 zrvnPg*1%b{xn)e*9sRP^8%b{CLMHo-VQ!sYnyn@KtIp|5wD!$|kZ9@pF$;yf_5Bv-@ z&d=lN~2cRe(o+!SY^2TUgK~f{$?JiabvQF2az=?1&`b+q<_rA8@)nFu8c=Z@$qTZ_4I>RR(v81xWc}@ST7kQsJ#X4d#zaic};84u}4*%>3a#D6+TC z&g_~Q)n&s@?ta7W-EU}&4{Jfmm$Yx$I(>awg=S&*>)%JneBo2 z=?q8$&C?_(#9kY0GvDOh113Kt;w6hR&L%tKAuUBp6RsXJD!K&gK!|Enb*KIF;f;X=u0apf|`^ zPc{%w7Uy>_6iZv0*I^DUXj;E+SqID-yQ?^!7?%U8h1{59hEc3b(jf3$h_RK2*VjM= zG3G+LnU8vX$c2%LX}IxRp|rI$JrMNv?X=^OiJsz?QgLDTmeNUlR(7F3nMh0ZV&1+K zcQkS51JZc0cTjwnFSAA1ui)?=9W z9n~#4f!z;YWqSSWcl@T&{FY(!@4OEE_R~B%0Q9@@FwFyGrrgTPakorTBKt=3q}QKF z^WMWkP9e>nSW&{>=D(ZBP+3WT@A9Wafvtqdc1&aL6f1xh5ohNirw?HU?M&a%GVd}- z>Ieg{eT;J|W80me0W8FYyDAuxhiNcB?AzbtaNlD5HPD}8cmqP+U+lS#$NK@*<4WJN zNFRhQjeJ+p<=n|no7k|8_$x1d+))F#G+L@r7L6MDQ!_+}wwfA}2ddu}wMCWxtX2A} zR;j&D6(MbTJY9y-Zh&~6whLgJXA!vSget%A0&eGo{N%LXU0}X(i|rD2)~K1V;PjUK zbRLDD&Jx)Q0fcXjHZ)M73!2sKVpM3coun&+GOg8IM3{Nd4r(QSKa8z7;8MkT&uguX2KkVU~CA{Jx`fDJ`y{0^%wyapF$>jB*@4 z3O*EwB+BSOl@#B2s_Sdwl{;P}-r_^)>3DEH<>E-&IWof zGrbFoW5av&9^YUj$kKi6RiVDAiBK{dFHc8fQ}x@^l?=xakRR+HlU)ShO$cjcDA;5S z74W}k8yLna?Ay&TOS0}@y+|eWBdC$Lzr`DumZTK>QuD`pP8<3;l;F+3S@s9aizijT zkDUl2>J#n_j0WOcJxxA!HX>b+el8~wg?Bbc(a7N#oY!{DFjOXQD1M|en2p7I{vt8I zWhfX-{9&R22l)4^0o7L3V@RNC%6}N_sRjQsJ+YMfl-T{Lo=f&edX_Kg`D+B)9h#p{ ze9>mZ+Y=u`Zi@uY_z;4JDPIT;aa_fXa=B# zMYbr44Fr;exrC?w5d34b1wbYW-{u|hX<9)VR}1!0%X`4c6?4V`dd^|gf$~#5b(ni- zldAmQ6ddeUOI|A&4igdz{1DYtT2_{5&Cb1%o8~ z?GTQ*O^rY)HwIVi7tUP!-@*4kD)@f*jkTn2w2($f ze$=AHZMXeX8N^=BJY&(@iPosMfg2D~+WIC7*pmfBlfDj=mQq^-XfX~x3#JuSASDob z29fUxQCBL0+=|0hI+b99V9^Ao0?zC%C<8hW8p~)It_%^^BrXSUWc#gAzGRCrs|QAo zvKdT=yj5=`I6K!rxHQ;5_aAmN60<_tBrKIyXj?2CO=d$@EE2V`I&DYdqn2MRUmpsN z4u_&)T1M_jc>zHT5Y-OI%3$$8CYQ@x`V0;xGI1NLcs7}ob<4XYX+~0S&p{%# zc~P=;=;7L5f{h%VBi#5=B$=I&d^v=P;w79HL#&17nJ;6$C;6%eUx|FbxS>RVwunqr zu>)FX$0DpdXf99>t*9gRdKI49|8oQy)7L1<2vYPcSl?^@Gy$vIo0+C4uaUiZTDJMqH^W+&!0B|8AHxFkh+@!UxzC?(poxGfSm$y4$d90i zs3W9_79&NB8Xkt11VOuV6t&ny3U2{xDh(+ZSC0VYmYZClMGg`mP#!-%YfoPuJ`K$e z=>8&NEwUr}Ddz%Q}~G?oy;Rk>Jt2{xYdmVpr{r!Ym}<6vZHCy3Aoe{ zMZ_q|^gvwP#0Km|oaF z9X3L89j~*Hxn_P$3+e!|N=al3f9qYhZ``NIw;Y57_gm(*EOa&cqVkYpA33%=|j~rICEzsQ-?=C6YAPVs~ zhU}oGla10MfMi@7T%eN1zJ|908&>4*`42A>Yk6`wne^aRQqmajdI7 zXzX^<6oAtl4K!!)TM~mSB7o9#c`RM5tMCVzRrPC0{Ad-sn(g_GNBM~!M-~=(IbcRM z(hvmef9a}pP8d+mw<^$4?4}+++q^RLEd@O*fs^Lk6kj+(bL)$cT8@7Y^7VZ$SL3~x z*q>JM5h(V$_s~Jkw>^P*@k#iKO@mK(705nxu;ex{P81OY63|SZbOu`@$tQMHMYg7tr-pU4Ok5V$xJOGm`0% zWDE0!WGA8B-d?FK){+Tep`j7kvGulvQgKd(*@Ve`1NG$_4%COr*wEzJV&B4TTLsXf z->%n&?V%xixb_*V5-(3lEH#{|^-Q&P8E_n#shOR4`kH`i5DgdKqyheI8|ilVr)W#-G+xjsAjpK- zs1Uo&^&8HoawO9h++cE8)$fN?4Nv>xOb!`Kdw}tY#C!9#Mk}cW4pOi|@-muu8<)Ks z$pUIB_hIG^n1TG3zMXtGW*|CGJBKGO|zTu0n*+1Nu*AcrbhHQpLL{0ALAKpJaynm#+H>n~dkg0z2H1$ndP5YEr|rZEjuv0?P~^$wY=(GvkG9+D+* z^K-CNBBxqXGZZ*rTcJ!(Ps;M+UOoha0!BHSh^B*4r#=XS1v{}ruS7gkLfP4vNvbrL zP{JBS`7F&~`p}Uk0a3*GHrWUXi-S)||B-7bURqyAR7$>RuJRRI$*<%aD~)^}zf(Ah z-Kz~8L}@j@vYubfJM)+8`%0N~x~&e6c%PWD237G&I^q5*$N_iuEzA;oQ?TZ$tOCk+ohb{W%a4?VYoyPc%>fWg3 zGgL3L5Rg=%AaoxK@-ZUT~=N9avDUO?dFH-7`(*+!V` zlH5PtGFZ(6SUzY(wL~zQNyY7enUN}?G_-SGeARe55cgY|)Pbpi# z(AcDUP{mRIisac?qvnYXHDX6zMwJ|$FT*?%#|YVlzDl|w%)VqTr*OnP$es<4d7kD( zP~?KpU^y^hnpuKmnsd4@#KoWJ$SoSP=2d0S)Knhe;pWW;r>6EO>TA%=*qgA!$x@0l zzRf3|*Pw6}#8^s6T2n6EG6$-s-!`}9Lg1^wLD80*v9zW<&-W?M<0H#w{^QJ-Fn|6D zte4w>qxH;CoMJNkIJRo~z$9QfvWQIqmU-W$$q^Wcs1hO_m*RSAZRTVF_f_r?y8_-e*yfzf~m^?>!_Z~>AaXBUF`UN}P(%p2<&YpO@ zrw6{F3HT271pjFWZh&#zb_mzj;n2Sf$I)dt_t!^va~?s^A;S3qRsq#YtItDPLudrS z-lF?sTo9X&?p6}$Nah(kR1`@?--X5>u;=rbJ%=wI>7BDdbZW9vxMGy2CTEZJ6)62B zPQ!;Ch$n~lUvu#=a;Gz#h5YHoUH880Ui2(ppJzC}kK*5;!^EMu?5qOUd$g;75o%Xk z-HP{r_Ty2wy_9a6L@P))Bm4_>ScgC@%5Vz;LzS>wcu|V}3F{fh6m~Hu;CXF~ zRd6Xi*_<7>zQtddFMd(?r9ql9(|b)!qKNsC9@4F(W&NmU*5BaofTr1X?{5cUbzjXM zu#=YeIihMymj#j>3;!L=^^bC#lP4;YFJcB4Y62mOBSI|6+m%TK=^}B6%i%O{P`^ET z!iWa$oNA;H?;>c**<9veAZna2-bnjj&7;p@i%AdbQowteQ5n8=XsAD>!e#L4!K(M5 zHz4T`>xmwIICOnz5`WGFZhcx{d<1H5i z?8i3e)1W@8N^iIo8NvR_}3cxq{B1(4hKfRXwJ^a9Y# zBX%N#gR}Mx7z&?|;m@rix0S99X!_zJa_)ed(XzqDH6sc;y&5&N=GUWfSf#rzCZ9NLH3*s?VkrUN&4p%sz=6jrRH?Y}8tE%cTdyIZL5*r!Q) zV&&Xc%YU=qPJ|R-k7Y^HeK!OwbzHNp!_|@LrIeMpPxx`+8xXJW>gSTEFZ$F*`5KKc z5OZYgor0h#g#C$}gfF#WAGx(+Z@1Qt(xpSY_}&sc8v1tvv#YDq*UrlN&9r0j-d(ig z(!IMcgFkmSa%NRjQ&X!u`(gQ^(`T=pR-rB5b?>6HV_@K+OUYh~@h5Ui8=w%d1I@VJ zb2inO&&RyRoHzl#OaGnSpd$D$*v-}QR0Tt>L=O@Hl8H_k0MyXy7*%Qs*rnw#@Irx1(kQDAhb zmgL|pgu52g&^DHe0V?ze#PJMr6%Ws}_Roz22O1xDvoDDGS6Am%{ZS(1kM1wkYJC^4 z9$39ZSN~jBA=3&Qv3nvW*8I0>yZiY(^j+2fA4WKRVc~Z1NElogQw}Rb8~`t401|!Y zE=Db0u~KFH)*|fH<^8b_QZ+uNR(lU(j`|H*y$p!zU!A*1oud8oP{TuZMkRRFGQ5~U z4X0H3!*Wo2NZK>Y_k{tH67!MhqhUm)BpVULc&NWR6v?vNN26T^Y%=e$&mOd5%^wr1 zO16MgLNl@3i52qqiUNPnZ3kO9rZ|5Uso|boS^E+9hq~6dFKXvwoxusd6tPIg3+)T%An~A!XJPjVhjn}nR;TDGt zxtFTmL%7nHSATpWR0|9#I8e8Ep6}9q5nX@2??v;Uc&{wCWs^>ri-s=u26~Ft=CfT{ zaBsrTh5clcR@1Y3^JHnhSe)NO3q(fR_!V$Q>|W~7`!py(s=vuT;_alcXo$kiO`~= zEQW?D1e?Uy!=Xh98-=bE56=htEvr9B`;p*<7lO#B&SSfA`bPTHbx$9-C8q`;TdgX9 zz&UtbP+Qv1R*LCYDaxzTMGn}KM4^VA5}{gGBT zBf(P82Pa1ma49tDkR6w!Yl$Z4@d8{!NucGEfJ@Mb)|2*1lV*=0tjI;Rp;SzXnZ5DE z#arKMMfGFGdUJh3RpL2AHQ(e?Hm?>ABT`lnh&AsLvx56}`2%{g(%*k`f1W{~fDBc! zzu3(hN+PI6T!iXXnl8bTWDv~|JS@q-gnlJ`at|>oLTv^%5wJmGS41u<_QES?Vx4xP z+*@miO8`n5Epcayw&5M}vrAez0GZr`Y2@&Ba)fK{ll5Cya{(CSv~d6sXYj251Jvc} zQqA%LFnpkK9Q28;G~Y*LieclD#$yzk_IHc527HR&S1bN5T1I`Wfr*k1Q#;T%{381i z$ExJe5>T`YZKC*oq)H~9qv*rJv4JzEy;JUeLSqu7jtFj`P} zax`vh=7V~R$K7}1@FQOW>4`bN10_I5*|nz;fsoLsMq189n!g;$$Z3OGYS*1cI-wZL z&o3KFB5mBc3qr*Uf`}dwt5ah2T*zzvVZ^p0f5=<$Lp~*x_PzSmzBE|%4_RM0LN`0t z0v(asS=tF&1|0_S^nnS2%En>Kz?2~Xk)UDK2|n-O4Y-eVp^EmGLZi^kHSaT#e*QLk z&YnF1qM6~p4AU~GNtUnqFB&Twfe)SZMTQNLcCh(LBOL@O9StEsWx)<*^pr1>_acuH zf`L(^h{@G_bJYnvvTO+zvEl4 zVqSneTWF0SL3uhkU?SV#fN2mpl!}MF;OrP%gDe2E8u2cogh}(tA4YkMp2Ap|_uLHB2Jx|^INrD>bqIzD zrTE|qKM3GdnQ| z*-CnEQr^thZ<24u(WJRc)35d?!gYbWIRjhcgRu7Cn~|Of(`W0;k+q8$5TbY;-;d8E zZGr+V-j6nXpXM_gzhDjD@-t_Bq2D_DGxE7rDT>u!1VrHbGO4pRrkqVHiU(Bi`9s6>l9o5!ih4q^FF zGs(-eU(n?z;LGx)=W?{P@FH#7pIrf3i1n>e;l3SgZ0E60I$XEIkCBa(0xu(5(qmz} zW9!7G<<)xF1{=gLz@lb{>m6I2M>@(F@1+0zmegRs1}n&3&z*Qd%%G*hi^z_|-M77G z9b^iRpdvn_!=va0(cLys2XPMODEi(Kv1NDh=}`~~USz+F2oVQ)u_?Thez|>0^Lbu= zmOja|;`A8G>_|;y&vx=@^Qqdpted&DDr$Qc}9NSN!U%waq8ZQVF(F~7J31iqcm`sA8iDWa9kg$f^jvSuJ zp`USr$Z@)gMuEB$?L)GI4VU!JZ651#yTnrvgSX}^%vOj?&`g6BCQh3Q?sKQvmjH6` zUb(nQP`ZOaF%LJjUs&B zrk8tRp6a?BlGi4e`#xwyVbdy=Qj#wkmh@f~v2oPiVKaifqF0snH1rsB;+1VQO1D*@ zM~~@^J*BHmQ;V3xy{a0Cs=c}t-t->c@MiZgHopa77k>_&=Wjz^i$fnZO1|F+=|&nT zOocpW29)EJDPx8!@0>tyAp0}{f)U0P2up=aWQ9=GWq8Nb@Wqx9O?ayNjMo64+6Sp| zPBv-=4;c2pxty99V2agqCubbuA}et^6LC3jl9hy0q;a>&`=P!xZ{Y=6@*?ImxL?sE2DuER_YK|@VUVovPSHh^L;~=z8~kIDKg6xbnloyHvfWAhdR2dSzvs)$Sl#m|Mg1mThNA{B3@4}ie+Y*4KCtok>DC$; z-1~Ie0?LZ|_P5z@VeICi|JV)5i8L+*8y25!14jhbR;y54Mkf#>q4ovV6 z04+f+P=#zoEFDQ%gqr25&l@kDxPAXn6ZGR^_!WCoO) zKLnGRMj;g&)H^W#9Yeo6zWcqch&_bV>_i z71u|dLhf23p);e0Lrk^G!0^up}%w# z-H3N99Y}32H2+RFzdl-pTS#dDFu*+iAu`H9DZZ4fj(#14GgsK2N~BV6qcBs5_j%eE z@M>P$TJS|ySK+#ytR+MEg9rEOYQ(o-**F^T`BKT$#VV|vYOUr0EAHSH4a9XxgL@qU zRV6K~EAPv$LVm_AbUKv_mJQsiqX=#l>cS350a{?kd|a%W4~V@1vB@IN?muz1k9D7R zvg;m~h%K>X6|v@B0q-DeT`+yIZX;Kv%dFaMD|N5^63atB1nmqcKu{8F763rNA?3}W zy5oa^AT#esNr9yA?QGpN-w~H$N%OW3fW^@8xp5hu|0QXN{So(T=00;^-1r@c1LKSz zV&#F`V{+Hs-tJ2Vq|_ZIBL97Ghi2RCcbt2F&>z>d#YIhv`#*S_nT$#CclZsVZ^pB} z%Wa|P#kRw+kem%*Ec}u1Fh}HoNPu|3Pn)SoBxOF$H)5o$)zuTfZ%C0qb2Si=jNkhV z_PFoRy06P9Y{gr^i;5Iaz0j?4GE2_2xbYu(>Bina;v4LjMa~*=XV!UVq1*RB=dgp~ zF`|duK11>opOvL<)Jg8@>x>7(uP!L`CEj${iMhIWryZHSR$U zt}XrkLvtT715$t?9VYIey}33wTf1Mw#UazjaKQY?+*Q7z3x|MRy2r>BgvyE9jNVQ3 zI~qA2P*BV%t?q~R0#uAZKv4Y79(7|>FvEK2Cf%zc%n=uvD00P7uQhX%zN*36P4{&D zDc}cjw*P=25j5d-`3m&3o%Fi=1KRF;;@(fdhw@1t&DlkjQarvHQUZ1JKXDHC!d!@n zIdK-8`UJP6jvN@{K~&yI-6}gfl))_5Bg?tM39g9Zi(}kEJ2!FF7QNKoTQvKCOV0v$ zmYcZgVPJw4QXHU7Nse9ze0Q;g$j zQ>{253y*9P&TuF873w2>^Yv0~Yz_$hLM7s>_YRKLc23?jxwAGl*vnRhDSV0|9vN=7NFQ#4u1CqZPyJAMQ2_?yt@jBsuH z1`8*>3aJn9A{~+jXH{Ug#b6O8F~RTfNeic8su6f?cDl)#Np=eT{X4cV&|m6_XH0z< z@w0}u?HQ_jAIStl(MUE|^dhv4Ib56D)jt?OSYCb^79pSCil%xHfI%V-BwEj=i+zor z#ERb+OeFoj7;s(KpQ|Kdy@jm>`29F@AYr*ipwEWni{?jNMWr0XBnK-yh9MZpgfWI* zu!K=fT2L-xIl4yC8^M~jI%Y4DAhh{&L<)RJ$@c}*z1eDSDv8V&YEJVbW?CTN)1#G8 z7BS(q<5W#*27Q~UPHID{*`ST|+!V#C*LRzUTQ#bfi?orQn$P=VcBrRsAQcY=5?Vk8 zLRyVjQ7-~#M+<{U%VF>~5-p`)hET42`?8Dq%Glw(Q0%zqAkXt8Y^WKa#wlYvtSX?Z zpn5QBl2v6p;YvAe#Y+Ji*i!QdHe_R-7~P#&+jH%D-$HRa+|imRHCfqST<9y$=hyQK zeJ`Ltk|>SEGwq@?6E~lC=Gv7rp44!9T=x0o@$_(tdD27a^w6(^9Bs6xjC4-C_|{~* zI)(n*jsFNdEXrH{+|k^eG4llX1Gxmaf!ooR=s)266U3#Gz5{ClF<=@Y?FoT+ z`IG{gokJN((1jt31ON`{gVKbimAg^`|LO1O^hYQA7$NRz{c$Ca2kJlk@p4*H}zb=Lk5t z=eC6|D0K6$IUxF+C$ag2y>}KV9n`sNr#hk0gnJ*@?3hD;pWxW&n&$wG4tf#t%i+@l z*eQAw2fRm8jytc&sJPwUBxZ{akMb8J`Gm{GXb|>!f=w^nw#SE?jsXd3-LS0_EKO+W z&tu1{h!=Q<7NdCiv#w#E1EPBBS~!)f%KSxLFlxPdW%o9LuUn_$9mx(N=#KEn$#Bd? zi{T=BIiM);z?s5d)LC~YmH62j{+*&lwkBT_5PM682VYEa3?Tz~po$mBp1{p#)O44)7-08|iK;9Ora4!EfxQtf|0MYtITl|w){a3M?vLca8G|EP?nTbShH6!v! zst6pRJ%R*VmVevQe!8A+w0~)v-&z-u*4DaKAEjI1YQF46&YJg2<;ik6lZzfRBZA(o zbAFQZ=z^=@W;{$7r1ovSPB!+nnDwk>eGPF4p0$pMS@LP%aIsaxUaTB>6kWu@HLl_t z(S6|;1|0%vkT8HSqc~7HrDj-NPXF;3 z)#N+R0$|yy)3TU^--U|&PG(=`X{r_KL9yT|XM~8uF$#R_CFK9QQTMqqN5sbM7N#!h zGz)je@5T7%71r&|cb{aOWo&X5>m23x#Cm$50l46TAVT+!Dl!5g%XR~te;69BO?NJA znnD6xmz!kbprZpATnfqXg!d{zMM*SdISfyZwIytTr$b(IIk8>AQ@r3;1kVEg;ZgWz zY(>mhNET)2XSyLn)QgD%LOON0Y8ddGk`PqOAfvsk0D9U&KOi=hAP4O034JgF2ng(k zzRaMWh}r>c)e+6b!&kn5-Tb|80LL3{{$rS#{&+5qA8Uy9*RISIYs7rjikU0*LaZK4 zo6~%o@0~W&!FsH44MJD~Y<~g~;Bj?Otnhv!pZSCABk(@y!@CKa2EL+Dkn*ochHFylj1AQ#b zo!^yqp-qP=3L*NO%N>x}oQxXfTZEtI!2V6W`AiHTaE}3P~tau04$qPM(cub@)rl+FD_jSC(ea<_4_N%Q8q z`l?&==5L?#rColUFo-Tbz(do0XX87h$?408eA(*PLh;@9U=*fzR$HgUg$@BbR0zuu1#w4oL3jWXeeR@o>s>Kj^VV=IDswHQB6 z=QeD^*{apT)ao5g^#{l)LvN2ozTK86x_iIgYRh-GkF&S8_O{yJdb)iPJKAccpKemR zy0vel-Gq;AwiA8O-F?_CaKC)QJgp-qJL!|Mlt;LQkeh*uh4cA5P876t;NN5@EI5>u zdK=+aod$7~M)`bkzQl_2#XO+QA+H)xFcB#M)jOJJg;A*4$p>OfxenN6X}(nN`!j&G zYRyyeu-8)mmYBZ3RV{cL=j)>!i?z-?s8?@r%Er~s8p5PsVcV{xyAEp-T(LN z+fViF|Nl>YKS}ldyr8T5+MS@pm_)4i; zC7)N(G7)z4G?6P>{3ZV2?(uI4KO)w8!`@(NATF!lQ1xC75uqw+YakjPikfN5E_ve- zKw9dtfTM@*c)yvAwAGaX9jH4dT)cr^N9(g!^9BAE0cJ||5IjH$_&`1Qsbg} zY#JfVeA2C{k`Hg91T?Q-OPAt9a=sYb9fmtqtS1>lx>~e>H;{>BPKlSJH*{dr?A;O6 zKJG2qR@#gXg`)#jx`IGgTCa|`mE!{?ggNjgnC(vl$ZW~&R!<=J#gl|SFT0VET@G=+ zO#oZ&K|DGSX?59ve}LLognSJ-vNUmP=Ay zQ4p^f3iEPrmf9Fht_}wm0^Si~wS$vSSA%otiA~+__=9%Ruv$bDZQ}MBfQ>*cqOq zq=fIpX%-_45s=u zBnHbO?vLhg;4B1TygD;HZuxxH_(LeiNykju9yf|>h_ffL2tMh z8&_|+b0u`QsuQY-D{j>irG%!uZJ6TO>bgiAC05P%wO!L#V=Qmm`7!P%!B%N}&pRyQ6yg%%d-t*lo)H_*PQ-b9F>nm94$YJxk$?b= zN+lcGO2J%D!IpO8<)n)G2`#RGOR=hde}^d#f~YV}Q-)-72Xf5v{YZ|>BE7OPZpyg` z%19qPgQR3gB#X2IbU7A3;%co)<86U>G#U@Q4cU?4%!=hZgYn4p<%V(jbR-^pr>Y^% zC(?yb(+LbZ>9)u&0)FhJY$BcGy`_U<=Q4fJsOKY^#McwtovpxL%F;1ifE%0>%WfTc zmDagWhKDr4u;ZhDL#O400U+%bamGY}2$k6ybi^rkB&%pmhAj?z%FQLkIq;SSkv+@P z1}&EkmO?QZ)>E$%jXLRff?6mV6;{$%D6wf`mBfJ%f(5!6g($n!fkYw{6L#2Gl#=|Y z`~kQTx6Q^vr2&LCM@T6^dAae{DI(X(Kdo_hImCO^ifQAc(j*yXQs-e6^w01SQ9O6PB z86*uzG4a7Slwl@Aa%}xx1W7QDkV71SAh=o?6A;wBhmpAHv_K1VJFl?2vR*5y>ADuR zyz~twnvc`e#Gu&GFCeV}*Qaf^;Q9*k;SlfTd674gg%P7Fi|KRo+I}p?veAEwX2Ha$ z466IHsy5mDLNtxohkFpOfyOV*MS^F**yTI}*J`@sgJY;LDj-IRC56u8G9__;1n{3^ zZ@R3A*1EI+keiztzHlkLRf?Bk@y1ZZGguf#qUHl;+jIT7J zRZcb{Pi<+t9L|kcOG7hsfSb#naM;EUMc}ZP|v0PL_7WI+>+r9M3Z_kF_}RC{s#kTZ)mvR*yhXl z0!IHZ*ITY*KA`w_bqATnIUt_&uft=Achw28L`Nk{h|8fONg(3vx?9pR5QW*Hn01R~ z5bsli=(vhMR5ROLKtF`CcIenGLzG5~%4AWfcI%xqwU@jXPeSYen2rG-)u6BlIg z%Jf;vkB!QZm$~h@?X=WL8x8C)wY~BB@=H8lUA*qZNQ z;dM)rqVCoL&$v%(Kldd{*PQ1SFMb}Ub?d-YuEWj;&X=Lzlef1>7bqkE(q0l(q5dux z!Ubvh=ODh>*uSokJPRZmmTN!2p1vk-$Bkp?{7%XqfGGhz&oi7sJ9~MF?rjSzuUG@n0i9Sqv;p5SR@~xmMArAJKd*hkGcEP9H>g!KeYqi>^ zI<}YkD=_Zl>3S?sT`q%?pU~%dE>W1?Ay2f1D5e%NTyriSb%nN_^z5J+l$jI!_5Z0D zW2n!QptT;z{2knPcU8E7tX&n%F^E~hb?(nTL!%QI$yGZ3fWCZJvX88MAHbQ%1o!^p?7V#m`Q-- z0CSHB0x9uxDi$mHl;1%?&1;^7hfiY4eFg! zJvw41NeH+kBg~MB7;h?K56Q^UDk1ce-ZQ1?$kjRy6mxbQd0lmO%!$T==qkJg?R|+XP#FjorAPhb3+_kQ6-|ZvOg7QCUGYo4fG+uE#HH~|dccqNB01v} zc=<QW9zkfa!>lqeWhvE3ZLYxAbhwwKXUl_m!R2E*G7mLmB-;eVY7J-GZ zxfeI$;9-|vK0`YELr`?~_OjT`4>;E?roFs^la z`=bSW*)AOQS`YX`e*7BF3Q>boI3K5{jw4dr5jqzOBqS-=hIJFNyWw<0tY}EPtwjp^3Xxi;a_pIQZiV-cMZ)38 zSPvyQr8>%f^6hZZJ25!<;rZ4&ksl1vv-_0h2(;NeD>@Aw=YV z)jfMzB>oZ|J?~XjSJ(0Cy;rZQUZwgpI6cJvu6Fq4ZijbaTrIElrLvoc`!_ui`#aZ( z(ZO|->v|{mK})_fQ`mRzp-9Hlfn~eWt(&xM>vv%1IWE7!#aby!Z0T7)+_M#qWq{)5 z0qi{Av3{GjsiWhNjs+Wd{9e~LsvX)lS?4~gPwr#w23mk>k4HouYuKYWxxqX`sYTJs z?useGN~6SXtPQT9E7e2Mwg>EDTG^Zeo}@2U`rgIN$CkkNY2ge ztlrt(srL``71A067=)UZF7yrbtKjVLU{>Fq-LWC+;tezRKR7UX=FH@Pi)lokp+mf; z`gFY?ewGCm84#FGBw?vbCt3I7aq&ZOqoRWu+{=Mo*r?#L?W%Pj%(B%A-M*@`;e>68 z)kGu_r4>(0B(`pi%u`#oM3$sg__@L5o~Jq-moJmX=(JMmuR3DWKQV@ug?z;3?Cr&V}fqlUz?5wlOtY_PcV$k5iQV?`WT?)`2$wJY79dT?UPw#^%h zPzLVBv5n%!&D*w2JecZF?@Fb=i;=atcx-BG)JLDEdogym@(Hr;nH_3LOl|aGsiu|? zcJT5+FY7G;c*SBbETim2PYHdV$FVAno2k!sj1}|LjyvbtDPJ7x5PkiG;hhqFeIf+_ zTIwR$M;2BS)bNV#-fWIOd^2|K=6;rGZ_oTJw|9Kg&1oFGxIH26-~$+Uh{WyqJ@>s& zW;!A|xVW@q1`Z{8+&rT8(6Q%!iMEL}kH=u(T)G!qTiz-J#tIYh%4rwWYB-%zJ1Gr- zJflG(YF$7HKdNx1s(5S!E?t;S*FGw4<4|w5|M2wm;r?vz#7>w+FI#bAC2r}!)O*D{ z%U5X6Jvz?l8QM4i@);-&ZdCTwn1?)wHMs{d$2h9)a8zv7;KLqxHmY^s@3f2s_8pTo-Gaef=zHaT1b`RIvvN*vzqsvBx+bZTEqv^}?BfzU)u| zzVi#&WIL`4=%YF>xEjaR2FT+^;Uk0F@)*cNMtU^OzP^mY6h6jv!@if>uulgQ(1pwZ7Fk11%**PTD7y{ZCgsI}^Vc7)a()vOhvj#c4cVJrN1*Z6)_-yQpR zZO>?^@%}?k=-s(Rg$<9aAIfU5S!Yrc+fMv%4Rg6_l@0RZz2%LnVWw`q;_BypYuEKd zDxz~g?uhJ44P^`Zy6dLT(}>E(BLw*D6yG~Owq!I#7eb-ggVU0_0d+=MBj6hv5bxye zn;6B;ZZ;Oc17CD!3dGS~`gsBOP94k*>6gA7SE&^z*A0$};(+#Cw$dzW&rf$GFC5cz z_YdfoZGm{)IGEmf$@I~g-PiYCI*cSQKp?@CiTp2ksO}d zyWxUMcC{bsKE4$O$o z!!6ot%g0`X_CPC!a=)?^oB6&sUZ`6Axyb358mp*t+X>XUZETH^WK}*VhI_zS)MH78 z@Z7euZG`v6N9Tz#_;|auDu%IUy$z!>T2|d9+OXU(J#sc;R%cr5i#gZjhW2C4_zjLd zJkm3Kc4V4QwB5DL_l99AgAej(k16{zycfPfj>FGc9k=w(qZF;pkMSCAJ8nng9pLO= zyanOLw3f!U?8X@rN9MM;Gi@1K%4=koG1{+kz}VY$nb-xFlgMv3V|#H6jJSYHHPekb z=61{!3r)Bk*0v>K-EDM|k%aSf>QV*2G&6d4e8NxeT)SCSfxrXu$-N+W0j>%NZ7YmE$h<+(iDcaTKmQSpFa7!!^f_CAH|8*5Kq5!A13afP){1 zo>6ddzIy;0E;{xcNcR`#J30%=f$lvAijiLQdHOkQB0cKNNZS~U4oe5)FbJXNL?;8- z0|Pd4wG0yUBg05`AH?n26Nj!j*qt;CYjX0?!(DsEx*y8T+!t-=`c+OZj*lO@=J3RL zQP1t$_l$?S$M$qRym96=Q0TB<3mwM1f*P>l9RZ>iybN4uhlw9|+RCnKE$OW?kSM)` z7x!YNdnpNxS^m`2U;XDQp-1xbXlia94UJpdbJv!ST+uFL?e!w+Qe>fz9alIU7FcB*Xva8^pPNqwO0V=+vS?q82# z(UxiZMGPmP;ru3slWjX`dkkxBeRLv*^|mcEAH$ipV;Do+rHcKSvyso^LtL;_mG;{BoTC?xh^BkWJ~CfvgtGi$#CFwlfH3 zi?g27C~|UX+fLE-oRhK=Y_A7_yMKCmHV)rjaT=f@r>)r*v=yN-EI`Zmfj98`yTXfD z0VpEYLmG*bQVwhp7S1+5w)DmS*Bi(1MGqykRGGOX+p+rF`ts`X?>h0j8{FV#L%rySa zu1UWgsW>O4Un;7{n#KA4(6?bP!v#_}*^1RrYzj-mN|L1<V+fv zej1=b8lrVH49m_2=mte->DcE?n`w;3X@Vwcinf4_Z=(`snA7m_vV(TgF1i3tsrJxb z+D8}CelYNhmH&v#;J5!E9iqc@IX#Y!&=qtgJ)W+jC(zaOM7oBaMAy<$dNMtQuA`^Y zF}j|fM#t&tbOYT;&!C&=W;#J8m8n8ik~B*-s*^=0X^w1gswO$)(kb$=b1tBe=4pXW z(<1J^dL})KZl!0_bKtw*)3L26`jCiQY_a!TkEI^fr1sy@TFK@1l3pd+5FJiS#~tKYf5cNcYi) z;NjsT^ild4eVp#62j~;@N%|Chnm$9HrO%PNCy~B@n>D{kU!pJ5SLh*nn7&G1qp#C9 z=$rH{I*b1K4*enh5&bd!34NFTl)guQMt@Gd&=0Yu@+107`YZY|{e=FSeoB8s ze@lNye^38F|42Whe}cUDXZi*G3;iqo8~u|09cQlogMLl_Nxz~0qI2|H(IyC&wBlAH zTxh5ZI6e|->>ACAoXEp;)-F0kr|1&hqDS=NlA?YwAO^*dSSNm`6p*`Ox7dSAi}#5O#eQ*-xL8~wE)|!F1LB}K zBo2$q#pA>gaRshQf4sO#JV9J7o+z#nPZHOPqvFZpDdIZuRB=pPj|H3K;_2cBaie&K zxJleBP6$(!MMYGF6tkix>cSEy#hkE3Lo|gWTyaWx!WV%E#k^P$r^TYUMLbhHOWZ1+ zEuJIJh}*<-#q-4T#S6p>#f!v?#Y@CX#mmIY#qHt_@d|OLc%^uic(u4o+%4`AuMw{m zuM@8qZxC-3ZxU}7ZxQ#3w~Dukw~Kd(cZzq3cZ>Ik_ln;W?-TDA9}piD_lXaQ4~vh8 zkBX0pkBj@o1L70nlj2k2)8aGYv*L5&^Ws7A`{E1Y55yP6m&BLFSHwf&VewV*HSu-v z4e?F!Epb+STYRT2XI878^!-xVapsngis@B#vwAZ0gPdtwwPvXz!Fs)XgmAbuyO@bE zTh0dA2=uI4JxH64a%h{)iX1f?(z7aNv*dFg2&;u=O_nUq%k^YnHETK&)*Y`CakeZ~ zov^Ha7MiO=_#<7b(x`8>uL=s?ObcIV#$Z%BmAQH&6{QGW!}Kb3YhL!6p64u-Ogku5 zEUyxO{n4SEQQxD|syw?N6&$*qQP_$sSBFFuQlE~~#1&c@#1&F_)!_;$FshIO;|eJ_ zbaN`+S2d}xMCPM6Rm?im_bv3^ye!%Hl}&U($zKH2@KYv!JjW_WwfPJl}Y^icm#E%36R%fNjBVIG1tOoL)%_L z>ZU#0-ikRDnjT*0YvDm13Pvdo^%G@TO_rtfGG)mBl5d-S9k^{9WvjA?KFgG?rc(jc zd49fZc|pBuE|x0hoYcy;)x^7wtsViOMi~!hF2#?A>CG8s&$Mh?rpulsXDgasGoj5e%h=;xPWT|4xb zBLk};{ZuOw8DiX+B@7VH(IX^*A&GAy2xA1a5P^yoB2dvnX9WA)ZakPUidKavqFWUb z5#6ew&_zl3L!sLaASf-9U|Qi^_H0FZ-~kxify`9uQ8H$n#i;?W`9{UD!$uR0?KB!-z?>Jt6r75GIZ?yKsOA9h zRNu#|?qZrBs&d(iC#x2i8%mz6c#fOF!}sf^g|S)*%TnWqpQwaEs%i#i83Q0$mFBF0 z!9N!`Zno;!7+8vjXR1z%O{Ta}xk5?KUX!elXD}o!7YwFUUk2y%vNOddTeg96V|oISfDuv4CP%_h2l zIizBLdK7{PFq@`ng9$e0IQxOsA@K-8L>2?SR7JD7Tr|Ln`6K}4XTdK^Ev}eT*sS9* zi%iU#r}bIc0At9`vP_g->7)!&vlhe)GR;LmB!Dsz!u&R^KqiGK5OtAu1X>M9&L{)7 zI@_)iy3PXRr~`2trJ1*?GR|YcL2q*+el&DEP=?M~3v2;31(}AHUzZ+YJz1Ew%~}a# zpfV>xD@jH*Jp8%rEchnM&i$rGaFQomMqEz~)3OD`gaH_=Q3Km@&8k*2(cOufY-DQS zi_){1C~Fo*T@9J~B`{r-z|v~AQ_XY_^uV0cE0X}Ueq3F zq{1?$#NsmQ2P(5x;*?dYgdU2PvZ|oHYE2pdcx-EmLUi@?HLF>6PU{eTU>hm?Kx6Y3 zvsQD~i3d-TVVz52RT6V@F@^t%yQNxcnr?%qId0MhFVJk+aGC{MqGwfOD=LoA&}AfT zTeGs{p(y}?;vp={NgiE5AEi_D*i4>!OOPg6n z4F+ASndV=vlAi#SMOq&vV%0UTU^KQfCrkBJ*nE^Oio=IIUvJ3joE0P*vTi`)qhlA- z4GZiULdfk$;w9448ljISY03~xBi)n>z8ZTur_4;gRP&tBEyPIJRH)&E0n=L6HF-Ri zz0j`%#)vJsASjtuFpE$?o{2&4)-{N&K;~SNKOG5K1OZ97=0XN6CuRiO11FJsn7|aYl9zUBT!MK4xwLl z8iprT^QXXe9n~)kWIS18-5hY*ldipp7+X^iUI-Q>=+uMY)tO((Amf3jMpZ}v%y?=F z#U%&mLW^cF>4Pcfd~l{py`*R)8zWq6J%aJ$%}cKXTn=)Ahgp~h1rv%YLNRFyz}MsgGW9Gp zavfu}R!{q3Ihx4nfELWflpk7wn(FvrGwXv)yeK~9FE%UO!bt`+sDqeXsb|#g5m*RJ zOxhcg^%|s2Ko}dMc>HAmBlMF#vKG zLA^78O45k)RWrwql_5NPTou4g*u64EJYO7I8Mb;RnGNb;qs-iTp_z_h^s|Ccsksa{ zGTIQe%Bfjdi!muA3B3iCaB6I;07FQ(K;#8A2BhfCX@IO|JDyEH(tkL!>SsNgDpclf^{Iq{M@|6L>KMLTqqMEEbBA{YDz`TMyy(OLMDc}HDeIsd7&<)4dvhR zk_(t+<`$sBKw_)OR(p&zKxGZ<7P*8&r)0bk$73!8@g`FX;L6M{^aT%cq@G%2!2+CZ G*8dHOkDTuS literal 0 HcmV?d00001 diff --git a/generator-web/target/classes/static/vendor/font-awesome/webfonts/fa-solid-900.woff b/generator-web/target/classes/static/vendor/font-awesome/webfonts/fa-solid-900.woff new file mode 100644 index 0000000000000000000000000000000000000000..1730c2d2dc342b47726a5d09029c19832d8c7c16 GIT binary patch literal 46284 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�OelHRIVW`^d4pKypylzU|P}lZO(`#EC!C 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 0 && j < len ? [ this[ j ] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: arr.sort, + splice: arr.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[ 0 ] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // Skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction( target ) ) { + target = {}; + } + + // Extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + + // Only deal with non-null/undefined values + if ( ( options = arguments[ i ] ) != null ) { + + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject( copy ) || + ( copyIsArray = Array.isArray( copy ) ) ) ) { + + if ( copyIsArray ) { + copyIsArray = false; + clone = src && Array.isArray( src ) ? src : []; + + } else { + clone = src && jQuery.isPlainObject( src ) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend( { + + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + isFunction: function( obj ) { + return jQuery.type( obj ) === "function"; + }, + + isWindow: function( obj ) { + return obj != null && obj === obj.window; + }, + + isNumeric: function( obj ) { + + // As of jQuery 3.0, isNumeric is limited to + // strings and numbers (primitives or objects) + // that can be coerced to finite numbers (gh-2662) + var type = jQuery.type( obj ); + return ( type === "number" || type === "string" ) && + + // parseFloat NaNs numeric-cast false positives ("") + // ...but misinterprets leading-number strings, particularly hex literals ("0x...") + // subtraction forces infinities to NaN + !isNaN( obj - parseFloat( obj ) ); + }, + + isPlainObject: function( obj ) { + var proto, Ctor; + + // Detect obvious negatives + // Use toString instead of jQuery.type to catch host objects + if ( !obj || toString.call( obj ) !== "[object Object]" ) { + return false; + } + + proto = getProto( obj ); + + // Objects with no prototype (e.g., `Object.create( null )`) are plain + if ( !proto ) { + return true; + } + + // Objects with prototype are plain iff they were constructed by a global Object function + Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; + return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; + }, + + isEmptyObject: function( obj ) { + + /* eslint-disable no-unused-vars */ + // See https://github.com/eslint/eslint/issues/6125 + var name; + + for ( name in obj ) { + return false; + } + return true; + }, + + type: function( obj ) { + if ( obj == null ) { + return obj + ""; + } + + // Support: Android <=2.3 only (functionish RegExp) + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call( obj ) ] || "object" : + typeof obj; + }, + + // Evaluates a script in a global context + globalEval: function( code ) { + DOMEval( code ); + }, + + // Convert dashed to camelCase; used by the css and data modules + // Support: IE <=9 - 11, Edge 12 - 13 + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + each: function( obj, callback ) { + var length, i = 0; + + if ( isArrayLike( obj ) ) { + length = obj.length; + for ( ; i < length; i++ ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } else { + for ( i in obj ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } + + return obj; + }, + + // Support: Android <=4.0 only + trim: function( text ) { + return text == null ? + "" : + ( text + "" ).replace( rtrim, "" ); + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArrayLike( Object( arr ) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + return arr == null ? -1 : indexOf.call( arr, elem, i ); + }, + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + for ( ; j < len; j++ ) { + first[ i++ ] = second[ j ]; + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var length, value, + i = 0, + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArrayLike( elems ) ) { + length = elems.length; + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + var tmp, args, proxy; + + if ( typeof context === "string" ) { + tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + args = slice.call( arguments, 2 ); + proxy = function() { + return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || jQuery.guid++; + + return proxy; + }, + + now: Date.now, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +} ); + +if ( typeof Symbol === "function" ) { + jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; +} + +// Populate the class2type map +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), +function( i, name ) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +} ); + +function isArrayLike( obj ) { + + // Support: real iOS 8.2 only (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = !!obj && "length" in obj && obj.length, + type = jQuery.type( obj ); + + if ( type === "function" || jQuery.isWindow( obj ) ) { + return false; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v2.3.3 + * https://sizzlejs.com/ + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2016-08-08 + */ +(function( window ) { + +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + 1 * new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // Instance methods + hasOwn = ({}).hasOwnProperty, + arr = [], + pop = arr.pop, + push_native = arr.push, + push = arr.push, + slice = arr.slice, + // Use a stripped-down indexOf as it's faster than native + // https://jsperf.com/thor-indexof-vs-for/5 + indexOf = function( list, elem ) { + var i = 0, + len = list.length; + for ( ; i < len; i++ ) { + if ( list[i] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + + // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+", + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + + "*\\]", + + pseudos = ":(" + identifier + ")(?:\\((" + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), + + rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + identifier + ")" ), + "CLASS": new RegExp( "^\\.(" + identifier + ")" ), + "TAG": new RegExp( "^(" + identifier + "|[*])" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + + // CSS escapes + // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), + funescape = function( _, escaped, escapedWhitespace ) { + var high = "0x" + escaped - 0x10000; + // NaN means non-codepoint + // Support: Firefox<24 + // Workaround erroneous numeric interpretation of +"0x" + return high !== high || escapedWhitespace ? + escaped : + high < 0 ? + // BMP codepoint + String.fromCharCode( high + 0x10000 ) : + // Supplemental Plane codepoint (surrogate pair) + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // CSS string/identifier serialization + // https://drafts.csswg.org/cssom/#common-serializing-idioms + rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, + fcssescape = function( ch, asCodePoint ) { + if ( asCodePoint ) { + + // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER + if ( ch === "\0" ) { + return "\uFFFD"; + } + + // Control characters and (dependent upon position) numbers get escaped as code points + return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; + } + + // Other potentially-special ASCII characters get backslash-escaped + return "\\" + ch; + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); + }, + + disabledAncestor = addCombinator( + function( elem ) { + return elem.disabled === true && ("form" in elem || "label" in elem); + }, + { dir: "parentNode", next: "legend" } + ); + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + (arr = slice.call( preferredDoc.childNodes )), + preferredDoc.childNodes + ); + // Support: Android<4.0 + // Detect silently failing push.apply + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + push_native.apply( target, slice.call(els) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + // Can't trust NodeList.length + while ( (target[j++] = els[i++]) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var m, i, elem, nid, match, groups, newSelector, + newContext = context && context.ownerDocument, + + // nodeType defaults to 9, since context defaults to document + nodeType = context ? context.nodeType : 9; + + results = results || []; + + // Return early from calls with invalid selector or context + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + // Try to shortcut find operations (as opposed to filters) in HTML documents + if ( !seed ) { + + if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { + setDocument( context ); + } + context = context || document; + + if ( documentIsHTML ) { + + // If the selector is sufficiently simple, try using a "get*By*" DOM method + // (excepting DocumentFragment context, where the methods don't exist) + if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { + + // ID selector + if ( (m = match[1]) ) { + + // Document context + if ( nodeType === 9 ) { + if ( (elem = context.getElementById( m )) ) { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + + // Element context + } else { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( newContext && (elem = newContext.getElementById( m )) && + contains( context, elem ) && + elem.id === m ) { + + results.push( elem ); + return results; + } + } + + // Type selector + } else if ( match[2] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Class selector + } else if ( (m = match[3]) && support.getElementsByClassName && + context.getElementsByClassName ) { + + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // Take advantage of querySelectorAll + if ( support.qsa && + !compilerCache[ selector + " " ] && + (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { + + if ( nodeType !== 1 ) { + newContext = context; + newSelector = selector; + + // qSA looks outside Element context, which is not what we want + // Thanks to Andrew Dupont for this workaround technique + // Support: IE <=8 + // Exclude object elements + } else if ( context.nodeName.toLowerCase() !== "object" ) { + + // Capture the context ID, setting it first if necessary + if ( (nid = context.getAttribute( "id" )) ) { + nid = nid.replace( rcssescape, fcssescape ); + } else { + context.setAttribute( "id", (nid = expando) ); + } + + // Prefix every selector in the list + groups = tokenize( selector ); + i = groups.length; + while ( i-- ) { + groups[i] = "#" + nid + " " + toSelector( groups[i] ); + } + newSelector = groups.join( "," ); + + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || + context; + } + + if ( newSelector ) { + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + } finally { + if ( nid === expando ) { + context.removeAttribute( "id" ); + } + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {function(string, object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return (cache[ key + " " ] = value); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created element and returns a boolean result + */ +function assert( fn ) { + var el = document.createElement("fieldset"); + + try { + return !!fn( el ); + } catch (e) { + return false; + } finally { + // Remove from its parent by default + if ( el.parentNode ) { + el.parentNode.removeChild( el ); + } + // release memory in IE + el = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split("|"), + i = arr.length; + + while ( i-- ) { + Expr.attrHandle[ arr[i] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + a.sourceIndex - b.sourceIndex; + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( (cur = cur.nextSibling) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for :enabled/:disabled + * @param {Boolean} disabled true for :disabled; false for :enabled + */ +function createDisabledPseudo( disabled ) { + + // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable + return function( elem ) { + + // Only certain elements can match :enabled or :disabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled + if ( "form" in elem ) { + + // Check for inherited disabledness on relevant non-disabled elements: + // * listed form-associated elements in a disabled fieldset + // https://html.spec.whatwg.org/multipage/forms.html#category-listed + // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled + // * option elements in a disabled optgroup + // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled + // All such elements have a "form" property. + if ( elem.parentNode && elem.disabled === false ) { + + // Option elements defer to a parent optgroup if present + if ( "label" in elem ) { + if ( "label" in elem.parentNode ) { + return elem.parentNode.disabled === disabled; + } else { + return elem.disabled === disabled; + } + } + + // Support: IE 6 - 11 + // Use the isDisabled shortcut property to check for disabled fieldset ancestors + return elem.isDisabled === disabled || + + // Where there is no isDisabled, check manually + /* jshint -W018 */ + elem.isDisabled !== !disabled && + disabledAncestor( elem ) === disabled; + } + + return elem.disabled === disabled; + + // Try to winnow out elements that can't be disabled before trusting the disabled property. + // Some victims get caught in our net (label, legend, menu, track), but it shouldn't + // even exist on them, let alone have a boolean value. + } else if ( "label" in elem ) { + return elem.disabled === disabled; + } + + // Remaining elements are neither :enabled nor :disabled + return false; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction(function( argument ) { + argument = +argument; + return markFunction(function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ (j = matchIndexes[i]) ] ) { + seed[j] = !(matches[j] = seed[j]); + } + } + }); + }); +} + +/** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== "undefined" && context; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = elem && (elem.ownerDocument || elem).documentElement; + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, subWindow, + doc = node ? node.ownerDocument || node : preferredDoc; + + // Return early if doc is invalid or already selected + if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Update global variables + document = doc; + docElem = document.documentElement; + documentIsHTML = !isXML( document ); + + // Support: IE 9-11, Edge + // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) + if ( preferredDoc !== document && + (subWindow = document.defaultView) && subWindow.top !== subWindow ) { + + // Support: IE 11, Edge + if ( subWindow.addEventListener ) { + subWindow.addEventListener( "unload", unloadHandler, false ); + + // Support: IE 9 - 10 only + } else if ( subWindow.attachEvent ) { + subWindow.attachEvent( "onunload", unloadHandler ); + } + } + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) + support.attributes = assert(function( el ) { + el.className = "i"; + return !el.getAttribute("className"); + }); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert(function( el ) { + el.appendChild( document.createComment("") ); + return !el.getElementsByTagName("*").length; + }); + + // Support: IE<9 + support.getElementsByClassName = rnative.test( document.getElementsByClassName ); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programmatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert(function( el ) { + docElem.appendChild( el ).id = expando; + return !document.getElementsByName || !document.getElementsByName( expando ).length; + }); + + // ID filter and find + if ( support.getById ) { + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute("id") === attrId; + }; + }; + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var elem = context.getElementById( id ); + return elem ? [ elem ] : []; + } + }; + } else { + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== "undefined" && + elem.getAttributeNode("id"); + return node && node.value === attrId; + }; + }; + + // Support: IE 6 - 7 only + // getElementById is not reliable as a find shortcut + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var node, i, elems, + elem = context.getElementById( id ); + + if ( elem ) { + + // Verify the id attribute + node = elem.getAttributeNode("id"); + if ( node && node.value === id ) { + return [ elem ]; + } + + // Fall back on getElementsByName + elems = context.getElementsByName( id ); + i = 0; + while ( (elem = elems[i++]) ) { + node = elem.getAttributeNode("id"); + if ( node && node.value === id ) { + return [ elem ]; + } + } + } + + return []; + } + }; + } + + // Tag + Expr.find["TAG"] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else if ( support.qsa ) { + return context.querySelectorAll( tag ); + } + } : + + function( tag, context ) { + var elem, + tmp = [], + i = 0, + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( (elem = results[i++]) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See https://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( (support.qsa = rnative.test( document.querySelectorAll )) ) { + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert(function( el ) { + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // https://bugs.jquery.com/ticket/12359 + docElem.appendChild( el ).innerHTML = "" + + ""; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( el.querySelectorAll("[msallowcapture^='']").length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !el.querySelectorAll("[selected]").length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ + if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push("~="); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !el.querySelectorAll(":checked").length ) { + rbuggyQSA.push(":checked"); + } + + // Support: Safari 8+, iOS 8+ + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibling-combinator selector` fails + if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push(".#.+[+~]"); + } + }); + + assert(function( el ) { + el.innerHTML = "" + + ""; + + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = document.createElement("input"); + input.setAttribute( "type", "hidden" ); + el.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( el.querySelectorAll("[name=d]").length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( el.querySelectorAll(":enabled").length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: IE9-11+ + // IE's :disabled selector does not pick up the children of disabled fieldsets + docElem.appendChild( el ).disabled = true; + if ( el.querySelectorAll(":disabled").length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Opera 10-11 does not throw on post-comma invalid pseudos + el.querySelectorAll("*,:x"); + rbuggyQSA.push(",.*:"); + }); + } + + if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector) )) ) { + + assert(function( el ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( el, "*" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( el, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + }); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully self-exclusive + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + )); + } : + function( a, b ) { + if ( b ) { + while ( (b = b.parentNode) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { + + // Choose the first element that is related to our preferred document + if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { + return -1; + } + if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + return a === document ? -1 : + b === document ? 1 : + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( (cur = cur.parentNode) ) { + ap.unshift( cur ); + } + cur = b; + while ( (cur = cur.parentNode) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[i] === bp[i] ) { + i++; + } + + return i ? + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[i], bp[i] ) : + + // Otherwise nodes in our document sort first + ap[i] === preferredDoc ? -1 : + bp[i] === preferredDoc ? 1 : + 0; + }; + + return document; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + // Make sure that attribute selectors are quoted + expr = expr.replace( rattributeQuotes, "='$1']" ); + + if ( support.matchesSelector && documentIsHTML && + !compilerCache[ expr + " " ] && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch (e) {} + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + // Set document vars if needed + if ( ( context.ownerDocument || context ) !== document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + (val = elem.getAttributeNode(name)) && val.specified ? + val.value : + null; +}; + +Sizzle.escape = function( sel ) { + return (sel + "").replace( rcssescape, fcssescape ); +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( (elem = results[i++]) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + // If no nodeType, this is expected to be an array + while ( (node = elem[i++]) ) { + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[1] = match[1].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); + + if ( match[2] === "~=" ) { + match[3] = " " + match[3] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[1] = match[1].toLowerCase(); + + if ( match[1].slice( 0, 3 ) === "nth" ) { + // nth-* requires argument + if ( !match[3] ) { + Sizzle.error( match[0] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); + match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); + + // other types prohibit arguments + } else if ( match[3] ) { + Sizzle.error( match[0] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[6] && match[2]; + + if ( matchExpr["CHILD"].test( match[0] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[3] ) { + match[2] = match[4] || match[5] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + // Get excess from tokenize (recursively) + (excess = tokenize( unquoted, true )) && + // advance to the next closing parenthesis + (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { + + // excess is a negative index + match[0] = match[0].slice( 0, excess ); + match[2] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { return true; } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && + classCache( className, function( elem ) { + return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); + }); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + }; + }, + + "CHILD": function( type, what, argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, context, xml ) { + var cache, uniqueCache, outerCache, node, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType, + diff = false; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( (node = node[ dir ]) ) { + if ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) { + + return false; + } + } + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + + // Seek `elem` from a previously-cached index + + // ...in a gzip-friendly way + node = parent; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex && cache[ 2 ]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( (node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + (diff = nodeIndex = 0) || start.pop()) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + } else { + // Use previously-cached element index if available + if ( useCache ) { + // ...in a gzip-friendly way + node = elem; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex; + } + + // xml :nth-child(...) + // or :nth-last-child(...) or :nth(-last)?-of-type(...) + if ( diff === false ) { + // Use the same loop as above to seek `elem` from the start + while ( (node = ++nodeIndex && node && node[ dir ] || + (diff = nodeIndex = 0) || start.pop()) ) { + + if ( ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) && + ++diff ) { + + // Cache the index of each encountered element + if ( useCache ) { + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + uniqueCache[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction(function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf( seed, matched[i] ); + seed[ idx ] = !( matches[ idx ] = matched[i] ); + } + }) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + // Potentially complex pseudos + "not": markFunction(function( selector ) { + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction(function( seed, matches, context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( (elem = unmatched[i]) ) { + seed[i] = !(matches[i] = elem); + } + } + }) : + function( elem, context, xml ) { + input[0] = elem; + matcher( input, null, xml, results ); + // Don't keep the element (issue #299) + input[0] = null; + return !results.pop(); + }; + }), + + "has": markFunction(function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + }), + + "contains": markFunction(function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; + }; + }), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + // lang value must be a valid identifier + if ( !ridentifier.test(lang || "") ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( (elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); + return false; + }; + }), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); + }, + + // Boolean properties + "enabled": createDisabledPseudo( false ), + "disabled": createDisabledPseudo( true ), + + "checked": function( elem ) { + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); + }, + + "selected": function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos["empty"]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + "first": createPositionalPseudo(function() { + return [ 0 ]; + }), + + "last": createPositionalPseudo(function( matchIndexes, length ) { + return [ length - 1 ]; + }), + + "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + }), + + "even": createPositionalPseudo(function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "odd": createPositionalPseudo(function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }) + } +}; + +Expr.pseudos["nth"] = Expr.pseudos["eq"]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +tokenize = Sizzle.tokenize = function( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || (match = rcomma.exec( soFar )) ) { + if ( match ) { + // Don't consume trailing commas as valid + soFar = soFar.slice( match[0].length ) || soFar; + } + groups.push( (tokens = []) ); + } + + matched = false; + + // Combinators + if ( (match = rcombinators.exec( soFar )) ) { + matched = match.shift(); + tokens.push({ + value: matched, + // Cast descendant combinators to space + type: match[0].replace( rtrim, " " ) + }); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || + (match = preFilters[ type ]( match ))) ) { + matched = match.shift(); + tokens.push({ + value: matched, + type: type, + matches: match + }); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[i].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + skip = combinator.next, + key = skip || dir, + checkNonElements = base && key === "parentNode", + doneName = done++; + + return combinator.first ? + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + return false; + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, uniqueCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching + if ( xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || (elem[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {}); + + if ( skip && skip === elem.nodeName.toLowerCase() ) { + elem = elem[ dir ] || elem; + } else if ( (oldCache = uniqueCache[ key ]) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return (newCache[ 2 ] = oldCache[ 2 ]); + } else { + // Reuse newcache so results back-propagate to previous elements + uniqueCache[ key ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { + return true; + } + } + } + } + } + return false; + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[i]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[0]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[i], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( (elem = unmatched[i]) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction(function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( (elem = temp[i]) ) { + matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) ) { + // Restore matcherIn since elem is not yet a final match + temp.push( (matcherIn[i] = elem) ); + } + } + postFinder( null, (matcherOut = []), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) && + (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { + + seed[temp] = !(results[temp] = elem); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + }); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[0].type ], + implicitRelative = leadingRelative || Expr.relative[" "], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + (checkContext = context).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + // Avoid hanging onto element (issue #299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( (matcher = Expr.relative[ tokens[i].type ]) ) { + matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; + } else { + matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[j].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), + len = elems.length; + + if ( outermost ) { + outermostContext = context === document || context || outermost; + } + + // Add elements passing elementMatchers directly to results + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + for ( ; i !== len && (elem = elems[i]) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + if ( !context && elem.ownerDocument !== document ) { + setDocument( elem ); + xml = !documentIsHTML; + } + while ( (matcher = elementMatchers[j++]) ) { + if ( matcher( elem, context || document, xml) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + // They will have gone through all possible matchers + if ( (elem = !matcher && elem) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // `i` is now the count of elements visited above, and adding it to `matchedCount` + // makes the latter nonnegative. + matchedCount += i; + + // Apply set filters to unmatched elements + // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` + // equals `i`), unless we didn't visit _any_ elements in the above loop because we have + // no element matchers and no seed. + // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that + // case, which will result in a "00" `matchedCount` that differs from `i` but is also + // numerically zero. + if ( bySet && i !== matchedCount ) { + j = 0; + while ( (matcher = setMatchers[j++]) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !(unmatched[i] || setMatched[i]) ) { + setMatched[i] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[i] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +}; + +/** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +select = Sizzle.select = function( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( (selector = compiled.selector || selector) ); + + results = results || []; + + // Try to minimize operations if there is only one selector in the list and no seed + // (the latter of which guarantees us context) + if ( match.length === 1 ) { + + // Reduce context if the leading compound selector is an ID + tokens = match[0] = match[0].slice( 0 ); + if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && + context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) { + + context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[i]; + + // Abort if we hit a combinator + if ( Expr.relative[ (type = token.type) ] ) { + break; + } + if ( (find = Expr.find[ type ]) ) { + // Search, expanding context for leading sibling combinators + if ( (seed = find( + token.matches[0].replace( runescape, funescape ), + rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context + )) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + !context || rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +}; + +// One-time assignments + +// Sort stability +support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; + +// Support: Chrome 14-35+ +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert(function( el ) { + // Should return 1, but returns 4 (following) + return el.compareDocumentPosition( document.createElement("fieldset") ) & 1; +}); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert(function( el ) { + el.innerHTML = ""; + return el.firstChild.getAttribute("href") === "#" ; +}) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + }); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert(function( el ) { + el.innerHTML = ""; + el.firstChild.setAttribute( "value", "" ); + return el.firstChild.getAttribute( "value" ) === ""; +}) ) { + addHandle( "value", function( elem, name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + }); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert(function( el ) { + return el.getAttribute("disabled") == null; +}) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + (val = elem.getAttributeNode( name )) && val.specified ? + val.value : + null; + } + }); +} + +return Sizzle; + +})( window ); + + + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; + +// Deprecated +jQuery.expr[ ":" ] = jQuery.expr.pseudos; +jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; +jQuery.escapeSelector = Sizzle.escape; + + + + +var dir = function( elem, dir, until ) { + var matched = [], + truncate = until !== undefined; + + while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); + } + } + return matched; +}; + + +var siblings = function( n, elem ) { + var matched = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + matched.push( n ); + } + } + + return matched; +}; + + +var rneedsContext = jQuery.expr.match.needsContext; + + + +function nodeName( elem, name ) { + + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + +}; +var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); + + + +var risSimple = /^.[^:#\[\.,]*$/; + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + return !!qualifier.call( elem, i, elem ) !== not; + } ); + } + + // Single element + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + } ); + } + + // Arraylike of elements (jQuery, arguments, Array) + if ( typeof qualifier !== "string" ) { + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) > -1 ) !== not; + } ); + } + + // Simple selector that can be filtered directly, removing non-Elements + if ( risSimple.test( qualifier ) ) { + return jQuery.filter( qualifier, elements, not ); + } + + // Complex selector, compare the two sets, removing non-Elements + qualifier = jQuery.filter( qualifier, elements ); + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) > -1 ) !== not && elem.nodeType === 1; + } ); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + if ( elems.length === 1 && elem.nodeType === 1 ) { + return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; + } + + return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + } ) ); +}; + +jQuery.fn.extend( { + find: function( selector ) { + var i, ret, + len = this.length, + self = this; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + } ) ); + } + + ret = this.pushStack( [] ); + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + return len > 1 ? jQuery.uniqueSort( ret ) : ret; + }, + filter: function( selector ) { + return this.pushStack( winnow( this, selector || [], false ) ); + }, + not: function( selector ) { + return this.pushStack( winnow( this, selector || [], true ) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +} ); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + // Shortcut simple #id case for speed + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, + + init = jQuery.fn.init = function( selector, context, root ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Method init() accepts an alternate rootjQuery + // so migrate can support jQuery.sub (gh-2101) + root = root || rootjQuery; + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector[ 0 ] === "<" && + selector[ selector.length - 1 ] === ">" && + selector.length >= 3 ) { + + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && ( match[ 1 ] || !context ) ) { + + // HANDLE: $(html) -> $(array) + if ( match[ 1 ] ) { + context = context instanceof jQuery ? context[ 0 ] : context; + + // Option to run scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[ 1 ], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + + // Properties of context are called as methods if possible + if ( jQuery.isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[ 2 ] ); + + if ( elem ) { + + // Inject the element directly into the jQuery object + this[ 0 ] = elem; + this.length = 1; + } + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || root ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this[ 0 ] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return root.ready !== undefined ? + root.ready( selector ) : + + // Execute immediately if ready is not present + selector( jQuery ); + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + + // Methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend( { + has: function( target ) { + var targets = jQuery( target, this ), + l = targets.length; + + return this.filter( function() { + var i = 0; + for ( ; i < l; i++ ) { + if ( jQuery.contains( this, targets[ i ] ) ) { + return true; + } + } + } ); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + targets = typeof selectors !== "string" && jQuery( selectors ); + + // Positional selectors never match, since there's no _selection_ context + if ( !rneedsContext.test( selectors ) ) { + for ( ; i < l; i++ ) { + for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { + + // Always skip document fragments + if ( cur.nodeType < 11 && ( targets ? + targets.index( cur ) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector( cur, selectors ) ) ) { + + matched.push( cur ); + break; + } + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); + }, + + // Determine the position of an element within the set + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; + } + + // Index in selector + if ( typeof elem === "string" ) { + return indexOf.call( jQuery( elem ), this[ 0 ] ); + } + + // Locate the position of the desired element + return indexOf.call( this, + + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[ 0 ] : elem + ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.uniqueSort( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + } +} ); + +function sibling( cur, dir ) { + while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} + return cur; +} + +jQuery.each( { + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return siblings( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return siblings( elem.firstChild ); + }, + contents: function( elem ) { + if ( nodeName( elem, "iframe" ) ) { + return elem.contentDocument; + } + + // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only + // Treat the templates element as a regular one in browsers that + // don't support it. + if ( nodeName( elem, "template" ) ) { + elem = elem.content || elem; + } + + return jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var matched = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + matched = jQuery.filter( selector, matched ); + } + + if ( this.length > 1 ) { + + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + jQuery.uniqueSort( matched ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + matched.reverse(); + } + } + + return this.pushStack( matched ); + }; +} ); +var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); + + + +// Convert String-formatted options into Object-formatted ones +function createOptions( options ) { + var object = {}; + jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { + object[ flag ] = true; + } ); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + createOptions( options ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + + // Last fire value for non-forgettable lists + memory, + + // Flag to know if list was already fired + fired, + + // Flag to prevent firing + locked, + + // Actual callback list + list = [], + + // Queue of execution data for repeatable lists + queue = [], + + // Index of currently firing callback (modified by add/remove as needed) + firingIndex = -1, + + // Fire callbacks + fire = function() { + + // Enforce single-firing + locked = locked || options.once; + + // Execute callbacks for all pending executions, + // respecting firingIndex overrides and runtime changes + fired = firing = true; + for ( ; queue.length; firingIndex = -1 ) { + memory = queue.shift(); + while ( ++firingIndex < list.length ) { + + // Run callback and check for early termination + if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && + options.stopOnFalse ) { + + // Jump to end and forget the data so .add doesn't re-fire + firingIndex = list.length; + memory = false; + } + } + } + + // Forget the data if we're done with it + if ( !options.memory ) { + memory = false; + } + + firing = false; + + // Clean up if we're done firing for good + if ( locked ) { + + // Keep an empty list if we have data for future add calls + if ( memory ) { + list = []; + + // Otherwise, this object is spent + } else { + list = ""; + } + } + }, + + // Actual Callbacks object + self = { + + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + + // If we have memory from a past run, we should fire after adding + if ( memory && !firing ) { + firingIndex = list.length - 1; + queue.push( memory ); + } + + ( function add( args ) { + jQuery.each( args, function( _, arg ) { + if ( jQuery.isFunction( arg ) ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) { + + // Inspect recursively + add( arg ); + } + } ); + } )( arguments ); + + if ( memory && !firing ) { + fire(); + } + } + return this; + }, + + // Remove a callback from the list + remove: function() { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + + // Handle firing indexes + if ( index <= firingIndex ) { + firingIndex--; + } + } + } ); + return this; + }, + + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? + jQuery.inArray( fn, list ) > -1 : + list.length > 0; + }, + + // Remove all callbacks from the list + empty: function() { + if ( list ) { + list = []; + } + return this; + }, + + // Disable .fire and .add + // Abort any current/pending executions + // Clear all callbacks and values + disable: function() { + locked = queue = []; + list = memory = ""; + return this; + }, + disabled: function() { + return !list; + }, + + // Disable .fire + // Also disable .add unless we have memory (since it would have no effect) + // Abort any pending executions + lock: function() { + locked = queue = []; + if ( !memory && !firing ) { + list = memory = ""; + } + return this; + }, + locked: function() { + return !!locked; + }, + + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( !locked ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + queue.push( args ); + if ( !firing ) { + fire(); + } + } + return this; + }, + + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + +function Identity( v ) { + return v; +} +function Thrower( ex ) { + throw ex; +} + +function adoptValue( value, resolve, reject, noValue ) { + var method; + + try { + + // Check for promise aspect first to privilege synchronous behavior + if ( value && jQuery.isFunction( ( method = value.promise ) ) ) { + method.call( value ).done( resolve ).fail( reject ); + + // Other thenables + } else if ( value && jQuery.isFunction( ( method = value.then ) ) ) { + method.call( value, resolve, reject ); + + // Other non-thenables + } else { + + // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: + // * false: [ value ].slice( 0 ) => resolve( value ) + // * true: [ value ].slice( 1 ) => resolve() + resolve.apply( undefined, [ value ].slice( noValue ) ); + } + + // For Promises/A+, convert exceptions into rejections + // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in + // Deferred#then to conditionally suppress rejection. + } catch ( value ) { + + // Support: Android 4.0 only + // Strict mode functions invoked without .call/.apply get global-object context + reject.apply( undefined, [ value ] ); + } +} + +jQuery.extend( { + + Deferred: function( func ) { + var tuples = [ + + // action, add listener, callbacks, + // ... .then handlers, argument index, [final state] + [ "notify", "progress", jQuery.Callbacks( "memory" ), + jQuery.Callbacks( "memory" ), 2 ], + [ "resolve", "done", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 0, "resolved" ], + [ "reject", "fail", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 1, "rejected" ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + "catch": function( fn ) { + return promise.then( null, fn ); + }, + + // Keep pipe for back-compat + pipe: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + + return jQuery.Deferred( function( newDefer ) { + jQuery.each( tuples, function( i, tuple ) { + + // Map tuples (progress, done, fail) to arguments (done, fail, progress) + var fn = jQuery.isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; + + // deferred.progress(function() { bind to newDefer or newDefer.notify }) + // deferred.done(function() { bind to newDefer or newDefer.resolve }) + // deferred.fail(function() { bind to newDefer or newDefer.reject }) + deferred[ tuple[ 1 ] ]( function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise() + .progress( newDefer.notify ) + .done( newDefer.resolve ) + .fail( newDefer.reject ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( + this, + fn ? [ returned ] : arguments + ); + } + } ); + } ); + fns = null; + } ).promise(); + }, + then: function( onFulfilled, onRejected, onProgress ) { + var maxDepth = 0; + function resolve( depth, deferred, handler, special ) { + return function() { + var that = this, + args = arguments, + mightThrow = function() { + var returned, then; + + // Support: Promises/A+ section 2.3.3.3.3 + // https://promisesaplus.com/#point-59 + // Ignore double-resolution attempts + if ( depth < maxDepth ) { + return; + } + + returned = handler.apply( that, args ); + + // Support: Promises/A+ section 2.3.1 + // https://promisesaplus.com/#point-48 + if ( returned === deferred.promise() ) { + throw new TypeError( "Thenable self-resolution" ); + } + + // Support: Promises/A+ sections 2.3.3.1, 3.5 + // https://promisesaplus.com/#point-54 + // https://promisesaplus.com/#point-75 + // Retrieve `then` only once + then = returned && + + // Support: Promises/A+ section 2.3.4 + // https://promisesaplus.com/#point-64 + // Only check objects and functions for thenability + ( typeof returned === "object" || + typeof returned === "function" ) && + returned.then; + + // Handle a returned thenable + if ( jQuery.isFunction( then ) ) { + + // Special processors (notify) just wait for resolution + if ( special ) { + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ) + ); + + // Normal processors (resolve) also hook into progress + } else { + + // ...and disregard older resolution values + maxDepth++; + + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ), + resolve( maxDepth, deferred, Identity, + deferred.notifyWith ) + ); + } + + // Handle all other returned values + } else { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Identity ) { + that = undefined; + args = [ returned ]; + } + + // Process the value(s) + // Default process is resolve + ( special || deferred.resolveWith )( that, args ); + } + }, + + // Only normal processors (resolve) catch and reject exceptions + process = special ? + mightThrow : + function() { + try { + mightThrow(); + } catch ( e ) { + + if ( jQuery.Deferred.exceptionHook ) { + jQuery.Deferred.exceptionHook( e, + process.stackTrace ); + } + + // Support: Promises/A+ section 2.3.3.3.4.1 + // https://promisesaplus.com/#point-61 + // Ignore post-resolution exceptions + if ( depth + 1 >= maxDepth ) { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Thrower ) { + that = undefined; + args = [ e ]; + } + + deferred.rejectWith( that, args ); + } + } + }; + + // Support: Promises/A+ section 2.3.3.3.1 + // https://promisesaplus.com/#point-57 + // Re-resolve promises immediately to dodge false rejection from + // subsequent errors + if ( depth ) { + process(); + } else { + + // Call an optional hook to record the stack, in case of exception + // since it's otherwise lost when execution goes async + if ( jQuery.Deferred.getStackHook ) { + process.stackTrace = jQuery.Deferred.getStackHook(); + } + window.setTimeout( process ); + } + }; + } + + return jQuery.Deferred( function( newDefer ) { + + // progress_handlers.add( ... ) + tuples[ 0 ][ 3 ].add( + resolve( + 0, + newDefer, + jQuery.isFunction( onProgress ) ? + onProgress : + Identity, + newDefer.notifyWith + ) + ); + + // fulfilled_handlers.add( ... ) + tuples[ 1 ][ 3 ].add( + resolve( + 0, + newDefer, + jQuery.isFunction( onFulfilled ) ? + onFulfilled : + Identity + ) + ); + + // rejected_handlers.add( ... ) + tuples[ 2 ][ 3 ].add( + resolve( + 0, + newDefer, + jQuery.isFunction( onRejected ) ? + onRejected : + Thrower + ) + ); + } ).promise(); + }, + + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 5 ]; + + // promise.progress = list.add + // promise.done = list.add + // promise.fail = list.add + promise[ tuple[ 1 ] ] = list.add; + + // Handle state + if ( stateString ) { + list.add( + function() { + + // state = "resolved" (i.e., fulfilled) + // state = "rejected" + state = stateString; + }, + + // rejected_callbacks.disable + // fulfilled_callbacks.disable + tuples[ 3 - i ][ 2 ].disable, + + // progress_callbacks.lock + tuples[ 0 ][ 2 ].lock + ); + } + + // progress_handlers.fire + // fulfilled_handlers.fire + // rejected_handlers.fire + list.add( tuple[ 3 ].fire ); + + // deferred.notify = function() { deferred.notifyWith(...) } + // deferred.resolve = function() { deferred.resolveWith(...) } + // deferred.reject = function() { deferred.rejectWith(...) } + deferred[ tuple[ 0 ] ] = function() { + deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); + return this; + }; + + // deferred.notifyWith = list.fireWith + // deferred.resolveWith = list.fireWith + // deferred.rejectWith = list.fireWith + deferred[ tuple[ 0 ] + "With" ] = list.fireWith; + } ); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( singleValue ) { + var + + // count of uncompleted subordinates + remaining = arguments.length, + + // count of unprocessed arguments + i = remaining, + + // subordinate fulfillment data + resolveContexts = Array( i ), + resolveValues = slice.call( arguments ), + + // the master Deferred + master = jQuery.Deferred(), + + // subordinate callback factory + updateFunc = function( i ) { + return function( value ) { + resolveContexts[ i ] = this; + resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( !( --remaining ) ) { + master.resolveWith( resolveContexts, resolveValues ); + } + }; + }; + + // Single- and empty arguments are adopted like Promise.resolve + if ( remaining <= 1 ) { + adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, + !remaining ); + + // Use .then() to unwrap secondary thenables (cf. gh-3000) + if ( master.state() === "pending" || + jQuery.isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { + + return master.then(); + } + } + + // Multiple arguments are aggregated like Promise.all array elements + while ( i-- ) { + adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); + } + + return master.promise(); + } +} ); + + +// These usually indicate a programmer mistake during development, +// warn about them ASAP rather than swallowing them by default. +var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; + +jQuery.Deferred.exceptionHook = function( error, stack ) { + + // Support: IE 8 - 9 only + // Console exists when dev tools are open, which can happen at any time + if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { + window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); + } +}; + + + + +jQuery.readyException = function( error ) { + window.setTimeout( function() { + throw error; + } ); +}; + + + + +// The deferred used on DOM ready +var readyList = jQuery.Deferred(); + +jQuery.fn.ready = function( fn ) { + + readyList + .then( fn ) + + // Wrap jQuery.readyException in a function so that the lookup + // happens at the time of error handling instead of callback + // registration. + .catch( function( error ) { + jQuery.readyException( error ); + } ); + + return this; +}; + +jQuery.extend( { + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + } +} ); + +jQuery.ready.then = readyList.then; + +// The ready event handler and self cleanup method +function completed() { + document.removeEventListener( "DOMContentLoaded", completed ); + window.removeEventListener( "load", completed ); + jQuery.ready(); +} + +// Catch cases where $(document).ready() is called +// after the browser event has already occurred. +// Support: IE <=9 - 10 only +// Older IE sometimes signals "interactive" too soon +if ( document.readyState === "complete" || + ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { + + // Handle it asynchronously to allow scripts the opportunity to delay ready + window.setTimeout( jQuery.ready ); + +} else { + + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed ); +} + + + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + len = elems.length, + bulk = key == null; + + // Sets many values + if ( jQuery.type( key ) === "object" ) { + chainable = true; + for ( i in key ) { + access( elems, fn, i, key[ i ], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !jQuery.isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < len; i++ ) { + fn( + elems[ i ], key, raw ? + value : + value.call( elems[ i ], i, fn( elems[ i ], key ) ) + ); + } + } + } + + if ( chainable ) { + return elems; + } + + // Gets + if ( bulk ) { + return fn.call( elems ); + } + + return len ? fn( elems[ 0 ], key ) : emptyGet; +}; +var acceptData = function( owner ) { + + // Accepts only: + // - Node + // - Node.ELEMENT_NODE + // - Node.DOCUMENT_NODE + // - Object + // - Any + return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); +}; + + + + +function Data() { + this.expando = jQuery.expando + Data.uid++; +} + +Data.uid = 1; + +Data.prototype = { + + cache: function( owner ) { + + // Check if the owner object already has a cache + var value = owner[ this.expando ]; + + // If not, create one + if ( !value ) { + value = {}; + + // We can accept data for non-element nodes in modern browsers, + // but we should not, see #8335. + // Always return an empty object. + if ( acceptData( owner ) ) { + + // If it is a node unlikely to be stringify-ed or looped over + // use plain assignment + if ( owner.nodeType ) { + owner[ this.expando ] = value; + + // Otherwise secure it in a non-enumerable property + // configurable must be true to allow the property to be + // deleted when data is removed + } else { + Object.defineProperty( owner, this.expando, { + value: value, + configurable: true + } ); + } + } + } + + return value; + }, + set: function( owner, data, value ) { + var prop, + cache = this.cache( owner ); + + // Handle: [ owner, key, value ] args + // Always use camelCase key (gh-2257) + if ( typeof data === "string" ) { + cache[ jQuery.camelCase( data ) ] = value; + + // Handle: [ owner, { properties } ] args + } else { + + // Copy the properties one-by-one to the cache object + for ( prop in data ) { + cache[ jQuery.camelCase( prop ) ] = data[ prop ]; + } + } + return cache; + }, + get: function( owner, key ) { + return key === undefined ? + this.cache( owner ) : + + // Always use camelCase key (gh-2257) + owner[ this.expando ] && owner[ this.expando ][ jQuery.camelCase( key ) ]; + }, + access: function( owner, key, value ) { + + // In cases where either: + // + // 1. No key was specified + // 2. A string key was specified, but no value provided + // + // Take the "read" path and allow the get method to determine + // which value to return, respectively either: + // + // 1. The entire cache object + // 2. The data stored at the key + // + if ( key === undefined || + ( ( key && typeof key === "string" ) && value === undefined ) ) { + + return this.get( owner, key ); + } + + // When the key is not a string, or both a key and value + // are specified, set or extend (existing objects) with either: + // + // 1. An object of properties + // 2. A key and value + // + this.set( owner, key, value ); + + // Since the "set" path can have two possible entry points + // return the expected data based on which path was taken[*] + return value !== undefined ? value : key; + }, + remove: function( owner, key ) { + var i, + cache = owner[ this.expando ]; + + if ( cache === undefined ) { + return; + } + + if ( key !== undefined ) { + + // Support array or space separated string of keys + if ( Array.isArray( key ) ) { + + // If key is an array of keys... + // We always set camelCase keys, so remove that. + key = key.map( jQuery.camelCase ); + } else { + key = jQuery.camelCase( key ); + + // If a key with the spaces exists, use it. + // Otherwise, create an array by matching non-whitespace + key = key in cache ? + [ key ] : + ( key.match( rnothtmlwhite ) || [] ); + } + + i = key.length; + + while ( i-- ) { + delete cache[ key[ i ] ]; + } + } + + // Remove the expando if there's no more data + if ( key === undefined || jQuery.isEmptyObject( cache ) ) { + + // Support: Chrome <=35 - 45 + // Webkit & Blink performance suffers when deleting properties + // from DOM nodes, so set to undefined instead + // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) + if ( owner.nodeType ) { + owner[ this.expando ] = undefined; + } else { + delete owner[ this.expando ]; + } + } + }, + hasData: function( owner ) { + var cache = owner[ this.expando ]; + return cache !== undefined && !jQuery.isEmptyObject( cache ); + } +}; +var dataPriv = new Data(); + +var dataUser = new Data(); + + + +// Implementation Summary +// +// 1. Enforce API surface and semantic compatibility with 1.9.x branch +// 2. Improve the module's maintainability by reducing the storage +// paths to a single mechanism. +// 3. Use the same single mechanism to support "private" and "user" data. +// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) +// 5. Avoid exposing implementation details on user objects (eg. expando properties) +// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /[A-Z]/g; + +function getData( data ) { + if ( data === "true" ) { + return true; + } + + if ( data === "false" ) { + return false; + } + + if ( data === "null" ) { + return null; + } + + // Only convert to a number if it doesn't change the string + if ( data === +data + "" ) { + return +data; + } + + if ( rbrace.test( data ) ) { + return JSON.parse( data ); + } + + return data; +} + +function dataAttr( elem, key, data ) { + var name; + + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = getData( data ); + } catch ( e ) {} + + // Make sure we set the data so it isn't changed later + dataUser.set( elem, key, data ); + } else { + data = undefined; + } + } + return data; +} + +jQuery.extend( { + hasData: function( elem ) { + return dataUser.hasData( elem ) || dataPriv.hasData( elem ); + }, + + data: function( elem, name, data ) { + return dataUser.access( elem, name, data ); + }, + + removeData: function( elem, name ) { + dataUser.remove( elem, name ); + }, + + // TODO: Now that all calls to _data and _removeData have been replaced + // with direct calls to dataPriv methods, these can be deprecated. + _data: function( elem, name, data ) { + return dataPriv.access( elem, name, data ); + }, + + _removeData: function( elem, name ) { + dataPriv.remove( elem, name ); + } +} ); + +jQuery.fn.extend( { + data: function( key, value ) { + var i, name, data, + elem = this[ 0 ], + attrs = elem && elem.attributes; + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = dataUser.get( elem ); + + if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE 11 only + // The attrs elements can be null (#14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = jQuery.camelCase( name.slice( 5 ) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + dataPriv.set( elem, "hasDataAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each( function() { + dataUser.set( this, key ); + } ); + } + + return access( this, function( value ) { + var data; + + // The calling jQuery object (element matches) is not empty + // (and therefore has an element appears at this[ 0 ]) and the + // `value` parameter was not undefined. An empty jQuery object + // will result in `undefined` for elem = this[ 0 ] which will + // throw an exception if an attempt to read a data cache is made. + if ( elem && value === undefined ) { + + // Attempt to get data from the cache + // The key will always be camelCased in Data + data = dataUser.get( elem, key ); + if ( data !== undefined ) { + return data; + } + + // Attempt to "discover" the data in + // HTML5 custom data-* attrs + data = dataAttr( elem, key ); + if ( data !== undefined ) { + return data; + } + + // We tried really hard, but the data doesn't exist. + return; + } + + // Set the data... + this.each( function() { + + // We always store the camelCased key + dataUser.set( this, key, value ); + } ); + }, null, value, arguments.length > 1, null, true ); + }, + + removeData: function( key ) { + return this.each( function() { + dataUser.remove( this, key ); + } ); + } +} ); + + +jQuery.extend( { + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = dataPriv.get( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || Array.isArray( data ) ) { + queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // Clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // Not public - generate a queueHooks object, or return the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { + empty: jQuery.Callbacks( "once memory" ).add( function() { + dataPriv.remove( elem, [ type + "queue", key ] ); + } ) + } ); + } +} ); + +jQuery.fn.extend( { + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[ 0 ], type ); + } + + return data === undefined ? + this : + this.each( function() { + var queue = jQuery.queue( this, type, data ); + + // Ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + } ); + }, + dequeue: function( type ) { + return this.each( function() { + jQuery.dequeue( this, type ); + } ); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +} ); +var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; + +var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); + + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var isHiddenWithinTree = function( elem, el ) { + + // isHiddenWithinTree might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + + // Inline style trumps all + return elem.style.display === "none" || + elem.style.display === "" && + + // Otherwise, check computed style + // Support: Firefox <=43 - 45 + // Disconnected elements can have computed display: none, so first confirm that elem is + // in the document. + jQuery.contains( elem.ownerDocument, elem ) && + + jQuery.css( elem, "display" ) === "none"; + }; + +var swap = function( elem, options, callback, args ) { + var ret, name, + old = {}; + + // Remember the old values, and insert the new ones + for ( name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + ret = callback.apply( elem, args || [] ); + + // Revert the old values + for ( name in options ) { + elem.style[ name ] = old[ name ]; + } + + return ret; +}; + + + + +function adjustCSS( elem, prop, valueParts, tween ) { + var adjusted, + scale = 1, + maxIterations = 20, + currentValue = tween ? + function() { + return tween.cur(); + } : + function() { + return jQuery.css( elem, prop, "" ); + }, + initial = currentValue(), + unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), + + // Starting value computation is required for potential unit mismatches + initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && + rcssNum.exec( jQuery.css( elem, prop ) ); + + if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { + + // Trust units reported by jQuery.css + unit = unit || initialInUnit[ 3 ]; + + // Make sure we update the tween properties later on + valueParts = valueParts || []; + + // Iteratively approximate from a nonzero starting point + initialInUnit = +initial || 1; + + do { + + // If previous iteration zeroed out, double until we get *something*. + // Use string for doubling so we don't accidentally see scale as unchanged below + scale = scale || ".5"; + + // Adjust and apply + initialInUnit = initialInUnit / scale; + jQuery.style( elem, prop, initialInUnit + unit ); + + // Update scale, tolerating zero or NaN from tween.cur() + // Break the loop if scale is unchanged or perfect, or if we've just had enough. + } while ( + scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations + ); + } + + if ( valueParts ) { + initialInUnit = +initialInUnit || +initial || 0; + + // Apply relative offset (+=/-=) if specified + adjusted = valueParts[ 1 ] ? + initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : + +valueParts[ 2 ]; + if ( tween ) { + tween.unit = unit; + tween.start = initialInUnit; + tween.end = adjusted; + } + } + return adjusted; +} + + +var defaultDisplayMap = {}; + +function getDefaultDisplay( elem ) { + var temp, + doc = elem.ownerDocument, + nodeName = elem.nodeName, + display = defaultDisplayMap[ nodeName ]; + + if ( display ) { + return display; + } + + temp = doc.body.appendChild( doc.createElement( nodeName ) ); + display = jQuery.css( temp, "display" ); + + temp.parentNode.removeChild( temp ); + + if ( display === "none" ) { + display = "block"; + } + defaultDisplayMap[ nodeName ] = display; + + return display; +} + +function showHide( elements, show ) { + var display, elem, + values = [], + index = 0, + length = elements.length; + + // Determine new display value for elements that need to change + for ( ; index < length; index++ ) { + elem = elements[ index ]; + if ( !elem.style ) { + continue; + } + + display = elem.style.display; + if ( show ) { + + // Since we force visibility upon cascade-hidden elements, an immediate (and slow) + // check is required in this first loop unless we have a nonempty display value (either + // inline or about-to-be-restored) + if ( display === "none" ) { + values[ index ] = dataPriv.get( elem, "display" ) || null; + if ( !values[ index ] ) { + elem.style.display = ""; + } + } + if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { + values[ index ] = getDefaultDisplay( elem ); + } + } else { + if ( display !== "none" ) { + values[ index ] = "none"; + + // Remember what we're overwriting + dataPriv.set( elem, "display", display ); + } + } + } + + // Set the display of the elements in a second loop to avoid constant reflow + for ( index = 0; index < length; index++ ) { + if ( values[ index ] != null ) { + elements[ index ].style.display = values[ index ]; + } + } + + return elements; +} + +jQuery.fn.extend( { + show: function() { + return showHide( this, true ); + }, + hide: function() { + return showHide( this ); + }, + toggle: function( state ) { + if ( typeof state === "boolean" ) { + return state ? this.show() : this.hide(); + } + + return this.each( function() { + if ( isHiddenWithinTree( this ) ) { + jQuery( this ).show(); + } else { + jQuery( this ).hide(); + } + } ); + } +} ); +var rcheckableType = ( /^(?:checkbox|radio)$/i ); + +var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i ); + +var rscriptType = ( /^$|\/(?:java|ecma)script/i ); + + + +// We have to close these tags to support XHTML (#13200) +var wrapMap = { + + // Support: IE <=9 only + option: [ 1, "" ], + + // XHTML parsers do not magically insert elements in the + // same way that tag soup parsers do. So we cannot shorten + // this by omitting or other required elements. + thead: [ 1, "", "
      " ], + col: [ 2, "", "
      " ], + tr: [ 2, "", "
      " ], + td: [ 3, "", "
      " ], + + _default: [ 0, "", "" ] +}; + +// Support: IE <=9 only +wrapMap.optgroup = wrapMap.option; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + + +function getAll( context, tag ) { + + // Support: IE <=9 - 11 only + // Use typeof to avoid zero-argument method invocation on host objects (#15151) + var ret; + + if ( typeof context.getElementsByTagName !== "undefined" ) { + ret = context.getElementsByTagName( tag || "*" ); + + } else if ( typeof context.querySelectorAll !== "undefined" ) { + ret = context.querySelectorAll( tag || "*" ); + + } else { + ret = []; + } + + if ( tag === undefined || tag && nodeName( context, tag ) ) { + return jQuery.merge( [ context ], ret ); + } + + return ret; +} + + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + dataPriv.set( + elems[ i ], + "globalEval", + !refElements || dataPriv.get( refElements[ i ], "globalEval" ) + ); + } +} + + +var rhtml = /<|&#?\w+;/; + +function buildFragment( elems, context, scripts, selection, ignored ) { + var elem, tmp, tag, wrap, contains, j, + fragment = context.createDocumentFragment(), + nodes = [], + i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( jQuery.type( elem ) === "object" ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); + + // Deserialize a standard representation + tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; + + // Descend through wrappers to the right content + j = wrap[ 0 ]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, tmp.childNodes ); + + // Remember the top-level container + tmp = fragment.firstChild; + + // Ensure the created nodes are orphaned (#12392) + tmp.textContent = ""; + } + } + } + + // Remove wrapper from fragment + fragment.textContent = ""; + + i = 0; + while ( ( elem = nodes[ i++ ] ) ) { + + // Skip elements already in the context collection (trac-4087) + if ( selection && jQuery.inArray( elem, selection ) > -1 ) { + if ( ignored ) { + ignored.push( elem ); + } + continue; + } + + contains = jQuery.contains( elem.ownerDocument, elem ); + + // Append to fragment + tmp = getAll( fragment.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( contains ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( ( elem = tmp[ j++ ] ) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + return fragment; +} + + +( function() { + var fragment = document.createDocumentFragment(), + div = fragment.appendChild( document.createElement( "div" ) ), + input = document.createElement( "input" ); + + // Support: Android 4.0 - 4.3 only + // Check state lost if the name is set (#11217) + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#14901) + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + + // Support: Android <=4.1 only + // Older WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE <=11 only + // Make sure textarea (and checkbox) defaultValue is properly cloned + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; +} )(); +var documentElement = document.documentElement; + + + +var + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +// Support: IE <=9 only +// See #13393 for more info +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +function on( elem, types, selector, data, fn, one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + on( elem, type, selector, data, types[ type ], one ); + } + return elem; + } + + if ( data == null && fn == null ) { + + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return elem; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return elem.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + } ); +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + + var handleObjIn, eventHandle, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.get( elem ); + + // Don't attach events to noData or text/comment nodes (but allow plain objects) + if ( !elemData ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Ensure that invalid selectors throw exceptions at attach time + // Evaluate against documentElement in case elem is a non-element node (e.g., document) + if ( selector ) { + jQuery.find.matchesSelector( documentElement, selector ); + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !( events = elemData.events ) ) { + events = elemData.events = {}; + } + if ( !( eventHandle = elemData.handle ) ) { + eventHandle = elemData.handle = function( e ) { + + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? + jQuery.event.dispatch.apply( elem, arguments ) : undefined; + }; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend( { + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join( "." ) + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !( handlers = events[ type ] ) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener if the special events handler returns false + if ( !special.setup || + special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var j, origCount, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); + + if ( !elemData || !( events = elemData.events ) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[ 2 ] && + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || + selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || + special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove data and the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + dataPriv.remove( elem, "handle events" ); + } + }, + + dispatch: function( nativeEvent ) { + + // Make a writable jQuery.Event from the native event object + var event = jQuery.event.fix( nativeEvent ); + + var i, j, ret, matched, handleObj, handlerQueue, + args = new Array( arguments.length ), + handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[ 0 ] = event; + + for ( i = 1; i < arguments.length; i++ ) { + args[ i ] = arguments[ i ]; + } + + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( ( handleObj = matched.handlers[ j++ ] ) && + !event.isImmediatePropagationStopped() ) { + + // Triggered event must either 1) have no namespace, or 2) have namespace(s) + // a subset or equal to those in the bound event (both can have no namespace). + if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || + handleObj.handler ).apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( ( event.result = ret ) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var i, handleObj, sel, matchedHandlers, matchedSelectors, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Find delegate handlers + if ( delegateCount && + + // Support: IE <=9 + // Black-hole SVG instance trees (trac-13180) + cur.nodeType && + + // Support: Firefox <=42 + // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) + // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click + // Support: IE 11 only + // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) + !( event.type === "click" && event.button >= 1 ) ) { + + for ( ; cur !== this; cur = cur.parentNode || this ) { + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { + matchedHandlers = []; + matchedSelectors = {}; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matchedSelectors[ sel ] === undefined ) { + matchedSelectors[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) > -1 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matchedSelectors[ sel ] ) { + matchedHandlers.push( handleObj ); + } + } + if ( matchedHandlers.length ) { + handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); + } + } + } + } + + // Add the remaining (directly-bound) handlers + cur = this; + if ( delegateCount < handlers.length ) { + handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); + } + + return handlerQueue; + }, + + addProp: function( name, hook ) { + Object.defineProperty( jQuery.Event.prototype, name, { + enumerable: true, + configurable: true, + + get: jQuery.isFunction( hook ) ? + function() { + if ( this.originalEvent ) { + return hook( this.originalEvent ); + } + } : + function() { + if ( this.originalEvent ) { + return this.originalEvent[ name ]; + } + }, + + set: function( value ) { + Object.defineProperty( this, name, { + enumerable: true, + configurable: true, + writable: true, + value: value + } ); + } + } ); + }, + + fix: function( originalEvent ) { + return originalEvent[ jQuery.expando ] ? + originalEvent : + new jQuery.Event( originalEvent ); + }, + + special: { + load: { + + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + focus: { + + // Fire native event if possible so blur/focus sequence is correct + trigger: function() { + if ( this !== safeActiveElement() && this.focus ) { + this.focus(); + return false; + } + }, + delegateType: "focusin" + }, + blur: { + trigger: function() { + if ( this === safeActiveElement() && this.blur ) { + this.blur(); + return false; + } + }, + delegateType: "focusout" + }, + click: { + + // For checkbox, fire native event so checked state will be right + trigger: function() { + if ( this.type === "checkbox" && this.click && nodeName( this, "input" ) ) { + this.click(); + return false; + } + }, + + // For cross-browser consistency, don't fire native .click() on links + _default: function( event ) { + return nodeName( event.target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + } +}; + +jQuery.removeEvent = function( elem, type, handle ) { + + // This "if" is needed for plain objects + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle ); + } +}; + +jQuery.Event = function( src, props ) { + + // Allow instantiation without the 'new' keyword + if ( !( this instanceof jQuery.Event ) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + + // Support: Android <=2.3 only + src.returnValue === false ? + returnTrue : + returnFalse; + + // Create target properties + // Support: Safari <=6 - 7 only + // Target should not be a text node (#504, #13143) + this.target = ( src.target && src.target.nodeType === 3 ) ? + src.target.parentNode : + src.target; + + this.currentTarget = src.currentTarget; + this.relatedTarget = src.relatedTarget; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + constructor: jQuery.Event, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + isSimulated: false, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + + if ( e && !this.isSimulated ) { + e.preventDefault(); + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopPropagation(); + } + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Includes all common event props including KeyEvent and MouseEvent specific props +jQuery.each( { + altKey: true, + bubbles: true, + cancelable: true, + changedTouches: true, + ctrlKey: true, + detail: true, + eventPhase: true, + metaKey: true, + pageX: true, + pageY: true, + shiftKey: true, + view: true, + "char": true, + charCode: true, + key: true, + keyCode: true, + button: true, + buttons: true, + clientX: true, + clientY: true, + offsetX: true, + offsetY: true, + pointerId: true, + pointerType: true, + screenX: true, + screenY: true, + targetTouches: true, + toElement: true, + touches: true, + + which: function( event ) { + var button = event.button; + + // Add which for key events + if ( event.which == null && rkeyEvent.test( event.type ) ) { + return event.charCode != null ? event.charCode : event.keyCode; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { + if ( button & 1 ) { + return 1; + } + + if ( button & 2 ) { + return 3; + } + + if ( button & 4 ) { + return 2; + } + + return 0; + } + + return event.which; + } +}, jQuery.event.addProp ); + +// Create mouseenter/leave events using mouseover/out and event-time checks +// so that event delegation works in jQuery. +// Do the same for pointerenter/pointerleave and pointerover/pointerout +// +// Support: Safari 7 only +// Safari sends mouseenter too often; see: +// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 +// for the description of the bug (it existed in older Chrome versions as well). +jQuery.each( { + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mouseenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +} ); + +jQuery.fn.extend( { + + on: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn ); + }, + one: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? + handleObj.origType + "." + handleObj.namespace : + handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each( function() { + jQuery.event.remove( this, types, fn, selector ); + } ); + } +} ); + + +var + + /* eslint-disable max-len */ + + // See https://github.com/eslint/eslint/issues/3229 + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi, + + /* eslint-enable */ + + // Support: IE <=10 - 11, Edge 12 - 13 + // In IE/Edge using regex groups here causes severe slowdowns. + // See https://connect.microsoft.com/IE/feedback/details/1736512/ + rnoInnerhtml = /\s*$/g; + +// Prefer a tbody over its parent table for containing new rows +function manipulationTarget( elem, content ) { + if ( nodeName( elem, "table" ) && + nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { + + return jQuery( ">tbody", elem )[ 0 ] || elem; + } + + return elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + var match = rscriptTypeMasked.exec( elem.type ); + + if ( match ) { + elem.type = match[ 1 ]; + } else { + elem.removeAttribute( "type" ); + } + + return elem; +} + +function cloneCopyEvent( src, dest ) { + var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; + + if ( dest.nodeType !== 1 ) { + return; + } + + // 1. Copy private data: events, handlers, etc. + if ( dataPriv.hasData( src ) ) { + pdataOld = dataPriv.access( src ); + pdataCur = dataPriv.set( dest, pdataOld ); + events = pdataOld.events; + + if ( events ) { + delete pdataCur.handle; + pdataCur.events = {}; + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + } + + // 2. Copy user data + if ( dataUser.hasData( src ) ) { + udataOld = dataUser.access( src ); + udataCur = jQuery.extend( {}, udataOld ); + + dataUser.set( dest, udataCur ); + } +} + +// Fix IE bugs, see support tests +function fixInput( src, dest ) { + var nodeName = dest.nodeName.toLowerCase(); + + // Fails to persist the checked state of a cloned checkbox or radio button. + if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + dest.checked = src.checked; + + // Fails to return the selected option to the default selected state when cloning options + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +function domManip( collection, args, callback, ignored ) { + + // Flatten any nested arrays + args = concat.apply( [], args ); + + var fragment, first, scripts, hasScripts, node, doc, + i = 0, + l = collection.length, + iNoClone = l - 1, + value = args[ 0 ], + isFunction = jQuery.isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( isFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return collection.each( function( index ) { + var self = collection.eq( index ); + if ( isFunction ) { + args[ 0 ] = value.call( this, index, self.html() ); + } + domManip( self, args, callback, ignored ); + } ); + } + + if ( l ) { + fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + // Require either new content or an interest in ignored elements to invoke the callback + if ( first || ignored ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item + // instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( collection[ i ], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !dataPriv.access( node, "globalEval" ) && + jQuery.contains( doc, node ) ) { + + if ( node.src ) { + + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl ) { + jQuery._evalUrl( node.src ); + } + } else { + DOMEval( node.textContent.replace( rcleanScript, "" ), doc ); + } + } + } + } + } + } + + return collection; +} + +function remove( elem, selector, keepData ) { + var node, + nodes = selector ? jQuery.filter( selector, elem ) : elem, + i = 0; + + for ( ; ( node = nodes[ i ] ) != null; i++ ) { + if ( !keepData && node.nodeType === 1 ) { + jQuery.cleanData( getAll( node ) ); + } + + if ( node.parentNode ) { + if ( keepData && jQuery.contains( node.ownerDocument, node ) ) { + setGlobalEval( getAll( node, "script" ) ); + } + node.parentNode.removeChild( node ); + } + } + + return elem; +} + +jQuery.extend( { + htmlPrefilter: function( html ) { + return html.replace( rxhtmlTag, "<$1>" ); + }, + + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var i, l, srcElements, destElements, + clone = elem.cloneNode( true ), + inPage = jQuery.contains( elem.ownerDocument, elem ); + + // Fix IE cloning issues + if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && + !jQuery.isXMLDoc( elem ) ) { + + // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + fixInput( srcElements[ i ], destElements[ i ] ); + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + cloneCopyEvent( srcElements[ i ], destElements[ i ] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + // Return the cloned set + return clone; + }, + + cleanData: function( elems ) { + var data, elem, type, + special = jQuery.event.special, + i = 0; + + for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { + if ( acceptData( elem ) ) { + if ( ( data = elem[ dataPriv.expando ] ) ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataPriv.expando ] = undefined; + } + if ( elem[ dataUser.expando ] ) { + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataUser.expando ] = undefined; + } + } + } + } +} ); + +jQuery.fn.extend( { + detach: function( selector ) { + return remove( this, selector, true ); + }, + + remove: function( selector ) { + return remove( this, selector ); + }, + + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().each( function() { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + this.textContent = value; + } + } ); + }, null, value, arguments.length ); + }, + + append: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + } ); + }, + + prepend: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + } ); + }, + + before: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + } ); + }, + + after: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + } ); + }, + + empty: function() { + var elem, + i = 0; + + for ( ; ( elem = this[ i ] ) != null; i++ ) { + if ( elem.nodeType === 1 ) { + + // Prevent memory leaks + jQuery.cleanData( getAll( elem, false ) ); + + // Remove any remaining nodes + elem.textContent = ""; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + } ); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined && elem.nodeType === 1 ) { + return elem.innerHTML; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + + value = jQuery.htmlPrefilter( value ); + + try { + for ( ; i < l; i++ ) { + elem = this[ i ] || {}; + + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch ( e ) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var ignored = []; + + // Make the changes, replacing each non-ignored context element with the new content + return domManip( this, arguments, function( elem ) { + var parent = this.parentNode; + + if ( jQuery.inArray( this, ignored ) < 0 ) { + jQuery.cleanData( getAll( this ) ); + if ( parent ) { + parent.replaceChild( elem, this ); + } + } + + // Force callback invocation + }, ignored ); + } +} ); + +jQuery.each( { + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1, + i = 0; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); + + // Support: Android <=4.0 only, PhantomJS 1 only + // .get() because push.apply(_, arraylike) throws on ancient WebKit + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +} ); +var rmargin = ( /^margin/ ); + +var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); + +var getStyles = function( elem ) { + + // Support: IE <=11 only, Firefox <=30 (#15098, #14150) + // IE throws on elements created in popups + // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" + var view = elem.ownerDocument.defaultView; + + if ( !view || !view.opener ) { + view = window; + } + + return view.getComputedStyle( elem ); + }; + + + +( function() { + + // Executing both pixelPosition & boxSizingReliable tests require only one layout + // so they're executed at the same time to save the second computation. + function computeStyleTests() { + + // This is a singleton, we need to execute it only once + if ( !div ) { + return; + } + + div.style.cssText = + "box-sizing:border-box;" + + "position:relative;display:block;" + + "margin:auto;border:1px;padding:1px;" + + "top:1%;width:50%"; + div.innerHTML = ""; + documentElement.appendChild( container ); + + var divStyle = window.getComputedStyle( div ); + pixelPositionVal = divStyle.top !== "1%"; + + // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 + reliableMarginLeftVal = divStyle.marginLeft === "2px"; + boxSizingReliableVal = divStyle.width === "4px"; + + // Support: Android 4.0 - 4.3 only + // Some styles come back with percentage values, even though they shouldn't + div.style.marginRight = "50%"; + pixelMarginRightVal = divStyle.marginRight === "4px"; + + documentElement.removeChild( container ); + + // Nullify the div so it wouldn't be stored in the memory and + // it will also be a sign that checks already performed + div = null; + } + + var pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal, + container = document.createElement( "div" ), + div = document.createElement( "div" ); + + // Finish early in limited (non-browser) environments + if ( !div.style ) { + return; + } + + // Support: IE <=9 - 11 only + // Style of cloned element affects source element cloned (#8908) + div.style.backgroundClip = "content-box"; + div.cloneNode( true ).style.backgroundClip = ""; + support.clearCloneStyle = div.style.backgroundClip === "content-box"; + + container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" + + "padding:0;margin-top:1px;position:absolute"; + container.appendChild( div ); + + jQuery.extend( support, { + pixelPosition: function() { + computeStyleTests(); + return pixelPositionVal; + }, + boxSizingReliable: function() { + computeStyleTests(); + return boxSizingReliableVal; + }, + pixelMarginRight: function() { + computeStyleTests(); + return pixelMarginRightVal; + }, + reliableMarginLeft: function() { + computeStyleTests(); + return reliableMarginLeftVal; + } + } ); +} )(); + + +function curCSS( elem, name, computed ) { + var width, minWidth, maxWidth, ret, + + // Support: Firefox 51+ + // Retrieving style before computed somehow + // fixes an issue with getting wrong values + // on detached elements + style = elem.style; + + computed = computed || getStyles( elem ); + + // getPropertyValue is needed for: + // .css('filter') (IE 9 only, #12537) + // .css('--customProperty) (#3144) + if ( computed ) { + ret = computed.getPropertyValue( name ) || computed[ name ]; + + if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) { + ret = jQuery.style( elem, name ); + } + + // A tribute to the "awesome hack by Dean Edwards" + // Android Browser returns percentage for some values, + // but width seems to be reliably pixels. + // This is against the CSSOM draft spec: + // https://drafts.csswg.org/cssom/#resolved-values + if ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) { + + // Remember the original values + width = style.width; + minWidth = style.minWidth; + maxWidth = style.maxWidth; + + // Put in the new values to get a computed value out + style.minWidth = style.maxWidth = style.width = ret; + ret = computed.width; + + // Revert the changed values + style.width = width; + style.minWidth = minWidth; + style.maxWidth = maxWidth; + } + } + + return ret !== undefined ? + + // Support: IE <=9 - 11 only + // IE returns zIndex value as an integer. + ret + "" : + ret; +} + + +function addGetHookIf( conditionFn, hookFn ) { + + // Define the hook, we'll check on the first run if it's really needed. + return { + get: function() { + if ( conditionFn() ) { + + // Hook not needed (or it's not possible to use it due + // to missing dependency), remove it. + delete this.get; + return; + } + + // Hook needed; redefine it so that the support test is not executed again. + return ( this.get = hookFn ).apply( this, arguments ); + } + }; +} + + +var + + // Swappable if display is none or starts with table + // except "table", "table-cell", or "table-caption" + // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display + rdisplayswap = /^(none|table(?!-c[ea]).+)/, + rcustomProp = /^--/, + cssShow = { position: "absolute", visibility: "hidden", display: "block" }, + cssNormalTransform = { + letterSpacing: "0", + fontWeight: "400" + }, + + cssPrefixes = [ "Webkit", "Moz", "ms" ], + emptyStyle = document.createElement( "div" ).style; + +// Return a css property mapped to a potentially vendor prefixed property +function vendorPropName( name ) { + + // Shortcut for names that are not vendor prefixed + if ( name in emptyStyle ) { + return name; + } + + // Check for vendor prefixed names + var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), + i = cssPrefixes.length; + + while ( i-- ) { + name = cssPrefixes[ i ] + capName; + if ( name in emptyStyle ) { + return name; + } + } +} + +// Return a property mapped along what jQuery.cssProps suggests or to +// a vendor prefixed property. +function finalPropName( name ) { + var ret = jQuery.cssProps[ name ]; + if ( !ret ) { + ret = jQuery.cssProps[ name ] = vendorPropName( name ) || name; + } + return ret; +} + +function setPositiveNumber( elem, value, subtract ) { + + // Any relative (+/-) values have already been + // normalized at this point + var matches = rcssNum.exec( value ); + return matches ? + + // Guard against undefined "subtract", e.g., when used as in cssHooks + Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : + value; +} + +function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) { + var i, + val = 0; + + // If we already have the right measurement, avoid augmentation + if ( extra === ( isBorderBox ? "border" : "content" ) ) { + i = 4; + + // Otherwise initialize for horizontal or vertical properties + } else { + i = name === "width" ? 1 : 0; + } + + for ( ; i < 4; i += 2 ) { + + // Both box models exclude margin, so add it if we want it + if ( extra === "margin" ) { + val += jQuery.css( elem, extra + cssExpand[ i ], true, styles ); + } + + if ( isBorderBox ) { + + // border-box includes padding, so remove it if we want content + if ( extra === "content" ) { + val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + } + + // At this point, extra isn't border nor margin, so remove border + if ( extra !== "margin" ) { + val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } else { + + // At this point, extra isn't content, so add padding + val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + + // At this point, extra isn't content nor padding, so add border + if ( extra !== "padding" ) { + val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } + } + + return val; +} + +function getWidthOrHeight( elem, name, extra ) { + + // Start with computed style + var valueIsBorderBox, + styles = getStyles( elem ), + val = curCSS( elem, name, styles ), + isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; + + // Computed unit is not pixels. Stop here and return. + if ( rnumnonpx.test( val ) ) { + return val; + } + + // Check for style in case a browser which returns unreliable values + // for getComputedStyle silently falls back to the reliable elem.style + valueIsBorderBox = isBorderBox && + ( support.boxSizingReliable() || val === elem.style[ name ] ); + + // Fall back to offsetWidth/Height when value is "auto" + // This happens for inline elements with no explicit setting (gh-3571) + if ( val === "auto" ) { + val = elem[ "offset" + name[ 0 ].toUpperCase() + name.slice( 1 ) ]; + } + + // Normalize "", auto, and prepare for extra + val = parseFloat( val ) || 0; + + // Use the active box-sizing model to add/subtract irrelevant styles + return ( val + + augmentWidthOrHeight( + elem, + name, + extra || ( isBorderBox ? "border" : "content" ), + valueIsBorderBox, + styles + ) + ) + "px"; +} + +jQuery.extend( { + + // Add in style property hooks for overriding the default + // behavior of getting and setting a style property + cssHooks: { + opacity: { + get: function( elem, computed ) { + if ( computed ) { + + // We should always get a number back from opacity + var ret = curCSS( elem, "opacity" ); + return ret === "" ? "1" : ret; + } + } + } + }, + + // Don't automatically add "px" to these possibly-unitless properties + cssNumber: { + "animationIterationCount": true, + "columnCount": true, + "fillOpacity": true, + "flexGrow": true, + "flexShrink": true, + "fontWeight": true, + "lineHeight": true, + "opacity": true, + "order": true, + "orphans": true, + "widows": true, + "zIndex": true, + "zoom": true + }, + + // Add in properties whose names you wish to fix before + // setting or getting the value + cssProps: { + "float": "cssFloat" + }, + + // Get and set the style property on a DOM Node + style: function( elem, name, value, extra ) { + + // Don't set styles on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { + return; + } + + // Make sure that we're working with the right name + var ret, type, hooks, + origName = jQuery.camelCase( name ), + isCustomProp = rcustomProp.test( name ), + style = elem.style; + + // Make sure that we're working with the right name. We don't + // want to query the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Gets hook for the prefixed version, then unprefixed version + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // Check if we're setting a value + if ( value !== undefined ) { + type = typeof value; + + // Convert "+=" or "-=" to relative numbers (#7345) + if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { + value = adjustCSS( elem, name, ret ); + + // Fixes bug #9237 + type = "number"; + } + + // Make sure that null and NaN values aren't set (#7116) + if ( value == null || value !== value ) { + return; + } + + // If a number was passed in, add the unit (except for certain CSS properties) + if ( type === "number" ) { + value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); + } + + // background-* props affect original clone's values + if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { + style[ name ] = "inherit"; + } + + // If a hook was provided, use that value, otherwise just set the specified value + if ( !hooks || !( "set" in hooks ) || + ( value = hooks.set( elem, value, extra ) ) !== undefined ) { + + if ( isCustomProp ) { + style.setProperty( name, value ); + } else { + style[ name ] = value; + } + } + + } else { + + // If a hook was provided get the non-computed value from there + if ( hooks && "get" in hooks && + ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { + + return ret; + } + + // Otherwise just get the value from the style object + return style[ name ]; + } + }, + + css: function( elem, name, extra, styles ) { + var val, num, hooks, + origName = jQuery.camelCase( name ), + isCustomProp = rcustomProp.test( name ); + + // Make sure that we're working with the right name. We don't + // want to modify the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Try prefixed name followed by the unprefixed name + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // If a hook was provided get the computed value from there + if ( hooks && "get" in hooks ) { + val = hooks.get( elem, true, extra ); + } + + // Otherwise, if a way to get the computed value exists, use that + if ( val === undefined ) { + val = curCSS( elem, name, styles ); + } + + // Convert "normal" to computed value + if ( val === "normal" && name in cssNormalTransform ) { + val = cssNormalTransform[ name ]; + } + + // Make numeric if forced or a qualifier was provided and val looks numeric + if ( extra === "" || extra ) { + num = parseFloat( val ); + return extra === true || isFinite( num ) ? num || 0 : val; + } + + return val; + } +} ); + +jQuery.each( [ "height", "width" ], function( i, name ) { + jQuery.cssHooks[ name ] = { + get: function( elem, computed, extra ) { + if ( computed ) { + + // Certain elements can have dimension info if we invisibly show them + // but it must have a current display style that would benefit + return rdisplayswap.test( jQuery.css( elem, "display" ) ) && + + // Support: Safari 8+ + // Table columns in Safari have non-zero offsetWidth & zero + // getBoundingClientRect().width unless display is changed. + // Support: IE <=11 only + // Running getBoundingClientRect on a disconnected node + // in IE throws an error. + ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? + swap( elem, cssShow, function() { + return getWidthOrHeight( elem, name, extra ); + } ) : + getWidthOrHeight( elem, name, extra ); + } + }, + + set: function( elem, value, extra ) { + var matches, + styles = extra && getStyles( elem ), + subtract = extra && augmentWidthOrHeight( + elem, + name, + extra, + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + styles + ); + + // Convert to pixels if value adjustment is needed + if ( subtract && ( matches = rcssNum.exec( value ) ) && + ( matches[ 3 ] || "px" ) !== "px" ) { + + elem.style[ name ] = value; + value = jQuery.css( elem, name ); + } + + return setPositiveNumber( elem, value, subtract ); + } + }; +} ); + +jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, + function( elem, computed ) { + if ( computed ) { + return ( parseFloat( curCSS( elem, "marginLeft" ) ) || + elem.getBoundingClientRect().left - + swap( elem, { marginLeft: 0 }, function() { + return elem.getBoundingClientRect().left; + } ) + ) + "px"; + } + } +); + +// These hooks are used by animate to expand properties +jQuery.each( { + margin: "", + padding: "", + border: "Width" +}, function( prefix, suffix ) { + jQuery.cssHooks[ prefix + suffix ] = { + expand: function( value ) { + var i = 0, + expanded = {}, + + // Assumes a single number if not a string + parts = typeof value === "string" ? value.split( " " ) : [ value ]; + + for ( ; i < 4; i++ ) { + expanded[ prefix + cssExpand[ i ] + suffix ] = + parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; + } + + return expanded; + } + }; + + if ( !rmargin.test( prefix ) ) { + jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; + } +} ); + +jQuery.fn.extend( { + css: function( name, value ) { + return access( this, function( elem, name, value ) { + var styles, len, + map = {}, + i = 0; + + if ( Array.isArray( name ) ) { + styles = getStyles( elem ); + len = name.length; + + for ( ; i < len; i++ ) { + map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); + } + + return map; + } + + return value !== undefined ? + jQuery.style( elem, name, value ) : + jQuery.css( elem, name ); + }, name, value, arguments.length > 1 ); + } +} ); + + +function Tween( elem, options, prop, end, easing ) { + return new Tween.prototype.init( elem, options, prop, end, easing ); +} +jQuery.Tween = Tween; + +Tween.prototype = { + constructor: Tween, + init: function( elem, options, prop, end, easing, unit ) { + this.elem = elem; + this.prop = prop; + this.easing = easing || jQuery.easing._default; + this.options = options; + this.start = this.now = this.cur(); + this.end = end; + this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); + }, + cur: function() { + var hooks = Tween.propHooks[ this.prop ]; + + return hooks && hooks.get ? + hooks.get( this ) : + Tween.propHooks._default.get( this ); + }, + run: function( percent ) { + var eased, + hooks = Tween.propHooks[ this.prop ]; + + if ( this.options.duration ) { + this.pos = eased = jQuery.easing[ this.easing ]( + percent, this.options.duration * percent, 0, 1, this.options.duration + ); + } else { + this.pos = eased = percent; + } + this.now = ( this.end - this.start ) * eased + this.start; + + if ( this.options.step ) { + this.options.step.call( this.elem, this.now, this ); + } + + if ( hooks && hooks.set ) { + hooks.set( this ); + } else { + Tween.propHooks._default.set( this ); + } + return this; + } +}; + +Tween.prototype.init.prototype = Tween.prototype; + +Tween.propHooks = { + _default: { + get: function( tween ) { + var result; + + // Use a property on the element directly when it is not a DOM element, + // or when there is no matching style property that exists. + if ( tween.elem.nodeType !== 1 || + tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { + return tween.elem[ tween.prop ]; + } + + // Passing an empty string as a 3rd parameter to .css will automatically + // attempt a parseFloat and fallback to a string if the parse fails. + // Simple values such as "10px" are parsed to Float; + // complex values such as "rotate(1rad)" are returned as-is. + result = jQuery.css( tween.elem, tween.prop, "" ); + + // Empty strings, null, undefined and "auto" are converted to 0. + return !result || result === "auto" ? 0 : result; + }, + set: function( tween ) { + + // Use step hook for back compat. + // Use cssHook if its there. + // Use .style if available and use plain properties where available. + if ( jQuery.fx.step[ tween.prop ] ) { + jQuery.fx.step[ tween.prop ]( tween ); + } else if ( tween.elem.nodeType === 1 && + ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || + jQuery.cssHooks[ tween.prop ] ) ) { + jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); + } else { + tween.elem[ tween.prop ] = tween.now; + } + } + } +}; + +// Support: IE <=9 only +// Panic based approach to setting things on disconnected nodes +Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { + set: function( tween ) { + if ( tween.elem.nodeType && tween.elem.parentNode ) { + tween.elem[ tween.prop ] = tween.now; + } + } +}; + +jQuery.easing = { + linear: function( p ) { + return p; + }, + swing: function( p ) { + return 0.5 - Math.cos( p * Math.PI ) / 2; + }, + _default: "swing" +}; + +jQuery.fx = Tween.prototype.init; + +// Back compat <1.8 extension point +jQuery.fx.step = {}; + + + + +var + fxNow, inProgress, + rfxtypes = /^(?:toggle|show|hide)$/, + rrun = /queueHooks$/; + +function schedule() { + if ( inProgress ) { + if ( document.hidden === false && window.requestAnimationFrame ) { + window.requestAnimationFrame( schedule ); + } else { + window.setTimeout( schedule, jQuery.fx.interval ); + } + + jQuery.fx.tick(); + } +} + +// Animations created synchronously will run synchronously +function createFxNow() { + window.setTimeout( function() { + fxNow = undefined; + } ); + return ( fxNow = jQuery.now() ); +} + +// Generate parameters to create a standard animation +function genFx( type, includeWidth ) { + var which, + i = 0, + attrs = { height: type }; + + // If we include width, step value is 1 to do all cssExpand values, + // otherwise step value is 2 to skip over Left and Right + includeWidth = includeWidth ? 1 : 0; + for ( ; i < 4; i += 2 - includeWidth ) { + which = cssExpand[ i ]; + attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; + } + + if ( includeWidth ) { + attrs.opacity = attrs.width = type; + } + + return attrs; +} + +function createTween( value, prop, animation ) { + var tween, + collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), + index = 0, + length = collection.length; + for ( ; index < length; index++ ) { + if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { + + // We're done with this property + return tween; + } + } +} + +function defaultPrefilter( elem, props, opts ) { + var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, + isBox = "width" in props || "height" in props, + anim = this, + orig = {}, + style = elem.style, + hidden = elem.nodeType && isHiddenWithinTree( elem ), + dataShow = dataPriv.get( elem, "fxshow" ); + + // Queue-skipping animations hijack the fx hooks + if ( !opts.queue ) { + hooks = jQuery._queueHooks( elem, "fx" ); + if ( hooks.unqueued == null ) { + hooks.unqueued = 0; + oldfire = hooks.empty.fire; + hooks.empty.fire = function() { + if ( !hooks.unqueued ) { + oldfire(); + } + }; + } + hooks.unqueued++; + + anim.always( function() { + + // Ensure the complete handler is called before this completes + anim.always( function() { + hooks.unqueued--; + if ( !jQuery.queue( elem, "fx" ).length ) { + hooks.empty.fire(); + } + } ); + } ); + } + + // Detect show/hide animations + for ( prop in props ) { + value = props[ prop ]; + if ( rfxtypes.test( value ) ) { + delete props[ prop ]; + toggle = toggle || value === "toggle"; + if ( value === ( hidden ? "hide" : "show" ) ) { + + // Pretend to be hidden if this is a "show" and + // there is still data from a stopped show/hide + if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { + hidden = true; + + // Ignore all other no-op show/hide data + } else { + continue; + } + } + orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); + } + } + + // Bail out if this is a no-op like .hide().hide() + propTween = !jQuery.isEmptyObject( props ); + if ( !propTween && jQuery.isEmptyObject( orig ) ) { + return; + } + + // Restrict "overflow" and "display" styles during box animations + if ( isBox && elem.nodeType === 1 ) { + + // Support: IE <=9 - 11, Edge 12 - 13 + // Record all 3 overflow attributes because IE does not infer the shorthand + // from identically-valued overflowX and overflowY + opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; + + // Identify a display type, preferring old show/hide data over the CSS cascade + restoreDisplay = dataShow && dataShow.display; + if ( restoreDisplay == null ) { + restoreDisplay = dataPriv.get( elem, "display" ); + } + display = jQuery.css( elem, "display" ); + if ( display === "none" ) { + if ( restoreDisplay ) { + display = restoreDisplay; + } else { + + // Get nonempty value(s) by temporarily forcing visibility + showHide( [ elem ], true ); + restoreDisplay = elem.style.display || restoreDisplay; + display = jQuery.css( elem, "display" ); + showHide( [ elem ] ); + } + } + + // Animate inline elements as inline-block + if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { + if ( jQuery.css( elem, "float" ) === "none" ) { + + // Restore the original display value at the end of pure show/hide animations + if ( !propTween ) { + anim.done( function() { + style.display = restoreDisplay; + } ); + if ( restoreDisplay == null ) { + display = style.display; + restoreDisplay = display === "none" ? "" : display; + } + } + style.display = "inline-block"; + } + } + } + + if ( opts.overflow ) { + style.overflow = "hidden"; + anim.always( function() { + style.overflow = opts.overflow[ 0 ]; + style.overflowX = opts.overflow[ 1 ]; + style.overflowY = opts.overflow[ 2 ]; + } ); + } + + // Implement show/hide animations + propTween = false; + for ( prop in orig ) { + + // General show/hide setup for this element animation + if ( !propTween ) { + if ( dataShow ) { + if ( "hidden" in dataShow ) { + hidden = dataShow.hidden; + } + } else { + dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); + } + + // Store hidden/visible for toggle so `.stop().toggle()` "reverses" + if ( toggle ) { + dataShow.hidden = !hidden; + } + + // Show elements before animating them + if ( hidden ) { + showHide( [ elem ], true ); + } + + /* eslint-disable no-loop-func */ + + anim.done( function() { + + /* eslint-enable no-loop-func */ + + // The final step of a "hide" animation is actually hiding the element + if ( !hidden ) { + showHide( [ elem ] ); + } + dataPriv.remove( elem, "fxshow" ); + for ( prop in orig ) { + jQuery.style( elem, prop, orig[ prop ] ); + } + } ); + } + + // Per-property setup + propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); + if ( !( prop in dataShow ) ) { + dataShow[ prop ] = propTween.start; + if ( hidden ) { + propTween.end = propTween.start; + propTween.start = 0; + } + } + } +} + +function propFilter( props, specialEasing ) { + var index, name, easing, value, hooks; + + // camelCase, specialEasing and expand cssHook pass + for ( index in props ) { + name = jQuery.camelCase( index ); + easing = specialEasing[ name ]; + value = props[ index ]; + if ( Array.isArray( value ) ) { + easing = value[ 1 ]; + value = props[ index ] = value[ 0 ]; + } + + if ( index !== name ) { + props[ name ] = value; + delete props[ index ]; + } + + hooks = jQuery.cssHooks[ name ]; + if ( hooks && "expand" in hooks ) { + value = hooks.expand( value ); + delete props[ name ]; + + // Not quite $.extend, this won't overwrite existing keys. + // Reusing 'index' because we have the correct "name" + for ( index in value ) { + if ( !( index in props ) ) { + props[ index ] = value[ index ]; + specialEasing[ index ] = easing; + } + } + } else { + specialEasing[ name ] = easing; + } + } +} + +function Animation( elem, properties, options ) { + var result, + stopped, + index = 0, + length = Animation.prefilters.length, + deferred = jQuery.Deferred().always( function() { + + // Don't match elem in the :animated selector + delete tick.elem; + } ), + tick = function() { + if ( stopped ) { + return false; + } + var currentTime = fxNow || createFxNow(), + remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), + + // Support: Android 2.3 only + // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) + temp = remaining / animation.duration || 0, + percent = 1 - temp, + index = 0, + length = animation.tweens.length; + + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( percent ); + } + + deferred.notifyWith( elem, [ animation, percent, remaining ] ); + + // If there's more to do, yield + if ( percent < 1 && length ) { + return remaining; + } + + // If this was an empty animation, synthesize a final progress notification + if ( !length ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + } + + // Resolve the animation and report its conclusion + deferred.resolveWith( elem, [ animation ] ); + return false; + }, + animation = deferred.promise( { + elem: elem, + props: jQuery.extend( {}, properties ), + opts: jQuery.extend( true, { + specialEasing: {}, + easing: jQuery.easing._default + }, options ), + originalProperties: properties, + originalOptions: options, + startTime: fxNow || createFxNow(), + duration: options.duration, + tweens: [], + createTween: function( prop, end ) { + var tween = jQuery.Tween( elem, animation.opts, prop, end, + animation.opts.specialEasing[ prop ] || animation.opts.easing ); + animation.tweens.push( tween ); + return tween; + }, + stop: function( gotoEnd ) { + var index = 0, + + // If we are going to the end, we want to run all the tweens + // otherwise we skip this part + length = gotoEnd ? animation.tweens.length : 0; + if ( stopped ) { + return this; + } + stopped = true; + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( 1 ); + } + + // Resolve when we played the last frame; otherwise, reject + if ( gotoEnd ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + deferred.resolveWith( elem, [ animation, gotoEnd ] ); + } else { + deferred.rejectWith( elem, [ animation, gotoEnd ] ); + } + return this; + } + } ), + props = animation.props; + + propFilter( props, animation.opts.specialEasing ); + + for ( ; index < length; index++ ) { + result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); + if ( result ) { + if ( jQuery.isFunction( result.stop ) ) { + jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = + jQuery.proxy( result.stop, result ); + } + return result; + } + } + + jQuery.map( props, createTween, animation ); + + if ( jQuery.isFunction( animation.opts.start ) ) { + animation.opts.start.call( elem, animation ); + } + + // Attach callbacks from options + animation + .progress( animation.opts.progress ) + .done( animation.opts.done, animation.opts.complete ) + .fail( animation.opts.fail ) + .always( animation.opts.always ); + + jQuery.fx.timer( + jQuery.extend( tick, { + elem: elem, + anim: animation, + queue: animation.opts.queue + } ) + ); + + return animation; +} + +jQuery.Animation = jQuery.extend( Animation, { + + tweeners: { + "*": [ function( prop, value ) { + var tween = this.createTween( prop, value ); + adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); + return tween; + } ] + }, + + tweener: function( props, callback ) { + if ( jQuery.isFunction( props ) ) { + callback = props; + props = [ "*" ]; + } else { + props = props.match( rnothtmlwhite ); + } + + var prop, + index = 0, + length = props.length; + + for ( ; index < length; index++ ) { + prop = props[ index ]; + Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; + Animation.tweeners[ prop ].unshift( callback ); + } + }, + + prefilters: [ defaultPrefilter ], + + prefilter: function( callback, prepend ) { + if ( prepend ) { + Animation.prefilters.unshift( callback ); + } else { + Animation.prefilters.push( callback ); + } + } +} ); + +jQuery.speed = function( speed, easing, fn ) { + var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { + complete: fn || !fn && easing || + jQuery.isFunction( speed ) && speed, + duration: speed, + easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing + }; + + // Go to the end state if fx are off + if ( jQuery.fx.off ) { + opt.duration = 0; + + } else { + if ( typeof opt.duration !== "number" ) { + if ( opt.duration in jQuery.fx.speeds ) { + opt.duration = jQuery.fx.speeds[ opt.duration ]; + + } else { + opt.duration = jQuery.fx.speeds._default; + } + } + } + + // Normalize opt.queue - true/undefined/null -> "fx" + if ( opt.queue == null || opt.queue === true ) { + opt.queue = "fx"; + } + + // Queueing + opt.old = opt.complete; + + opt.complete = function() { + if ( jQuery.isFunction( opt.old ) ) { + opt.old.call( this ); + } + + if ( opt.queue ) { + jQuery.dequeue( this, opt.queue ); + } + }; + + return opt; +}; + +jQuery.fn.extend( { + fadeTo: function( speed, to, easing, callback ) { + + // Show any hidden elements after setting opacity to 0 + return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() + + // Animate to the value specified + .end().animate( { opacity: to }, speed, easing, callback ); + }, + animate: function( prop, speed, easing, callback ) { + var empty = jQuery.isEmptyObject( prop ), + optall = jQuery.speed( speed, easing, callback ), + doAnimation = function() { + + // Operate on a copy of prop so per-property easing won't be lost + var anim = Animation( this, jQuery.extend( {}, prop ), optall ); + + // Empty animations, or finishing resolves immediately + if ( empty || dataPriv.get( this, "finish" ) ) { + anim.stop( true ); + } + }; + doAnimation.finish = doAnimation; + + return empty || optall.queue === false ? + this.each( doAnimation ) : + this.queue( optall.queue, doAnimation ); + }, + stop: function( type, clearQueue, gotoEnd ) { + var stopQueue = function( hooks ) { + var stop = hooks.stop; + delete hooks.stop; + stop( gotoEnd ); + }; + + if ( typeof type !== "string" ) { + gotoEnd = clearQueue; + clearQueue = type; + type = undefined; + } + if ( clearQueue && type !== false ) { + this.queue( type || "fx", [] ); + } + + return this.each( function() { + var dequeue = true, + index = type != null && type + "queueHooks", + timers = jQuery.timers, + data = dataPriv.get( this ); + + if ( index ) { + if ( data[ index ] && data[ index ].stop ) { + stopQueue( data[ index ] ); + } + } else { + for ( index in data ) { + if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { + stopQueue( data[ index ] ); + } + } + } + + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && + ( type == null || timers[ index ].queue === type ) ) { + + timers[ index ].anim.stop( gotoEnd ); + dequeue = false; + timers.splice( index, 1 ); + } + } + + // Start the next in the queue if the last step wasn't forced. + // Timers currently will call their complete callbacks, which + // will dequeue but only if they were gotoEnd. + if ( dequeue || !gotoEnd ) { + jQuery.dequeue( this, type ); + } + } ); + }, + finish: function( type ) { + if ( type !== false ) { + type = type || "fx"; + } + return this.each( function() { + var index, + data = dataPriv.get( this ), + queue = data[ type + "queue" ], + hooks = data[ type + "queueHooks" ], + timers = jQuery.timers, + length = queue ? queue.length : 0; + + // Enable finishing flag on private data + data.finish = true; + + // Empty the queue first + jQuery.queue( this, type, [] ); + + if ( hooks && hooks.stop ) { + hooks.stop.call( this, true ); + } + + // Look for any active animations, and finish them + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && timers[ index ].queue === type ) { + timers[ index ].anim.stop( true ); + timers.splice( index, 1 ); + } + } + + // Look for any animations in the old queue and finish them + for ( index = 0; index < length; index++ ) { + if ( queue[ index ] && queue[ index ].finish ) { + queue[ index ].finish.call( this ); + } + } + + // Turn off finishing flag + delete data.finish; + } ); + } +} ); + +jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) { + var cssFn = jQuery.fn[ name ]; + jQuery.fn[ name ] = function( speed, easing, callback ) { + return speed == null || typeof speed === "boolean" ? + cssFn.apply( this, arguments ) : + this.animate( genFx( name, true ), speed, easing, callback ); + }; +} ); + +// Generate shortcuts for custom animations +jQuery.each( { + slideDown: genFx( "show" ), + slideUp: genFx( "hide" ), + slideToggle: genFx( "toggle" ), + fadeIn: { opacity: "show" }, + fadeOut: { opacity: "hide" }, + fadeToggle: { opacity: "toggle" } +}, function( name, props ) { + jQuery.fn[ name ] = function( speed, easing, callback ) { + return this.animate( props, speed, easing, callback ); + }; +} ); + +jQuery.timers = []; +jQuery.fx.tick = function() { + var timer, + i = 0, + timers = jQuery.timers; + + fxNow = jQuery.now(); + + for ( ; i < timers.length; i++ ) { + timer = timers[ i ]; + + // Run the timer and safely remove it when done (allowing for external removal) + if ( !timer() && timers[ i ] === timer ) { + timers.splice( i--, 1 ); + } + } + + if ( !timers.length ) { + jQuery.fx.stop(); + } + fxNow = undefined; +}; + +jQuery.fx.timer = function( timer ) { + jQuery.timers.push( timer ); + jQuery.fx.start(); +}; + +jQuery.fx.interval = 13; +jQuery.fx.start = function() { + if ( inProgress ) { + return; + } + + inProgress = true; + schedule(); +}; + +jQuery.fx.stop = function() { + inProgress = null; +}; + +jQuery.fx.speeds = { + slow: 600, + fast: 200, + + // Default speed + _default: 400 +}; + + +// Based off of the plugin by Clint Helfers, with permission. +// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ +jQuery.fn.delay = function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; + type = type || "fx"; + + return this.queue( type, function( next, hooks ) { + var timeout = window.setTimeout( next, time ); + hooks.stop = function() { + window.clearTimeout( timeout ); + }; + } ); +}; + + +( function() { + var input = document.createElement( "input" ), + select = document.createElement( "select" ), + opt = select.appendChild( document.createElement( "option" ) ); + + input.type = "checkbox"; + + // Support: Android <=4.3 only + // Default value for a checkbox should be "on" + support.checkOn = input.value !== ""; + + // Support: IE <=11 only + // Must access selectedIndex to make default options select + support.optSelected = opt.selected; + + // Support: IE <=11 only + // An input loses its value after becoming a radio + input = document.createElement( "input" ); + input.value = "t"; + input.type = "radio"; + support.radioValue = input.value === "t"; +} )(); + + +var boolHook, + attrHandle = jQuery.expr.attrHandle; + +jQuery.fn.extend( { + attr: function( name, value ) { + return access( this, jQuery.attr, name, value, arguments.length > 1 ); + }, + + removeAttr: function( name ) { + return this.each( function() { + jQuery.removeAttr( this, name ); + } ); + } +} ); + +jQuery.extend( { + attr: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set attributes on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + // Fallback to prop when attributes are not supported + if ( typeof elem.getAttribute === "undefined" ) { + return jQuery.prop( elem, name, value ); + } + + // Attribute hooks are determined by the lowercase version + // Grab necessary hook if one is defined + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + hooks = jQuery.attrHooks[ name.toLowerCase() ] || + ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); + } + + if ( value !== undefined ) { + if ( value === null ) { + jQuery.removeAttr( elem, name ); + return; + } + + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + elem.setAttribute( name, value + "" ); + return value; + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + ret = jQuery.find.attr( elem, name ); + + // Non-existent attributes return null, we normalize to undefined + return ret == null ? undefined : ret; + }, + + attrHooks: { + type: { + set: function( elem, value ) { + if ( !support.radioValue && value === "radio" && + nodeName( elem, "input" ) ) { + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + } + }, + + removeAttr: function( elem, value ) { + var name, + i = 0, + + // Attribute names can contain non-HTML whitespace characters + // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 + attrNames = value && value.match( rnothtmlwhite ); + + if ( attrNames && elem.nodeType === 1 ) { + while ( ( name = attrNames[ i++ ] ) ) { + elem.removeAttribute( name ); + } + } + } +} ); + +// Hooks for boolean attributes +boolHook = { + set: function( elem, value, name ) { + if ( value === false ) { + + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else { + elem.setAttribute( name, name ); + } + return name; + } +}; + +jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) { + var getter = attrHandle[ name ] || jQuery.find.attr; + + attrHandle[ name ] = function( elem, name, isXML ) { + var ret, handle, + lowercaseName = name.toLowerCase(); + + if ( !isXML ) { + + // Avoid an infinite loop by temporarily removing this function from the getter + handle = attrHandle[ lowercaseName ]; + attrHandle[ lowercaseName ] = ret; + ret = getter( elem, name, isXML ) != null ? + lowercaseName : + null; + attrHandle[ lowercaseName ] = handle; + } + return ret; + }; +} ); + + + + +var rfocusable = /^(?:input|select|textarea|button)$/i, + rclickable = /^(?:a|area)$/i; + +jQuery.fn.extend( { + prop: function( name, value ) { + return access( this, jQuery.prop, name, value, arguments.length > 1 ); + }, + + removeProp: function( name ) { + return this.each( function() { + delete this[ jQuery.propFix[ name ] || name ]; + } ); + } +} ); + +jQuery.extend( { + prop: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set properties on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + return ( elem[ name ] = value ); + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + return elem[ name ]; + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + + // Support: IE <=9 - 11 only + // elem.tabIndex doesn't always return the + // correct value when it hasn't been explicitly set + // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + // Use proper attribute retrieval(#12072) + var tabindex = jQuery.find.attr( elem, "tabindex" ); + + if ( tabindex ) { + return parseInt( tabindex, 10 ); + } + + if ( + rfocusable.test( elem.nodeName ) || + rclickable.test( elem.nodeName ) && + elem.href + ) { + return 0; + } + + return -1; + } + } + }, + + propFix: { + "for": "htmlFor", + "class": "className" + } +} ); + +// Support: IE <=11 only +// Accessing the selectedIndex property +// forces the browser to respect setting selected +// on the option +// The getter ensures a default option is selected +// when in an optgroup +// eslint rule "no-unused-expressions" is disabled for this code +// since it considers such accessions noop +if ( !support.optSelected ) { + jQuery.propHooks.selected = { + get: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent && parent.parentNode ) { + parent.parentNode.selectedIndex; + } + return null; + }, + set: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent ) { + parent.selectedIndex; + + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + } + }; +} + +jQuery.each( [ + "tabIndex", + "readOnly", + "maxLength", + "cellSpacing", + "cellPadding", + "rowSpan", + "colSpan", + "useMap", + "frameBorder", + "contentEditable" +], function() { + jQuery.propFix[ this.toLowerCase() ] = this; +} ); + + + + + // Strip and collapse whitespace according to HTML spec + // https://html.spec.whatwg.org/multipage/infrastructure.html#strip-and-collapse-whitespace + function stripAndCollapse( value ) { + var tokens = value.match( rnothtmlwhite ) || []; + return tokens.join( " " ); + } + + +function getClass( elem ) { + return elem.getAttribute && elem.getAttribute( "class" ) || ""; +} + +jQuery.fn.extend( { + addClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( jQuery.isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + if ( typeof value === "string" && value ) { + classes = value.match( rnothtmlwhite ) || []; + + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + if ( cur.indexOf( " " + clazz + " " ) < 0 ) { + cur += clazz + " "; + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( jQuery.isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + if ( !arguments.length ) { + return this.attr( "class", "" ); + } + + if ( typeof value === "string" && value ) { + classes = value.match( rnothtmlwhite ) || []; + + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + + // This expression is here for better compressibility (see addClass) + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + + // Remove *all* instances + while ( cur.indexOf( " " + clazz + " " ) > -1 ) { + cur = cur.replace( " " + clazz + " ", " " ); + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value; + + if ( typeof stateVal === "boolean" && type === "string" ) { + return stateVal ? this.addClass( value ) : this.removeClass( value ); + } + + if ( jQuery.isFunction( value ) ) { + return this.each( function( i ) { + jQuery( this ).toggleClass( + value.call( this, i, getClass( this ), stateVal ), + stateVal + ); + } ); + } + + return this.each( function() { + var className, i, self, classNames; + + if ( type === "string" ) { + + // Toggle individual class names + i = 0; + self = jQuery( this ); + classNames = value.match( rnothtmlwhite ) || []; + + while ( ( className = classNames[ i++ ] ) ) { + + // Check each className given, space separated list + if ( self.hasClass( className ) ) { + self.removeClass( className ); + } else { + self.addClass( className ); + } + } + + // Toggle whole class name + } else if ( value === undefined || type === "boolean" ) { + className = getClass( this ); + if ( className ) { + + // Store className if set + dataPriv.set( this, "__className__", className ); + } + + // If the element has a class name or if we're passed `false`, + // then remove the whole classname (if there was one, the above saved it). + // Otherwise bring back whatever was previously saved (if anything), + // falling back to the empty string if nothing was stored. + if ( this.setAttribute ) { + this.setAttribute( "class", + className || value === false ? + "" : + dataPriv.get( this, "__className__" ) || "" + ); + } + } + } ); + }, + + hasClass: function( selector ) { + var className, elem, + i = 0; + + className = " " + selector + " "; + while ( ( elem = this[ i++ ] ) ) { + if ( elem.nodeType === 1 && + ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { + return true; + } + } + + return false; + } +} ); + + + + +var rreturn = /\r/g; + +jQuery.fn.extend( { + val: function( value ) { + var hooks, ret, isFunction, + elem = this[ 0 ]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.type ] || + jQuery.valHooks[ elem.nodeName.toLowerCase() ]; + + if ( hooks && + "get" in hooks && + ( ret = hooks.get( elem, "value" ) ) !== undefined + ) { + return ret; + } + + ret = elem.value; + + // Handle most common string cases + if ( typeof ret === "string" ) { + return ret.replace( rreturn, "" ); + } + + // Handle cases where value is null/undef or number + return ret == null ? "" : ret; + } + + return; + } + + isFunction = jQuery.isFunction( value ); + + return this.each( function( i ) { + var val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( isFunction ) { + val = value.call( this, i, jQuery( this ).val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + + } else if ( typeof val === "number" ) { + val += ""; + + } else if ( Array.isArray( val ) ) { + val = jQuery.map( val, function( value ) { + return value == null ? "" : value + ""; + } ); + } + + hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + } ); + } +} ); + +jQuery.extend( { + valHooks: { + option: { + get: function( elem ) { + + var val = jQuery.find.attr( elem, "value" ); + return val != null ? + val : + + // Support: IE <=10 - 11 only + // option.text throws exceptions (#14686, #14858) + // Strip and collapse whitespace + // https://html.spec.whatwg.org/#strip-and-collapse-whitespace + stripAndCollapse( jQuery.text( elem ) ); + } + }, + select: { + get: function( elem ) { + var value, option, i, + options = elem.options, + index = elem.selectedIndex, + one = elem.type === "select-one", + values = one ? null : [], + max = one ? index + 1 : options.length; + + if ( index < 0 ) { + i = max; + + } else { + i = one ? index : 0; + } + + // Loop through all the selected options + for ( ; i < max; i++ ) { + option = options[ i ]; + + // Support: IE <=9 only + // IE8-9 doesn't update selected after form reset (#2551) + if ( ( option.selected || i === index ) && + + // Don't return options that are disabled or in a disabled optgroup + !option.disabled && + ( !option.parentNode.disabled || + !nodeName( option.parentNode, "optgroup" ) ) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + }, + + set: function( elem, value ) { + var optionSet, option, + options = elem.options, + values = jQuery.makeArray( value ), + i = options.length; + + while ( i-- ) { + option = options[ i ]; + + /* eslint-disable no-cond-assign */ + + if ( option.selected = + jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 + ) { + optionSet = true; + } + + /* eslint-enable no-cond-assign */ + } + + // Force browsers to behave consistently when non-matching value is set + if ( !optionSet ) { + elem.selectedIndex = -1; + } + return values; + } + } + } +} ); + +// Radios and checkboxes getter/setter +jQuery.each( [ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + set: function( elem, value ) { + if ( Array.isArray( value ) ) { + return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); + } + } + }; + if ( !support.checkOn ) { + jQuery.valHooks[ this ].get = function( elem ) { + return elem.getAttribute( "value" ) === null ? "on" : elem.value; + }; + } +} ); + + + + +// Return jQuery for attributes-only inclusion + + +var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/; + +jQuery.extend( jQuery.event, { + + trigger: function( event, data, elem, onlyHandlers ) { + + var i, cur, tmp, bubbleType, ontype, handle, special, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; + + cur = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "." ) > -1 ) { + + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split( "." ); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf( ":" ) < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join( "." ); + event.rnamespace = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === ( elem.ownerDocument || document ) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { + + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] && + dataPriv.get( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( ( !special._default || + special._default.apply( eventPath.pop(), data ) === false ) && + acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name as the event. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + elem[ type ](); + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + // Piggyback on a donor event to simulate a different one + // Used only for `focus(in | out)` events + simulate: function( type, elem, event ) { + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true + } + ); + + jQuery.event.trigger( e, null, elem ); + } + +} ); + +jQuery.fn.extend( { + + trigger: function( type, data ) { + return this.each( function() { + jQuery.event.trigger( type, data, this ); + } ); + }, + triggerHandler: function( type, data ) { + var elem = this[ 0 ]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +} ); + + +jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " + + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + + "change select submit keydown keypress keyup contextmenu" ).split( " " ), + function( i, name ) { + + // Handle event binding + jQuery.fn[ name ] = function( data, fn ) { + return arguments.length > 0 ? + this.on( name, null, data, fn ) : + this.trigger( name ); + }; +} ); + +jQuery.fn.extend( { + hover: function( fnOver, fnOut ) { + return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); + } +} ); + + + + +support.focusin = "onfocusin" in window; + + +// Support: Firefox <=44 +// Firefox doesn't have focus(in | out) events +// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 +// +// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 +// focus(in | out) events fire after focus & blur events, +// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order +// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 +if ( !support.focusin ) { + jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler on the document while someone wants focusin/focusout + var handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + var doc = this.ownerDocument || this, + attaches = dataPriv.access( doc, fix ); + + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); + } + dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this, + attaches = dataPriv.access( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + dataPriv.remove( doc, fix ); + + } else { + dataPriv.access( doc, fix, attaches ); + } + } + }; + } ); +} +var location = window.location; + +var nonce = jQuery.now(); + +var rquery = ( /\?/ ); + + + +// Cross-browser xml parsing +jQuery.parseXML = function( data ) { + var xml; + if ( !data || typeof data !== "string" ) { + return null; + } + + // Support: IE 9 - 11 only + // IE throws on parseFromString with invalid input. + try { + xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); + } catch ( e ) { + xml = undefined; + } + + if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { + jQuery.error( "Invalid XML: " + data ); + } + return xml; +}; + + +var + rbracket = /\[\]$/, + rCRLF = /\r?\n/g, + rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, + rsubmittable = /^(?:input|select|textarea|keygen)/i; + +function buildParams( prefix, obj, traditional, add ) { + var name; + + if ( Array.isArray( obj ) ) { + + // Serialize array item. + jQuery.each( obj, function( i, v ) { + if ( traditional || rbracket.test( prefix ) ) { + + // Treat each array item as a scalar. + add( prefix, v ); + + } else { + + // Item is non-scalar (array or object), encode its numeric index. + buildParams( + prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", + v, + traditional, + add + ); + } + } ); + + } else if ( !traditional && jQuery.type( obj ) === "object" ) { + + // Serialize object item. + for ( name in obj ) { + buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); + } + + } else { + + // Serialize scalar item. + add( prefix, obj ); + } +} + +// Serialize an array of form elements or a set of +// key/values into a query string +jQuery.param = function( a, traditional ) { + var prefix, + s = [], + add = function( key, valueOrFunction ) { + + // If value is a function, invoke it and use its return value + var value = jQuery.isFunction( valueOrFunction ) ? + valueOrFunction() : + valueOrFunction; + + s[ s.length ] = encodeURIComponent( key ) + "=" + + encodeURIComponent( value == null ? "" : value ); + }; + + // If an array was passed in, assume that it is an array of form elements. + if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { + + // Serialize the form elements + jQuery.each( a, function() { + add( this.name, this.value ); + } ); + + } else { + + // If traditional, encode the "old" way (the way 1.3.2 or older + // did it), otherwise encode params recursively. + for ( prefix in a ) { + buildParams( prefix, a[ prefix ], traditional, add ); + } + } + + // Return the resulting serialization + return s.join( "&" ); +}; + +jQuery.fn.extend( { + serialize: function() { + return jQuery.param( this.serializeArray() ); + }, + serializeArray: function() { + return this.map( function() { + + // Can add propHook for "elements" to filter or add form elements + var elements = jQuery.prop( this, "elements" ); + return elements ? jQuery.makeArray( elements ) : this; + } ) + .filter( function() { + var type = this.type; + + // Use .is( ":disabled" ) so that fieldset[disabled] works + return this.name && !jQuery( this ).is( ":disabled" ) && + rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && + ( this.checked || !rcheckableType.test( type ) ); + } ) + .map( function( i, elem ) { + var val = jQuery( this ).val(); + + if ( val == null ) { + return null; + } + + if ( Array.isArray( val ) ) { + return jQuery.map( val, function( val ) { + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ); + } + + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ).get(); + } +} ); + + +var + r20 = /%20/g, + rhash = /#.*$/, + rantiCache = /([?&])_=[^&]*/, + rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, + + // #7653, #8125, #8152: local protocol detection + rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, + rnoContent = /^(?:GET|HEAD)$/, + rprotocol = /^\/\//, + + /* Prefilters + * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) + * 2) These are called: + * - BEFORE asking for a transport + * - AFTER param serialization (s.data is a string if s.processData is true) + * 3) key is the dataType + * 4) the catchall symbol "*" can be used + * 5) execution will start with transport dataType and THEN continue down to "*" if needed + */ + prefilters = {}, + + /* Transports bindings + * 1) key is the dataType + * 2) the catchall symbol "*" can be used + * 3) selection will start with transport dataType and THEN go to "*" if needed + */ + transports = {}, + + // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression + allTypes = "*/".concat( "*" ), + + // Anchor tag for parsing the document origin + originAnchor = document.createElement( "a" ); + originAnchor.href = location.href; + +// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport +function addToPrefiltersOrTransports( structure ) { + + // dataTypeExpression is optional and defaults to "*" + return function( dataTypeExpression, func ) { + + if ( typeof dataTypeExpression !== "string" ) { + func = dataTypeExpression; + dataTypeExpression = "*"; + } + + var dataType, + i = 0, + dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; + + if ( jQuery.isFunction( func ) ) { + + // For each dataType in the dataTypeExpression + while ( ( dataType = dataTypes[ i++ ] ) ) { + + // Prepend if requested + if ( dataType[ 0 ] === "+" ) { + dataType = dataType.slice( 1 ) || "*"; + ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); + + // Otherwise append + } else { + ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); + } + } + } + }; +} + +// Base inspection function for prefilters and transports +function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { + + var inspected = {}, + seekingTransport = ( structure === transports ); + + function inspect( dataType ) { + var selected; + inspected[ dataType ] = true; + jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { + var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); + if ( typeof dataTypeOrTransport === "string" && + !seekingTransport && !inspected[ dataTypeOrTransport ] ) { + + options.dataTypes.unshift( dataTypeOrTransport ); + inspect( dataTypeOrTransport ); + return false; + } else if ( seekingTransport ) { + return !( selected = dataTypeOrTransport ); + } + } ); + return selected; + } + + return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); +} + +// A special extend for ajax options +// that takes "flat" options (not to be deep extended) +// Fixes #9887 +function ajaxExtend( target, src ) { + var key, deep, + flatOptions = jQuery.ajaxSettings.flatOptions || {}; + + for ( key in src ) { + if ( src[ key ] !== undefined ) { + ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; + } + } + if ( deep ) { + jQuery.extend( true, target, deep ); + } + + return target; +} + +/* Handles responses to an ajax request: + * - finds the right dataType (mediates between content-type and expected dataType) + * - returns the corresponding response + */ +function ajaxHandleResponses( s, jqXHR, responses ) { + + var ct, type, finalDataType, firstDataType, + contents = s.contents, + dataTypes = s.dataTypes; + + // Remove auto dataType and get content-type in the process + while ( dataTypes[ 0 ] === "*" ) { + dataTypes.shift(); + if ( ct === undefined ) { + ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); + } + } + + // Check if we're dealing with a known content-type + if ( ct ) { + for ( type in contents ) { + if ( contents[ type ] && contents[ type ].test( ct ) ) { + dataTypes.unshift( type ); + break; + } + } + } + + // Check to see if we have a response for the expected dataType + if ( dataTypes[ 0 ] in responses ) { + finalDataType = dataTypes[ 0 ]; + } else { + + // Try convertible dataTypes + for ( type in responses ) { + if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { + finalDataType = type; + break; + } + if ( !firstDataType ) { + firstDataType = type; + } + } + + // Or just use first one + finalDataType = finalDataType || firstDataType; + } + + // If we found a dataType + // We add the dataType to the list if needed + // and return the corresponding response + if ( finalDataType ) { + if ( finalDataType !== dataTypes[ 0 ] ) { + dataTypes.unshift( finalDataType ); + } + return responses[ finalDataType ]; + } +} + +/* Chain conversions given the request and the original response + * Also sets the responseXXX fields on the jqXHR instance + */ +function ajaxConvert( s, response, jqXHR, isSuccess ) { + var conv2, current, conv, tmp, prev, + converters = {}, + + // Work with a copy of dataTypes in case we need to modify it for conversion + dataTypes = s.dataTypes.slice(); + + // Create converters map with lowercased keys + if ( dataTypes[ 1 ] ) { + for ( conv in s.converters ) { + converters[ conv.toLowerCase() ] = s.converters[ conv ]; + } + } + + current = dataTypes.shift(); + + // Convert to each sequential dataType + while ( current ) { + + if ( s.responseFields[ current ] ) { + jqXHR[ s.responseFields[ current ] ] = response; + } + + // Apply the dataFilter if provided + if ( !prev && isSuccess && s.dataFilter ) { + response = s.dataFilter( response, s.dataType ); + } + + prev = current; + current = dataTypes.shift(); + + if ( current ) { + + // There's only work to do if current dataType is non-auto + if ( current === "*" ) { + + current = prev; + + // Convert response if prev dataType is non-auto and differs from current + } else if ( prev !== "*" && prev !== current ) { + + // Seek a direct converter + conv = converters[ prev + " " + current ] || converters[ "* " + current ]; + + // If none found, seek a pair + if ( !conv ) { + for ( conv2 in converters ) { + + // If conv2 outputs current + tmp = conv2.split( " " ); + if ( tmp[ 1 ] === current ) { + + // If prev can be converted to accepted input + conv = converters[ prev + " " + tmp[ 0 ] ] || + converters[ "* " + tmp[ 0 ] ]; + if ( conv ) { + + // Condense equivalence converters + if ( conv === true ) { + conv = converters[ conv2 ]; + + // Otherwise, insert the intermediate dataType + } else if ( converters[ conv2 ] !== true ) { + current = tmp[ 0 ]; + dataTypes.unshift( tmp[ 1 ] ); + } + break; + } + } + } + } + + // Apply converter (if not an equivalence) + if ( conv !== true ) { + + // Unless errors are allowed to bubble, catch and return them + if ( conv && s.throws ) { + response = conv( response ); + } else { + try { + response = conv( response ); + } catch ( e ) { + return { + state: "parsererror", + error: conv ? e : "No conversion from " + prev + " to " + current + }; + } + } + } + } + } + } + + return { state: "success", data: response }; +} + +jQuery.extend( { + + // Counter for holding the number of active queries + active: 0, + + // Last-Modified header cache for next request + lastModified: {}, + etag: {}, + + ajaxSettings: { + url: location.href, + type: "GET", + isLocal: rlocalProtocol.test( location.protocol ), + global: true, + processData: true, + async: true, + contentType: "application/x-www-form-urlencoded; charset=UTF-8", + + /* + timeout: 0, + data: null, + dataType: null, + username: null, + password: null, + cache: null, + throws: false, + traditional: false, + headers: {}, + */ + + accepts: { + "*": allTypes, + text: "text/plain", + html: "text/html", + xml: "application/xml, text/xml", + json: "application/json, text/javascript" + }, + + contents: { + xml: /\bxml\b/, + html: /\bhtml/, + json: /\bjson\b/ + }, + + responseFields: { + xml: "responseXML", + text: "responseText", + json: "responseJSON" + }, + + // Data converters + // Keys separate source (or catchall "*") and destination types with a single space + converters: { + + // Convert anything to text + "* text": String, + + // Text to html (true = no transformation) + "text html": true, + + // Evaluate text as a json expression + "text json": JSON.parse, + + // Parse text as xml + "text xml": jQuery.parseXML + }, + + // For options that shouldn't be deep extended: + // you can add your own custom options here if + // and when you create one that shouldn't be + // deep extended (see ajaxExtend) + flatOptions: { + url: true, + context: true + } + }, + + // Creates a full fledged settings object into target + // with both ajaxSettings and settings fields. + // If target is omitted, writes into ajaxSettings. + ajaxSetup: function( target, settings ) { + return settings ? + + // Building a settings object + ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : + + // Extending ajaxSettings + ajaxExtend( jQuery.ajaxSettings, target ); + }, + + ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), + ajaxTransport: addToPrefiltersOrTransports( transports ), + + // Main method + ajax: function( url, options ) { + + // If url is an object, simulate pre-1.5 signature + if ( typeof url === "object" ) { + options = url; + url = undefined; + } + + // Force options to be an object + options = options || {}; + + var transport, + + // URL without anti-cache param + cacheURL, + + // Response headers + responseHeadersString, + responseHeaders, + + // timeout handle + timeoutTimer, + + // Url cleanup var + urlAnchor, + + // Request state (becomes false upon send and true upon completion) + completed, + + // To know if global events are to be dispatched + fireGlobals, + + // Loop variable + i, + + // uncached part of the url + uncached, + + // Create the final options object + s = jQuery.ajaxSetup( {}, options ), + + // Callbacks context + callbackContext = s.context || s, + + // Context for global events is callbackContext if it is a DOM node or jQuery collection + globalEventContext = s.context && + ( callbackContext.nodeType || callbackContext.jquery ) ? + jQuery( callbackContext ) : + jQuery.event, + + // Deferreds + deferred = jQuery.Deferred(), + completeDeferred = jQuery.Callbacks( "once memory" ), + + // Status-dependent callbacks + statusCode = s.statusCode || {}, + + // Headers (they are sent all at once) + requestHeaders = {}, + requestHeadersNames = {}, + + // Default abort message + strAbort = "canceled", + + // Fake xhr + jqXHR = { + readyState: 0, + + // Builds headers hashtable if needed + getResponseHeader: function( key ) { + var match; + if ( completed ) { + if ( !responseHeaders ) { + responseHeaders = {}; + while ( ( match = rheaders.exec( responseHeadersString ) ) ) { + responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ]; + } + } + match = responseHeaders[ key.toLowerCase() ]; + } + return match == null ? null : match; + }, + + // Raw string + getAllResponseHeaders: function() { + return completed ? responseHeadersString : null; + }, + + // Caches the header + setRequestHeader: function( name, value ) { + if ( completed == null ) { + name = requestHeadersNames[ name.toLowerCase() ] = + requestHeadersNames[ name.toLowerCase() ] || name; + requestHeaders[ name ] = value; + } + return this; + }, + + // Overrides response content-type header + overrideMimeType: function( type ) { + if ( completed == null ) { + s.mimeType = type; + } + return this; + }, + + // Status-dependent callbacks + statusCode: function( map ) { + var code; + if ( map ) { + if ( completed ) { + + // Execute the appropriate callbacks + jqXHR.always( map[ jqXHR.status ] ); + } else { + + // Lazy-add the new callbacks in a way that preserves old ones + for ( code in map ) { + statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; + } + } + } + return this; + }, + + // Cancel the request + abort: function( statusText ) { + var finalText = statusText || strAbort; + if ( transport ) { + transport.abort( finalText ); + } + done( 0, finalText ); + return this; + } + }; + + // Attach deferreds + deferred.promise( jqXHR ); + + // Add protocol if not provided (prefilters might expect it) + // Handle falsy url in the settings object (#10093: consistency with old signature) + // We also use the url parameter if available + s.url = ( ( url || s.url || location.href ) + "" ) + .replace( rprotocol, location.protocol + "//" ); + + // Alias method option to type as per ticket #12004 + s.type = options.method || options.type || s.method || s.type; + + // Extract dataTypes list + s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; + + // A cross-domain request is in order when the origin doesn't match the current origin. + if ( s.crossDomain == null ) { + urlAnchor = document.createElement( "a" ); + + // Support: IE <=8 - 11, Edge 12 - 13 + // IE throws exception on accessing the href property if url is malformed, + // e.g. http://example.com:80x/ + try { + urlAnchor.href = s.url; + + // Support: IE <=8 - 11 only + // Anchor's host property isn't correctly set when s.url is relative + urlAnchor.href = urlAnchor.href; + s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== + urlAnchor.protocol + "//" + urlAnchor.host; + } catch ( e ) { + + // If there is an error parsing the URL, assume it is crossDomain, + // it can be rejected by the transport if it is invalid + s.crossDomain = true; + } + } + + // Convert data if not already a string + if ( s.data && s.processData && typeof s.data !== "string" ) { + s.data = jQuery.param( s.data, s.traditional ); + } + + // Apply prefilters + inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); + + // If request was aborted inside a prefilter, stop there + if ( completed ) { + return jqXHR; + } + + // We can fire global events as of now if asked to + // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) + fireGlobals = jQuery.event && s.global; + + // Watch for a new set of requests + if ( fireGlobals && jQuery.active++ === 0 ) { + jQuery.event.trigger( "ajaxStart" ); + } + + // Uppercase the type + s.type = s.type.toUpperCase(); + + // Determine if request has content + s.hasContent = !rnoContent.test( s.type ); + + // Save the URL in case we're toying with the If-Modified-Since + // and/or If-None-Match header later on + // Remove hash to simplify url manipulation + cacheURL = s.url.replace( rhash, "" ); + + // More options handling for requests with no content + if ( !s.hasContent ) { + + // Remember the hash so we can put it back + uncached = s.url.slice( cacheURL.length ); + + // If data is available, append data to url + if ( s.data ) { + cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; + + // #9682: remove data so that it's not used in an eventual retry + delete s.data; + } + + // Add or update anti-cache param if needed + if ( s.cache === false ) { + cacheURL = cacheURL.replace( rantiCache, "$1" ); + uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached; + } + + // Put hash and anti-cache on the URL that will be requested (gh-1732) + s.url = cacheURL + uncached; + + // Change '%20' to '+' if this is encoded form body content (gh-2658) + } else if ( s.data && s.processData && + ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { + s.data = s.data.replace( r20, "+" ); + } + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + if ( jQuery.lastModified[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); + } + if ( jQuery.etag[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); + } + } + + // Set the correct header, if data is being sent + if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { + jqXHR.setRequestHeader( "Content-Type", s.contentType ); + } + + // Set the Accepts header for the server, depending on the dataType + jqXHR.setRequestHeader( + "Accept", + s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? + s.accepts[ s.dataTypes[ 0 ] ] + + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : + s.accepts[ "*" ] + ); + + // Check for headers option + for ( i in s.headers ) { + jqXHR.setRequestHeader( i, s.headers[ i ] ); + } + + // Allow custom headers/mimetypes and early abort + if ( s.beforeSend && + ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { + + // Abort if not done already and return + return jqXHR.abort(); + } + + // Aborting is no longer a cancellation + strAbort = "abort"; + + // Install callbacks on deferreds + completeDeferred.add( s.complete ); + jqXHR.done( s.success ); + jqXHR.fail( s.error ); + + // Get transport + transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); + + // If no transport, we auto-abort + if ( !transport ) { + done( -1, "No Transport" ); + } else { + jqXHR.readyState = 1; + + // Send global event + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); + } + + // If request was aborted inside ajaxSend, stop there + if ( completed ) { + return jqXHR; + } + + // Timeout + if ( s.async && s.timeout > 0 ) { + timeoutTimer = window.setTimeout( function() { + jqXHR.abort( "timeout" ); + }, s.timeout ); + } + + try { + completed = false; + transport.send( requestHeaders, done ); + } catch ( e ) { + + // Rethrow post-completion exceptions + if ( completed ) { + throw e; + } + + // Propagate others as results + done( -1, e ); + } + } + + // Callback for when everything is done + function done( status, nativeStatusText, responses, headers ) { + var isSuccess, success, error, response, modified, + statusText = nativeStatusText; + + // Ignore repeat invocations + if ( completed ) { + return; + } + + completed = true; + + // Clear timeout if it exists + if ( timeoutTimer ) { + window.clearTimeout( timeoutTimer ); + } + + // Dereference transport for early garbage collection + // (no matter how long the jqXHR object will be used) + transport = undefined; + + // Cache response headers + responseHeadersString = headers || ""; + + // Set readyState + jqXHR.readyState = status > 0 ? 4 : 0; + + // Determine if successful + isSuccess = status >= 200 && status < 300 || status === 304; + + // Get response data + if ( responses ) { + response = ajaxHandleResponses( s, jqXHR, responses ); + } + + // Convert no matter what (that way responseXXX fields are always set) + response = ajaxConvert( s, response, jqXHR, isSuccess ); + + // If successful, handle type chaining + if ( isSuccess ) { + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + modified = jqXHR.getResponseHeader( "Last-Modified" ); + if ( modified ) { + jQuery.lastModified[ cacheURL ] = modified; + } + modified = jqXHR.getResponseHeader( "etag" ); + if ( modified ) { + jQuery.etag[ cacheURL ] = modified; + } + } + + // if no content + if ( status === 204 || s.type === "HEAD" ) { + statusText = "nocontent"; + + // if not modified + } else if ( status === 304 ) { + statusText = "notmodified"; + + // If we have data, let's convert it + } else { + statusText = response.state; + success = response.data; + error = response.error; + isSuccess = !error; + } + } else { + + // Extract error from statusText and normalize for non-aborts + error = statusText; + if ( status || !statusText ) { + statusText = "error"; + if ( status < 0 ) { + status = 0; + } + } + } + + // Set data for the fake xhr object + jqXHR.status = status; + jqXHR.statusText = ( nativeStatusText || statusText ) + ""; + + // Success/Error + if ( isSuccess ) { + deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); + } else { + deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); + } + + // Status-dependent callbacks + jqXHR.statusCode( statusCode ); + statusCode = undefined; + + if ( fireGlobals ) { + globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", + [ jqXHR, s, isSuccess ? success : error ] ); + } + + // Complete + completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); + + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); + + // Handle the global AJAX counter + if ( !( --jQuery.active ) ) { + jQuery.event.trigger( "ajaxStop" ); + } + } + } + + return jqXHR; + }, + + getJSON: function( url, data, callback ) { + return jQuery.get( url, data, callback, "json" ); + }, + + getScript: function( url, callback ) { + return jQuery.get( url, undefined, callback, "script" ); + } +} ); + +jQuery.each( [ "get", "post" ], function( i, method ) { + jQuery[ method ] = function( url, data, callback, type ) { + + // Shift arguments if data argument was omitted + if ( jQuery.isFunction( data ) ) { + type = type || callback; + callback = data; + data = undefined; + } + + // The url can be an options object (which then must have .url) + return jQuery.ajax( jQuery.extend( { + url: url, + type: method, + dataType: type, + data: data, + success: callback + }, jQuery.isPlainObject( url ) && url ) ); + }; +} ); + + +jQuery._evalUrl = function( url ) { + return jQuery.ajax( { + url: url, + + // Make this explicit, since user can override this through ajaxSetup (#11264) + type: "GET", + dataType: "script", + cache: true, + async: false, + global: false, + "throws": true + } ); +}; + + +jQuery.fn.extend( { + wrapAll: function( html ) { + var wrap; + + if ( this[ 0 ] ) { + if ( jQuery.isFunction( html ) ) { + html = html.call( this[ 0 ] ); + } + + // The elements to wrap the target around + wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); + + if ( this[ 0 ].parentNode ) { + wrap.insertBefore( this[ 0 ] ); + } + + wrap.map( function() { + var elem = this; + + while ( elem.firstElementChild ) { + elem = elem.firstElementChild; + } + + return elem; + } ).append( this ); + } + + return this; + }, + + wrapInner: function( html ) { + if ( jQuery.isFunction( html ) ) { + return this.each( function( i ) { + jQuery( this ).wrapInner( html.call( this, i ) ); + } ); + } + + return this.each( function() { + var self = jQuery( this ), + contents = self.contents(); + + if ( contents.length ) { + contents.wrapAll( html ); + + } else { + self.append( html ); + } + } ); + }, + + wrap: function( html ) { + var isFunction = jQuery.isFunction( html ); + + return this.each( function( i ) { + jQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html ); + } ); + }, + + unwrap: function( selector ) { + this.parent( selector ).not( "body" ).each( function() { + jQuery( this ).replaceWith( this.childNodes ); + } ); + return this; + } +} ); + + +jQuery.expr.pseudos.hidden = function( elem ) { + return !jQuery.expr.pseudos.visible( elem ); +}; +jQuery.expr.pseudos.visible = function( elem ) { + return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); +}; + + + + +jQuery.ajaxSettings.xhr = function() { + try { + return new window.XMLHttpRequest(); + } catch ( e ) {} +}; + +var xhrSuccessStatus = { + + // File protocol always yields status code 0, assume 200 + 0: 200, + + // Support: IE <=9 only + // #1450: sometimes IE returns 1223 when it should be 204 + 1223: 204 + }, + xhrSupported = jQuery.ajaxSettings.xhr(); + +support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); +support.ajax = xhrSupported = !!xhrSupported; + +jQuery.ajaxTransport( function( options ) { + var callback, errorCallback; + + // Cross domain only allowed if supported through XMLHttpRequest + if ( support.cors || xhrSupported && !options.crossDomain ) { + return { + send: function( headers, complete ) { + var i, + xhr = options.xhr(); + + xhr.open( + options.type, + options.url, + options.async, + options.username, + options.password + ); + + // Apply custom fields if provided + if ( options.xhrFields ) { + for ( i in options.xhrFields ) { + xhr[ i ] = options.xhrFields[ i ]; + } + } + + // Override mime type if needed + if ( options.mimeType && xhr.overrideMimeType ) { + xhr.overrideMimeType( options.mimeType ); + } + + // X-Requested-With header + // For cross-domain requests, seeing as conditions for a preflight are + // akin to a jigsaw puzzle, we simply never set it to be sure. + // (it can always be set on a per-request basis or even using ajaxSetup) + // For same-domain requests, won't change header if already provided. + if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { + headers[ "X-Requested-With" ] = "XMLHttpRequest"; + } + + // Set headers + for ( i in headers ) { + xhr.setRequestHeader( i, headers[ i ] ); + } + + // Callback + callback = function( type ) { + return function() { + if ( callback ) { + callback = errorCallback = xhr.onload = + xhr.onerror = xhr.onabort = xhr.onreadystatechange = null; + + if ( type === "abort" ) { + xhr.abort(); + } else if ( type === "error" ) { + + // Support: IE <=9 only + // On a manual native abort, IE9 throws + // errors on any property access that is not readyState + if ( typeof xhr.status !== "number" ) { + complete( 0, "error" ); + } else { + complete( + + // File: protocol always yields status 0; see #8605, #14207 + xhr.status, + xhr.statusText + ); + } + } else { + complete( + xhrSuccessStatus[ xhr.status ] || xhr.status, + xhr.statusText, + + // Support: IE <=9 only + // IE9 has no XHR2 but throws on binary (trac-11426) + // For XHR2 non-text, let the caller handle it (gh-2498) + ( xhr.responseType || "text" ) !== "text" || + typeof xhr.responseText !== "string" ? + { binary: xhr.response } : + { text: xhr.responseText }, + xhr.getAllResponseHeaders() + ); + } + } + }; + }; + + // Listen to events + xhr.onload = callback(); + errorCallback = xhr.onerror = callback( "error" ); + + // Support: IE 9 only + // Use onreadystatechange to replace onabort + // to handle uncaught aborts + if ( xhr.onabort !== undefined ) { + xhr.onabort = errorCallback; + } else { + xhr.onreadystatechange = function() { + + // Check readyState before timeout as it changes + if ( xhr.readyState === 4 ) { + + // Allow onerror to be called first, + // but that will not handle a native abort + // Also, save errorCallback to a variable + // as xhr.onerror cannot be accessed + window.setTimeout( function() { + if ( callback ) { + errorCallback(); + } + } ); + } + }; + } + + // Create the abort callback + callback = callback( "abort" ); + + try { + + // Do send the request (this may raise an exception) + xhr.send( options.hasContent && options.data || null ); + } catch ( e ) { + + // #14683: Only rethrow if this hasn't been notified as an error yet + if ( callback ) { + throw e; + } + } + }, + + abort: function() { + if ( callback ) { + callback(); + } + } + }; + } +} ); + + + + +// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) +jQuery.ajaxPrefilter( function( s ) { + if ( s.crossDomain ) { + s.contents.script = false; + } +} ); + +// Install script dataType +jQuery.ajaxSetup( { + accepts: { + script: "text/javascript, application/javascript, " + + "application/ecmascript, application/x-ecmascript" + }, + contents: { + script: /\b(?:java|ecma)script\b/ + }, + converters: { + "text script": function( text ) { + jQuery.globalEval( text ); + return text; + } + } +} ); + +// Handle cache's special case and crossDomain +jQuery.ajaxPrefilter( "script", function( s ) { + if ( s.cache === undefined ) { + s.cache = false; + } + if ( s.crossDomain ) { + s.type = "GET"; + } +} ); + +// Bind script tag hack transport +jQuery.ajaxTransport( "script", function( s ) { + + // This transport only deals with cross domain requests + if ( s.crossDomain ) { + var script, callback; + return { + send: function( _, complete ) { + script = jQuery( " + + + + + + + diff --git a/generator-web/target/classes/templates/html/common/footer.html b/generator-web/target/classes/templates/html/common/footer.html new file mode 100644 index 0000000..e243af7 --- /dev/null +++ b/generator-web/target/classes/templates/html/common/footer.html @@ -0,0 +1,22 @@ + + + + + Title + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/generator-web/target/classes/templates/html/common/header.html b/generator-web/target/classes/templates/html/common/header.html new file mode 100644 index 0000000..58b9deb --- /dev/null +++ b/generator-web/target/classes/templates/html/common/header.html @@ -0,0 +1,15 @@ + + + + + Title + + + + + + + + + + \ No newline at end of file diff --git a/generator-web/target/classes/templates/html/index.html b/generator-web/target/classes/templates/html/index.html new file mode 100644 index 0000000..5ddcec6 --- /dev/null +++ b/generator-web/target/classes/templates/html/index.html @@ -0,0 +1,208 @@ + + + + + 代码生成器 + + +
      + + +
      +
      +
      +
      +
      +
      +
      +
      +
      + 代码生成器: +
      + +
      +
      +
      +
      + + +
      +
      + +
      +
      + +
      + +
      +
      +
      + + + 使用前给当前用户或者IP授权访问 使用完成可取消授权 +
      +
      + +
      +
      + + + 密码不会记录,请放心使用 +
      +
      + +
      + +
      +
      + +
      +
      + +
      +
      +
      + 无法连接到数据库,请检查配置 + +
      +
      +
      + +
      +
      +
      + + +
      +
      +
      +
      + + +
      +
      +
      +
      +
      + +
      + +
      +
      + + +
      +
      +
      +
      + + +
      +
      +
      +
      + + + java包名 +
      +
      +
      + +
      +
      +
      + + +
      +
      + +
      +
      + + +
      +
      +
      + +
      + +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      + + +
      + + + + + diff --git a/generator-web/target/classes/templates/html/layout.html b/generator-web/target/classes/templates/html/layout.html new file mode 100644 index 0000000..6ff06ee --- /dev/null +++ b/generator-web/target/classes/templates/html/layout.html @@ -0,0 +1,27 @@ + + + + + + layout + + + + + + + + +
      header
      +
      footer
      +
      + + + + \ No newline at end of file diff --git a/generator-web/target/classes/template/java/api/pagination.vm b/generator-web/target/classes/templates/java/api/pagination.vm similarity index 100% rename from generator-web/target/classes/template/java/api/pagination.vm rename to generator-web/target/classes/templates/java/api/pagination.vm diff --git a/generator-web/target/classes/template/java/api/pom.vm b/generator-web/target/classes/templates/java/api/pom.vm similarity index 100% rename from generator-web/target/classes/template/java/api/pom.vm rename to generator-web/target/classes/templates/java/api/pom.vm diff --git a/generator-web/target/classes/template/java/app/pom.vm b/generator-web/target/classes/templates/java/app/pom.vm similarity index 100% rename from generator-web/target/classes/template/java/app/pom.vm rename to generator-web/target/classes/templates/java/app/pom.vm diff --git a/generator-web/target/classes/template/java/app/readme.vm b/generator-web/target/classes/templates/java/app/readme.vm similarity index 100% rename from generator-web/target/classes/template/java/app/readme.vm rename to generator-web/target/classes/templates/java/app/readme.vm diff --git a/generator-web/target/classes/template/java/common/pom.vm b/generator-web/target/classes/templates/java/common/pom.vm similarity index 100% rename from generator-web/target/classes/template/java/common/pom.vm rename to generator-web/target/classes/templates/java/common/pom.vm diff --git a/generator-web/target/classes/template/java/domain/condition.vm b/generator-web/target/classes/templates/java/domain/condition.vm similarity index 100% rename from generator-web/target/classes/template/java/domain/condition.vm rename to generator-web/target/classes/templates/java/domain/condition.vm diff --git a/generator-web/target/classes/template/java/domain/entity.vm b/generator-web/target/classes/templates/java/domain/entity.vm similarity index 100% rename from generator-web/target/classes/template/java/domain/entity.vm rename to generator-web/target/classes/templates/java/domain/entity.vm diff --git a/generator-web/target/classes/template/java/domain/pom.vm b/generator-web/target/classes/templates/java/domain/pom.vm similarity index 100% rename from generator-web/target/classes/template/java/domain/pom.vm rename to generator-web/target/classes/templates/java/domain/pom.vm diff --git a/generator-web/target/classes/template/java/orm/dao.vm b/generator-web/target/classes/templates/java/orm/dao.vm similarity index 100% rename from generator-web/target/classes/template/java/orm/dao.vm rename to generator-web/target/classes/templates/java/orm/dao.vm diff --git a/generator-web/target/classes/template/java/orm/mapper.vm b/generator-web/target/classes/templates/java/orm/mapper.vm similarity index 100% rename from generator-web/target/classes/template/java/orm/mapper.vm rename to generator-web/target/classes/templates/java/orm/mapper.vm diff --git a/generator-web/target/classes/template/java/orm/pom.vm b/generator-web/target/classes/templates/java/orm/pom.vm similarity index 100% rename from generator-web/target/classes/template/java/orm/pom.vm rename to generator-web/target/classes/templates/java/orm/pom.vm diff --git a/generator-web/target/classes/template/java/provider/pom.vm b/generator-web/target/classes/templates/java/provider/pom.vm similarity index 100% rename from generator-web/target/classes/template/java/provider/pom.vm rename to generator-web/target/classes/templates/java/provider/pom.vm diff --git a/generator-web/target/classes/template/java/rpc/pom.vm b/generator-web/target/classes/templates/java/rpc/pom.vm similarity index 100% rename from generator-web/target/classes/template/java/rpc/pom.vm rename to generator-web/target/classes/templates/java/rpc/pom.vm diff --git a/generator-web/target/classes/template/java/service/pom.vm b/generator-web/target/classes/templates/java/service/pom.vm similarity index 100% rename from generator-web/target/classes/template/java/service/pom.vm rename to generator-web/target/classes/templates/java/service/pom.vm diff --git a/generator-web/target/classes/template/java/service/service.vm b/generator-web/target/classes/templates/java/service/service.vm similarity index 100% rename from generator-web/target/classes/template/java/service/service.vm rename to generator-web/target/classes/templates/java/service/service.vm diff --git a/generator-web/target/classes/template/java/service/serviceImpl.vm b/generator-web/target/classes/templates/java/service/serviceImpl.vm similarity index 100% rename from generator-web/target/classes/template/java/service/serviceImpl.vm rename to generator-web/target/classes/templates/java/service/serviceImpl.vm diff --git a/generator-web/target/classes/template/java/web/application-dev.vm b/generator-web/target/classes/templates/java/web/application-dev.vm similarity index 100% rename from generator-web/target/classes/template/java/web/application-dev.vm rename to generator-web/target/classes/templates/java/web/application-dev.vm diff --git a/generator-web/target/classes/template/java/web/application.vm b/generator-web/target/classes/templates/java/web/application.vm similarity index 100% rename from generator-web/target/classes/template/java/web/application.vm rename to generator-web/target/classes/templates/java/web/application.vm diff --git a/generator-web/target/classes/template/java/web/log-back.vm b/generator-web/target/classes/templates/java/web/log-back.vm similarity index 100% rename from generator-web/target/classes/template/java/web/log-back.vm rename to generator-web/target/classes/templates/java/web/log-back.vm diff --git a/generator-web/target/classes/template/java/web/pom.vm b/generator-web/target/classes/templates/java/web/pom.vm similarity index 100% rename from generator-web/target/classes/template/java/web/pom.vm rename to generator-web/target/classes/templates/java/web/pom.vm diff --git a/generator-web/target/classes/template/java/web/webApplication.vm b/generator-web/target/classes/templates/java/web/webApplication.vm similarity index 100% rename from generator-web/target/classes/template/java/web/webApplication.vm rename to generator-web/target/classes/templates/java/web/webApplication.vm diff --git a/pom.xml b/pom.xml index 11fc32a..3ac2f65 100644 --- a/pom.xml +++ b/pom.xml @@ -93,7 +93,6 @@ org.projectlombok lombok - true -- Gitee From 8ccabdc2fc5ddeed5740eac0b9f2e4e57a16a656 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=98=8E=E6=B3=A2?= Date: Tue, 23 Apr 2019 20:40:06 +0800 Subject: [PATCH 3/4] =?UTF-8?q?web=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + .idea/workspace.xml | 838 +- .../target/maven-archiver/pom.properties | 5 + .../com/my/simon/common/enums/CodeEnum.java | 1 + .../target/maven-archiver/pom.properties | 5 + .../compile/default-compile/createdFiles.lst | 0 .../compile/default-compile/inputFiles.lst | 10 + .../target/maven-archiver/pom.properties | 5 + .../target/maven-archiver/pom.properties | 5 + .../target/maven-archiver/pom.properties | 5 + .../web/controller/GeneratorController.java | 145 +- .../com/my/simon/web/dao/GeneratorDao.java | 10 +- .../my/simon/web/dao/GeneratorDaoImpl.java | 14 +- .../com/my/simon/web/entity/DatabaseInfo.java | 17 + .../my/simon/web/entity/DatabasesWrapper.java | 52 + .../web/generator/JavaConfiguration.java | 5 +- .../my/simon/web/generator/JavaGenerator.java | 39 +- .../web/generator/WebGeneratorFactory.java | 36 + .../java/com/my/simon/web/utils/FileUtil.java | 162 + .../main/java/com/my/simon/web/vo/DBInfo.java | 5 + .../main/resources/templates/html/index.html | 124 +- .../target/classes/templates/html/index.html | 124 +- .../WEB-INF/classes/config.properties | 17 + .../classes/config/application-dev.yml | 35 + .../classes/config/application-prod.yml | 0 .../classes/config/application-test.yml | 0 .../WEB-INF/classes/config/application.yml | 3 + .../WEB-INF/classes/config/log-back.xml | 19 + .../WEB-INF/classes/static/404.html | 25 + .../WEB-INF/classes/static/500.html | 24 + .../WEB-INF/classes/static/alerts.html | 343 + .../WEB-INF/classes/static/blank.html | 316 + .../WEB-INF/classes/static/buttons.html | 355 + .../WEB-INF/classes/static/cards.html | 424 + .../WEB-INF/classes/static/chartjs.html | 314 + .../css/bootstrap-datetimepicker.min.css | 9 + .../WEB-INF/classes/static/css/styles.css | 1 + .../WEB-INF/classes/static/css/toast.css | 32 + .../WEB-INF/classes/static/favicon.ico | Bin 0 -> 1150 bytes .../WEB-INF/classes/static/forms.html | 595 + .../WEB-INF/classes/static/imgs/avatar-1.png | Bin 0 -> 27093 bytes .../WEB-INF/classes/static/imgs/female.jpg | Bin 0 -> 15009 bytes .../WEB-INF/classes/static/imgs/logo-wd.png | Bin 0 -> 40473 bytes .../WEB-INF/classes/static/imgs/logo.png | Bin 0 -> 16494 bytes .../WEB-INF/classes/static/imgs/male.jpg | Bin 0 -> 14124 bytes .../WEB-INF/classes/static/index.html | 365 + .../WEB-INF/classes/static/invoice.html | 365 + .../WEB-INF/classes/static/js/carbon.js | 54 + .../WEB-INF/classes/static/js/demo.js | 190 + .../WEB-INF/classes/static/js/page.js | 48 + .../classes/static/js/templateHelper.js | 37 + .../classes/static/layouts-fixed-header.html | 424 + .../classes/static/layouts-fixed-sidebar.html | 424 + .../static/layouts-hidden-sidebar.html | 424 + .../classes/static/layouts-normal.html | 424 + .../WEB-INF/classes/static/login.html | 62 + .../WEB-INF/classes/static/modals.html | 602 + .../WEB-INF/classes/static/progress-bars.html | 412 + .../WEB-INF/classes/static/register.html | 59 + .../WEB-INF/classes/static/settings.html | 359 + .../WEB-INF/classes/static/tables.html | 512 + .../WEB-INF/classes/static/tabs.html | 394 + .../bootstrap/js/bootstrap-datetimepicker.js | 1967 +++ .../js/bootstrap-datetimepicker.zh-CN.js | 16 + .../bootstrap/js/bootstrap-paginator.js | 659 + .../vendor/bootstrap/js/bootstrap.min.js | 7 + .../classes/static/vendor/chart.js/chart.js | 14145 ++++++++++++++++ .../static/vendor/chart.js/chart.min.js | 10 + .../vendor/font-awesome/css/fa-brands.css | 13 + .../vendor/font-awesome/css/fa-brands.min.css | 5 + .../vendor/font-awesome/css/fa-regular.css | 14 + .../font-awesome/css/fa-regular.min.css | 5 + .../vendor/font-awesome/css/fa-solid.css | 15 + .../vendor/font-awesome/css/fa-solid.min.css | 5 + .../font-awesome/css/fontawesome-all.css | 2603 +++ .../font-awesome/css/fontawesome-all.min.css | 5 + .../vendor/font-awesome/css/fontawesome.css | 2573 +++ .../font-awesome/css/fontawesome.min.css | 5 + .../font-awesome/webfonts/fa-brands-400.eot | Bin 0 -> 97180 bytes .../font-awesome/webfonts/fa-brands-400.svg | 990 ++ .../font-awesome/webfonts/fa-brands-400.ttf | Bin 0 -> 96944 bytes .../font-awesome/webfonts/fa-brands-400.woff | Bin 0 -> 62811 bytes .../font-awesome/webfonts/fa-brands-400.woff2 | Bin 0 -> 53794 bytes .../font-awesome/webfonts/fa-regular-400.eot | Bin 0 -> 31004 bytes .../font-awesome/webfonts/fa-regular-400.svg | 363 + .../font-awesome/webfonts/fa-regular-400.ttf | Bin 0 -> 30776 bytes .../font-awesome/webfonts/fa-regular-400.woff | Bin 0 -> 14556 bytes .../webfonts/fa-regular-400.woff2 | Bin 0 -> 12176 bytes .../font-awesome/webfonts/fa-solid-900.eot | Bin 0 -> 97828 bytes .../font-awesome/webfonts/fa-solid-900.svg | 1413 ++ .../font-awesome/webfonts/fa-solid-900.ttf | Bin 0 -> 97608 bytes .../font-awesome/webfonts/fa-solid-900.woff | Bin 0 -> 46284 bytes .../font-awesome/webfonts/fa-solid-900.woff2 | Bin 0 -> 36854 bytes .../classes/static/vendor/jquery/jquery.js | 10253 +++++++++++ .../static/vendor/jquery/jquery.min.js | 4 + .../static/vendor/popper.js/popper.min.js | 4 + .../css/simple-line-icons.css | 778 + .../fonts/Simple-Line-Icons.eot | Bin 0 -> 54266 bytes .../fonts/Simple-Line-Icons.svg | 200 + .../fonts/Simple-Line-Icons.ttf | Bin 0 -> 54056 bytes .../fonts/Simple-Line-Icons.woff | Bin 0 -> 81331 bytes .../fonts/Simple-Line-Icons.woff2 | Bin 0 -> 30063 bytes .../WEB-INF/classes/static/vendor/template.js | 742 + .../static/vendor/validate/ValidateUtil.js | 198 + .../static/vendor/validate/jquery.validate.js | 1650 ++ .../static/vendor/validate/messages_zh.js | 36 + .../WEB-INF/classes/static/widgets.html | 470 + .../classes/templates/html/common/footer.html | 22 + .../classes/templates/html/common/header.html | 15 + .../WEB-INF/classes/templates/html/index.html | 276 + .../classes/templates/html/layout.html | 27 + .../classes/templates/java/api/pagination.vm | 42 + .../WEB-INF/classes/templates/java/api/pom.vm | 12 + .../WEB-INF/classes/templates/java/app/pom.vm | 49 + .../classes/templates/java/app/readme.vm | 99 + .../classes/templates/java/common/pom.vm | 17 + .../templates/java/domain/condition.vm | 12 + .../classes/templates/java/domain/entity.vm | 28 + .../classes/templates/java/domain/pom.vm | 17 + .../WEB-INF/classes/templates/java/orm/dao.vm | 52 + .../classes/templates/java/orm/mapper.vm | 83 + .../WEB-INF/classes/templates/java/orm/pom.vm | 31 + .../classes/templates/java/provider/pom.vm | 17 + .../WEB-INF/classes/templates/java/rpc/pom.vm | 17 + .../classes/templates/java/service/pom.vm | 30 + .../classes/templates/java/service/service.vm | 47 + .../templates/java/service/serviceImpl.vm | 56 + .../templates/java/web/application-dev.vm | 31 + .../classes/templates/java/web/application.vm | 3 + .../classes/templates/java/web/log-back.vm | 19 + .../WEB-INF/classes/templates/java/web/pom.vm | 42 + .../templates/java/web/webApplication.vm | 36 + .../target/maven-archiver/pom.properties | 5 + .../compile/default-compile/createdFiles.lst | 0 .../compile/default-compile/inputFiles.lst | 40 + 135 files changed, 48963 insertions(+), 585 deletions(-) create mode 100644 generator-api/target/maven-archiver/pom.properties create mode 100644 generator-common/target/maven-archiver/pom.properties create mode 100644 generator-common/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst create mode 100644 generator-common/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst create mode 100644 generator-dao/target/maven-archiver/pom.properties create mode 100644 generator-domain/target/maven-archiver/pom.properties create mode 100644 generator-service/target/maven-archiver/pom.properties create mode 100644 generator-web/src/main/java/com/my/simon/web/entity/DatabaseInfo.java create mode 100644 generator-web/src/main/java/com/my/simon/web/entity/DatabasesWrapper.java create mode 100644 generator-web/src/main/java/com/my/simon/web/generator/WebGeneratorFactory.java create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/config.properties create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/config/application-dev.yml create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/config/application-prod.yml create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/config/application-test.yml create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/config/application.yml create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/config/log-back.xml create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/404.html create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/500.html create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/alerts.html create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/blank.html create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/buttons.html create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/cards.html create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/chartjs.html create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/css/bootstrap-datetimepicker.min.css create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/css/styles.css create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/css/toast.css create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/favicon.ico create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/forms.html create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/imgs/avatar-1.png create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/imgs/female.jpg create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/imgs/logo-wd.png create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/imgs/logo.png create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/imgs/male.jpg create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/index.html create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/invoice.html create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/js/carbon.js create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/js/demo.js create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/js/page.js create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/js/templateHelper.js create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/layouts-fixed-header.html create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/layouts-fixed-sidebar.html create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/layouts-hidden-sidebar.html create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/layouts-normal.html create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/login.html create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/modals.html create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/progress-bars.html create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/register.html create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/settings.html create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/tables.html create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/tabs.html create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/vendor/bootstrap/js/bootstrap-datetimepicker.js create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/vendor/bootstrap/js/bootstrap-datetimepicker.zh-CN.js create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/vendor/bootstrap/js/bootstrap-paginator.js create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/vendor/bootstrap/js/bootstrap.min.js create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/vendor/chart.js/chart.js create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/vendor/chart.js/chart.min.js create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/vendor/font-awesome/css/fa-brands.css create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/vendor/font-awesome/css/fa-brands.min.css create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/vendor/font-awesome/css/fa-regular.css create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/vendor/font-awesome/css/fa-regular.min.css create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/vendor/font-awesome/css/fa-solid.css create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/vendor/font-awesome/css/fa-solid.min.css create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/vendor/font-awesome/css/fontawesome-all.css create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/vendor/font-awesome/css/fontawesome-all.min.css create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/vendor/font-awesome/css/fontawesome.css create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/vendor/font-awesome/css/fontawesome.min.css create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/vendor/font-awesome/webfonts/fa-brands-400.eot create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/vendor/font-awesome/webfonts/fa-brands-400.svg create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/vendor/font-awesome/webfonts/fa-brands-400.ttf create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/vendor/font-awesome/webfonts/fa-brands-400.woff create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/vendor/font-awesome/webfonts/fa-brands-400.woff2 create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/vendor/font-awesome/webfonts/fa-regular-400.eot create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/vendor/font-awesome/webfonts/fa-regular-400.svg create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/vendor/font-awesome/webfonts/fa-regular-400.ttf create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/vendor/font-awesome/webfonts/fa-regular-400.woff create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/vendor/font-awesome/webfonts/fa-regular-400.woff2 create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/vendor/font-awesome/webfonts/fa-solid-900.eot create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/vendor/font-awesome/webfonts/fa-solid-900.svg create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/vendor/font-awesome/webfonts/fa-solid-900.ttf create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/vendor/font-awesome/webfonts/fa-solid-900.woff create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/vendor/font-awesome/webfonts/fa-solid-900.woff2 create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/vendor/jquery/jquery.js create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/vendor/jquery/jquery.min.js create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/vendor/popper.js/popper.min.js create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/vendor/simple-line-icons/css/simple-line-icons.css create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/vendor/simple-line-icons/fonts/Simple-Line-Icons.eot create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/vendor/simple-line-icons/fonts/Simple-Line-Icons.svg create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/vendor/simple-line-icons/fonts/Simple-Line-Icons.ttf create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/vendor/simple-line-icons/fonts/Simple-Line-Icons.woff create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/vendor/simple-line-icons/fonts/Simple-Line-Icons.woff2 create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/vendor/template.js create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/vendor/validate/ValidateUtil.js create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/vendor/validate/jquery.validate.js create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/vendor/validate/messages_zh.js create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/static/widgets.html create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/html/common/footer.html create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/html/common/header.html create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/html/index.html create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/html/layout.html create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/api/pagination.vm create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/api/pom.vm create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/app/pom.vm create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/app/readme.vm create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/common/pom.vm create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/domain/condition.vm create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/domain/entity.vm create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/domain/pom.vm create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/orm/dao.vm create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/orm/mapper.vm create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/orm/pom.vm create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/provider/pom.vm create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/rpc/pom.vm create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/service/pom.vm create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/service/service.vm create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/service/serviceImpl.vm create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/web/application-dev.vm create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/web/application.vm create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/web/log-back.vm create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/web/pom.vm create mode 100644 generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/web/webApplication.vm create mode 100644 generator-web/target/maven-archiver/pom.properties create mode 100644 generator-web/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst create mode 100644 generator-web/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst diff --git a/.gitignore b/.gitignore index c3bedfa..945ff1c 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,7 @@ .mtj.tmp/ *.iml target/* +.idea/* # Package Files # *.jar diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 0ea8a38..c14081a 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,107 +2,21 @@ - - - - - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + @@ -135,41 +49,41 @@ - + - - - + + + - - + + - + - + - - + + - - + + - + - + - - - + + + @@ -178,9 +92,9 @@ - - - + + + @@ -191,15 +105,6 @@ - - - - - - - - - @@ -212,83 +117,65 @@ - - + + - + - - + + - - - - - - - - - - - - - - - - - + + - - + + - + - - + + - + - - + + - + - - - - - + + - + - - + + @@ -307,6 +194,11 @@ base.package ¬ tem + jdbc.driverClassName + DEFAULT_WEB_APP_ROOT_KEY + names + conte + conten @@ -322,7 +214,6 @@ @@ -370,10 +270,32 @@ - + + + + + + + + + + + + + + + + + + + + @@ -508,7 +330,7 @@ - + @@ -518,17 +340,18 @@ - - - - - - + + + + + + + + + - - + @@ -644,13 +482,13 @@ - - + + - + @@ -660,7 +498,7 @@ - + @@ -670,43 +508,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      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 0 && j < len ? [ this[ j ] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: arr.sort, + splice: arr.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[ 0 ] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // Skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction( target ) ) { + target = {}; + } + + // Extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + + // Only deal with non-null/undefined values + if ( ( options = arguments[ i ] ) != null ) { + + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject( copy ) || + ( copyIsArray = Array.isArray( copy ) ) ) ) { + + if ( copyIsArray ) { + copyIsArray = false; + clone = src && Array.isArray( src ) ? src : []; + + } else { + clone = src && jQuery.isPlainObject( src ) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend( { + + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + isFunction: function( obj ) { + return jQuery.type( obj ) === "function"; + }, + + isWindow: function( obj ) { + return obj != null && obj === obj.window; + }, + + isNumeric: function( obj ) { + + // As of jQuery 3.0, isNumeric is limited to + // strings and numbers (primitives or objects) + // that can be coerced to finite numbers (gh-2662) + var type = jQuery.type( obj ); + return ( type === "number" || type === "string" ) && + + // parseFloat NaNs numeric-cast false positives ("") + // ...but misinterprets leading-number strings, particularly hex literals ("0x...") + // subtraction forces infinities to NaN + !isNaN( obj - parseFloat( obj ) ); + }, + + isPlainObject: function( obj ) { + var proto, Ctor; + + // Detect obvious negatives + // Use toString instead of jQuery.type to catch host objects + if ( !obj || toString.call( obj ) !== "[object Object]" ) { + return false; + } + + proto = getProto( obj ); + + // Objects with no prototype (e.g., `Object.create( null )`) are plain + if ( !proto ) { + return true; + } + + // Objects with prototype are plain iff they were constructed by a global Object function + Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; + return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; + }, + + isEmptyObject: function( obj ) { + + /* eslint-disable no-unused-vars */ + // See https://github.com/eslint/eslint/issues/6125 + var name; + + for ( name in obj ) { + return false; + } + return true; + }, + + type: function( obj ) { + if ( obj == null ) { + return obj + ""; + } + + // Support: Android <=2.3 only (functionish RegExp) + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call( obj ) ] || "object" : + typeof obj; + }, + + // Evaluates a script in a global context + globalEval: function( code ) { + DOMEval( code ); + }, + + // Convert dashed to camelCase; used by the css and data modules + // Support: IE <=9 - 11, Edge 12 - 13 + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + each: function( obj, callback ) { + var length, i = 0; + + if ( isArrayLike( obj ) ) { + length = obj.length; + for ( ; i < length; i++ ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } else { + for ( i in obj ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } + + return obj; + }, + + // Support: Android <=4.0 only + trim: function( text ) { + return text == null ? + "" : + ( text + "" ).replace( rtrim, "" ); + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArrayLike( Object( arr ) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + return arr == null ? -1 : indexOf.call( arr, elem, i ); + }, + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + for ( ; j < len; j++ ) { + first[ i++ ] = second[ j ]; + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var length, value, + i = 0, + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArrayLike( elems ) ) { + length = elems.length; + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + var tmp, args, proxy; + + if ( typeof context === "string" ) { + tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + args = slice.call( arguments, 2 ); + proxy = function() { + return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || jQuery.guid++; + + return proxy; + }, + + now: Date.now, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +} ); + +if ( typeof Symbol === "function" ) { + jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; +} + +// Populate the class2type map +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), +function( i, name ) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +} ); + +function isArrayLike( obj ) { + + // Support: real iOS 8.2 only (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = !!obj && "length" in obj && obj.length, + type = jQuery.type( obj ); + + if ( type === "function" || jQuery.isWindow( obj ) ) { + return false; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v2.3.3 + * https://sizzlejs.com/ + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2016-08-08 + */ +(function( window ) { + +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + 1 * new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // Instance methods + hasOwn = ({}).hasOwnProperty, + arr = [], + pop = arr.pop, + push_native = arr.push, + push = arr.push, + slice = arr.slice, + // Use a stripped-down indexOf as it's faster than native + // https://jsperf.com/thor-indexof-vs-for/5 + indexOf = function( list, elem ) { + var i = 0, + len = list.length; + for ( ; i < len; i++ ) { + if ( list[i] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + + // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+", + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + + "*\\]", + + pseudos = ":(" + identifier + ")(?:\\((" + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), + + rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + identifier + ")" ), + "CLASS": new RegExp( "^\\.(" + identifier + ")" ), + "TAG": new RegExp( "^(" + identifier + "|[*])" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + + // CSS escapes + // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), + funescape = function( _, escaped, escapedWhitespace ) { + var high = "0x" + escaped - 0x10000; + // NaN means non-codepoint + // Support: Firefox<24 + // Workaround erroneous numeric interpretation of +"0x" + return high !== high || escapedWhitespace ? + escaped : + high < 0 ? + // BMP codepoint + String.fromCharCode( high + 0x10000 ) : + // Supplemental Plane codepoint (surrogate pair) + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // CSS string/identifier serialization + // https://drafts.csswg.org/cssom/#common-serializing-idioms + rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, + fcssescape = function( ch, asCodePoint ) { + if ( asCodePoint ) { + + // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER + if ( ch === "\0" ) { + return "\uFFFD"; + } + + // Control characters and (dependent upon position) numbers get escaped as code points + return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; + } + + // Other potentially-special ASCII characters get backslash-escaped + return "\\" + ch; + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); + }, + + disabledAncestor = addCombinator( + function( elem ) { + return elem.disabled === true && ("form" in elem || "label" in elem); + }, + { dir: "parentNode", next: "legend" } + ); + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + (arr = slice.call( preferredDoc.childNodes )), + preferredDoc.childNodes + ); + // Support: Android<4.0 + // Detect silently failing push.apply + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + push_native.apply( target, slice.call(els) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + // Can't trust NodeList.length + while ( (target[j++] = els[i++]) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var m, i, elem, nid, match, groups, newSelector, + newContext = context && context.ownerDocument, + + // nodeType defaults to 9, since context defaults to document + nodeType = context ? context.nodeType : 9; + + results = results || []; + + // Return early from calls with invalid selector or context + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + // Try to shortcut find operations (as opposed to filters) in HTML documents + if ( !seed ) { + + if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { + setDocument( context ); + } + context = context || document; + + if ( documentIsHTML ) { + + // If the selector is sufficiently simple, try using a "get*By*" DOM method + // (excepting DocumentFragment context, where the methods don't exist) + if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { + + // ID selector + if ( (m = match[1]) ) { + + // Document context + if ( nodeType === 9 ) { + if ( (elem = context.getElementById( m )) ) { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + + // Element context + } else { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( newContext && (elem = newContext.getElementById( m )) && + contains( context, elem ) && + elem.id === m ) { + + results.push( elem ); + return results; + } + } + + // Type selector + } else if ( match[2] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Class selector + } else if ( (m = match[3]) && support.getElementsByClassName && + context.getElementsByClassName ) { + + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // Take advantage of querySelectorAll + if ( support.qsa && + !compilerCache[ selector + " " ] && + (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { + + if ( nodeType !== 1 ) { + newContext = context; + newSelector = selector; + + // qSA looks outside Element context, which is not what we want + // Thanks to Andrew Dupont for this workaround technique + // Support: IE <=8 + // Exclude object elements + } else if ( context.nodeName.toLowerCase() !== "object" ) { + + // Capture the context ID, setting it first if necessary + if ( (nid = context.getAttribute( "id" )) ) { + nid = nid.replace( rcssescape, fcssescape ); + } else { + context.setAttribute( "id", (nid = expando) ); + } + + // Prefix every selector in the list + groups = tokenize( selector ); + i = groups.length; + while ( i-- ) { + groups[i] = "#" + nid + " " + toSelector( groups[i] ); + } + newSelector = groups.join( "," ); + + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || + context; + } + + if ( newSelector ) { + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + } finally { + if ( nid === expando ) { + context.removeAttribute( "id" ); + } + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {function(string, object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return (cache[ key + " " ] = value); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created element and returns a boolean result + */ +function assert( fn ) { + var el = document.createElement("fieldset"); + + try { + return !!fn( el ); + } catch (e) { + return false; + } finally { + // Remove from its parent by default + if ( el.parentNode ) { + el.parentNode.removeChild( el ); + } + // release memory in IE + el = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split("|"), + i = arr.length; + + while ( i-- ) { + Expr.attrHandle[ arr[i] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + a.sourceIndex - b.sourceIndex; + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( (cur = cur.nextSibling) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for :enabled/:disabled + * @param {Boolean} disabled true for :disabled; false for :enabled + */ +function createDisabledPseudo( disabled ) { + + // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable + return function( elem ) { + + // Only certain elements can match :enabled or :disabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled + if ( "form" in elem ) { + + // Check for inherited disabledness on relevant non-disabled elements: + // * listed form-associated elements in a disabled fieldset + // https://html.spec.whatwg.org/multipage/forms.html#category-listed + // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled + // * option elements in a disabled optgroup + // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled + // All such elements have a "form" property. + if ( elem.parentNode && elem.disabled === false ) { + + // Option elements defer to a parent optgroup if present + if ( "label" in elem ) { + if ( "label" in elem.parentNode ) { + return elem.parentNode.disabled === disabled; + } else { + return elem.disabled === disabled; + } + } + + // Support: IE 6 - 11 + // Use the isDisabled shortcut property to check for disabled fieldset ancestors + return elem.isDisabled === disabled || + + // Where there is no isDisabled, check manually + /* jshint -W018 */ + elem.isDisabled !== !disabled && + disabledAncestor( elem ) === disabled; + } + + return elem.disabled === disabled; + + // Try to winnow out elements that can't be disabled before trusting the disabled property. + // Some victims get caught in our net (label, legend, menu, track), but it shouldn't + // even exist on them, let alone have a boolean value. + } else if ( "label" in elem ) { + return elem.disabled === disabled; + } + + // Remaining elements are neither :enabled nor :disabled + return false; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction(function( argument ) { + argument = +argument; + return markFunction(function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ (j = matchIndexes[i]) ] ) { + seed[j] = !(matches[j] = seed[j]); + } + } + }); + }); +} + +/** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== "undefined" && context; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = elem && (elem.ownerDocument || elem).documentElement; + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, subWindow, + doc = node ? node.ownerDocument || node : preferredDoc; + + // Return early if doc is invalid or already selected + if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Update global variables + document = doc; + docElem = document.documentElement; + documentIsHTML = !isXML( document ); + + // Support: IE 9-11, Edge + // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) + if ( preferredDoc !== document && + (subWindow = document.defaultView) && subWindow.top !== subWindow ) { + + // Support: IE 11, Edge + if ( subWindow.addEventListener ) { + subWindow.addEventListener( "unload", unloadHandler, false ); + + // Support: IE 9 - 10 only + } else if ( subWindow.attachEvent ) { + subWindow.attachEvent( "onunload", unloadHandler ); + } + } + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) + support.attributes = assert(function( el ) { + el.className = "i"; + return !el.getAttribute("className"); + }); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert(function( el ) { + el.appendChild( document.createComment("") ); + return !el.getElementsByTagName("*").length; + }); + + // Support: IE<9 + support.getElementsByClassName = rnative.test( document.getElementsByClassName ); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programmatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert(function( el ) { + docElem.appendChild( el ).id = expando; + return !document.getElementsByName || !document.getElementsByName( expando ).length; + }); + + // ID filter and find + if ( support.getById ) { + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute("id") === attrId; + }; + }; + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var elem = context.getElementById( id ); + return elem ? [ elem ] : []; + } + }; + } else { + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== "undefined" && + elem.getAttributeNode("id"); + return node && node.value === attrId; + }; + }; + + // Support: IE 6 - 7 only + // getElementById is not reliable as a find shortcut + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var node, i, elems, + elem = context.getElementById( id ); + + if ( elem ) { + + // Verify the id attribute + node = elem.getAttributeNode("id"); + if ( node && node.value === id ) { + return [ elem ]; + } + + // Fall back on getElementsByName + elems = context.getElementsByName( id ); + i = 0; + while ( (elem = elems[i++]) ) { + node = elem.getAttributeNode("id"); + if ( node && node.value === id ) { + return [ elem ]; + } + } + } + + return []; + } + }; + } + + // Tag + Expr.find["TAG"] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else if ( support.qsa ) { + return context.querySelectorAll( tag ); + } + } : + + function( tag, context ) { + var elem, + tmp = [], + i = 0, + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( (elem = results[i++]) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See https://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( (support.qsa = rnative.test( document.querySelectorAll )) ) { + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert(function( el ) { + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // https://bugs.jquery.com/ticket/12359 + docElem.appendChild( el ).innerHTML = "" + + ""; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( el.querySelectorAll("[msallowcapture^='']").length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !el.querySelectorAll("[selected]").length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ + if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push("~="); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !el.querySelectorAll(":checked").length ) { + rbuggyQSA.push(":checked"); + } + + // Support: Safari 8+, iOS 8+ + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibling-combinator selector` fails + if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push(".#.+[+~]"); + } + }); + + assert(function( el ) { + el.innerHTML = "" + + ""; + + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = document.createElement("input"); + input.setAttribute( "type", "hidden" ); + el.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( el.querySelectorAll("[name=d]").length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( el.querySelectorAll(":enabled").length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: IE9-11+ + // IE's :disabled selector does not pick up the children of disabled fieldsets + docElem.appendChild( el ).disabled = true; + if ( el.querySelectorAll(":disabled").length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Opera 10-11 does not throw on post-comma invalid pseudos + el.querySelectorAll("*,:x"); + rbuggyQSA.push(",.*:"); + }); + } + + if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector) )) ) { + + assert(function( el ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( el, "*" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( el, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + }); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully self-exclusive + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + )); + } : + function( a, b ) { + if ( b ) { + while ( (b = b.parentNode) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { + + // Choose the first element that is related to our preferred document + if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { + return -1; + } + if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + return a === document ? -1 : + b === document ? 1 : + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( (cur = cur.parentNode) ) { + ap.unshift( cur ); + } + cur = b; + while ( (cur = cur.parentNode) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[i] === bp[i] ) { + i++; + } + + return i ? + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[i], bp[i] ) : + + // Otherwise nodes in our document sort first + ap[i] === preferredDoc ? -1 : + bp[i] === preferredDoc ? 1 : + 0; + }; + + return document; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + // Make sure that attribute selectors are quoted + expr = expr.replace( rattributeQuotes, "='$1']" ); + + if ( support.matchesSelector && documentIsHTML && + !compilerCache[ expr + " " ] && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch (e) {} + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + // Set document vars if needed + if ( ( context.ownerDocument || context ) !== document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + (val = elem.getAttributeNode(name)) && val.specified ? + val.value : + null; +}; + +Sizzle.escape = function( sel ) { + return (sel + "").replace( rcssescape, fcssescape ); +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( (elem = results[i++]) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + // If no nodeType, this is expected to be an array + while ( (node = elem[i++]) ) { + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[1] = match[1].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); + + if ( match[2] === "~=" ) { + match[3] = " " + match[3] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[1] = match[1].toLowerCase(); + + if ( match[1].slice( 0, 3 ) === "nth" ) { + // nth-* requires argument + if ( !match[3] ) { + Sizzle.error( match[0] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); + match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); + + // other types prohibit arguments + } else if ( match[3] ) { + Sizzle.error( match[0] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[6] && match[2]; + + if ( matchExpr["CHILD"].test( match[0] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[3] ) { + match[2] = match[4] || match[5] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + // Get excess from tokenize (recursively) + (excess = tokenize( unquoted, true )) && + // advance to the next closing parenthesis + (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { + + // excess is a negative index + match[0] = match[0].slice( 0, excess ); + match[2] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { return true; } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && + classCache( className, function( elem ) { + return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); + }); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + }; + }, + + "CHILD": function( type, what, argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, context, xml ) { + var cache, uniqueCache, outerCache, node, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType, + diff = false; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( (node = node[ dir ]) ) { + if ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) { + + return false; + } + } + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + + // Seek `elem` from a previously-cached index + + // ...in a gzip-friendly way + node = parent; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex && cache[ 2 ]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( (node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + (diff = nodeIndex = 0) || start.pop()) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + } else { + // Use previously-cached element index if available + if ( useCache ) { + // ...in a gzip-friendly way + node = elem; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex; + } + + // xml :nth-child(...) + // or :nth-last-child(...) or :nth(-last)?-of-type(...) + if ( diff === false ) { + // Use the same loop as above to seek `elem` from the start + while ( (node = ++nodeIndex && node && node[ dir ] || + (diff = nodeIndex = 0) || start.pop()) ) { + + if ( ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) && + ++diff ) { + + // Cache the index of each encountered element + if ( useCache ) { + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + uniqueCache[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction(function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf( seed, matched[i] ); + seed[ idx ] = !( matches[ idx ] = matched[i] ); + } + }) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + // Potentially complex pseudos + "not": markFunction(function( selector ) { + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction(function( seed, matches, context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( (elem = unmatched[i]) ) { + seed[i] = !(matches[i] = elem); + } + } + }) : + function( elem, context, xml ) { + input[0] = elem; + matcher( input, null, xml, results ); + // Don't keep the element (issue #299) + input[0] = null; + return !results.pop(); + }; + }), + + "has": markFunction(function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + }), + + "contains": markFunction(function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; + }; + }), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + // lang value must be a valid identifier + if ( !ridentifier.test(lang || "") ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( (elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); + return false; + }; + }), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); + }, + + // Boolean properties + "enabled": createDisabledPseudo( false ), + "disabled": createDisabledPseudo( true ), + + "checked": function( elem ) { + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); + }, + + "selected": function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos["empty"]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + "first": createPositionalPseudo(function() { + return [ 0 ]; + }), + + "last": createPositionalPseudo(function( matchIndexes, length ) { + return [ length - 1 ]; + }), + + "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + }), + + "even": createPositionalPseudo(function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "odd": createPositionalPseudo(function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }) + } +}; + +Expr.pseudos["nth"] = Expr.pseudos["eq"]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +tokenize = Sizzle.tokenize = function( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || (match = rcomma.exec( soFar )) ) { + if ( match ) { + // Don't consume trailing commas as valid + soFar = soFar.slice( match[0].length ) || soFar; + } + groups.push( (tokens = []) ); + } + + matched = false; + + // Combinators + if ( (match = rcombinators.exec( soFar )) ) { + matched = match.shift(); + tokens.push({ + value: matched, + // Cast descendant combinators to space + type: match[0].replace( rtrim, " " ) + }); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || + (match = preFilters[ type ]( match ))) ) { + matched = match.shift(); + tokens.push({ + value: matched, + type: type, + matches: match + }); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[i].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + skip = combinator.next, + key = skip || dir, + checkNonElements = base && key === "parentNode", + doneName = done++; + + return combinator.first ? + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + return false; + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, uniqueCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching + if ( xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || (elem[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {}); + + if ( skip && skip === elem.nodeName.toLowerCase() ) { + elem = elem[ dir ] || elem; + } else if ( (oldCache = uniqueCache[ key ]) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return (newCache[ 2 ] = oldCache[ 2 ]); + } else { + // Reuse newcache so results back-propagate to previous elements + uniqueCache[ key ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { + return true; + } + } + } + } + } + return false; + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[i]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[0]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[i], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( (elem = unmatched[i]) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction(function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( (elem = temp[i]) ) { + matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) ) { + // Restore matcherIn since elem is not yet a final match + temp.push( (matcherIn[i] = elem) ); + } + } + postFinder( null, (matcherOut = []), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) && + (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { + + seed[temp] = !(results[temp] = elem); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + }); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[0].type ], + implicitRelative = leadingRelative || Expr.relative[" "], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + (checkContext = context).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + // Avoid hanging onto element (issue #299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( (matcher = Expr.relative[ tokens[i].type ]) ) { + matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; + } else { + matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[j].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), + len = elems.length; + + if ( outermost ) { + outermostContext = context === document || context || outermost; + } + + // Add elements passing elementMatchers directly to results + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + for ( ; i !== len && (elem = elems[i]) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + if ( !context && elem.ownerDocument !== document ) { + setDocument( elem ); + xml = !documentIsHTML; + } + while ( (matcher = elementMatchers[j++]) ) { + if ( matcher( elem, context || document, xml) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + // They will have gone through all possible matchers + if ( (elem = !matcher && elem) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // `i` is now the count of elements visited above, and adding it to `matchedCount` + // makes the latter nonnegative. + matchedCount += i; + + // Apply set filters to unmatched elements + // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` + // equals `i`), unless we didn't visit _any_ elements in the above loop because we have + // no element matchers and no seed. + // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that + // case, which will result in a "00" `matchedCount` that differs from `i` but is also + // numerically zero. + if ( bySet && i !== matchedCount ) { + j = 0; + while ( (matcher = setMatchers[j++]) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !(unmatched[i] || setMatched[i]) ) { + setMatched[i] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[i] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +}; + +/** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +select = Sizzle.select = function( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( (selector = compiled.selector || selector) ); + + results = results || []; + + // Try to minimize operations if there is only one selector in the list and no seed + // (the latter of which guarantees us context) + if ( match.length === 1 ) { + + // Reduce context if the leading compound selector is an ID + tokens = match[0] = match[0].slice( 0 ); + if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && + context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) { + + context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[i]; + + // Abort if we hit a combinator + if ( Expr.relative[ (type = token.type) ] ) { + break; + } + if ( (find = Expr.find[ type ]) ) { + // Search, expanding context for leading sibling combinators + if ( (seed = find( + token.matches[0].replace( runescape, funescape ), + rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context + )) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + !context || rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +}; + +// One-time assignments + +// Sort stability +support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; + +// Support: Chrome 14-35+ +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert(function( el ) { + // Should return 1, but returns 4 (following) + return el.compareDocumentPosition( document.createElement("fieldset") ) & 1; +}); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert(function( el ) { + el.innerHTML = ""; + return el.firstChild.getAttribute("href") === "#" ; +}) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + }); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert(function( el ) { + el.innerHTML = ""; + el.firstChild.setAttribute( "value", "" ); + return el.firstChild.getAttribute( "value" ) === ""; +}) ) { + addHandle( "value", function( elem, name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + }); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert(function( el ) { + return el.getAttribute("disabled") == null; +}) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + (val = elem.getAttributeNode( name )) && val.specified ? + val.value : + null; + } + }); +} + +return Sizzle; + +})( window ); + + + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; + +// Deprecated +jQuery.expr[ ":" ] = jQuery.expr.pseudos; +jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; +jQuery.escapeSelector = Sizzle.escape; + + + + +var dir = function( elem, dir, until ) { + var matched = [], + truncate = until !== undefined; + + while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); + } + } + return matched; +}; + + +var siblings = function( n, elem ) { + var matched = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + matched.push( n ); + } + } + + return matched; +}; + + +var rneedsContext = jQuery.expr.match.needsContext; + + + +function nodeName( elem, name ) { + + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + +}; +var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); + + + +var risSimple = /^.[^:#\[\.,]*$/; + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + return !!qualifier.call( elem, i, elem ) !== not; + } ); + } + + // Single element + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + } ); + } + + // Arraylike of elements (jQuery, arguments, Array) + if ( typeof qualifier !== "string" ) { + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) > -1 ) !== not; + } ); + } + + // Simple selector that can be filtered directly, removing non-Elements + if ( risSimple.test( qualifier ) ) { + return jQuery.filter( qualifier, elements, not ); + } + + // Complex selector, compare the two sets, removing non-Elements + qualifier = jQuery.filter( qualifier, elements ); + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) > -1 ) !== not && elem.nodeType === 1; + } ); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + if ( elems.length === 1 && elem.nodeType === 1 ) { + return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; + } + + return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + } ) ); +}; + +jQuery.fn.extend( { + find: function( selector ) { + var i, ret, + len = this.length, + self = this; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + } ) ); + } + + ret = this.pushStack( [] ); + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + return len > 1 ? jQuery.uniqueSort( ret ) : ret; + }, + filter: function( selector ) { + return this.pushStack( winnow( this, selector || [], false ) ); + }, + not: function( selector ) { + return this.pushStack( winnow( this, selector || [], true ) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +} ); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + // Shortcut simple #id case for speed + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, + + init = jQuery.fn.init = function( selector, context, root ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Method init() accepts an alternate rootjQuery + // so migrate can support jQuery.sub (gh-2101) + root = root || rootjQuery; + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector[ 0 ] === "<" && + selector[ selector.length - 1 ] === ">" && + selector.length >= 3 ) { + + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && ( match[ 1 ] || !context ) ) { + + // HANDLE: $(html) -> $(array) + if ( match[ 1 ] ) { + context = context instanceof jQuery ? context[ 0 ] : context; + + // Option to run scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[ 1 ], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + + // Properties of context are called as methods if possible + if ( jQuery.isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[ 2 ] ); + + if ( elem ) { + + // Inject the element directly into the jQuery object + this[ 0 ] = elem; + this.length = 1; + } + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || root ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this[ 0 ] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return root.ready !== undefined ? + root.ready( selector ) : + + // Execute immediately if ready is not present + selector( jQuery ); + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + + // Methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend( { + has: function( target ) { + var targets = jQuery( target, this ), + l = targets.length; + + return this.filter( function() { + var i = 0; + for ( ; i < l; i++ ) { + if ( jQuery.contains( this, targets[ i ] ) ) { + return true; + } + } + } ); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + targets = typeof selectors !== "string" && jQuery( selectors ); + + // Positional selectors never match, since there's no _selection_ context + if ( !rneedsContext.test( selectors ) ) { + for ( ; i < l; i++ ) { + for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { + + // Always skip document fragments + if ( cur.nodeType < 11 && ( targets ? + targets.index( cur ) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector( cur, selectors ) ) ) { + + matched.push( cur ); + break; + } + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); + }, + + // Determine the position of an element within the set + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; + } + + // Index in selector + if ( typeof elem === "string" ) { + return indexOf.call( jQuery( elem ), this[ 0 ] ); + } + + // Locate the position of the desired element + return indexOf.call( this, + + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[ 0 ] : elem + ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.uniqueSort( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + } +} ); + +function sibling( cur, dir ) { + while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} + return cur; +} + +jQuery.each( { + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return siblings( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return siblings( elem.firstChild ); + }, + contents: function( elem ) { + if ( nodeName( elem, "iframe" ) ) { + return elem.contentDocument; + } + + // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only + // Treat the templates element as a regular one in browsers that + // don't support it. + if ( nodeName( elem, "template" ) ) { + elem = elem.content || elem; + } + + return jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var matched = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + matched = jQuery.filter( selector, matched ); + } + + if ( this.length > 1 ) { + + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + jQuery.uniqueSort( matched ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + matched.reverse(); + } + } + + return this.pushStack( matched ); + }; +} ); +var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); + + + +// Convert String-formatted options into Object-formatted ones +function createOptions( options ) { + var object = {}; + jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { + object[ flag ] = true; + } ); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + createOptions( options ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + + // Last fire value for non-forgettable lists + memory, + + // Flag to know if list was already fired + fired, + + // Flag to prevent firing + locked, + + // Actual callback list + list = [], + + // Queue of execution data for repeatable lists + queue = [], + + // Index of currently firing callback (modified by add/remove as needed) + firingIndex = -1, + + // Fire callbacks + fire = function() { + + // Enforce single-firing + locked = locked || options.once; + + // Execute callbacks for all pending executions, + // respecting firingIndex overrides and runtime changes + fired = firing = true; + for ( ; queue.length; firingIndex = -1 ) { + memory = queue.shift(); + while ( ++firingIndex < list.length ) { + + // Run callback and check for early termination + if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && + options.stopOnFalse ) { + + // Jump to end and forget the data so .add doesn't re-fire + firingIndex = list.length; + memory = false; + } + } + } + + // Forget the data if we're done with it + if ( !options.memory ) { + memory = false; + } + + firing = false; + + // Clean up if we're done firing for good + if ( locked ) { + + // Keep an empty list if we have data for future add calls + if ( memory ) { + list = []; + + // Otherwise, this object is spent + } else { + list = ""; + } + } + }, + + // Actual Callbacks object + self = { + + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + + // If we have memory from a past run, we should fire after adding + if ( memory && !firing ) { + firingIndex = list.length - 1; + queue.push( memory ); + } + + ( function add( args ) { + jQuery.each( args, function( _, arg ) { + if ( jQuery.isFunction( arg ) ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) { + + // Inspect recursively + add( arg ); + } + } ); + } )( arguments ); + + if ( memory && !firing ) { + fire(); + } + } + return this; + }, + + // Remove a callback from the list + remove: function() { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + + // Handle firing indexes + if ( index <= firingIndex ) { + firingIndex--; + } + } + } ); + return this; + }, + + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? + jQuery.inArray( fn, list ) > -1 : + list.length > 0; + }, + + // Remove all callbacks from the list + empty: function() { + if ( list ) { + list = []; + } + return this; + }, + + // Disable .fire and .add + // Abort any current/pending executions + // Clear all callbacks and values + disable: function() { + locked = queue = []; + list = memory = ""; + return this; + }, + disabled: function() { + return !list; + }, + + // Disable .fire + // Also disable .add unless we have memory (since it would have no effect) + // Abort any pending executions + lock: function() { + locked = queue = []; + if ( !memory && !firing ) { + list = memory = ""; + } + return this; + }, + locked: function() { + return !!locked; + }, + + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( !locked ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + queue.push( args ); + if ( !firing ) { + fire(); + } + } + return this; + }, + + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + +function Identity( v ) { + return v; +} +function Thrower( ex ) { + throw ex; +} + +function adoptValue( value, resolve, reject, noValue ) { + var method; + + try { + + // Check for promise aspect first to privilege synchronous behavior + if ( value && jQuery.isFunction( ( method = value.promise ) ) ) { + method.call( value ).done( resolve ).fail( reject ); + + // Other thenables + } else if ( value && jQuery.isFunction( ( method = value.then ) ) ) { + method.call( value, resolve, reject ); + + // Other non-thenables + } else { + + // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: + // * false: [ value ].slice( 0 ) => resolve( value ) + // * true: [ value ].slice( 1 ) => resolve() + resolve.apply( undefined, [ value ].slice( noValue ) ); + } + + // For Promises/A+, convert exceptions into rejections + // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in + // Deferred#then to conditionally suppress rejection. + } catch ( value ) { + + // Support: Android 4.0 only + // Strict mode functions invoked without .call/.apply get global-object context + reject.apply( undefined, [ value ] ); + } +} + +jQuery.extend( { + + Deferred: function( func ) { + var tuples = [ + + // action, add listener, callbacks, + // ... .then handlers, argument index, [final state] + [ "notify", "progress", jQuery.Callbacks( "memory" ), + jQuery.Callbacks( "memory" ), 2 ], + [ "resolve", "done", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 0, "resolved" ], + [ "reject", "fail", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 1, "rejected" ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + "catch": function( fn ) { + return promise.then( null, fn ); + }, + + // Keep pipe for back-compat + pipe: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + + return jQuery.Deferred( function( newDefer ) { + jQuery.each( tuples, function( i, tuple ) { + + // Map tuples (progress, done, fail) to arguments (done, fail, progress) + var fn = jQuery.isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; + + // deferred.progress(function() { bind to newDefer or newDefer.notify }) + // deferred.done(function() { bind to newDefer or newDefer.resolve }) + // deferred.fail(function() { bind to newDefer or newDefer.reject }) + deferred[ tuple[ 1 ] ]( function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise() + .progress( newDefer.notify ) + .done( newDefer.resolve ) + .fail( newDefer.reject ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( + this, + fn ? [ returned ] : arguments + ); + } + } ); + } ); + fns = null; + } ).promise(); + }, + then: function( onFulfilled, onRejected, onProgress ) { + var maxDepth = 0; + function resolve( depth, deferred, handler, special ) { + return function() { + var that = this, + args = arguments, + mightThrow = function() { + var returned, then; + + // Support: Promises/A+ section 2.3.3.3.3 + // https://promisesaplus.com/#point-59 + // Ignore double-resolution attempts + if ( depth < maxDepth ) { + return; + } + + returned = handler.apply( that, args ); + + // Support: Promises/A+ section 2.3.1 + // https://promisesaplus.com/#point-48 + if ( returned === deferred.promise() ) { + throw new TypeError( "Thenable self-resolution" ); + } + + // Support: Promises/A+ sections 2.3.3.1, 3.5 + // https://promisesaplus.com/#point-54 + // https://promisesaplus.com/#point-75 + // Retrieve `then` only once + then = returned && + + // Support: Promises/A+ section 2.3.4 + // https://promisesaplus.com/#point-64 + // Only check objects and functions for thenability + ( typeof returned === "object" || + typeof returned === "function" ) && + returned.then; + + // Handle a returned thenable + if ( jQuery.isFunction( then ) ) { + + // Special processors (notify) just wait for resolution + if ( special ) { + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ) + ); + + // Normal processors (resolve) also hook into progress + } else { + + // ...and disregard older resolution values + maxDepth++; + + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ), + resolve( maxDepth, deferred, Identity, + deferred.notifyWith ) + ); + } + + // Handle all other returned values + } else { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Identity ) { + that = undefined; + args = [ returned ]; + } + + // Process the value(s) + // Default process is resolve + ( special || deferred.resolveWith )( that, args ); + } + }, + + // Only normal processors (resolve) catch and reject exceptions + process = special ? + mightThrow : + function() { + try { + mightThrow(); + } catch ( e ) { + + if ( jQuery.Deferred.exceptionHook ) { + jQuery.Deferred.exceptionHook( e, + process.stackTrace ); + } + + // Support: Promises/A+ section 2.3.3.3.4.1 + // https://promisesaplus.com/#point-61 + // Ignore post-resolution exceptions + if ( depth + 1 >= maxDepth ) { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Thrower ) { + that = undefined; + args = [ e ]; + } + + deferred.rejectWith( that, args ); + } + } + }; + + // Support: Promises/A+ section 2.3.3.3.1 + // https://promisesaplus.com/#point-57 + // Re-resolve promises immediately to dodge false rejection from + // subsequent errors + if ( depth ) { + process(); + } else { + + // Call an optional hook to record the stack, in case of exception + // since it's otherwise lost when execution goes async + if ( jQuery.Deferred.getStackHook ) { + process.stackTrace = jQuery.Deferred.getStackHook(); + } + window.setTimeout( process ); + } + }; + } + + return jQuery.Deferred( function( newDefer ) { + + // progress_handlers.add( ... ) + tuples[ 0 ][ 3 ].add( + resolve( + 0, + newDefer, + jQuery.isFunction( onProgress ) ? + onProgress : + Identity, + newDefer.notifyWith + ) + ); + + // fulfilled_handlers.add( ... ) + tuples[ 1 ][ 3 ].add( + resolve( + 0, + newDefer, + jQuery.isFunction( onFulfilled ) ? + onFulfilled : + Identity + ) + ); + + // rejected_handlers.add( ... ) + tuples[ 2 ][ 3 ].add( + resolve( + 0, + newDefer, + jQuery.isFunction( onRejected ) ? + onRejected : + Thrower + ) + ); + } ).promise(); + }, + + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 5 ]; + + // promise.progress = list.add + // promise.done = list.add + // promise.fail = list.add + promise[ tuple[ 1 ] ] = list.add; + + // Handle state + if ( stateString ) { + list.add( + function() { + + // state = "resolved" (i.e., fulfilled) + // state = "rejected" + state = stateString; + }, + + // rejected_callbacks.disable + // fulfilled_callbacks.disable + tuples[ 3 - i ][ 2 ].disable, + + // progress_callbacks.lock + tuples[ 0 ][ 2 ].lock + ); + } + + // progress_handlers.fire + // fulfilled_handlers.fire + // rejected_handlers.fire + list.add( tuple[ 3 ].fire ); + + // deferred.notify = function() { deferred.notifyWith(...) } + // deferred.resolve = function() { deferred.resolveWith(...) } + // deferred.reject = function() { deferred.rejectWith(...) } + deferred[ tuple[ 0 ] ] = function() { + deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); + return this; + }; + + // deferred.notifyWith = list.fireWith + // deferred.resolveWith = list.fireWith + // deferred.rejectWith = list.fireWith + deferred[ tuple[ 0 ] + "With" ] = list.fireWith; + } ); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( singleValue ) { + var + + // count of uncompleted subordinates + remaining = arguments.length, + + // count of unprocessed arguments + i = remaining, + + // subordinate fulfillment data + resolveContexts = Array( i ), + resolveValues = slice.call( arguments ), + + // the master Deferred + master = jQuery.Deferred(), + + // subordinate callback factory + updateFunc = function( i ) { + return function( value ) { + resolveContexts[ i ] = this; + resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( !( --remaining ) ) { + master.resolveWith( resolveContexts, resolveValues ); + } + }; + }; + + // Single- and empty arguments are adopted like Promise.resolve + if ( remaining <= 1 ) { + adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, + !remaining ); + + // Use .then() to unwrap secondary thenables (cf. gh-3000) + if ( master.state() === "pending" || + jQuery.isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { + + return master.then(); + } + } + + // Multiple arguments are aggregated like Promise.all array elements + while ( i-- ) { + adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); + } + + return master.promise(); + } +} ); + + +// These usually indicate a programmer mistake during development, +// warn about them ASAP rather than swallowing them by default. +var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; + +jQuery.Deferred.exceptionHook = function( error, stack ) { + + // Support: IE 8 - 9 only + // Console exists when dev tools are open, which can happen at any time + if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { + window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); + } +}; + + + + +jQuery.readyException = function( error ) { + window.setTimeout( function() { + throw error; + } ); +}; + + + + +// The deferred used on DOM ready +var readyList = jQuery.Deferred(); + +jQuery.fn.ready = function( fn ) { + + readyList + .then( fn ) + + // Wrap jQuery.readyException in a function so that the lookup + // happens at the time of error handling instead of callback + // registration. + .catch( function( error ) { + jQuery.readyException( error ); + } ); + + return this; +}; + +jQuery.extend( { + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + } +} ); + +jQuery.ready.then = readyList.then; + +// The ready event handler and self cleanup method +function completed() { + document.removeEventListener( "DOMContentLoaded", completed ); + window.removeEventListener( "load", completed ); + jQuery.ready(); +} + +// Catch cases where $(document).ready() is called +// after the browser event has already occurred. +// Support: IE <=9 - 10 only +// Older IE sometimes signals "interactive" too soon +if ( document.readyState === "complete" || + ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { + + // Handle it asynchronously to allow scripts the opportunity to delay ready + window.setTimeout( jQuery.ready ); + +} else { + + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed ); +} + + + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + len = elems.length, + bulk = key == null; + + // Sets many values + if ( jQuery.type( key ) === "object" ) { + chainable = true; + for ( i in key ) { + access( elems, fn, i, key[ i ], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !jQuery.isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < len; i++ ) { + fn( + elems[ i ], key, raw ? + value : + value.call( elems[ i ], i, fn( elems[ i ], key ) ) + ); + } + } + } + + if ( chainable ) { + return elems; + } + + // Gets + if ( bulk ) { + return fn.call( elems ); + } + + return len ? fn( elems[ 0 ], key ) : emptyGet; +}; +var acceptData = function( owner ) { + + // Accepts only: + // - Node + // - Node.ELEMENT_NODE + // - Node.DOCUMENT_NODE + // - Object + // - Any + return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); +}; + + + + +function Data() { + this.expando = jQuery.expando + Data.uid++; +} + +Data.uid = 1; + +Data.prototype = { + + cache: function( owner ) { + + // Check if the owner object already has a cache + var value = owner[ this.expando ]; + + // If not, create one + if ( !value ) { + value = {}; + + // We can accept data for non-element nodes in modern browsers, + // but we should not, see #8335. + // Always return an empty object. + if ( acceptData( owner ) ) { + + // If it is a node unlikely to be stringify-ed or looped over + // use plain assignment + if ( owner.nodeType ) { + owner[ this.expando ] = value; + + // Otherwise secure it in a non-enumerable property + // configurable must be true to allow the property to be + // deleted when data is removed + } else { + Object.defineProperty( owner, this.expando, { + value: value, + configurable: true + } ); + } + } + } + + return value; + }, + set: function( owner, data, value ) { + var prop, + cache = this.cache( owner ); + + // Handle: [ owner, key, value ] args + // Always use camelCase key (gh-2257) + if ( typeof data === "string" ) { + cache[ jQuery.camelCase( data ) ] = value; + + // Handle: [ owner, { properties } ] args + } else { + + // Copy the properties one-by-one to the cache object + for ( prop in data ) { + cache[ jQuery.camelCase( prop ) ] = data[ prop ]; + } + } + return cache; + }, + get: function( owner, key ) { + return key === undefined ? + this.cache( owner ) : + + // Always use camelCase key (gh-2257) + owner[ this.expando ] && owner[ this.expando ][ jQuery.camelCase( key ) ]; + }, + access: function( owner, key, value ) { + + // In cases where either: + // + // 1. No key was specified + // 2. A string key was specified, but no value provided + // + // Take the "read" path and allow the get method to determine + // which value to return, respectively either: + // + // 1. The entire cache object + // 2. The data stored at the key + // + if ( key === undefined || + ( ( key && typeof key === "string" ) && value === undefined ) ) { + + return this.get( owner, key ); + } + + // When the key is not a string, or both a key and value + // are specified, set or extend (existing objects) with either: + // + // 1. An object of properties + // 2. A key and value + // + this.set( owner, key, value ); + + // Since the "set" path can have two possible entry points + // return the expected data based on which path was taken[*] + return value !== undefined ? value : key; + }, + remove: function( owner, key ) { + var i, + cache = owner[ this.expando ]; + + if ( cache === undefined ) { + return; + } + + if ( key !== undefined ) { + + // Support array or space separated string of keys + if ( Array.isArray( key ) ) { + + // If key is an array of keys... + // We always set camelCase keys, so remove that. + key = key.map( jQuery.camelCase ); + } else { + key = jQuery.camelCase( key ); + + // If a key with the spaces exists, use it. + // Otherwise, create an array by matching non-whitespace + key = key in cache ? + [ key ] : + ( key.match( rnothtmlwhite ) || [] ); + } + + i = key.length; + + while ( i-- ) { + delete cache[ key[ i ] ]; + } + } + + // Remove the expando if there's no more data + if ( key === undefined || jQuery.isEmptyObject( cache ) ) { + + // Support: Chrome <=35 - 45 + // Webkit & Blink performance suffers when deleting properties + // from DOM nodes, so set to undefined instead + // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) + if ( owner.nodeType ) { + owner[ this.expando ] = undefined; + } else { + delete owner[ this.expando ]; + } + } + }, + hasData: function( owner ) { + var cache = owner[ this.expando ]; + return cache !== undefined && !jQuery.isEmptyObject( cache ); + } +}; +var dataPriv = new Data(); + +var dataUser = new Data(); + + + +// Implementation Summary +// +// 1. Enforce API surface and semantic compatibility with 1.9.x branch +// 2. Improve the module's maintainability by reducing the storage +// paths to a single mechanism. +// 3. Use the same single mechanism to support "private" and "user" data. +// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) +// 5. Avoid exposing implementation details on user objects (eg. expando properties) +// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /[A-Z]/g; + +function getData( data ) { + if ( data === "true" ) { + return true; + } + + if ( data === "false" ) { + return false; + } + + if ( data === "null" ) { + return null; + } + + // Only convert to a number if it doesn't change the string + if ( data === +data + "" ) { + return +data; + } + + if ( rbrace.test( data ) ) { + return JSON.parse( data ); + } + + return data; +} + +function dataAttr( elem, key, data ) { + var name; + + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = getData( data ); + } catch ( e ) {} + + // Make sure we set the data so it isn't changed later + dataUser.set( elem, key, data ); + } else { + data = undefined; + } + } + return data; +} + +jQuery.extend( { + hasData: function( elem ) { + return dataUser.hasData( elem ) || dataPriv.hasData( elem ); + }, + + data: function( elem, name, data ) { + return dataUser.access( elem, name, data ); + }, + + removeData: function( elem, name ) { + dataUser.remove( elem, name ); + }, + + // TODO: Now that all calls to _data and _removeData have been replaced + // with direct calls to dataPriv methods, these can be deprecated. + _data: function( elem, name, data ) { + return dataPriv.access( elem, name, data ); + }, + + _removeData: function( elem, name ) { + dataPriv.remove( elem, name ); + } +} ); + +jQuery.fn.extend( { + data: function( key, value ) { + var i, name, data, + elem = this[ 0 ], + attrs = elem && elem.attributes; + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = dataUser.get( elem ); + + if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE 11 only + // The attrs elements can be null (#14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = jQuery.camelCase( name.slice( 5 ) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + dataPriv.set( elem, "hasDataAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each( function() { + dataUser.set( this, key ); + } ); + } + + return access( this, function( value ) { + var data; + + // The calling jQuery object (element matches) is not empty + // (and therefore has an element appears at this[ 0 ]) and the + // `value` parameter was not undefined. An empty jQuery object + // will result in `undefined` for elem = this[ 0 ] which will + // throw an exception if an attempt to read a data cache is made. + if ( elem && value === undefined ) { + + // Attempt to get data from the cache + // The key will always be camelCased in Data + data = dataUser.get( elem, key ); + if ( data !== undefined ) { + return data; + } + + // Attempt to "discover" the data in + // HTML5 custom data-* attrs + data = dataAttr( elem, key ); + if ( data !== undefined ) { + return data; + } + + // We tried really hard, but the data doesn't exist. + return; + } + + // Set the data... + this.each( function() { + + // We always store the camelCased key + dataUser.set( this, key, value ); + } ); + }, null, value, arguments.length > 1, null, true ); + }, + + removeData: function( key ) { + return this.each( function() { + dataUser.remove( this, key ); + } ); + } +} ); + + +jQuery.extend( { + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = dataPriv.get( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || Array.isArray( data ) ) { + queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // Clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // Not public - generate a queueHooks object, or return the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { + empty: jQuery.Callbacks( "once memory" ).add( function() { + dataPriv.remove( elem, [ type + "queue", key ] ); + } ) + } ); + } +} ); + +jQuery.fn.extend( { + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[ 0 ], type ); + } + + return data === undefined ? + this : + this.each( function() { + var queue = jQuery.queue( this, type, data ); + + // Ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + } ); + }, + dequeue: function( type ) { + return this.each( function() { + jQuery.dequeue( this, type ); + } ); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +} ); +var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; + +var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); + + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var isHiddenWithinTree = function( elem, el ) { + + // isHiddenWithinTree might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + + // Inline style trumps all + return elem.style.display === "none" || + elem.style.display === "" && + + // Otherwise, check computed style + // Support: Firefox <=43 - 45 + // Disconnected elements can have computed display: none, so first confirm that elem is + // in the document. + jQuery.contains( elem.ownerDocument, elem ) && + + jQuery.css( elem, "display" ) === "none"; + }; + +var swap = function( elem, options, callback, args ) { + var ret, name, + old = {}; + + // Remember the old values, and insert the new ones + for ( name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + ret = callback.apply( elem, args || [] ); + + // Revert the old values + for ( name in options ) { + elem.style[ name ] = old[ name ]; + } + + return ret; +}; + + + + +function adjustCSS( elem, prop, valueParts, tween ) { + var adjusted, + scale = 1, + maxIterations = 20, + currentValue = tween ? + function() { + return tween.cur(); + } : + function() { + return jQuery.css( elem, prop, "" ); + }, + initial = currentValue(), + unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), + + // Starting value computation is required for potential unit mismatches + initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && + rcssNum.exec( jQuery.css( elem, prop ) ); + + if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { + + // Trust units reported by jQuery.css + unit = unit || initialInUnit[ 3 ]; + + // Make sure we update the tween properties later on + valueParts = valueParts || []; + + // Iteratively approximate from a nonzero starting point + initialInUnit = +initial || 1; + + do { + + // If previous iteration zeroed out, double until we get *something*. + // Use string for doubling so we don't accidentally see scale as unchanged below + scale = scale || ".5"; + + // Adjust and apply + initialInUnit = initialInUnit / scale; + jQuery.style( elem, prop, initialInUnit + unit ); + + // Update scale, tolerating zero or NaN from tween.cur() + // Break the loop if scale is unchanged or perfect, or if we've just had enough. + } while ( + scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations + ); + } + + if ( valueParts ) { + initialInUnit = +initialInUnit || +initial || 0; + + // Apply relative offset (+=/-=) if specified + adjusted = valueParts[ 1 ] ? + initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : + +valueParts[ 2 ]; + if ( tween ) { + tween.unit = unit; + tween.start = initialInUnit; + tween.end = adjusted; + } + } + return adjusted; +} + + +var defaultDisplayMap = {}; + +function getDefaultDisplay( elem ) { + var temp, + doc = elem.ownerDocument, + nodeName = elem.nodeName, + display = defaultDisplayMap[ nodeName ]; + + if ( display ) { + return display; + } + + temp = doc.body.appendChild( doc.createElement( nodeName ) ); + display = jQuery.css( temp, "display" ); + + temp.parentNode.removeChild( temp ); + + if ( display === "none" ) { + display = "block"; + } + defaultDisplayMap[ nodeName ] = display; + + return display; +} + +function showHide( elements, show ) { + var display, elem, + values = [], + index = 0, + length = elements.length; + + // Determine new display value for elements that need to change + for ( ; index < length; index++ ) { + elem = elements[ index ]; + if ( !elem.style ) { + continue; + } + + display = elem.style.display; + if ( show ) { + + // Since we force visibility upon cascade-hidden elements, an immediate (and slow) + // check is required in this first loop unless we have a nonempty display value (either + // inline or about-to-be-restored) + if ( display === "none" ) { + values[ index ] = dataPriv.get( elem, "display" ) || null; + if ( !values[ index ] ) { + elem.style.display = ""; + } + } + if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { + values[ index ] = getDefaultDisplay( elem ); + } + } else { + if ( display !== "none" ) { + values[ index ] = "none"; + + // Remember what we're overwriting + dataPriv.set( elem, "display", display ); + } + } + } + + // Set the display of the elements in a second loop to avoid constant reflow + for ( index = 0; index < length; index++ ) { + if ( values[ index ] != null ) { + elements[ index ].style.display = values[ index ]; + } + } + + return elements; +} + +jQuery.fn.extend( { + show: function() { + return showHide( this, true ); + }, + hide: function() { + return showHide( this ); + }, + toggle: function( state ) { + if ( typeof state === "boolean" ) { + return state ? this.show() : this.hide(); + } + + return this.each( function() { + if ( isHiddenWithinTree( this ) ) { + jQuery( this ).show(); + } else { + jQuery( this ).hide(); + } + } ); + } +} ); +var rcheckableType = ( /^(?:checkbox|radio)$/i ); + +var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i ); + +var rscriptType = ( /^$|\/(?:java|ecma)script/i ); + + + +// We have to close these tags to support XHTML (#13200) +var wrapMap = { + + // Support: IE <=9 only + option: [ 1, "" ], + + // XHTML parsers do not magically insert elements in the + // same way that tag soup parsers do. So we cannot shorten + // this by omitting or other required elements. + thead: [ 1, "", "
      " ], + col: [ 2, "", "
      " ], + tr: [ 2, "", "
      " ], + td: [ 3, "", "
      " ], + + _default: [ 0, "", "" ] +}; + +// Support: IE <=9 only +wrapMap.optgroup = wrapMap.option; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + + +function getAll( context, tag ) { + + // Support: IE <=9 - 11 only + // Use typeof to avoid zero-argument method invocation on host objects (#15151) + var ret; + + if ( typeof context.getElementsByTagName !== "undefined" ) { + ret = context.getElementsByTagName( tag || "*" ); + + } else if ( typeof context.querySelectorAll !== "undefined" ) { + ret = context.querySelectorAll( tag || "*" ); + + } else { + ret = []; + } + + if ( tag === undefined || tag && nodeName( context, tag ) ) { + return jQuery.merge( [ context ], ret ); + } + + return ret; +} + + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + dataPriv.set( + elems[ i ], + "globalEval", + !refElements || dataPriv.get( refElements[ i ], "globalEval" ) + ); + } +} + + +var rhtml = /<|&#?\w+;/; + +function buildFragment( elems, context, scripts, selection, ignored ) { + var elem, tmp, tag, wrap, contains, j, + fragment = context.createDocumentFragment(), + nodes = [], + i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( jQuery.type( elem ) === "object" ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); + + // Deserialize a standard representation + tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; + + // Descend through wrappers to the right content + j = wrap[ 0 ]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, tmp.childNodes ); + + // Remember the top-level container + tmp = fragment.firstChild; + + // Ensure the created nodes are orphaned (#12392) + tmp.textContent = ""; + } + } + } + + // Remove wrapper from fragment + fragment.textContent = ""; + + i = 0; + while ( ( elem = nodes[ i++ ] ) ) { + + // Skip elements already in the context collection (trac-4087) + if ( selection && jQuery.inArray( elem, selection ) > -1 ) { + if ( ignored ) { + ignored.push( elem ); + } + continue; + } + + contains = jQuery.contains( elem.ownerDocument, elem ); + + // Append to fragment + tmp = getAll( fragment.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( contains ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( ( elem = tmp[ j++ ] ) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + return fragment; +} + + +( function() { + var fragment = document.createDocumentFragment(), + div = fragment.appendChild( document.createElement( "div" ) ), + input = document.createElement( "input" ); + + // Support: Android 4.0 - 4.3 only + // Check state lost if the name is set (#11217) + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#14901) + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + + // Support: Android <=4.1 only + // Older WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE <=11 only + // Make sure textarea (and checkbox) defaultValue is properly cloned + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; +} )(); +var documentElement = document.documentElement; + + + +var + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +// Support: IE <=9 only +// See #13393 for more info +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +function on( elem, types, selector, data, fn, one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + on( elem, type, selector, data, types[ type ], one ); + } + return elem; + } + + if ( data == null && fn == null ) { + + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return elem; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return elem.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + } ); +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + + var handleObjIn, eventHandle, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.get( elem ); + + // Don't attach events to noData or text/comment nodes (but allow plain objects) + if ( !elemData ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Ensure that invalid selectors throw exceptions at attach time + // Evaluate against documentElement in case elem is a non-element node (e.g., document) + if ( selector ) { + jQuery.find.matchesSelector( documentElement, selector ); + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !( events = elemData.events ) ) { + events = elemData.events = {}; + } + if ( !( eventHandle = elemData.handle ) ) { + eventHandle = elemData.handle = function( e ) { + + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? + jQuery.event.dispatch.apply( elem, arguments ) : undefined; + }; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend( { + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join( "." ) + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !( handlers = events[ type ] ) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener if the special events handler returns false + if ( !special.setup || + special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var j, origCount, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); + + if ( !elemData || !( events = elemData.events ) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[ 2 ] && + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || + selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || + special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove data and the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + dataPriv.remove( elem, "handle events" ); + } + }, + + dispatch: function( nativeEvent ) { + + // Make a writable jQuery.Event from the native event object + var event = jQuery.event.fix( nativeEvent ); + + var i, j, ret, matched, handleObj, handlerQueue, + args = new Array( arguments.length ), + handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[ 0 ] = event; + + for ( i = 1; i < arguments.length; i++ ) { + args[ i ] = arguments[ i ]; + } + + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( ( handleObj = matched.handlers[ j++ ] ) && + !event.isImmediatePropagationStopped() ) { + + // Triggered event must either 1) have no namespace, or 2) have namespace(s) + // a subset or equal to those in the bound event (both can have no namespace). + if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || + handleObj.handler ).apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( ( event.result = ret ) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var i, handleObj, sel, matchedHandlers, matchedSelectors, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Find delegate handlers + if ( delegateCount && + + // Support: IE <=9 + // Black-hole SVG instance trees (trac-13180) + cur.nodeType && + + // Support: Firefox <=42 + // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) + // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click + // Support: IE 11 only + // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) + !( event.type === "click" && event.button >= 1 ) ) { + + for ( ; cur !== this; cur = cur.parentNode || this ) { + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { + matchedHandlers = []; + matchedSelectors = {}; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matchedSelectors[ sel ] === undefined ) { + matchedSelectors[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) > -1 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matchedSelectors[ sel ] ) { + matchedHandlers.push( handleObj ); + } + } + if ( matchedHandlers.length ) { + handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); + } + } + } + } + + // Add the remaining (directly-bound) handlers + cur = this; + if ( delegateCount < handlers.length ) { + handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); + } + + return handlerQueue; + }, + + addProp: function( name, hook ) { + Object.defineProperty( jQuery.Event.prototype, name, { + enumerable: true, + configurable: true, + + get: jQuery.isFunction( hook ) ? + function() { + if ( this.originalEvent ) { + return hook( this.originalEvent ); + } + } : + function() { + if ( this.originalEvent ) { + return this.originalEvent[ name ]; + } + }, + + set: function( value ) { + Object.defineProperty( this, name, { + enumerable: true, + configurable: true, + writable: true, + value: value + } ); + } + } ); + }, + + fix: function( originalEvent ) { + return originalEvent[ jQuery.expando ] ? + originalEvent : + new jQuery.Event( originalEvent ); + }, + + special: { + load: { + + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + focus: { + + // Fire native event if possible so blur/focus sequence is correct + trigger: function() { + if ( this !== safeActiveElement() && this.focus ) { + this.focus(); + return false; + } + }, + delegateType: "focusin" + }, + blur: { + trigger: function() { + if ( this === safeActiveElement() && this.blur ) { + this.blur(); + return false; + } + }, + delegateType: "focusout" + }, + click: { + + // For checkbox, fire native event so checked state will be right + trigger: function() { + if ( this.type === "checkbox" && this.click && nodeName( this, "input" ) ) { + this.click(); + return false; + } + }, + + // For cross-browser consistency, don't fire native .click() on links + _default: function( event ) { + return nodeName( event.target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + } +}; + +jQuery.removeEvent = function( elem, type, handle ) { + + // This "if" is needed for plain objects + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle ); + } +}; + +jQuery.Event = function( src, props ) { + + // Allow instantiation without the 'new' keyword + if ( !( this instanceof jQuery.Event ) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + + // Support: Android <=2.3 only + src.returnValue === false ? + returnTrue : + returnFalse; + + // Create target properties + // Support: Safari <=6 - 7 only + // Target should not be a text node (#504, #13143) + this.target = ( src.target && src.target.nodeType === 3 ) ? + src.target.parentNode : + src.target; + + this.currentTarget = src.currentTarget; + this.relatedTarget = src.relatedTarget; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + constructor: jQuery.Event, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + isSimulated: false, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + + if ( e && !this.isSimulated ) { + e.preventDefault(); + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopPropagation(); + } + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Includes all common event props including KeyEvent and MouseEvent specific props +jQuery.each( { + altKey: true, + bubbles: true, + cancelable: true, + changedTouches: true, + ctrlKey: true, + detail: true, + eventPhase: true, + metaKey: true, + pageX: true, + pageY: true, + shiftKey: true, + view: true, + "char": true, + charCode: true, + key: true, + keyCode: true, + button: true, + buttons: true, + clientX: true, + clientY: true, + offsetX: true, + offsetY: true, + pointerId: true, + pointerType: true, + screenX: true, + screenY: true, + targetTouches: true, + toElement: true, + touches: true, + + which: function( event ) { + var button = event.button; + + // Add which for key events + if ( event.which == null && rkeyEvent.test( event.type ) ) { + return event.charCode != null ? event.charCode : event.keyCode; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { + if ( button & 1 ) { + return 1; + } + + if ( button & 2 ) { + return 3; + } + + if ( button & 4 ) { + return 2; + } + + return 0; + } + + return event.which; + } +}, jQuery.event.addProp ); + +// Create mouseenter/leave events using mouseover/out and event-time checks +// so that event delegation works in jQuery. +// Do the same for pointerenter/pointerleave and pointerover/pointerout +// +// Support: Safari 7 only +// Safari sends mouseenter too often; see: +// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 +// for the description of the bug (it existed in older Chrome versions as well). +jQuery.each( { + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mouseenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +} ); + +jQuery.fn.extend( { + + on: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn ); + }, + one: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? + handleObj.origType + "." + handleObj.namespace : + handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each( function() { + jQuery.event.remove( this, types, fn, selector ); + } ); + } +} ); + + +var + + /* eslint-disable max-len */ + + // See https://github.com/eslint/eslint/issues/3229 + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi, + + /* eslint-enable */ + + // Support: IE <=10 - 11, Edge 12 - 13 + // In IE/Edge using regex groups here causes severe slowdowns. + // See https://connect.microsoft.com/IE/feedback/details/1736512/ + rnoInnerhtml = /\s*$/g; + +// Prefer a tbody over its parent table for containing new rows +function manipulationTarget( elem, content ) { + if ( nodeName( elem, "table" ) && + nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { + + return jQuery( ">tbody", elem )[ 0 ] || elem; + } + + return elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + var match = rscriptTypeMasked.exec( elem.type ); + + if ( match ) { + elem.type = match[ 1 ]; + } else { + elem.removeAttribute( "type" ); + } + + return elem; +} + +function cloneCopyEvent( src, dest ) { + var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; + + if ( dest.nodeType !== 1 ) { + return; + } + + // 1. Copy private data: events, handlers, etc. + if ( dataPriv.hasData( src ) ) { + pdataOld = dataPriv.access( src ); + pdataCur = dataPriv.set( dest, pdataOld ); + events = pdataOld.events; + + if ( events ) { + delete pdataCur.handle; + pdataCur.events = {}; + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + } + + // 2. Copy user data + if ( dataUser.hasData( src ) ) { + udataOld = dataUser.access( src ); + udataCur = jQuery.extend( {}, udataOld ); + + dataUser.set( dest, udataCur ); + } +} + +// Fix IE bugs, see support tests +function fixInput( src, dest ) { + var nodeName = dest.nodeName.toLowerCase(); + + // Fails to persist the checked state of a cloned checkbox or radio button. + if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + dest.checked = src.checked; + + // Fails to return the selected option to the default selected state when cloning options + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +function domManip( collection, args, callback, ignored ) { + + // Flatten any nested arrays + args = concat.apply( [], args ); + + var fragment, first, scripts, hasScripts, node, doc, + i = 0, + l = collection.length, + iNoClone = l - 1, + value = args[ 0 ], + isFunction = jQuery.isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( isFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return collection.each( function( index ) { + var self = collection.eq( index ); + if ( isFunction ) { + args[ 0 ] = value.call( this, index, self.html() ); + } + domManip( self, args, callback, ignored ); + } ); + } + + if ( l ) { + fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + // Require either new content or an interest in ignored elements to invoke the callback + if ( first || ignored ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item + // instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( collection[ i ], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !dataPriv.access( node, "globalEval" ) && + jQuery.contains( doc, node ) ) { + + if ( node.src ) { + + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl ) { + jQuery._evalUrl( node.src ); + } + } else { + DOMEval( node.textContent.replace( rcleanScript, "" ), doc ); + } + } + } + } + } + } + + return collection; +} + +function remove( elem, selector, keepData ) { + var node, + nodes = selector ? jQuery.filter( selector, elem ) : elem, + i = 0; + + for ( ; ( node = nodes[ i ] ) != null; i++ ) { + if ( !keepData && node.nodeType === 1 ) { + jQuery.cleanData( getAll( node ) ); + } + + if ( node.parentNode ) { + if ( keepData && jQuery.contains( node.ownerDocument, node ) ) { + setGlobalEval( getAll( node, "script" ) ); + } + node.parentNode.removeChild( node ); + } + } + + return elem; +} + +jQuery.extend( { + htmlPrefilter: function( html ) { + return html.replace( rxhtmlTag, "<$1>" ); + }, + + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var i, l, srcElements, destElements, + clone = elem.cloneNode( true ), + inPage = jQuery.contains( elem.ownerDocument, elem ); + + // Fix IE cloning issues + if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && + !jQuery.isXMLDoc( elem ) ) { + + // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + fixInput( srcElements[ i ], destElements[ i ] ); + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + cloneCopyEvent( srcElements[ i ], destElements[ i ] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + // Return the cloned set + return clone; + }, + + cleanData: function( elems ) { + var data, elem, type, + special = jQuery.event.special, + i = 0; + + for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { + if ( acceptData( elem ) ) { + if ( ( data = elem[ dataPriv.expando ] ) ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataPriv.expando ] = undefined; + } + if ( elem[ dataUser.expando ] ) { + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataUser.expando ] = undefined; + } + } + } + } +} ); + +jQuery.fn.extend( { + detach: function( selector ) { + return remove( this, selector, true ); + }, + + remove: function( selector ) { + return remove( this, selector ); + }, + + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().each( function() { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + this.textContent = value; + } + } ); + }, null, value, arguments.length ); + }, + + append: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + } ); + }, + + prepend: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + } ); + }, + + before: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + } ); + }, + + after: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + } ); + }, + + empty: function() { + var elem, + i = 0; + + for ( ; ( elem = this[ i ] ) != null; i++ ) { + if ( elem.nodeType === 1 ) { + + // Prevent memory leaks + jQuery.cleanData( getAll( elem, false ) ); + + // Remove any remaining nodes + elem.textContent = ""; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + } ); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined && elem.nodeType === 1 ) { + return elem.innerHTML; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + + value = jQuery.htmlPrefilter( value ); + + try { + for ( ; i < l; i++ ) { + elem = this[ i ] || {}; + + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch ( e ) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var ignored = []; + + // Make the changes, replacing each non-ignored context element with the new content + return domManip( this, arguments, function( elem ) { + var parent = this.parentNode; + + if ( jQuery.inArray( this, ignored ) < 0 ) { + jQuery.cleanData( getAll( this ) ); + if ( parent ) { + parent.replaceChild( elem, this ); + } + } + + // Force callback invocation + }, ignored ); + } +} ); + +jQuery.each( { + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1, + i = 0; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); + + // Support: Android <=4.0 only, PhantomJS 1 only + // .get() because push.apply(_, arraylike) throws on ancient WebKit + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +} ); +var rmargin = ( /^margin/ ); + +var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); + +var getStyles = function( elem ) { + + // Support: IE <=11 only, Firefox <=30 (#15098, #14150) + // IE throws on elements created in popups + // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" + var view = elem.ownerDocument.defaultView; + + if ( !view || !view.opener ) { + view = window; + } + + return view.getComputedStyle( elem ); + }; + + + +( function() { + + // Executing both pixelPosition & boxSizingReliable tests require only one layout + // so they're executed at the same time to save the second computation. + function computeStyleTests() { + + // This is a singleton, we need to execute it only once + if ( !div ) { + return; + } + + div.style.cssText = + "box-sizing:border-box;" + + "position:relative;display:block;" + + "margin:auto;border:1px;padding:1px;" + + "top:1%;width:50%"; + div.innerHTML = ""; + documentElement.appendChild( container ); + + var divStyle = window.getComputedStyle( div ); + pixelPositionVal = divStyle.top !== "1%"; + + // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 + reliableMarginLeftVal = divStyle.marginLeft === "2px"; + boxSizingReliableVal = divStyle.width === "4px"; + + // Support: Android 4.0 - 4.3 only + // Some styles come back with percentage values, even though they shouldn't + div.style.marginRight = "50%"; + pixelMarginRightVal = divStyle.marginRight === "4px"; + + documentElement.removeChild( container ); + + // Nullify the div so it wouldn't be stored in the memory and + // it will also be a sign that checks already performed + div = null; + } + + var pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal, + container = document.createElement( "div" ), + div = document.createElement( "div" ); + + // Finish early in limited (non-browser) environments + if ( !div.style ) { + return; + } + + // Support: IE <=9 - 11 only + // Style of cloned element affects source element cloned (#8908) + div.style.backgroundClip = "content-box"; + div.cloneNode( true ).style.backgroundClip = ""; + support.clearCloneStyle = div.style.backgroundClip === "content-box"; + + container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" + + "padding:0;margin-top:1px;position:absolute"; + container.appendChild( div ); + + jQuery.extend( support, { + pixelPosition: function() { + computeStyleTests(); + return pixelPositionVal; + }, + boxSizingReliable: function() { + computeStyleTests(); + return boxSizingReliableVal; + }, + pixelMarginRight: function() { + computeStyleTests(); + return pixelMarginRightVal; + }, + reliableMarginLeft: function() { + computeStyleTests(); + return reliableMarginLeftVal; + } + } ); +} )(); + + +function curCSS( elem, name, computed ) { + var width, minWidth, maxWidth, ret, + + // Support: Firefox 51+ + // Retrieving style before computed somehow + // fixes an issue with getting wrong values + // on detached elements + style = elem.style; + + computed = computed || getStyles( elem ); + + // getPropertyValue is needed for: + // .css('filter') (IE 9 only, #12537) + // .css('--customProperty) (#3144) + if ( computed ) { + ret = computed.getPropertyValue( name ) || computed[ name ]; + + if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) { + ret = jQuery.style( elem, name ); + } + + // A tribute to the "awesome hack by Dean Edwards" + // Android Browser returns percentage for some values, + // but width seems to be reliably pixels. + // This is against the CSSOM draft spec: + // https://drafts.csswg.org/cssom/#resolved-values + if ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) { + + // Remember the original values + width = style.width; + minWidth = style.minWidth; + maxWidth = style.maxWidth; + + // Put in the new values to get a computed value out + style.minWidth = style.maxWidth = style.width = ret; + ret = computed.width; + + // Revert the changed values + style.width = width; + style.minWidth = minWidth; + style.maxWidth = maxWidth; + } + } + + return ret !== undefined ? + + // Support: IE <=9 - 11 only + // IE returns zIndex value as an integer. + ret + "" : + ret; +} + + +function addGetHookIf( conditionFn, hookFn ) { + + // Define the hook, we'll check on the first run if it's really needed. + return { + get: function() { + if ( conditionFn() ) { + + // Hook not needed (or it's not possible to use it due + // to missing dependency), remove it. + delete this.get; + return; + } + + // Hook needed; redefine it so that the support test is not executed again. + return ( this.get = hookFn ).apply( this, arguments ); + } + }; +} + + +var + + // Swappable if display is none or starts with table + // except "table", "table-cell", or "table-caption" + // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display + rdisplayswap = /^(none|table(?!-c[ea]).+)/, + rcustomProp = /^--/, + cssShow = { position: "absolute", visibility: "hidden", display: "block" }, + cssNormalTransform = { + letterSpacing: "0", + fontWeight: "400" + }, + + cssPrefixes = [ "Webkit", "Moz", "ms" ], + emptyStyle = document.createElement( "div" ).style; + +// Return a css property mapped to a potentially vendor prefixed property +function vendorPropName( name ) { + + // Shortcut for names that are not vendor prefixed + if ( name in emptyStyle ) { + return name; + } + + // Check for vendor prefixed names + var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), + i = cssPrefixes.length; + + while ( i-- ) { + name = cssPrefixes[ i ] + capName; + if ( name in emptyStyle ) { + return name; + } + } +} + +// Return a property mapped along what jQuery.cssProps suggests or to +// a vendor prefixed property. +function finalPropName( name ) { + var ret = jQuery.cssProps[ name ]; + if ( !ret ) { + ret = jQuery.cssProps[ name ] = vendorPropName( name ) || name; + } + return ret; +} + +function setPositiveNumber( elem, value, subtract ) { + + // Any relative (+/-) values have already been + // normalized at this point + var matches = rcssNum.exec( value ); + return matches ? + + // Guard against undefined "subtract", e.g., when used as in cssHooks + Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : + value; +} + +function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) { + var i, + val = 0; + + // If we already have the right measurement, avoid augmentation + if ( extra === ( isBorderBox ? "border" : "content" ) ) { + i = 4; + + // Otherwise initialize for horizontal or vertical properties + } else { + i = name === "width" ? 1 : 0; + } + + for ( ; i < 4; i += 2 ) { + + // Both box models exclude margin, so add it if we want it + if ( extra === "margin" ) { + val += jQuery.css( elem, extra + cssExpand[ i ], true, styles ); + } + + if ( isBorderBox ) { + + // border-box includes padding, so remove it if we want content + if ( extra === "content" ) { + val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + } + + // At this point, extra isn't border nor margin, so remove border + if ( extra !== "margin" ) { + val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } else { + + // At this point, extra isn't content, so add padding + val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + + // At this point, extra isn't content nor padding, so add border + if ( extra !== "padding" ) { + val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } + } + + return val; +} + +function getWidthOrHeight( elem, name, extra ) { + + // Start with computed style + var valueIsBorderBox, + styles = getStyles( elem ), + val = curCSS( elem, name, styles ), + isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; + + // Computed unit is not pixels. Stop here and return. + if ( rnumnonpx.test( val ) ) { + return val; + } + + // Check for style in case a browser which returns unreliable values + // for getComputedStyle silently falls back to the reliable elem.style + valueIsBorderBox = isBorderBox && + ( support.boxSizingReliable() || val === elem.style[ name ] ); + + // Fall back to offsetWidth/Height when value is "auto" + // This happens for inline elements with no explicit setting (gh-3571) + if ( val === "auto" ) { + val = elem[ "offset" + name[ 0 ].toUpperCase() + name.slice( 1 ) ]; + } + + // Normalize "", auto, and prepare for extra + val = parseFloat( val ) || 0; + + // Use the active box-sizing model to add/subtract irrelevant styles + return ( val + + augmentWidthOrHeight( + elem, + name, + extra || ( isBorderBox ? "border" : "content" ), + valueIsBorderBox, + styles + ) + ) + "px"; +} + +jQuery.extend( { + + // Add in style property hooks for overriding the default + // behavior of getting and setting a style property + cssHooks: { + opacity: { + get: function( elem, computed ) { + if ( computed ) { + + // We should always get a number back from opacity + var ret = curCSS( elem, "opacity" ); + return ret === "" ? "1" : ret; + } + } + } + }, + + // Don't automatically add "px" to these possibly-unitless properties + cssNumber: { + "animationIterationCount": true, + "columnCount": true, + "fillOpacity": true, + "flexGrow": true, + "flexShrink": true, + "fontWeight": true, + "lineHeight": true, + "opacity": true, + "order": true, + "orphans": true, + "widows": true, + "zIndex": true, + "zoom": true + }, + + // Add in properties whose names you wish to fix before + // setting or getting the value + cssProps: { + "float": "cssFloat" + }, + + // Get and set the style property on a DOM Node + style: function( elem, name, value, extra ) { + + // Don't set styles on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { + return; + } + + // Make sure that we're working with the right name + var ret, type, hooks, + origName = jQuery.camelCase( name ), + isCustomProp = rcustomProp.test( name ), + style = elem.style; + + // Make sure that we're working with the right name. We don't + // want to query the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Gets hook for the prefixed version, then unprefixed version + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // Check if we're setting a value + if ( value !== undefined ) { + type = typeof value; + + // Convert "+=" or "-=" to relative numbers (#7345) + if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { + value = adjustCSS( elem, name, ret ); + + // Fixes bug #9237 + type = "number"; + } + + // Make sure that null and NaN values aren't set (#7116) + if ( value == null || value !== value ) { + return; + } + + // If a number was passed in, add the unit (except for certain CSS properties) + if ( type === "number" ) { + value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); + } + + // background-* props affect original clone's values + if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { + style[ name ] = "inherit"; + } + + // If a hook was provided, use that value, otherwise just set the specified value + if ( !hooks || !( "set" in hooks ) || + ( value = hooks.set( elem, value, extra ) ) !== undefined ) { + + if ( isCustomProp ) { + style.setProperty( name, value ); + } else { + style[ name ] = value; + } + } + + } else { + + // If a hook was provided get the non-computed value from there + if ( hooks && "get" in hooks && + ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { + + return ret; + } + + // Otherwise just get the value from the style object + return style[ name ]; + } + }, + + css: function( elem, name, extra, styles ) { + var val, num, hooks, + origName = jQuery.camelCase( name ), + isCustomProp = rcustomProp.test( name ); + + // Make sure that we're working with the right name. We don't + // want to modify the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Try prefixed name followed by the unprefixed name + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // If a hook was provided get the computed value from there + if ( hooks && "get" in hooks ) { + val = hooks.get( elem, true, extra ); + } + + // Otherwise, if a way to get the computed value exists, use that + if ( val === undefined ) { + val = curCSS( elem, name, styles ); + } + + // Convert "normal" to computed value + if ( val === "normal" && name in cssNormalTransform ) { + val = cssNormalTransform[ name ]; + } + + // Make numeric if forced or a qualifier was provided and val looks numeric + if ( extra === "" || extra ) { + num = parseFloat( val ); + return extra === true || isFinite( num ) ? num || 0 : val; + } + + return val; + } +} ); + +jQuery.each( [ "height", "width" ], function( i, name ) { + jQuery.cssHooks[ name ] = { + get: function( elem, computed, extra ) { + if ( computed ) { + + // Certain elements can have dimension info if we invisibly show them + // but it must have a current display style that would benefit + return rdisplayswap.test( jQuery.css( elem, "display" ) ) && + + // Support: Safari 8+ + // Table columns in Safari have non-zero offsetWidth & zero + // getBoundingClientRect().width unless display is changed. + // Support: IE <=11 only + // Running getBoundingClientRect on a disconnected node + // in IE throws an error. + ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? + swap( elem, cssShow, function() { + return getWidthOrHeight( elem, name, extra ); + } ) : + getWidthOrHeight( elem, name, extra ); + } + }, + + set: function( elem, value, extra ) { + var matches, + styles = extra && getStyles( elem ), + subtract = extra && augmentWidthOrHeight( + elem, + name, + extra, + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + styles + ); + + // Convert to pixels if value adjustment is needed + if ( subtract && ( matches = rcssNum.exec( value ) ) && + ( matches[ 3 ] || "px" ) !== "px" ) { + + elem.style[ name ] = value; + value = jQuery.css( elem, name ); + } + + return setPositiveNumber( elem, value, subtract ); + } + }; +} ); + +jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, + function( elem, computed ) { + if ( computed ) { + return ( parseFloat( curCSS( elem, "marginLeft" ) ) || + elem.getBoundingClientRect().left - + swap( elem, { marginLeft: 0 }, function() { + return elem.getBoundingClientRect().left; + } ) + ) + "px"; + } + } +); + +// These hooks are used by animate to expand properties +jQuery.each( { + margin: "", + padding: "", + border: "Width" +}, function( prefix, suffix ) { + jQuery.cssHooks[ prefix + suffix ] = { + expand: function( value ) { + var i = 0, + expanded = {}, + + // Assumes a single number if not a string + parts = typeof value === "string" ? value.split( " " ) : [ value ]; + + for ( ; i < 4; i++ ) { + expanded[ prefix + cssExpand[ i ] + suffix ] = + parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; + } + + return expanded; + } + }; + + if ( !rmargin.test( prefix ) ) { + jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; + } +} ); + +jQuery.fn.extend( { + css: function( name, value ) { + return access( this, function( elem, name, value ) { + var styles, len, + map = {}, + i = 0; + + if ( Array.isArray( name ) ) { + styles = getStyles( elem ); + len = name.length; + + for ( ; i < len; i++ ) { + map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); + } + + return map; + } + + return value !== undefined ? + jQuery.style( elem, name, value ) : + jQuery.css( elem, name ); + }, name, value, arguments.length > 1 ); + } +} ); + + +function Tween( elem, options, prop, end, easing ) { + return new Tween.prototype.init( elem, options, prop, end, easing ); +} +jQuery.Tween = Tween; + +Tween.prototype = { + constructor: Tween, + init: function( elem, options, prop, end, easing, unit ) { + this.elem = elem; + this.prop = prop; + this.easing = easing || jQuery.easing._default; + this.options = options; + this.start = this.now = this.cur(); + this.end = end; + this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); + }, + cur: function() { + var hooks = Tween.propHooks[ this.prop ]; + + return hooks && hooks.get ? + hooks.get( this ) : + Tween.propHooks._default.get( this ); + }, + run: function( percent ) { + var eased, + hooks = Tween.propHooks[ this.prop ]; + + if ( this.options.duration ) { + this.pos = eased = jQuery.easing[ this.easing ]( + percent, this.options.duration * percent, 0, 1, this.options.duration + ); + } else { + this.pos = eased = percent; + } + this.now = ( this.end - this.start ) * eased + this.start; + + if ( this.options.step ) { + this.options.step.call( this.elem, this.now, this ); + } + + if ( hooks && hooks.set ) { + hooks.set( this ); + } else { + Tween.propHooks._default.set( this ); + } + return this; + } +}; + +Tween.prototype.init.prototype = Tween.prototype; + +Tween.propHooks = { + _default: { + get: function( tween ) { + var result; + + // Use a property on the element directly when it is not a DOM element, + // or when there is no matching style property that exists. + if ( tween.elem.nodeType !== 1 || + tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { + return tween.elem[ tween.prop ]; + } + + // Passing an empty string as a 3rd parameter to .css will automatically + // attempt a parseFloat and fallback to a string if the parse fails. + // Simple values such as "10px" are parsed to Float; + // complex values such as "rotate(1rad)" are returned as-is. + result = jQuery.css( tween.elem, tween.prop, "" ); + + // Empty strings, null, undefined and "auto" are converted to 0. + return !result || result === "auto" ? 0 : result; + }, + set: function( tween ) { + + // Use step hook for back compat. + // Use cssHook if its there. + // Use .style if available and use plain properties where available. + if ( jQuery.fx.step[ tween.prop ] ) { + jQuery.fx.step[ tween.prop ]( tween ); + } else if ( tween.elem.nodeType === 1 && + ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || + jQuery.cssHooks[ tween.prop ] ) ) { + jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); + } else { + tween.elem[ tween.prop ] = tween.now; + } + } + } +}; + +// Support: IE <=9 only +// Panic based approach to setting things on disconnected nodes +Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { + set: function( tween ) { + if ( tween.elem.nodeType && tween.elem.parentNode ) { + tween.elem[ tween.prop ] = tween.now; + } + } +}; + +jQuery.easing = { + linear: function( p ) { + return p; + }, + swing: function( p ) { + return 0.5 - Math.cos( p * Math.PI ) / 2; + }, + _default: "swing" +}; + +jQuery.fx = Tween.prototype.init; + +// Back compat <1.8 extension point +jQuery.fx.step = {}; + + + + +var + fxNow, inProgress, + rfxtypes = /^(?:toggle|show|hide)$/, + rrun = /queueHooks$/; + +function schedule() { + if ( inProgress ) { + if ( document.hidden === false && window.requestAnimationFrame ) { + window.requestAnimationFrame( schedule ); + } else { + window.setTimeout( schedule, jQuery.fx.interval ); + } + + jQuery.fx.tick(); + } +} + +// Animations created synchronously will run synchronously +function createFxNow() { + window.setTimeout( function() { + fxNow = undefined; + } ); + return ( fxNow = jQuery.now() ); +} + +// Generate parameters to create a standard animation +function genFx( type, includeWidth ) { + var which, + i = 0, + attrs = { height: type }; + + // If we include width, step value is 1 to do all cssExpand values, + // otherwise step value is 2 to skip over Left and Right + includeWidth = includeWidth ? 1 : 0; + for ( ; i < 4; i += 2 - includeWidth ) { + which = cssExpand[ i ]; + attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; + } + + if ( includeWidth ) { + attrs.opacity = attrs.width = type; + } + + return attrs; +} + +function createTween( value, prop, animation ) { + var tween, + collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), + index = 0, + length = collection.length; + for ( ; index < length; index++ ) { + if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { + + // We're done with this property + return tween; + } + } +} + +function defaultPrefilter( elem, props, opts ) { + var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, + isBox = "width" in props || "height" in props, + anim = this, + orig = {}, + style = elem.style, + hidden = elem.nodeType && isHiddenWithinTree( elem ), + dataShow = dataPriv.get( elem, "fxshow" ); + + // Queue-skipping animations hijack the fx hooks + if ( !opts.queue ) { + hooks = jQuery._queueHooks( elem, "fx" ); + if ( hooks.unqueued == null ) { + hooks.unqueued = 0; + oldfire = hooks.empty.fire; + hooks.empty.fire = function() { + if ( !hooks.unqueued ) { + oldfire(); + } + }; + } + hooks.unqueued++; + + anim.always( function() { + + // Ensure the complete handler is called before this completes + anim.always( function() { + hooks.unqueued--; + if ( !jQuery.queue( elem, "fx" ).length ) { + hooks.empty.fire(); + } + } ); + } ); + } + + // Detect show/hide animations + for ( prop in props ) { + value = props[ prop ]; + if ( rfxtypes.test( value ) ) { + delete props[ prop ]; + toggle = toggle || value === "toggle"; + if ( value === ( hidden ? "hide" : "show" ) ) { + + // Pretend to be hidden if this is a "show" and + // there is still data from a stopped show/hide + if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { + hidden = true; + + // Ignore all other no-op show/hide data + } else { + continue; + } + } + orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); + } + } + + // Bail out if this is a no-op like .hide().hide() + propTween = !jQuery.isEmptyObject( props ); + if ( !propTween && jQuery.isEmptyObject( orig ) ) { + return; + } + + // Restrict "overflow" and "display" styles during box animations + if ( isBox && elem.nodeType === 1 ) { + + // Support: IE <=9 - 11, Edge 12 - 13 + // Record all 3 overflow attributes because IE does not infer the shorthand + // from identically-valued overflowX and overflowY + opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; + + // Identify a display type, preferring old show/hide data over the CSS cascade + restoreDisplay = dataShow && dataShow.display; + if ( restoreDisplay == null ) { + restoreDisplay = dataPriv.get( elem, "display" ); + } + display = jQuery.css( elem, "display" ); + if ( display === "none" ) { + if ( restoreDisplay ) { + display = restoreDisplay; + } else { + + // Get nonempty value(s) by temporarily forcing visibility + showHide( [ elem ], true ); + restoreDisplay = elem.style.display || restoreDisplay; + display = jQuery.css( elem, "display" ); + showHide( [ elem ] ); + } + } + + // Animate inline elements as inline-block + if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { + if ( jQuery.css( elem, "float" ) === "none" ) { + + // Restore the original display value at the end of pure show/hide animations + if ( !propTween ) { + anim.done( function() { + style.display = restoreDisplay; + } ); + if ( restoreDisplay == null ) { + display = style.display; + restoreDisplay = display === "none" ? "" : display; + } + } + style.display = "inline-block"; + } + } + } + + if ( opts.overflow ) { + style.overflow = "hidden"; + anim.always( function() { + style.overflow = opts.overflow[ 0 ]; + style.overflowX = opts.overflow[ 1 ]; + style.overflowY = opts.overflow[ 2 ]; + } ); + } + + // Implement show/hide animations + propTween = false; + for ( prop in orig ) { + + // General show/hide setup for this element animation + if ( !propTween ) { + if ( dataShow ) { + if ( "hidden" in dataShow ) { + hidden = dataShow.hidden; + } + } else { + dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); + } + + // Store hidden/visible for toggle so `.stop().toggle()` "reverses" + if ( toggle ) { + dataShow.hidden = !hidden; + } + + // Show elements before animating them + if ( hidden ) { + showHide( [ elem ], true ); + } + + /* eslint-disable no-loop-func */ + + anim.done( function() { + + /* eslint-enable no-loop-func */ + + // The final step of a "hide" animation is actually hiding the element + if ( !hidden ) { + showHide( [ elem ] ); + } + dataPriv.remove( elem, "fxshow" ); + for ( prop in orig ) { + jQuery.style( elem, prop, orig[ prop ] ); + } + } ); + } + + // Per-property setup + propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); + if ( !( prop in dataShow ) ) { + dataShow[ prop ] = propTween.start; + if ( hidden ) { + propTween.end = propTween.start; + propTween.start = 0; + } + } + } +} + +function propFilter( props, specialEasing ) { + var index, name, easing, value, hooks; + + // camelCase, specialEasing and expand cssHook pass + for ( index in props ) { + name = jQuery.camelCase( index ); + easing = specialEasing[ name ]; + value = props[ index ]; + if ( Array.isArray( value ) ) { + easing = value[ 1 ]; + value = props[ index ] = value[ 0 ]; + } + + if ( index !== name ) { + props[ name ] = value; + delete props[ index ]; + } + + hooks = jQuery.cssHooks[ name ]; + if ( hooks && "expand" in hooks ) { + value = hooks.expand( value ); + delete props[ name ]; + + // Not quite $.extend, this won't overwrite existing keys. + // Reusing 'index' because we have the correct "name" + for ( index in value ) { + if ( !( index in props ) ) { + props[ index ] = value[ index ]; + specialEasing[ index ] = easing; + } + } + } else { + specialEasing[ name ] = easing; + } + } +} + +function Animation( elem, properties, options ) { + var result, + stopped, + index = 0, + length = Animation.prefilters.length, + deferred = jQuery.Deferred().always( function() { + + // Don't match elem in the :animated selector + delete tick.elem; + } ), + tick = function() { + if ( stopped ) { + return false; + } + var currentTime = fxNow || createFxNow(), + remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), + + // Support: Android 2.3 only + // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) + temp = remaining / animation.duration || 0, + percent = 1 - temp, + index = 0, + length = animation.tweens.length; + + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( percent ); + } + + deferred.notifyWith( elem, [ animation, percent, remaining ] ); + + // If there's more to do, yield + if ( percent < 1 && length ) { + return remaining; + } + + // If this was an empty animation, synthesize a final progress notification + if ( !length ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + } + + // Resolve the animation and report its conclusion + deferred.resolveWith( elem, [ animation ] ); + return false; + }, + animation = deferred.promise( { + elem: elem, + props: jQuery.extend( {}, properties ), + opts: jQuery.extend( true, { + specialEasing: {}, + easing: jQuery.easing._default + }, options ), + originalProperties: properties, + originalOptions: options, + startTime: fxNow || createFxNow(), + duration: options.duration, + tweens: [], + createTween: function( prop, end ) { + var tween = jQuery.Tween( elem, animation.opts, prop, end, + animation.opts.specialEasing[ prop ] || animation.opts.easing ); + animation.tweens.push( tween ); + return tween; + }, + stop: function( gotoEnd ) { + var index = 0, + + // If we are going to the end, we want to run all the tweens + // otherwise we skip this part + length = gotoEnd ? animation.tweens.length : 0; + if ( stopped ) { + return this; + } + stopped = true; + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( 1 ); + } + + // Resolve when we played the last frame; otherwise, reject + if ( gotoEnd ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + deferred.resolveWith( elem, [ animation, gotoEnd ] ); + } else { + deferred.rejectWith( elem, [ animation, gotoEnd ] ); + } + return this; + } + } ), + props = animation.props; + + propFilter( props, animation.opts.specialEasing ); + + for ( ; index < length; index++ ) { + result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); + if ( result ) { + if ( jQuery.isFunction( result.stop ) ) { + jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = + jQuery.proxy( result.stop, result ); + } + return result; + } + } + + jQuery.map( props, createTween, animation ); + + if ( jQuery.isFunction( animation.opts.start ) ) { + animation.opts.start.call( elem, animation ); + } + + // Attach callbacks from options + animation + .progress( animation.opts.progress ) + .done( animation.opts.done, animation.opts.complete ) + .fail( animation.opts.fail ) + .always( animation.opts.always ); + + jQuery.fx.timer( + jQuery.extend( tick, { + elem: elem, + anim: animation, + queue: animation.opts.queue + } ) + ); + + return animation; +} + +jQuery.Animation = jQuery.extend( Animation, { + + tweeners: { + "*": [ function( prop, value ) { + var tween = this.createTween( prop, value ); + adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); + return tween; + } ] + }, + + tweener: function( props, callback ) { + if ( jQuery.isFunction( props ) ) { + callback = props; + props = [ "*" ]; + } else { + props = props.match( rnothtmlwhite ); + } + + var prop, + index = 0, + length = props.length; + + for ( ; index < length; index++ ) { + prop = props[ index ]; + Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; + Animation.tweeners[ prop ].unshift( callback ); + } + }, + + prefilters: [ defaultPrefilter ], + + prefilter: function( callback, prepend ) { + if ( prepend ) { + Animation.prefilters.unshift( callback ); + } else { + Animation.prefilters.push( callback ); + } + } +} ); + +jQuery.speed = function( speed, easing, fn ) { + var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { + complete: fn || !fn && easing || + jQuery.isFunction( speed ) && speed, + duration: speed, + easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing + }; + + // Go to the end state if fx are off + if ( jQuery.fx.off ) { + opt.duration = 0; + + } else { + if ( typeof opt.duration !== "number" ) { + if ( opt.duration in jQuery.fx.speeds ) { + opt.duration = jQuery.fx.speeds[ opt.duration ]; + + } else { + opt.duration = jQuery.fx.speeds._default; + } + } + } + + // Normalize opt.queue - true/undefined/null -> "fx" + if ( opt.queue == null || opt.queue === true ) { + opt.queue = "fx"; + } + + // Queueing + opt.old = opt.complete; + + opt.complete = function() { + if ( jQuery.isFunction( opt.old ) ) { + opt.old.call( this ); + } + + if ( opt.queue ) { + jQuery.dequeue( this, opt.queue ); + } + }; + + return opt; +}; + +jQuery.fn.extend( { + fadeTo: function( speed, to, easing, callback ) { + + // Show any hidden elements after setting opacity to 0 + return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() + + // Animate to the value specified + .end().animate( { opacity: to }, speed, easing, callback ); + }, + animate: function( prop, speed, easing, callback ) { + var empty = jQuery.isEmptyObject( prop ), + optall = jQuery.speed( speed, easing, callback ), + doAnimation = function() { + + // Operate on a copy of prop so per-property easing won't be lost + var anim = Animation( this, jQuery.extend( {}, prop ), optall ); + + // Empty animations, or finishing resolves immediately + if ( empty || dataPriv.get( this, "finish" ) ) { + anim.stop( true ); + } + }; + doAnimation.finish = doAnimation; + + return empty || optall.queue === false ? + this.each( doAnimation ) : + this.queue( optall.queue, doAnimation ); + }, + stop: function( type, clearQueue, gotoEnd ) { + var stopQueue = function( hooks ) { + var stop = hooks.stop; + delete hooks.stop; + stop( gotoEnd ); + }; + + if ( typeof type !== "string" ) { + gotoEnd = clearQueue; + clearQueue = type; + type = undefined; + } + if ( clearQueue && type !== false ) { + this.queue( type || "fx", [] ); + } + + return this.each( function() { + var dequeue = true, + index = type != null && type + "queueHooks", + timers = jQuery.timers, + data = dataPriv.get( this ); + + if ( index ) { + if ( data[ index ] && data[ index ].stop ) { + stopQueue( data[ index ] ); + } + } else { + for ( index in data ) { + if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { + stopQueue( data[ index ] ); + } + } + } + + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && + ( type == null || timers[ index ].queue === type ) ) { + + timers[ index ].anim.stop( gotoEnd ); + dequeue = false; + timers.splice( index, 1 ); + } + } + + // Start the next in the queue if the last step wasn't forced. + // Timers currently will call their complete callbacks, which + // will dequeue but only if they were gotoEnd. + if ( dequeue || !gotoEnd ) { + jQuery.dequeue( this, type ); + } + } ); + }, + finish: function( type ) { + if ( type !== false ) { + type = type || "fx"; + } + return this.each( function() { + var index, + data = dataPriv.get( this ), + queue = data[ type + "queue" ], + hooks = data[ type + "queueHooks" ], + timers = jQuery.timers, + length = queue ? queue.length : 0; + + // Enable finishing flag on private data + data.finish = true; + + // Empty the queue first + jQuery.queue( this, type, [] ); + + if ( hooks && hooks.stop ) { + hooks.stop.call( this, true ); + } + + // Look for any active animations, and finish them + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && timers[ index ].queue === type ) { + timers[ index ].anim.stop( true ); + timers.splice( index, 1 ); + } + } + + // Look for any animations in the old queue and finish them + for ( index = 0; index < length; index++ ) { + if ( queue[ index ] && queue[ index ].finish ) { + queue[ index ].finish.call( this ); + } + } + + // Turn off finishing flag + delete data.finish; + } ); + } +} ); + +jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) { + var cssFn = jQuery.fn[ name ]; + jQuery.fn[ name ] = function( speed, easing, callback ) { + return speed == null || typeof speed === "boolean" ? + cssFn.apply( this, arguments ) : + this.animate( genFx( name, true ), speed, easing, callback ); + }; +} ); + +// Generate shortcuts for custom animations +jQuery.each( { + slideDown: genFx( "show" ), + slideUp: genFx( "hide" ), + slideToggle: genFx( "toggle" ), + fadeIn: { opacity: "show" }, + fadeOut: { opacity: "hide" }, + fadeToggle: { opacity: "toggle" } +}, function( name, props ) { + jQuery.fn[ name ] = function( speed, easing, callback ) { + return this.animate( props, speed, easing, callback ); + }; +} ); + +jQuery.timers = []; +jQuery.fx.tick = function() { + var timer, + i = 0, + timers = jQuery.timers; + + fxNow = jQuery.now(); + + for ( ; i < timers.length; i++ ) { + timer = timers[ i ]; + + // Run the timer and safely remove it when done (allowing for external removal) + if ( !timer() && timers[ i ] === timer ) { + timers.splice( i--, 1 ); + } + } + + if ( !timers.length ) { + jQuery.fx.stop(); + } + fxNow = undefined; +}; + +jQuery.fx.timer = function( timer ) { + jQuery.timers.push( timer ); + jQuery.fx.start(); +}; + +jQuery.fx.interval = 13; +jQuery.fx.start = function() { + if ( inProgress ) { + return; + } + + inProgress = true; + schedule(); +}; + +jQuery.fx.stop = function() { + inProgress = null; +}; + +jQuery.fx.speeds = { + slow: 600, + fast: 200, + + // Default speed + _default: 400 +}; + + +// Based off of the plugin by Clint Helfers, with permission. +// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ +jQuery.fn.delay = function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; + type = type || "fx"; + + return this.queue( type, function( next, hooks ) { + var timeout = window.setTimeout( next, time ); + hooks.stop = function() { + window.clearTimeout( timeout ); + }; + } ); +}; + + +( function() { + var input = document.createElement( "input" ), + select = document.createElement( "select" ), + opt = select.appendChild( document.createElement( "option" ) ); + + input.type = "checkbox"; + + // Support: Android <=4.3 only + // Default value for a checkbox should be "on" + support.checkOn = input.value !== ""; + + // Support: IE <=11 only + // Must access selectedIndex to make default options select + support.optSelected = opt.selected; + + // Support: IE <=11 only + // An input loses its value after becoming a radio + input = document.createElement( "input" ); + input.value = "t"; + input.type = "radio"; + support.radioValue = input.value === "t"; +} )(); + + +var boolHook, + attrHandle = jQuery.expr.attrHandle; + +jQuery.fn.extend( { + attr: function( name, value ) { + return access( this, jQuery.attr, name, value, arguments.length > 1 ); + }, + + removeAttr: function( name ) { + return this.each( function() { + jQuery.removeAttr( this, name ); + } ); + } +} ); + +jQuery.extend( { + attr: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set attributes on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + // Fallback to prop when attributes are not supported + if ( typeof elem.getAttribute === "undefined" ) { + return jQuery.prop( elem, name, value ); + } + + // Attribute hooks are determined by the lowercase version + // Grab necessary hook if one is defined + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + hooks = jQuery.attrHooks[ name.toLowerCase() ] || + ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); + } + + if ( value !== undefined ) { + if ( value === null ) { + jQuery.removeAttr( elem, name ); + return; + } + + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + elem.setAttribute( name, value + "" ); + return value; + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + ret = jQuery.find.attr( elem, name ); + + // Non-existent attributes return null, we normalize to undefined + return ret == null ? undefined : ret; + }, + + attrHooks: { + type: { + set: function( elem, value ) { + if ( !support.radioValue && value === "radio" && + nodeName( elem, "input" ) ) { + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + } + }, + + removeAttr: function( elem, value ) { + var name, + i = 0, + + // Attribute names can contain non-HTML whitespace characters + // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 + attrNames = value && value.match( rnothtmlwhite ); + + if ( attrNames && elem.nodeType === 1 ) { + while ( ( name = attrNames[ i++ ] ) ) { + elem.removeAttribute( name ); + } + } + } +} ); + +// Hooks for boolean attributes +boolHook = { + set: function( elem, value, name ) { + if ( value === false ) { + + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else { + elem.setAttribute( name, name ); + } + return name; + } +}; + +jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) { + var getter = attrHandle[ name ] || jQuery.find.attr; + + attrHandle[ name ] = function( elem, name, isXML ) { + var ret, handle, + lowercaseName = name.toLowerCase(); + + if ( !isXML ) { + + // Avoid an infinite loop by temporarily removing this function from the getter + handle = attrHandle[ lowercaseName ]; + attrHandle[ lowercaseName ] = ret; + ret = getter( elem, name, isXML ) != null ? + lowercaseName : + null; + attrHandle[ lowercaseName ] = handle; + } + return ret; + }; +} ); + + + + +var rfocusable = /^(?:input|select|textarea|button)$/i, + rclickable = /^(?:a|area)$/i; + +jQuery.fn.extend( { + prop: function( name, value ) { + return access( this, jQuery.prop, name, value, arguments.length > 1 ); + }, + + removeProp: function( name ) { + return this.each( function() { + delete this[ jQuery.propFix[ name ] || name ]; + } ); + } +} ); + +jQuery.extend( { + prop: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set properties on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + return ( elem[ name ] = value ); + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + return elem[ name ]; + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + + // Support: IE <=9 - 11 only + // elem.tabIndex doesn't always return the + // correct value when it hasn't been explicitly set + // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + // Use proper attribute retrieval(#12072) + var tabindex = jQuery.find.attr( elem, "tabindex" ); + + if ( tabindex ) { + return parseInt( tabindex, 10 ); + } + + if ( + rfocusable.test( elem.nodeName ) || + rclickable.test( elem.nodeName ) && + elem.href + ) { + return 0; + } + + return -1; + } + } + }, + + propFix: { + "for": "htmlFor", + "class": "className" + } +} ); + +// Support: IE <=11 only +// Accessing the selectedIndex property +// forces the browser to respect setting selected +// on the option +// The getter ensures a default option is selected +// when in an optgroup +// eslint rule "no-unused-expressions" is disabled for this code +// since it considers such accessions noop +if ( !support.optSelected ) { + jQuery.propHooks.selected = { + get: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent && parent.parentNode ) { + parent.parentNode.selectedIndex; + } + return null; + }, + set: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent ) { + parent.selectedIndex; + + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + } + }; +} + +jQuery.each( [ + "tabIndex", + "readOnly", + "maxLength", + "cellSpacing", + "cellPadding", + "rowSpan", + "colSpan", + "useMap", + "frameBorder", + "contentEditable" +], function() { + jQuery.propFix[ this.toLowerCase() ] = this; +} ); + + + + + // Strip and collapse whitespace according to HTML spec + // https://html.spec.whatwg.org/multipage/infrastructure.html#strip-and-collapse-whitespace + function stripAndCollapse( value ) { + var tokens = value.match( rnothtmlwhite ) || []; + return tokens.join( " " ); + } + + +function getClass( elem ) { + return elem.getAttribute && elem.getAttribute( "class" ) || ""; +} + +jQuery.fn.extend( { + addClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( jQuery.isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + if ( typeof value === "string" && value ) { + classes = value.match( rnothtmlwhite ) || []; + + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + if ( cur.indexOf( " " + clazz + " " ) < 0 ) { + cur += clazz + " "; + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( jQuery.isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + if ( !arguments.length ) { + return this.attr( "class", "" ); + } + + if ( typeof value === "string" && value ) { + classes = value.match( rnothtmlwhite ) || []; + + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + + // This expression is here for better compressibility (see addClass) + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + + // Remove *all* instances + while ( cur.indexOf( " " + clazz + " " ) > -1 ) { + cur = cur.replace( " " + clazz + " ", " " ); + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value; + + if ( typeof stateVal === "boolean" && type === "string" ) { + return stateVal ? this.addClass( value ) : this.removeClass( value ); + } + + if ( jQuery.isFunction( value ) ) { + return this.each( function( i ) { + jQuery( this ).toggleClass( + value.call( this, i, getClass( this ), stateVal ), + stateVal + ); + } ); + } + + return this.each( function() { + var className, i, self, classNames; + + if ( type === "string" ) { + + // Toggle individual class names + i = 0; + self = jQuery( this ); + classNames = value.match( rnothtmlwhite ) || []; + + while ( ( className = classNames[ i++ ] ) ) { + + // Check each className given, space separated list + if ( self.hasClass( className ) ) { + self.removeClass( className ); + } else { + self.addClass( className ); + } + } + + // Toggle whole class name + } else if ( value === undefined || type === "boolean" ) { + className = getClass( this ); + if ( className ) { + + // Store className if set + dataPriv.set( this, "__className__", className ); + } + + // If the element has a class name or if we're passed `false`, + // then remove the whole classname (if there was one, the above saved it). + // Otherwise bring back whatever was previously saved (if anything), + // falling back to the empty string if nothing was stored. + if ( this.setAttribute ) { + this.setAttribute( "class", + className || value === false ? + "" : + dataPriv.get( this, "__className__" ) || "" + ); + } + } + } ); + }, + + hasClass: function( selector ) { + var className, elem, + i = 0; + + className = " " + selector + " "; + while ( ( elem = this[ i++ ] ) ) { + if ( elem.nodeType === 1 && + ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { + return true; + } + } + + return false; + } +} ); + + + + +var rreturn = /\r/g; + +jQuery.fn.extend( { + val: function( value ) { + var hooks, ret, isFunction, + elem = this[ 0 ]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.type ] || + jQuery.valHooks[ elem.nodeName.toLowerCase() ]; + + if ( hooks && + "get" in hooks && + ( ret = hooks.get( elem, "value" ) ) !== undefined + ) { + return ret; + } + + ret = elem.value; + + // Handle most common string cases + if ( typeof ret === "string" ) { + return ret.replace( rreturn, "" ); + } + + // Handle cases where value is null/undef or number + return ret == null ? "" : ret; + } + + return; + } + + isFunction = jQuery.isFunction( value ); + + return this.each( function( i ) { + var val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( isFunction ) { + val = value.call( this, i, jQuery( this ).val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + + } else if ( typeof val === "number" ) { + val += ""; + + } else if ( Array.isArray( val ) ) { + val = jQuery.map( val, function( value ) { + return value == null ? "" : value + ""; + } ); + } + + hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + } ); + } +} ); + +jQuery.extend( { + valHooks: { + option: { + get: function( elem ) { + + var val = jQuery.find.attr( elem, "value" ); + return val != null ? + val : + + // Support: IE <=10 - 11 only + // option.text throws exceptions (#14686, #14858) + // Strip and collapse whitespace + // https://html.spec.whatwg.org/#strip-and-collapse-whitespace + stripAndCollapse( jQuery.text( elem ) ); + } + }, + select: { + get: function( elem ) { + var value, option, i, + options = elem.options, + index = elem.selectedIndex, + one = elem.type === "select-one", + values = one ? null : [], + max = one ? index + 1 : options.length; + + if ( index < 0 ) { + i = max; + + } else { + i = one ? index : 0; + } + + // Loop through all the selected options + for ( ; i < max; i++ ) { + option = options[ i ]; + + // Support: IE <=9 only + // IE8-9 doesn't update selected after form reset (#2551) + if ( ( option.selected || i === index ) && + + // Don't return options that are disabled or in a disabled optgroup + !option.disabled && + ( !option.parentNode.disabled || + !nodeName( option.parentNode, "optgroup" ) ) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + }, + + set: function( elem, value ) { + var optionSet, option, + options = elem.options, + values = jQuery.makeArray( value ), + i = options.length; + + while ( i-- ) { + option = options[ i ]; + + /* eslint-disable no-cond-assign */ + + if ( option.selected = + jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 + ) { + optionSet = true; + } + + /* eslint-enable no-cond-assign */ + } + + // Force browsers to behave consistently when non-matching value is set + if ( !optionSet ) { + elem.selectedIndex = -1; + } + return values; + } + } + } +} ); + +// Radios and checkboxes getter/setter +jQuery.each( [ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + set: function( elem, value ) { + if ( Array.isArray( value ) ) { + return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); + } + } + }; + if ( !support.checkOn ) { + jQuery.valHooks[ this ].get = function( elem ) { + return elem.getAttribute( "value" ) === null ? "on" : elem.value; + }; + } +} ); + + + + +// Return jQuery for attributes-only inclusion + + +var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/; + +jQuery.extend( jQuery.event, { + + trigger: function( event, data, elem, onlyHandlers ) { + + var i, cur, tmp, bubbleType, ontype, handle, special, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; + + cur = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "." ) > -1 ) { + + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split( "." ); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf( ":" ) < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join( "." ); + event.rnamespace = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === ( elem.ownerDocument || document ) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { + + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] && + dataPriv.get( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( ( !special._default || + special._default.apply( eventPath.pop(), data ) === false ) && + acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name as the event. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + elem[ type ](); + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + // Piggyback on a donor event to simulate a different one + // Used only for `focus(in | out)` events + simulate: function( type, elem, event ) { + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true + } + ); + + jQuery.event.trigger( e, null, elem ); + } + +} ); + +jQuery.fn.extend( { + + trigger: function( type, data ) { + return this.each( function() { + jQuery.event.trigger( type, data, this ); + } ); + }, + triggerHandler: function( type, data ) { + var elem = this[ 0 ]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +} ); + + +jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " + + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + + "change select submit keydown keypress keyup contextmenu" ).split( " " ), + function( i, name ) { + + // Handle event binding + jQuery.fn[ name ] = function( data, fn ) { + return arguments.length > 0 ? + this.on( name, null, data, fn ) : + this.trigger( name ); + }; +} ); + +jQuery.fn.extend( { + hover: function( fnOver, fnOut ) { + return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); + } +} ); + + + + +support.focusin = "onfocusin" in window; + + +// Support: Firefox <=44 +// Firefox doesn't have focus(in | out) events +// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 +// +// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 +// focus(in | out) events fire after focus & blur events, +// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order +// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 +if ( !support.focusin ) { + jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler on the document while someone wants focusin/focusout + var handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + var doc = this.ownerDocument || this, + attaches = dataPriv.access( doc, fix ); + + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); + } + dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this, + attaches = dataPriv.access( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + dataPriv.remove( doc, fix ); + + } else { + dataPriv.access( doc, fix, attaches ); + } + } + }; + } ); +} +var location = window.location; + +var nonce = jQuery.now(); + +var rquery = ( /\?/ ); + + + +// Cross-browser xml parsing +jQuery.parseXML = function( data ) { + var xml; + if ( !data || typeof data !== "string" ) { + return null; + } + + // Support: IE 9 - 11 only + // IE throws on parseFromString with invalid input. + try { + xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); + } catch ( e ) { + xml = undefined; + } + + if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { + jQuery.error( "Invalid XML: " + data ); + } + return xml; +}; + + +var + rbracket = /\[\]$/, + rCRLF = /\r?\n/g, + rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, + rsubmittable = /^(?:input|select|textarea|keygen)/i; + +function buildParams( prefix, obj, traditional, add ) { + var name; + + if ( Array.isArray( obj ) ) { + + // Serialize array item. + jQuery.each( obj, function( i, v ) { + if ( traditional || rbracket.test( prefix ) ) { + + // Treat each array item as a scalar. + add( prefix, v ); + + } else { + + // Item is non-scalar (array or object), encode its numeric index. + buildParams( + prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", + v, + traditional, + add + ); + } + } ); + + } else if ( !traditional && jQuery.type( obj ) === "object" ) { + + // Serialize object item. + for ( name in obj ) { + buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); + } + + } else { + + // Serialize scalar item. + add( prefix, obj ); + } +} + +// Serialize an array of form elements or a set of +// key/values into a query string +jQuery.param = function( a, traditional ) { + var prefix, + s = [], + add = function( key, valueOrFunction ) { + + // If value is a function, invoke it and use its return value + var value = jQuery.isFunction( valueOrFunction ) ? + valueOrFunction() : + valueOrFunction; + + s[ s.length ] = encodeURIComponent( key ) + "=" + + encodeURIComponent( value == null ? "" : value ); + }; + + // If an array was passed in, assume that it is an array of form elements. + if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { + + // Serialize the form elements + jQuery.each( a, function() { + add( this.name, this.value ); + } ); + + } else { + + // If traditional, encode the "old" way (the way 1.3.2 or older + // did it), otherwise encode params recursively. + for ( prefix in a ) { + buildParams( prefix, a[ prefix ], traditional, add ); + } + } + + // Return the resulting serialization + return s.join( "&" ); +}; + +jQuery.fn.extend( { + serialize: function() { + return jQuery.param( this.serializeArray() ); + }, + serializeArray: function() { + return this.map( function() { + + // Can add propHook for "elements" to filter or add form elements + var elements = jQuery.prop( this, "elements" ); + return elements ? jQuery.makeArray( elements ) : this; + } ) + .filter( function() { + var type = this.type; + + // Use .is( ":disabled" ) so that fieldset[disabled] works + return this.name && !jQuery( this ).is( ":disabled" ) && + rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && + ( this.checked || !rcheckableType.test( type ) ); + } ) + .map( function( i, elem ) { + var val = jQuery( this ).val(); + + if ( val == null ) { + return null; + } + + if ( Array.isArray( val ) ) { + return jQuery.map( val, function( val ) { + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ); + } + + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ).get(); + } +} ); + + +var + r20 = /%20/g, + rhash = /#.*$/, + rantiCache = /([?&])_=[^&]*/, + rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, + + // #7653, #8125, #8152: local protocol detection + rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, + rnoContent = /^(?:GET|HEAD)$/, + rprotocol = /^\/\//, + + /* Prefilters + * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) + * 2) These are called: + * - BEFORE asking for a transport + * - AFTER param serialization (s.data is a string if s.processData is true) + * 3) key is the dataType + * 4) the catchall symbol "*" can be used + * 5) execution will start with transport dataType and THEN continue down to "*" if needed + */ + prefilters = {}, + + /* Transports bindings + * 1) key is the dataType + * 2) the catchall symbol "*" can be used + * 3) selection will start with transport dataType and THEN go to "*" if needed + */ + transports = {}, + + // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression + allTypes = "*/".concat( "*" ), + + // Anchor tag for parsing the document origin + originAnchor = document.createElement( "a" ); + originAnchor.href = location.href; + +// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport +function addToPrefiltersOrTransports( structure ) { + + // dataTypeExpression is optional and defaults to "*" + return function( dataTypeExpression, func ) { + + if ( typeof dataTypeExpression !== "string" ) { + func = dataTypeExpression; + dataTypeExpression = "*"; + } + + var dataType, + i = 0, + dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; + + if ( jQuery.isFunction( func ) ) { + + // For each dataType in the dataTypeExpression + while ( ( dataType = dataTypes[ i++ ] ) ) { + + // Prepend if requested + if ( dataType[ 0 ] === "+" ) { + dataType = dataType.slice( 1 ) || "*"; + ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); + + // Otherwise append + } else { + ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); + } + } + } + }; +} + +// Base inspection function for prefilters and transports +function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { + + var inspected = {}, + seekingTransport = ( structure === transports ); + + function inspect( dataType ) { + var selected; + inspected[ dataType ] = true; + jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { + var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); + if ( typeof dataTypeOrTransport === "string" && + !seekingTransport && !inspected[ dataTypeOrTransport ] ) { + + options.dataTypes.unshift( dataTypeOrTransport ); + inspect( dataTypeOrTransport ); + return false; + } else if ( seekingTransport ) { + return !( selected = dataTypeOrTransport ); + } + } ); + return selected; + } + + return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); +} + +// A special extend for ajax options +// that takes "flat" options (not to be deep extended) +// Fixes #9887 +function ajaxExtend( target, src ) { + var key, deep, + flatOptions = jQuery.ajaxSettings.flatOptions || {}; + + for ( key in src ) { + if ( src[ key ] !== undefined ) { + ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; + } + } + if ( deep ) { + jQuery.extend( true, target, deep ); + } + + return target; +} + +/* Handles responses to an ajax request: + * - finds the right dataType (mediates between content-type and expected dataType) + * - returns the corresponding response + */ +function ajaxHandleResponses( s, jqXHR, responses ) { + + var ct, type, finalDataType, firstDataType, + contents = s.contents, + dataTypes = s.dataTypes; + + // Remove auto dataType and get content-type in the process + while ( dataTypes[ 0 ] === "*" ) { + dataTypes.shift(); + if ( ct === undefined ) { + ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); + } + } + + // Check if we're dealing with a known content-type + if ( ct ) { + for ( type in contents ) { + if ( contents[ type ] && contents[ type ].test( ct ) ) { + dataTypes.unshift( type ); + break; + } + } + } + + // Check to see if we have a response for the expected dataType + if ( dataTypes[ 0 ] in responses ) { + finalDataType = dataTypes[ 0 ]; + } else { + + // Try convertible dataTypes + for ( type in responses ) { + if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { + finalDataType = type; + break; + } + if ( !firstDataType ) { + firstDataType = type; + } + } + + // Or just use first one + finalDataType = finalDataType || firstDataType; + } + + // If we found a dataType + // We add the dataType to the list if needed + // and return the corresponding response + if ( finalDataType ) { + if ( finalDataType !== dataTypes[ 0 ] ) { + dataTypes.unshift( finalDataType ); + } + return responses[ finalDataType ]; + } +} + +/* Chain conversions given the request and the original response + * Also sets the responseXXX fields on the jqXHR instance + */ +function ajaxConvert( s, response, jqXHR, isSuccess ) { + var conv2, current, conv, tmp, prev, + converters = {}, + + // Work with a copy of dataTypes in case we need to modify it for conversion + dataTypes = s.dataTypes.slice(); + + // Create converters map with lowercased keys + if ( dataTypes[ 1 ] ) { + for ( conv in s.converters ) { + converters[ conv.toLowerCase() ] = s.converters[ conv ]; + } + } + + current = dataTypes.shift(); + + // Convert to each sequential dataType + while ( current ) { + + if ( s.responseFields[ current ] ) { + jqXHR[ s.responseFields[ current ] ] = response; + } + + // Apply the dataFilter if provided + if ( !prev && isSuccess && s.dataFilter ) { + response = s.dataFilter( response, s.dataType ); + } + + prev = current; + current = dataTypes.shift(); + + if ( current ) { + + // There's only work to do if current dataType is non-auto + if ( current === "*" ) { + + current = prev; + + // Convert response if prev dataType is non-auto and differs from current + } else if ( prev !== "*" && prev !== current ) { + + // Seek a direct converter + conv = converters[ prev + " " + current ] || converters[ "* " + current ]; + + // If none found, seek a pair + if ( !conv ) { + for ( conv2 in converters ) { + + // If conv2 outputs current + tmp = conv2.split( " " ); + if ( tmp[ 1 ] === current ) { + + // If prev can be converted to accepted input + conv = converters[ prev + " " + tmp[ 0 ] ] || + converters[ "* " + tmp[ 0 ] ]; + if ( conv ) { + + // Condense equivalence converters + if ( conv === true ) { + conv = converters[ conv2 ]; + + // Otherwise, insert the intermediate dataType + } else if ( converters[ conv2 ] !== true ) { + current = tmp[ 0 ]; + dataTypes.unshift( tmp[ 1 ] ); + } + break; + } + } + } + } + + // Apply converter (if not an equivalence) + if ( conv !== true ) { + + // Unless errors are allowed to bubble, catch and return them + if ( conv && s.throws ) { + response = conv( response ); + } else { + try { + response = conv( response ); + } catch ( e ) { + return { + state: "parsererror", + error: conv ? e : "No conversion from " + prev + " to " + current + }; + } + } + } + } + } + } + + return { state: "success", data: response }; +} + +jQuery.extend( { + + // Counter for holding the number of active queries + active: 0, + + // Last-Modified header cache for next request + lastModified: {}, + etag: {}, + + ajaxSettings: { + url: location.href, + type: "GET", + isLocal: rlocalProtocol.test( location.protocol ), + global: true, + processData: true, + async: true, + contentType: "application/x-www-form-urlencoded; charset=UTF-8", + + /* + timeout: 0, + data: null, + dataType: null, + username: null, + password: null, + cache: null, + throws: false, + traditional: false, + headers: {}, + */ + + accepts: { + "*": allTypes, + text: "text/plain", + html: "text/html", + xml: "application/xml, text/xml", + json: "application/json, text/javascript" + }, + + contents: { + xml: /\bxml\b/, + html: /\bhtml/, + json: /\bjson\b/ + }, + + responseFields: { + xml: "responseXML", + text: "responseText", + json: "responseJSON" + }, + + // Data converters + // Keys separate source (or catchall "*") and destination types with a single space + converters: { + + // Convert anything to text + "* text": String, + + // Text to html (true = no transformation) + "text html": true, + + // Evaluate text as a json expression + "text json": JSON.parse, + + // Parse text as xml + "text xml": jQuery.parseXML + }, + + // For options that shouldn't be deep extended: + // you can add your own custom options here if + // and when you create one that shouldn't be + // deep extended (see ajaxExtend) + flatOptions: { + url: true, + context: true + } + }, + + // Creates a full fledged settings object into target + // with both ajaxSettings and settings fields. + // If target is omitted, writes into ajaxSettings. + ajaxSetup: function( target, settings ) { + return settings ? + + // Building a settings object + ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : + + // Extending ajaxSettings + ajaxExtend( jQuery.ajaxSettings, target ); + }, + + ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), + ajaxTransport: addToPrefiltersOrTransports( transports ), + + // Main method + ajax: function( url, options ) { + + // If url is an object, simulate pre-1.5 signature + if ( typeof url === "object" ) { + options = url; + url = undefined; + } + + // Force options to be an object + options = options || {}; + + var transport, + + // URL without anti-cache param + cacheURL, + + // Response headers + responseHeadersString, + responseHeaders, + + // timeout handle + timeoutTimer, + + // Url cleanup var + urlAnchor, + + // Request state (becomes false upon send and true upon completion) + completed, + + // To know if global events are to be dispatched + fireGlobals, + + // Loop variable + i, + + // uncached part of the url + uncached, + + // Create the final options object + s = jQuery.ajaxSetup( {}, options ), + + // Callbacks context + callbackContext = s.context || s, + + // Context for global events is callbackContext if it is a DOM node or jQuery collection + globalEventContext = s.context && + ( callbackContext.nodeType || callbackContext.jquery ) ? + jQuery( callbackContext ) : + jQuery.event, + + // Deferreds + deferred = jQuery.Deferred(), + completeDeferred = jQuery.Callbacks( "once memory" ), + + // Status-dependent callbacks + statusCode = s.statusCode || {}, + + // Headers (they are sent all at once) + requestHeaders = {}, + requestHeadersNames = {}, + + // Default abort message + strAbort = "canceled", + + // Fake xhr + jqXHR = { + readyState: 0, + + // Builds headers hashtable if needed + getResponseHeader: function( key ) { + var match; + if ( completed ) { + if ( !responseHeaders ) { + responseHeaders = {}; + while ( ( match = rheaders.exec( responseHeadersString ) ) ) { + responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ]; + } + } + match = responseHeaders[ key.toLowerCase() ]; + } + return match == null ? null : match; + }, + + // Raw string + getAllResponseHeaders: function() { + return completed ? responseHeadersString : null; + }, + + // Caches the header + setRequestHeader: function( name, value ) { + if ( completed == null ) { + name = requestHeadersNames[ name.toLowerCase() ] = + requestHeadersNames[ name.toLowerCase() ] || name; + requestHeaders[ name ] = value; + } + return this; + }, + + // Overrides response content-type header + overrideMimeType: function( type ) { + if ( completed == null ) { + s.mimeType = type; + } + return this; + }, + + // Status-dependent callbacks + statusCode: function( map ) { + var code; + if ( map ) { + if ( completed ) { + + // Execute the appropriate callbacks + jqXHR.always( map[ jqXHR.status ] ); + } else { + + // Lazy-add the new callbacks in a way that preserves old ones + for ( code in map ) { + statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; + } + } + } + return this; + }, + + // Cancel the request + abort: function( statusText ) { + var finalText = statusText || strAbort; + if ( transport ) { + transport.abort( finalText ); + } + done( 0, finalText ); + return this; + } + }; + + // Attach deferreds + deferred.promise( jqXHR ); + + // Add protocol if not provided (prefilters might expect it) + // Handle falsy url in the settings object (#10093: consistency with old signature) + // We also use the url parameter if available + s.url = ( ( url || s.url || location.href ) + "" ) + .replace( rprotocol, location.protocol + "//" ); + + // Alias method option to type as per ticket #12004 + s.type = options.method || options.type || s.method || s.type; + + // Extract dataTypes list + s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; + + // A cross-domain request is in order when the origin doesn't match the current origin. + if ( s.crossDomain == null ) { + urlAnchor = document.createElement( "a" ); + + // Support: IE <=8 - 11, Edge 12 - 13 + // IE throws exception on accessing the href property if url is malformed, + // e.g. http://example.com:80x/ + try { + urlAnchor.href = s.url; + + // Support: IE <=8 - 11 only + // Anchor's host property isn't correctly set when s.url is relative + urlAnchor.href = urlAnchor.href; + s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== + urlAnchor.protocol + "//" + urlAnchor.host; + } catch ( e ) { + + // If there is an error parsing the URL, assume it is crossDomain, + // it can be rejected by the transport if it is invalid + s.crossDomain = true; + } + } + + // Convert data if not already a string + if ( s.data && s.processData && typeof s.data !== "string" ) { + s.data = jQuery.param( s.data, s.traditional ); + } + + // Apply prefilters + inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); + + // If request was aborted inside a prefilter, stop there + if ( completed ) { + return jqXHR; + } + + // We can fire global events as of now if asked to + // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) + fireGlobals = jQuery.event && s.global; + + // Watch for a new set of requests + if ( fireGlobals && jQuery.active++ === 0 ) { + jQuery.event.trigger( "ajaxStart" ); + } + + // Uppercase the type + s.type = s.type.toUpperCase(); + + // Determine if request has content + s.hasContent = !rnoContent.test( s.type ); + + // Save the URL in case we're toying with the If-Modified-Since + // and/or If-None-Match header later on + // Remove hash to simplify url manipulation + cacheURL = s.url.replace( rhash, "" ); + + // More options handling for requests with no content + if ( !s.hasContent ) { + + // Remember the hash so we can put it back + uncached = s.url.slice( cacheURL.length ); + + // If data is available, append data to url + if ( s.data ) { + cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; + + // #9682: remove data so that it's not used in an eventual retry + delete s.data; + } + + // Add or update anti-cache param if needed + if ( s.cache === false ) { + cacheURL = cacheURL.replace( rantiCache, "$1" ); + uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached; + } + + // Put hash and anti-cache on the URL that will be requested (gh-1732) + s.url = cacheURL + uncached; + + // Change '%20' to '+' if this is encoded form body content (gh-2658) + } else if ( s.data && s.processData && + ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { + s.data = s.data.replace( r20, "+" ); + } + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + if ( jQuery.lastModified[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); + } + if ( jQuery.etag[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); + } + } + + // Set the correct header, if data is being sent + if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { + jqXHR.setRequestHeader( "Content-Type", s.contentType ); + } + + // Set the Accepts header for the server, depending on the dataType + jqXHR.setRequestHeader( + "Accept", + s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? + s.accepts[ s.dataTypes[ 0 ] ] + + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : + s.accepts[ "*" ] + ); + + // Check for headers option + for ( i in s.headers ) { + jqXHR.setRequestHeader( i, s.headers[ i ] ); + } + + // Allow custom headers/mimetypes and early abort + if ( s.beforeSend && + ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { + + // Abort if not done already and return + return jqXHR.abort(); + } + + // Aborting is no longer a cancellation + strAbort = "abort"; + + // Install callbacks on deferreds + completeDeferred.add( s.complete ); + jqXHR.done( s.success ); + jqXHR.fail( s.error ); + + // Get transport + transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); + + // If no transport, we auto-abort + if ( !transport ) { + done( -1, "No Transport" ); + } else { + jqXHR.readyState = 1; + + // Send global event + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); + } + + // If request was aborted inside ajaxSend, stop there + if ( completed ) { + return jqXHR; + } + + // Timeout + if ( s.async && s.timeout > 0 ) { + timeoutTimer = window.setTimeout( function() { + jqXHR.abort( "timeout" ); + }, s.timeout ); + } + + try { + completed = false; + transport.send( requestHeaders, done ); + } catch ( e ) { + + // Rethrow post-completion exceptions + if ( completed ) { + throw e; + } + + // Propagate others as results + done( -1, e ); + } + } + + // Callback for when everything is done + function done( status, nativeStatusText, responses, headers ) { + var isSuccess, success, error, response, modified, + statusText = nativeStatusText; + + // Ignore repeat invocations + if ( completed ) { + return; + } + + completed = true; + + // Clear timeout if it exists + if ( timeoutTimer ) { + window.clearTimeout( timeoutTimer ); + } + + // Dereference transport for early garbage collection + // (no matter how long the jqXHR object will be used) + transport = undefined; + + // Cache response headers + responseHeadersString = headers || ""; + + // Set readyState + jqXHR.readyState = status > 0 ? 4 : 0; + + // Determine if successful + isSuccess = status >= 200 && status < 300 || status === 304; + + // Get response data + if ( responses ) { + response = ajaxHandleResponses( s, jqXHR, responses ); + } + + // Convert no matter what (that way responseXXX fields are always set) + response = ajaxConvert( s, response, jqXHR, isSuccess ); + + // If successful, handle type chaining + if ( isSuccess ) { + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + modified = jqXHR.getResponseHeader( "Last-Modified" ); + if ( modified ) { + jQuery.lastModified[ cacheURL ] = modified; + } + modified = jqXHR.getResponseHeader( "etag" ); + if ( modified ) { + jQuery.etag[ cacheURL ] = modified; + } + } + + // if no content + if ( status === 204 || s.type === "HEAD" ) { + statusText = "nocontent"; + + // if not modified + } else if ( status === 304 ) { + statusText = "notmodified"; + + // If we have data, let's convert it + } else { + statusText = response.state; + success = response.data; + error = response.error; + isSuccess = !error; + } + } else { + + // Extract error from statusText and normalize for non-aborts + error = statusText; + if ( status || !statusText ) { + statusText = "error"; + if ( status < 0 ) { + status = 0; + } + } + } + + // Set data for the fake xhr object + jqXHR.status = status; + jqXHR.statusText = ( nativeStatusText || statusText ) + ""; + + // Success/Error + if ( isSuccess ) { + deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); + } else { + deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); + } + + // Status-dependent callbacks + jqXHR.statusCode( statusCode ); + statusCode = undefined; + + if ( fireGlobals ) { + globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", + [ jqXHR, s, isSuccess ? success : error ] ); + } + + // Complete + completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); + + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); + + // Handle the global AJAX counter + if ( !( --jQuery.active ) ) { + jQuery.event.trigger( "ajaxStop" ); + } + } + } + + return jqXHR; + }, + + getJSON: function( url, data, callback ) { + return jQuery.get( url, data, callback, "json" ); + }, + + getScript: function( url, callback ) { + return jQuery.get( url, undefined, callback, "script" ); + } +} ); + +jQuery.each( [ "get", "post" ], function( i, method ) { + jQuery[ method ] = function( url, data, callback, type ) { + + // Shift arguments if data argument was omitted + if ( jQuery.isFunction( data ) ) { + type = type || callback; + callback = data; + data = undefined; + } + + // The url can be an options object (which then must have .url) + return jQuery.ajax( jQuery.extend( { + url: url, + type: method, + dataType: type, + data: data, + success: callback + }, jQuery.isPlainObject( url ) && url ) ); + }; +} ); + + +jQuery._evalUrl = function( url ) { + return jQuery.ajax( { + url: url, + + // Make this explicit, since user can override this through ajaxSetup (#11264) + type: "GET", + dataType: "script", + cache: true, + async: false, + global: false, + "throws": true + } ); +}; + + +jQuery.fn.extend( { + wrapAll: function( html ) { + var wrap; + + if ( this[ 0 ] ) { + if ( jQuery.isFunction( html ) ) { + html = html.call( this[ 0 ] ); + } + + // The elements to wrap the target around + wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); + + if ( this[ 0 ].parentNode ) { + wrap.insertBefore( this[ 0 ] ); + } + + wrap.map( function() { + var elem = this; + + while ( elem.firstElementChild ) { + elem = elem.firstElementChild; + } + + return elem; + } ).append( this ); + } + + return this; + }, + + wrapInner: function( html ) { + if ( jQuery.isFunction( html ) ) { + return this.each( function( i ) { + jQuery( this ).wrapInner( html.call( this, i ) ); + } ); + } + + return this.each( function() { + var self = jQuery( this ), + contents = self.contents(); + + if ( contents.length ) { + contents.wrapAll( html ); + + } else { + self.append( html ); + } + } ); + }, + + wrap: function( html ) { + var isFunction = jQuery.isFunction( html ); + + return this.each( function( i ) { + jQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html ); + } ); + }, + + unwrap: function( selector ) { + this.parent( selector ).not( "body" ).each( function() { + jQuery( this ).replaceWith( this.childNodes ); + } ); + return this; + } +} ); + + +jQuery.expr.pseudos.hidden = function( elem ) { + return !jQuery.expr.pseudos.visible( elem ); +}; +jQuery.expr.pseudos.visible = function( elem ) { + return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); +}; + + + + +jQuery.ajaxSettings.xhr = function() { + try { + return new window.XMLHttpRequest(); + } catch ( e ) {} +}; + +var xhrSuccessStatus = { + + // File protocol always yields status code 0, assume 200 + 0: 200, + + // Support: IE <=9 only + // #1450: sometimes IE returns 1223 when it should be 204 + 1223: 204 + }, + xhrSupported = jQuery.ajaxSettings.xhr(); + +support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); +support.ajax = xhrSupported = !!xhrSupported; + +jQuery.ajaxTransport( function( options ) { + var callback, errorCallback; + + // Cross domain only allowed if supported through XMLHttpRequest + if ( support.cors || xhrSupported && !options.crossDomain ) { + return { + send: function( headers, complete ) { + var i, + xhr = options.xhr(); + + xhr.open( + options.type, + options.url, + options.async, + options.username, + options.password + ); + + // Apply custom fields if provided + if ( options.xhrFields ) { + for ( i in options.xhrFields ) { + xhr[ i ] = options.xhrFields[ i ]; + } + } + + // Override mime type if needed + if ( options.mimeType && xhr.overrideMimeType ) { + xhr.overrideMimeType( options.mimeType ); + } + + // X-Requested-With header + // For cross-domain requests, seeing as conditions for a preflight are + // akin to a jigsaw puzzle, we simply never set it to be sure. + // (it can always be set on a per-request basis or even using ajaxSetup) + // For same-domain requests, won't change header if already provided. + if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { + headers[ "X-Requested-With" ] = "XMLHttpRequest"; + } + + // Set headers + for ( i in headers ) { + xhr.setRequestHeader( i, headers[ i ] ); + } + + // Callback + callback = function( type ) { + return function() { + if ( callback ) { + callback = errorCallback = xhr.onload = + xhr.onerror = xhr.onabort = xhr.onreadystatechange = null; + + if ( type === "abort" ) { + xhr.abort(); + } else if ( type === "error" ) { + + // Support: IE <=9 only + // On a manual native abort, IE9 throws + // errors on any property access that is not readyState + if ( typeof xhr.status !== "number" ) { + complete( 0, "error" ); + } else { + complete( + + // File: protocol always yields status 0; see #8605, #14207 + xhr.status, + xhr.statusText + ); + } + } else { + complete( + xhrSuccessStatus[ xhr.status ] || xhr.status, + xhr.statusText, + + // Support: IE <=9 only + // IE9 has no XHR2 but throws on binary (trac-11426) + // For XHR2 non-text, let the caller handle it (gh-2498) + ( xhr.responseType || "text" ) !== "text" || + typeof xhr.responseText !== "string" ? + { binary: xhr.response } : + { text: xhr.responseText }, + xhr.getAllResponseHeaders() + ); + } + } + }; + }; + + // Listen to events + xhr.onload = callback(); + errorCallback = xhr.onerror = callback( "error" ); + + // Support: IE 9 only + // Use onreadystatechange to replace onabort + // to handle uncaught aborts + if ( xhr.onabort !== undefined ) { + xhr.onabort = errorCallback; + } else { + xhr.onreadystatechange = function() { + + // Check readyState before timeout as it changes + if ( xhr.readyState === 4 ) { + + // Allow onerror to be called first, + // but that will not handle a native abort + // Also, save errorCallback to a variable + // as xhr.onerror cannot be accessed + window.setTimeout( function() { + if ( callback ) { + errorCallback(); + } + } ); + } + }; + } + + // Create the abort callback + callback = callback( "abort" ); + + try { + + // Do send the request (this may raise an exception) + xhr.send( options.hasContent && options.data || null ); + } catch ( e ) { + + // #14683: Only rethrow if this hasn't been notified as an error yet + if ( callback ) { + throw e; + } + } + }, + + abort: function() { + if ( callback ) { + callback(); + } + } + }; + } +} ); + + + + +// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) +jQuery.ajaxPrefilter( function( s ) { + if ( s.crossDomain ) { + s.contents.script = false; + } +} ); + +// Install script dataType +jQuery.ajaxSetup( { + accepts: { + script: "text/javascript, application/javascript, " + + "application/ecmascript, application/x-ecmascript" + }, + contents: { + script: /\b(?:java|ecma)script\b/ + }, + converters: { + "text script": function( text ) { + jQuery.globalEval( text ); + return text; + } + } +} ); + +// Handle cache's special case and crossDomain +jQuery.ajaxPrefilter( "script", function( s ) { + if ( s.cache === undefined ) { + s.cache = false; + } + if ( s.crossDomain ) { + s.type = "GET"; + } +} ); + +// Bind script tag hack transport +jQuery.ajaxTransport( "script", function( s ) { + + // This transport only deals with cross domain requests + if ( s.crossDomain ) { + var script, callback; + return { + send: function( _, complete ) { + script = jQuery( " + + + + + + + diff --git a/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/html/common/footer.html b/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/html/common/footer.html new file mode 100644 index 0000000..e243af7 --- /dev/null +++ b/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/html/common/footer.html @@ -0,0 +1,22 @@ + + + + + Title + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/html/common/header.html b/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/html/common/header.html new file mode 100644 index 0000000..58b9deb --- /dev/null +++ b/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/html/common/header.html @@ -0,0 +1,15 @@ + + + + + Title + + + + + + + + + + \ No newline at end of file diff --git a/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/html/index.html b/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/html/index.html new file mode 100644 index 0000000..2457ab7 --- /dev/null +++ b/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/html/index.html @@ -0,0 +1,276 @@ + + + + + 代码生成器 + + +
      + + +
      +
      +
      +
      +
      +
      +
      +
      +
      + 代码生成器: +
      + +
      +
      +
      + +
      +
      + jdbc:mysql: +
      + +
      +
      + +
      +
      + +
      + +
      +
      +
      + + + 使用前给当前用户或者IP授权访问 使用完成可取消授权 +
      +
      + +
      +
      + + + 密码不会记录,请放心使用 +
      +
      + +
      + +
      +
      + +
      +
      +
      + + +
      +
      +
      +
      + + +
      +
      +
      +
      +
      + +
      + +
      +
      + + +
      +
      +
      +
      + + +
      +
      +
      +
      + + + java包名 +
      +
      +
      + +
      +
      + +
      +
      + +
      +
      +
      + + +
      +
      + +
      +
      + + +
      +
      +
      + +
      + +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      + + +
      + + + + + diff --git a/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/html/layout.html b/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/html/layout.html new file mode 100644 index 0000000..6ff06ee --- /dev/null +++ b/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/html/layout.html @@ -0,0 +1,27 @@ + + + + + + layout + + + + + + + + +
      header
      +
      footer
      +
      + + + + \ No newline at end of file diff --git a/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/api/pagination.vm b/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/api/pagination.vm new file mode 100644 index 0000000..b0e98d7 --- /dev/null +++ b/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/api/pagination.vm @@ -0,0 +1,42 @@ +package $!{app.currentPackage}; + +import lombok.Data; + +import java.util.List; + +/** +* @author $!{app.author} +* @date $!{app.date} +* @Description: $!{app.desc} +*/ +@Data +public class Pagination { + + /** + * 当前页 + */ + private int currentPage; + + /** + * 每页多少条 + */ + private int pageSize; + + /** + * 数据 + */ + private List data; + + /** + * 总条数 + */ + private long total; + + public Pagination() { + } + + public Pagination(int currentPage, int pageSize) { + this.currentPage = currentPage; + this.pageSize = pageSize; + } +} diff --git a/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/api/pom.vm b/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/api/pom.vm new file mode 100644 index 0000000..81f2cdb --- /dev/null +++ b/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/api/pom.vm @@ -0,0 +1,12 @@ + + + + 4.0.0 + $!{appInfo.groupId} + $!{appInfo.artifactId} + 1.0-SNAPSHOT + jar + $!{appInfo.artifactId} + + diff --git a/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/app/pom.vm b/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/app/pom.vm new file mode 100644 index 0000000..7ad579f --- /dev/null +++ b/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/app/pom.vm @@ -0,0 +1,49 @@ + + + 4.0.0 + + $!{appInfo.groupId} + $!{appInfo.parentArtifactId} + 1.0-SNAPSHOT + pom + $!{appInfo.productName} + + + org.springframework.boot + spring-boot-starter-parent + 1.5.6.RELEASE + + + + $!{appInfo.parentArtifactId}-api + $!{appInfo.parentArtifactId}-common + $!{appInfo.parentArtifactId}-orm + $!{appInfo.parentArtifactId}-domain + $!{appInfo.parentArtifactId}-service + $!{appInfo.parentArtifactId}-provider + $!{appInfo.parentArtifactId}-rpc + $!{appInfo.parentArtifactId}-web + + + + + + org.projectlombok + lombok + + + + mysql + mysql-connector-java + 5.1.43 + + + + com.alibaba + druid + 1.1.0 + + + + diff --git a/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/app/readme.vm b/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/app/readme.vm new file mode 100644 index 0000000..e4e6223 --- /dev/null +++ b/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/app/readme.vm @@ -0,0 +1,99 @@ +code-generator +==== + +api +=== +``` +|--------- api + |------ dto + |--- request + |--- response +``` +api 模块主要作用对外提供RPC-API
      +dto.request 请求dto
      +dto.response 应答dto
      + +common +=== +``` +|--------- common + |------ constant + |------ enums + |------ exceptions + |------ util +``` +common 模块主要作用提供公用
      +constant 常量包
      +enums 枚举包
      +exceptions 异常包
      +util 工具包
      + +domain +=== +``` +|--------- domain + |------ condition + |------ entity +``` +domain 模块主要作用数据实体和条件
      +condition 条件包
      +entity 数据库实体包
      + +orm +=== +``` +|--------- orm + |------ dao + |------ mapper +``` +orm 模块主要作用存放mapper数据库操作
      +dao 接口包
      +mapper mapper.xml
      + +provider +=== +``` +|--------- provider + |------ impl +``` +provider 模块主要作用实现API模块
      +impl 接口实现类包
      + +rpc +=== +``` +|--------- rpc + |------ impl + |------ dto +``` +rpc 模块主要作用对外接口对接
      +impl 接口实现类包
      +dto dto包
      + +service +=== +``` +|--------- service + |------ impl + |------ vo +``` +service 模块主要作用接口定义
      +impl 接口实现类包
      +vo 包
      + +web +=== +``` +|--------- web + |------ app + |------ common + |------ interceptor + |------ controller +``` +web 模块主要作用web模块
      +app 启动类
      +common 公用包
      +interceptor 拦截器
      +controller 控制层
      + + diff --git a/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/common/pom.vm b/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/common/pom.vm new file mode 100644 index 0000000..92daa0f --- /dev/null +++ b/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/common/pom.vm @@ -0,0 +1,17 @@ + + + + + $!{appInfo.groupId} + $!{appInfo.parentArtifactId} + 1.0-SNAPSHOT + + + 4.0.0 + $!{appInfo.artifactId} + 1.0-SNAPSHOT + jar + $!{appInfo.artifactId} + + diff --git a/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/domain/condition.vm b/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/domain/condition.vm new file mode 100644 index 0000000..e2e1707 --- /dev/null +++ b/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/domain/condition.vm @@ -0,0 +1,12 @@ +package ${javaModel.currentPackage}.condition; + +import ${javaModel.currentPackage}.entity.$!{tableInfo.getTableName()}; + +/** + * ${tableInfo.table.tableComment} + * + * @author ${javaModel.author} + * @Date ${tableInfo.now()} + */ +public class $!{tableInfo.getTableName()}Condition extends $!{tableInfo.getTableName()} { +} \ No newline at end of file diff --git a/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/domain/entity.vm b/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/domain/entity.vm new file mode 100644 index 0000000..3038a39 --- /dev/null +++ b/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/domain/entity.vm @@ -0,0 +1,28 @@ +package ${javaModel.currentPackage}.entity; + +#set($types = {}) +import java.io.Serializable; +import lombok.Data; +#foreach($item in $!tableInfo.columns) +#if(!$types.get($item.javaShortType)) $!types.put($item.javaShortType,$item.javaShortType) +import $item.javaType; +#end +#end + +/** + * ${tableInfo.table.tableComment} + * + * @author ${javaModel.author} + * @Date ${tableInfo.now()} + */ +@Data +public class $!{tableInfo.getTableName()} implements Serializable { + +#foreach($item in $!{tableInfo.columns}) + /** + * $!{item.columnComments} + */ + private $!{item.javaShortType} $!{item.getColumnJavaName()}; +#end + +} \ No newline at end of file diff --git a/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/domain/pom.vm b/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/domain/pom.vm new file mode 100644 index 0000000..92daa0f --- /dev/null +++ b/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/domain/pom.vm @@ -0,0 +1,17 @@ + + + + + $!{appInfo.groupId} + $!{appInfo.parentArtifactId} + 1.0-SNAPSHOT + + + 4.0.0 + $!{appInfo.artifactId} + 1.0-SNAPSHOT + jar + $!{appInfo.artifactId} + + diff --git a/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/orm/dao.vm b/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/orm/dao.vm new file mode 100644 index 0000000..a892355 --- /dev/null +++ b/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/orm/dao.vm @@ -0,0 +1,52 @@ +package ${javaModel.basePackage}.orm.dao; + +import ${javaModel.basePackage}.domain.condition.${tableInfo.getTableName()}Condition; +import ${javaModel.basePackage}.domain.entity.${tableInfo.getTableName()}; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * ${tableInfo.getTableName()}Dao + * + * @author ${javaModel.author} + * @Date ${tableInfo.now()} + */ +public interface ${tableInfo.getTableName()}Dao { + + /** + * insert + * + * @param ${tableInfo.getFirstLowerName()} + */ + public Long insertSelective(${tableInfo.getTableName()} ${tableInfo.getFirstLowerName()}); + + /** + * get by id + * + * @param id + * @return + */ + public ${tableInfo.getTableName()} getById(Long id); + + /** + * update + * + * @param ${tableInfo.getFirstLowerName()} + */ + public Long update (${tableInfo.getTableName()} ${tableInfo.getFirstLowerName()}); + + /** + * delete + * + * @param id + */ + public Long delete(Long id); + + /** + * get list + * @param ${tableInfo.getFirstLowerName()}Condition + * @return + */ + public List<${tableInfo.getTableName()}> findList(${tableInfo.getTableName()}Condition ${tableInfo.getFirstLowerName()}Condition); +} diff --git a/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/orm/mapper.vm b/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/orm/mapper.vm new file mode 100644 index 0000000..6b7842e --- /dev/null +++ b/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/orm/mapper.vm @@ -0,0 +1,83 @@ + + + + +#foreach($item in $!tableInfo.columns) + +#end + + + + +#foreach($item in $!tableInfo.columns) + ${item.columnName}, +#end + + + + + + insert into ${tableInfo.table.tableName} + +#foreach($item in $!tableInfo.columns) + + ${item.columnName}, + +#end + + values + +#foreach($item in $!tableInfo.columns) + + #{${item.getColumnJavaName()},jdbcType=${item.jdbcType}}, + +#end + + + + + + + + + + + + update ${tableInfo.table.tableName} + + +#foreach($item in $!tableInfo.columns) + + ${item.columnName} = #{${item.getColumnJavaName()},jdbcType=${item.jdbcType}}, + +#end + + + where id = #{id,jdbcType=BIGINT} + + + + + update ${tableInfo.table.tableName} + + yn=0 + + where id = #{id,jdbcType=BIGINT} + + \ No newline at end of file diff --git a/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/orm/pom.vm b/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/orm/pom.vm new file mode 100644 index 0000000..ef858fa --- /dev/null +++ b/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/orm/pom.vm @@ -0,0 +1,31 @@ + + + + + $!{appInfo.groupId} + $!{appInfo.parentArtifactId} + 1.0-SNAPSHOT + + + 4.0.0 + $!{appInfo.artifactId} + 1.0-SNAPSHOT + jar + $!{appInfo.artifactId} + + + + $!{appInfo.groupId} + $!{appInfo.parentArtifactId}-domain + 1.0-SNAPSHOT + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 1.3.1 + + + + diff --git a/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/provider/pom.vm b/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/provider/pom.vm new file mode 100644 index 0000000..92daa0f --- /dev/null +++ b/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/provider/pom.vm @@ -0,0 +1,17 @@ + + + + + $!{appInfo.groupId} + $!{appInfo.parentArtifactId} + 1.0-SNAPSHOT + + + 4.0.0 + $!{appInfo.artifactId} + 1.0-SNAPSHOT + jar + $!{appInfo.artifactId} + + diff --git a/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/rpc/pom.vm b/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/rpc/pom.vm new file mode 100644 index 0000000..92daa0f --- /dev/null +++ b/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/rpc/pom.vm @@ -0,0 +1,17 @@ + + + + + $!{appInfo.groupId} + $!{appInfo.parentArtifactId} + 1.0-SNAPSHOT + + + 4.0.0 + $!{appInfo.artifactId} + 1.0-SNAPSHOT + jar + $!{appInfo.artifactId} + + diff --git a/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/service/pom.vm b/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/service/pom.vm new file mode 100644 index 0000000..01f6ed2 --- /dev/null +++ b/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/service/pom.vm @@ -0,0 +1,30 @@ + + + + + $!{appInfo.groupId} + $!{appInfo.parentArtifactId} + 1.0-SNAPSHOT + + + 4.0.0 + $!{appInfo.artifactId} + 1.0-SNAPSHOT + jar + $!{appInfo.artifactId} + + + + $!{appInfo.groupId} + $!{appInfo.parentArtifactId}-orm + 1.0-SNAPSHOT + + + + org.springframework.boot + spring-boot-starter-web + + + + diff --git a/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/service/service.vm b/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/service/service.vm new file mode 100644 index 0000000..69f2a18 --- /dev/null +++ b/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/service/service.vm @@ -0,0 +1,47 @@ +package ${javaModel.basePackage}.service; + +import ${javaModel.basePackage}.domain.condition.$!{tableInfo.getTableName()}Condition; +import ${javaModel.basePackage}.domain.entity.$!{tableInfo.getTableName()}; +import java.util.List; + +/** + * $!tableInfo.getTableName()Service + * + * @author ${javaModel.author} + * @Date ${tableInfo.now()} + */ +public interface $!{tableInfo.getTableName()}Service { + + /** + * getById + * @param id + * @return + */ + public $!{tableInfo.getTableName()} getById(Long id); + + /** + * insert + * @param ${tableInfo.getFirstLowerName()} + */ + public Long insert($!{tableInfo.getTableName()} $!{tableInfo.getFirstLowerName()}); + + /** + * update + * @param $!{tableInfo.getFirstLowerName()} + */ + public Long update($!{tableInfo.getTableName()} $!{tableInfo.getFirstLowerName()}); + + /** + * delete + * @param id + */ + public Long delete(Long id); + + /** + * get list + * @param $!{tableInfo.getFirstLowerName()}Condition + * @return + */ + public List<$!{tableInfo.getTableName()}> findList($!{tableInfo.getTableName()}Condition $!{tableInfo.getFirstLowerName()}Condition); + +} diff --git a/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/service/serviceImpl.vm b/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/service/serviceImpl.vm new file mode 100644 index 0000000..acb8970 --- /dev/null +++ b/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/service/serviceImpl.vm @@ -0,0 +1,56 @@ +package ${javaModel.basePackage}.service.impl; + +import ${javaModel.basePackage}.domain.condition.${tableInfo.getTableName()}Condition; +import ${javaModel.basePackage}.orm.dao.${tableInfo.getTableName()}Dao; +import ${javaModel.basePackage}.domain.entity.${tableInfo.getTableName()}; +import ${javaModel.basePackage}.service.${tableInfo.getTableName()}Service; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import java.util.Date; +import java.util.List; +import lombok.extern.slf4j.Slf4j; + +/** + * ${tableInfo.getTableName()}ServiceImpl + * + * @author ${javaModel.author} + * @Date ${tableInfo.now()} + */ +@Service +@Slf4j +public class ${tableInfo.getTableName()}ServiceImpl implements ${tableInfo.getTableName()}Service { + + @Autowired + private ${tableInfo.getTableName()}Dao ${tableInfo.getFirstLowerName()}Dao; + + @Override + public ${tableInfo.getTableName()} getById(Long id) { + ${tableInfo.getTableName()} ${tableInfo.getFirstLowerName()} = ${tableInfo.getFirstLowerName()}Dao.getById(id); + return ${tableInfo.getFirstLowerName()}; + } + + @Override + public Long insert(${tableInfo.getTableName()} ${tableInfo.getFirstLowerName()}) { + Date date = new Date(); + ${tableInfo.getFirstLowerName()}.setCreateTime(date); + ${tableInfo.getFirstLowerName()}Dao.insertSelective(${tableInfo.getFirstLowerName()}); + Long id=${tableInfo.getFirstLowerName()}.getId(); + return id; + } + + @Override + public Long update(${tableInfo.getTableName()} ${tableInfo.getFirstLowerName()}) { + return ${tableInfo.getFirstLowerName()}Dao.update(${tableInfo.getFirstLowerName()}); + } + + @Override + public Long delete(Long id) { + return ${tableInfo.getFirstLowerName()}Dao.delete(id); + } + + @Override + public List<${tableInfo.getTableName()}> findList(${tableInfo.getTableName()}Condition ${tableInfo.getFirstLowerName()}Condition) { + return ${tableInfo.getFirstLowerName()}Dao.findList(${tableInfo.getFirstLowerName()}Condition); + } + +} diff --git a/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/web/application-dev.vm b/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/web/application-dev.vm new file mode 100644 index 0000000..ebc3161 --- /dev/null +++ b/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/web/application-dev.vm @@ -0,0 +1,31 @@ +server: + tomcat: + uri-encoding: UTF-8 + port: 80 + +spring: + http: + encoding: + force: true + charset: UTF-8 + enabled: true + datasource: + name: c2c + url: ${dbInfo.jdbcUrl} + username: ${dbInfo.user} + password: ${dbInfo.password} + # 使用druid数据源 + type: com.alibaba.druid.pool.DruidDataSource + driver-class-name: com.mysql.jdbc.Driver + +# mybatis配置 start +mybatis: + mapper-locations: classpath:${javaModel.getMapperPath()}/*Mapper.xml + type-aliases-package: ${javaModel.basePackage}.domain.entity + +logging: + config: classpath:config/log-back.xml + level: + root: info + + diff --git a/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/web/application.vm b/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/web/application.vm new file mode 100644 index 0000000..c88e9b0 --- /dev/null +++ b/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/web/application.vm @@ -0,0 +1,3 @@ +spring: + profiles: + active: dev \ No newline at end of file diff --git a/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/web/log-back.vm b/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/web/log-back.vm new file mode 100644 index 0000000..ac3ff57 --- /dev/null +++ b/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/web/log-back.vm @@ -0,0 +1,19 @@ + + + yys + + + + + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{50} [%file:%line] - %msg%n + + + + + + + + \ No newline at end of file diff --git a/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/web/pom.vm b/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/web/pom.vm new file mode 100644 index 0000000..33a5fbc --- /dev/null +++ b/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/web/pom.vm @@ -0,0 +1,42 @@ + + + + + $!{appInfo.groupId} + $!{appInfo.parentArtifactId} + 1.0-SNAPSHOT + + + 4.0.0 + $!{appInfo.artifactId} + 1.0-SNAPSHOT + war + $!{appInfo.artifactId} + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-test + + + $!{appInfo.groupId} + $!{appInfo.parentArtifactId}-service + 1.0-SNAPSHOT + + + org.springframework + spring-aop + 4.3.12.RELEASE + + + org.springframework + spring-aspects + 4.3.12.RELEASE + + + diff --git a/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/web/webApplication.vm b/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/web/webApplication.vm new file mode 100644 index 0000000..ab9848c --- /dev/null +++ b/generator-web/target/generator-web-1.0-SNAPSHOT/WEB-INF/classes/templates/java/web/webApplication.vm @@ -0,0 +1,36 @@ +package $!{app.currentPackage}; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.support.SpringBootServletInitializer; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.context.annotation.EnableAspectJAutoProxy; +import org.mybatis.spring.annotation.MapperScan; + +/** + * @author $!{app.author} + * @date $!{app.date} + * @Description: $!{app.desc} + */ +@ComponentScan(basePackages = { + "$!{app.basePackage}" +}) +@MapperScan(basePackages = "$!{app.basePackage}.orm.dao") +@SpringBootApplication +@EnableAsync +@EnableAspectJAutoProxy +@Slf4j +public class WebApplication extends SpringBootServletInitializer { + + public static void main(String[] args) { + ApplicationContext ctx = SpringApplication.run(WebApplication.class, args); + + String[] activeProfiles = ctx.getEnvironment().getActiveProfiles(); + for (String profile : activeProfiles) { + log.warn("Spring Boot 使用profile为:{}", profile); + } + } +} diff --git a/generator-web/target/maven-archiver/pom.properties b/generator-web/target/maven-archiver/pom.properties new file mode 100644 index 0000000..94b117d --- /dev/null +++ b/generator-web/target/maven-archiver/pom.properties @@ -0,0 +1,5 @@ +#Generated by Apache Maven +#Tue Apr 23 19:35:31 CST 2019 +version=1.0-SNAPSHOT +groupId=com.my.simon +artifactId=generator-web diff --git a/generator-web/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/generator-web/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..e69de29 diff --git a/generator-web/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/generator-web/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..031fa7d --- /dev/null +++ b/generator-web/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,40 @@ +/Users/chenmingbo/code-gen/code-generator/generator-web/src/main/java/com/my/simon/web/utils/FileUtil.java +/Users/chenmingbo/code-gen/code-generator/generator-web/src/main/java/com/my/simon/web/base/Configuration.java +/Users/chenmingbo/code-gen/code-generator/generator-web/src/main/java/com/my/simon/web/generator/builders/RpcModuleBuilder.java +/Users/chenmingbo/code-gen/code-generator/generator-web/src/main/java/com/my/simon/web/entity/DB.java +/Users/chenmingbo/code-gen/code-generator/generator-web/src/main/java/com/my/simon/web/controller/GeneratorController.java +/Users/chenmingbo/code-gen/code-generator/generator-web/src/main/java/com/my/simon/web/generator/builders/CommonModuleBuilder.java +/Users/chenmingbo/code-gen/code-generator/generator-web/src/main/java/com/my/simon/web/utils/Test.java +/Users/chenmingbo/code-gen/code-generator/generator-web/src/main/java/com/my/simon/web/utils/DateUtils.java +/Users/chenmingbo/code-gen/code-generator/generator-web/src/main/java/com/my/simon/web/generator/JavaGeneratorFactory.java +/Users/chenmingbo/code-gen/code-generator/generator-web/src/main/java/com/my/simon/web/generator/WebGeneratorFactory.java +/Users/chenmingbo/code-gen/code-generator/generator-web/src/main/java/com/my/simon/web/entity/JavaModel.java +/Users/chenmingbo/code-gen/code-generator/generator-web/src/main/java/com/my/simon/web/dao/GeneratorDaoImpl.java +/Users/chenmingbo/code-gen/code-generator/generator-web/src/main/java/com/my/simon/web/exceptions/ExceptionEnum.java +/Users/chenmingbo/code-gen/code-generator/generator-web/src/main/java/com/my/simon/web/generator/builders/ProviderModuleBuilder.java +/Users/chenmingbo/code-gen/code-generator/generator-web/src/main/java/com/my/simon/web/entity/DatabasesWrapper.java +/Users/chenmingbo/code-gen/code-generator/generator-web/src/main/java/com/my/simon/web/entity/ColumnInfo.java +/Users/chenmingbo/code-gen/code-generator/generator-web/src/main/java/com/my/simon/web/dao/GeneratorDao.java +/Users/chenmingbo/code-gen/code-generator/generator-web/src/main/java/com/my/simon/web/generator/JavaConfiguration.java +/Users/chenmingbo/code-gen/code-generator/generator-web/src/main/java/com/my/simon/web/generator/builders/OrmModuleBuilder.java +/Users/chenmingbo/code-gen/code-generator/generator-web/src/main/java/com/my/simon/web/entity/TableMeta.java +/Users/chenmingbo/code-gen/code-generator/generator-web/src/main/java/com/my/simon/web/exceptions/GeneratorException.java +/Users/chenmingbo/code-gen/code-generator/generator-web/src/main/java/com/my/simon/web/entity/JdbcRelation.java +/Users/chenmingbo/code-gen/code-generator/generator-web/src/main/java/com/my/simon/web/WebApplication.java +/Users/chenmingbo/code-gen/code-generator/generator-web/src/main/java/com/my/simon/web/generator/builders/DomainModuleBuilder.java +/Users/chenmingbo/code-gen/code-generator/generator-web/src/main/java/com/my/simon/web/entity/DatabaseInfo.java +/Users/chenmingbo/code-gen/code-generator/generator-web/src/main/java/com/my/simon/web/utils/JavaTypes.java +/Users/chenmingbo/code-gen/code-generator/generator-web/src/main/java/com/my/simon/web/generator/builders/ServiceModuleBuilder.java +/Users/chenmingbo/code-gen/code-generator/generator-web/src/main/java/com/my/simon/web/base/Generator.java +/Users/chenmingbo/code-gen/code-generator/generator-web/src/main/java/com/my/simon/web/generator/JavaGenerator.java +/Users/chenmingbo/code-gen/code-generator/generator-web/src/main/java/com/my/simon/web/vo/DBInfo.java +/Users/chenmingbo/code-gen/code-generator/generator-web/src/main/java/com/my/simon/web/entity/TableInfo.java +/Users/chenmingbo/code-gen/code-generator/generator-web/src/main/java/com/my/simon/web/utils/PropertiesUtils.java +/Users/chenmingbo/code-gen/code-generator/generator-web/src/main/java/com/my/simon/web/generator/JavaAppBuilder.java +/Users/chenmingbo/code-gen/code-generator/generator-web/src/main/java/com/my/simon/web/generator/builders/WebModuleBuilder.java +/Users/chenmingbo/code-gen/code-generator/generator-web/src/main/java/com/my/simon/web/generator/builders/ApiModuleBuilder.java +/Users/chenmingbo/code-gen/code-generator/generator-web/src/main/java/com/my/simon/web/utils/DBUtils.java +/Users/chenmingbo/code-gen/code-generator/generator-web/src/main/java/com/my/simon/web/WebMvcConfig.java +/Users/chenmingbo/code-gen/code-generator/generator-web/src/main/java/com/my/simon/web/entity/Pom.java +/Users/chenmingbo/code-gen/code-generator/generator-web/src/main/java/com/my/simon/web/generator/builders/AppBuilder.java +/Users/chenmingbo/code-gen/code-generator/generator-web/src/main/java/com/my/simon/web/base/Builder.java -- Gitee From de5f941b7831ce9f4ea26425a6a781802778ff77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=98=8E=E6=B3=A2?= Date: Fri, 26 Apr 2019 08:13:25 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/workspace.xml | 143 ++++++++---------- .../WEB-INF/classes/templates/html/index.html | 4 +- .../target/maven-archiver/pom.properties | 2 +- 3 files changed, 67 insertions(+), 82 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index c14081a..94932ca 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,21 +2,9 @@ - - - - - - - - - - - - - - + + @@ -38,10 +26,10 @@ - + - - + + @@ -118,16 +106,16 @@ - + - + - - + + @@ -135,20 +123,11 @@ - - - - - - - - - - - + + @@ -165,7 +144,7 @@ - + @@ -174,8 +153,8 @@ - - + + @@ -306,7 +285,6 @@ - @@ -314,11 +292,23 @@ + + + + + + + + + + +