From e935fa3d72ed3b07ce7cdb2df42416b786f2a92c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= Date: Thu, 18 Apr 2019 16:17:08 +0800 Subject: [PATCH 01/20] =?UTF-8?q?:sparkles:=20=E6=B7=BB=E5=8A=A0=E6=96=B0?= =?UTF-8?q?=E7=89=B9=E6=80=A7=E3=80=82=E6=94=AF=E6=8C=81nacos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pigx-auth/pom.xml | 7 +- pigx-auth/src/main/resources/bootstrap.yml | 22 +- .../src/main/resources/logback-spring.xml | 20 +- pigx-config/Dockerfile | 15 - pigx-config/conf/schema.sql | 188 + .../DEFAULT_GROUP}/application-dev.yml | 2 +- .../DEFAULT_GROUP}/pigx-activiti-dev.yml | 2 +- .../DEFAULT_GROUP}/pigx-auth-dev.yml | 2 +- .../DEFAULT_GROUP}/pigx-codegen-dev.yml | 0 .../pigx-daemon-elastic-job-dev.yml | 2 +- .../DEFAULT_GROUP}/pigx-daemon-quartz-dev.yml | 1 - .../DEFAULT_GROUP}/pigx-gateway-dev.yml | 2 +- .../DEFAULT_GROUP}/pigx-monitor-dev.yml | 2 +- .../DEFAULT_GROUP}/pigx-mp-manager-dev.yml | 0 .../DEFAULT_GROUP}/pigx-tx-manager-dev.yml | 2 +- .../DEFAULT_GROUP}/pigx-upms-biz-dev.yml | 2 +- .../DEFAULT_GROUP}/pigx-zipkin-dev.yml | 0 pigx-config/data/naming/meta.properties | 0 pigx-config/pom.xml | 67 - .../pigx/config/PigxConfigApplication.java | 38 - pigx-config/src/main/resources/banner.txt | 16 - pigx-config/src/main/resources/bootstrap.yml | 29 - .../src/main/resources/logback-spring.xml | 54 - pigx-eureka/Dockerfile | 15 - pigx-eureka/pom.xml | 76 - .../pigx/eureka/PigxEurekaApplication.java | 39 - .../eureka/security/WebSecurityConfig.java | 41 - pigx-eureka/src/main/resources/banner.txt | 16 - pigx-eureka/src/main/resources/bootstrap.yml | 34 - .../src/main/resources/logback-spring.xml | 52 - pigx-gateway/pom.xml | 7 +- pigx-gateway/src/main/resources/bootstrap.yml | 23 +- pigx-register/pom.xml | 75 + .../alibaba/nacos/PigxNacosApplication.java | 41 + .../console/config/WebSecurityConfig.java | 107 + .../console/controller/AuthController.java | 82 + .../console/controller/HealthController.java | 108 + .../controller/NamespaceController.java | 166 + .../controller/ServerStateController.java | 60 + .../filter/JwtAuthenticationTokenFilter.java | 80 + .../nacos/console/model/Namespace.java | 93 + .../nacos/console/model/NamespaceAllInfo.java | 46 + .../CustomAuthenticationProvider.java | 55 + .../console/security/CustomUserDetails.java | 73 + .../CustomUserDetailsServiceImpl.java | 46 + .../security/JwtAuthenticationEntryPoint.java | 46 + .../nacos/console/utils/JwtTokenUtils.java | 139 + .../console/utils/PasswordEncoderUtil.java | 30 + .../src/main/resources/bootstrap.yml | 26 + .../src/main/resources/nacos-version.txt | 1 + .../main/resources/static/console-fe/.babelrc | 26 + .../resources/static/console-fe/.editorconfig | 16 + .../resources/static/console-fe/.eslintignore | 6 + .../resources/static/console-fe/.eslintrc | 35 + .../resources/static/console-fe/.gitignore | 16 + .../static/console-fe/.prettierignore | 6 + .../resources/static/console-fe/.prettierrc | 9 + .../resources/static/console-fe/README.md | 60 + .../resources/static/console-fe/package.json | 80 + .../console-fe/public/css/bootstrap.css | 7124 ++++++++++++ .../console-fe/public/css/codemirror.css | 353 + .../console-fe/public/css/console1412.css | 1 + .../console-fe/public/css/font-awesome.css | 2099 ++++ .../public/css/fonts/aliyun-console-font.eot | Bin 0 -> 169748 bytes .../public/css/fonts/aliyun-console-font.ttf | Bin 0 -> 169536 bytes .../public/css/fonts/aliyun-console-font.woff | Bin 0 -> 169612 bytes .../css/fonts/font_515771_emcns5054x3whfr.ttf | Bin 0 -> 9988 bytes .../fonts/font_515771_emcns5054x3whfr.woff | Bin 0 -> 5504 bytes .../public/css/fonts/roboto-bold.ttf | Bin 0 -> 48448 bytes .../public/css/fonts/roboto-bold.woff | Bin 0 -> 26712 bytes .../public/css/fonts/roboto-bold.woff2 | Bin 0 -> 20248 bytes .../public/css/fonts/roboto-regular.ttf | Bin 0 -> 47940 bytes .../public/css/fonts/roboto-regular.woff | Bin 0 -> 26296 bytes .../public/css/fonts/roboto-regular.woff2 | Bin 0 -> 19988 bytes .../static/console-fe/public/css/icon.css | 262 + .../static/console-fe/public/css/merge.css | 126 + .../TB118jPv_mWBKNjSZFBXXXxUFXa-2000-390.svg | 1 + .../console-fe/public/img/black_dot.png | Bin 0 -> 114 bytes .../static/console-fe/public/img/nacos.png | Bin 0 -> 3588 bytes .../static/console-fe/public/index.html | 54 + .../public/js/codemirror.addone.fullscreen.js | 51 + .../public/js/codemirror.addone.json-lint.js | 41 + .../public/js/codemirror.addone.lint.js | 248 + .../static/console-fe/public/js/codemirror.js | 9512 +++++++++++++++++ .../public/js/codemirror.lib.clike-lint.js | 799 ++ .../public/js/codemirror.lib.json-lint.js | 445 + .../console-fe/public/js/diff_match_patch.js | 49 + .../static/console-fe/public/js/javascript.js | 828 ++ .../static/console-fe/public/js/jquery.js | 4 + .../static/console-fe/public/js/loader.js | 8 + .../static/console-fe/public/js/merge.js | 1007 ++ .../public/js/vs/base/worker/workerMain.js | 8 + .../public/js/vs/basic-languages/src/bat.js | 7 + .../js/vs/basic-languages/src/coffee.js | 7 + .../public/js/vs/basic-languages/src/cpp.js | 7 + .../js/vs/basic-languages/src/csharp.js | 7 + .../public/js/vs/basic-languages/src/css.js | 7 + .../js/vs/basic-languages/src/dockerfile.js | 7 + .../js/vs/basic-languages/src/fsharp.js | 7 + .../public/js/vs/basic-languages/src/go.js | 7 + .../js/vs/basic-languages/src/handlebars.js | 7 + .../public/js/vs/basic-languages/src/html.js | 7 + .../public/js/vs/basic-languages/src/ini.js | 7 + .../public/js/vs/basic-languages/src/java.js | 7 + .../public/js/vs/basic-languages/src/less.js | 7 + .../public/js/vs/basic-languages/src/lua.js | 7 + .../js/vs/basic-languages/src/markdown.js | 7 + .../public/js/vs/basic-languages/src/msdax.js | 7 + .../js/vs/basic-languages/src/objective-c.js | 7 + .../public/js/vs/basic-languages/src/php.js | 7 + .../js/vs/basic-languages/src/postiats.js | 7 + .../js/vs/basic-languages/src/powershell.js | 7 + .../public/js/vs/basic-languages/src/pug.js | 7 + .../js/vs/basic-languages/src/python.js | 7 + .../public/js/vs/basic-languages/src/r.js | 7 + .../public/js/vs/basic-languages/src/razor.js | 7 + .../public/js/vs/basic-languages/src/ruby.js | 7 + .../public/js/vs/basic-languages/src/sb.js | 7 + .../public/js/vs/basic-languages/src/scss.js | 7 + .../js/vs/basic-languages/src/solidity.js | 7 + .../public/js/vs/basic-languages/src/sql.js | 7 + .../public/js/vs/basic-languages/src/swift.js | 10 + .../public/js/vs/basic-languages/src/vb.js | 7 + .../public/js/vs/basic-languages/src/xml.js | 7 + .../public/js/vs/basic-languages/src/yaml.js | 7 + .../suggest/browser/media/String_16x.svg | 1 + .../browser/media/String_inverse_16x.svg | 1 + .../public/js/vs/editor/editor.main.css | 6 + .../public/js/vs/editor/editor.main.js | 69 + .../public/js/vs/editor/editor.main.nls.de.js | 14 + .../public/js/vs/editor/editor.main.nls.es.js | 14 + .../public/js/vs/editor/editor.main.nls.fr.js | 14 + .../public/js/vs/editor/editor.main.nls.hu.js | 14 + .../public/js/vs/editor/editor.main.nls.it.js | 14 + .../public/js/vs/editor/editor.main.nls.ja.js | 14 + .../public/js/vs/editor/editor.main.nls.js | 14 + .../public/js/vs/editor/editor.main.nls.ko.js | 14 + .../js/vs/editor/editor.main.nls.pt-br.js | 14 + .../public/js/vs/editor/editor.main.nls.ru.js | 14 + .../public/js/vs/editor/editor.main.nls.tr.js | 14 + .../js/vs/editor/editor.main.nls.zh-cn.js | 14 + .../js/vs/editor/editor.main.nls.zh-tw.js | 14 + .../browser/quickOpen/symbol-sprite.svg | 1 + .../public/js/vs/language/css/cssMode.js | 7 + .../public/js/vs/language/css/cssWorker.js | 21 + .../public/js/vs/language/html/htmlMode.js | 7 + .../public/js/vs/language/html/htmlWorker.js | 167 + .../public/js/vs/language/json/jsonMode.js | 8 + .../public/js/vs/language/json/jsonWorker.js | 9 + .../typescript/lib/typescriptServices.js | 67 + .../js/vs/language/typescript/src/mode.js | 7 + .../js/vs/language/typescript/src/worker.js | 15 + .../static/console-fe/public/js/vs/loader.js | 8 + .../static/console-fe/public/js/xml.js | 404 + .../src/components/BatchHandle/BatchHandle.js | 149 + .../src/components/BatchHandle/index.js | 16 + .../src/components/BatchHandle/index.scss | 12 + .../src/components/CloneDialog/CloneDialog.js | 236 + .../src/components/CloneDialog/index.js | 16 + .../src/components/CloneDialog/index.scss | 12 + .../components/DeleteDialog/DeleteDialog.js | 119 + .../src/components/DeleteDialog/index.js | 16 + .../src/components/DeleteDialog/index.scss | 12 + .../DiffEditorDialog/DiffEditorDialog.js | 113 + .../src/components/DiffEditorDialog/index.js | 16 + .../components/DiffEditorDialog/index.scss | 12 + .../EditorNameSpace/EditorNameSpace.js | 212 + .../src/components/EditorNameSpace/index.js | 16 + .../src/components/EditorNameSpace/index.scss | 12 + .../components/ExportDialog/ExportDialog.js | 161 + .../src/components/ExportDialog/index.js | 16 + .../src/components/ExportDialog/index.scss | 12 + .../components/ImportDialog/ImportDialog.js | 197 + .../src/components/ImportDialog/index.js | 16 + .../src/components/ImportDialog/index.scss | 12 + .../components/MonacoEditor/MonacoEditor.tsx | 111 + .../src/components/MonacoEditor/constant.ts | 27 + .../src/components/MonacoEditor/index.scss | 12 + .../src/components/MonacoEditor/index.tsx | 16 + .../components/NameSpaceList/NameSpaceList.js | 224 + .../src/components/NameSpaceList/index.js | 16 + .../src/components/NameSpaceList/index.scss | 12 + .../components/NewNameSpace/NewNameSpace.js | 232 + .../src/components/NewNameSpace/index.js | 16 + .../src/components/NewNameSpace/index.scss | 12 + .../src/components/RegionGroup/RegionGroup.js | 330 + .../src/components/RegionGroup/index.js | 16 + .../src/components/RegionGroup/index.scss | 12 + .../src/components/ShowCodeing/ShowCodeing.js | 328 + .../src/components/ShowCodeing/index.js | 16 + .../src/components/ShowCodeing/index.scss | 12 + .../components/SuccessDialog/SuccessDialog.js | 132 + .../src/components/SuccessDialog/index.js | 16 + .../src/components/SuccessDialog/index.scss | 12 + .../resources/static/console-fe/src/config.js | 142 + .../static/console-fe/src/constants.js | 22 + .../static/console-fe/src/globalLib.js | 650 ++ .../static/console-fe/src/i18ndoc.js | 1167 ++ .../resources/static/console-fe/src/index.js | 147 + .../static/console-fe/src/index.scss | 1238 +++ .../static/console-fe/src/layouts/Header.js | 120 + .../console-fe/src/layouts/MainLayout.js | 510 + .../static/console-fe/src/layouts/index.scss | 1400 +++ .../resources/static/console-fe/src/lib.js | 207 + .../static/console-fe/src/locales/en-US.js | 407 + .../static/console-fe/src/locales/index.js | 17 + .../static/console-fe/src/locales/zh-CN.js | 406 + .../resources/static/console-fe/src/menu.js | 233 + .../ConfigDetail/ConfigDetail.js | 249 + .../ConfigDetail/index.js | 16 + .../ConfigDetail/index.scss | 12 + .../ConfigEditor/ConfigEditor.js | 756 ++ .../ConfigEditor/index.js | 16 + .../ConfigEditor/index.scss | 12 + .../ConfigRollback/ConfigRollback.js | 224 + .../ConfigRollback/index.js | 16 + .../ConfigRollback/index.scss | 12 + .../ConfigSync/ConfigSync.js | 309 + .../ConfigSync/index.js | 16 + .../ConfigSync/index.scss | 12 + .../ConfigurationManagement.js | 892 ++ .../ConfigurationManagement/DashboardCard.js | 106 + .../ConfigurationManagement/index.js | 16 + .../ConfigurationManagement/index.scss | 12 + .../HistoryDetail/HistoryDetail.js | 141 + .../HistoryDetail/index.js | 16 + .../HistoryDetail/index.scss | 12 + .../HistoryRollback/HistoryRollback.js | 397 + .../HistoryRollback/index.js | 16 + .../HistoryRollback/index.scss | 12 + .../ListeningToQuery/ListeningToQuery.js | 328 + .../ListeningToQuery/index.js | 16 + .../ListeningToQuery/index.scss | 12 + .../NewConfig/NewConfig.js | 589 + .../NewConfig/index.js | 16 + .../NewConfig/index.scss | 20 + .../console-fe/src/pages/Login/Login.jsx | 136 + .../console-fe/src/pages/Login/index.jsx | 16 + .../console-fe/src/pages/Login/index.scss | 116 + .../src/pages/NameSpace/NameSpace.js | 356 + .../console-fe/src/pages/NameSpace/index.js | 16 + .../console-fe/src/pages/NameSpace/index.scss | 12 + .../ServiceDetail/EditClusterDialog.js | 179 + .../ServiceDetail/EditInstanceDialog.js | 143 + .../ServiceDetail/EditServiceDialog.js | 217 + .../ServiceDetail/InstanceTable.js | 188 + .../ServiceDetail/ServiceDetail.js | 193 + .../ServiceDetail/ServiceDetail.scss | 63 + .../ServiceDetail/constant.js | 30 + .../ServiceManagement/ServiceDetail/index.js | 16 + .../ServiceList/ServiceList.js | 278 + .../ServiceList/ServiceList.scss | 29 + .../ServiceManagement/ServiceList/index.js | 16 + .../static/console-fe/src/reducers/base.js | 55 + .../static/console-fe/src/reducers/index.js | 17 + .../static/console-fe/src/reducers/locale.js | 42 + .../console-fe/src/utils/ajaxrequest.js | 24 + .../static/console-fe/src/utils/cookie.js | 15 + .../console-fe/src/utils/localstorage.js | 24 + .../static/console-fe/src/utils/nacosutil.js | 76 + .../static/console-fe/src/utils/request.js | 33 + .../console-fe/src/utils/validateContent.js | 77 + .../static/console-fe/test/.editorconfig | 17 + .../static/console-fe/test/.gitignore | 9 + .../static/console-fe/test/README.md | 40 + .../static/console-fe/test/commons/commons.md | 1 + .../static/console-fe/test/config.json | 14 + .../resources/static/console-fe/test/hosts | 0 .../static/console-fe/test/install.sh | 4 + .../static/console-fe/test/package.json | 25 + .../resources/static/console-fe/test/run.bat | 7 + .../resources/static/console-fe/test/run.sh | 5 + .../sample/configurationManagement.spec.js | 527 + .../test/uploadfiles/uploadfiles.md | 1 + .../resources/static/console-fe/tsconfig.json | 20 + .../resources/static/console-fe/yarn.lock | 8363 +++++++++++++++ .../src/main/resources/static/css/main.css | 1 + .../TB118jPv_mWBKNjSZFBXXXxUFXa-2000-390.svg | 1 + .../main/resources/static/img/black_dot.png | Bin 0 -> 114 bytes .../src/main/resources/static/img/nacos.png | Bin 0 -> 3588 bytes .../src/main/resources/static/index.html | 58 + .../src/main/resources/static/js/main.js | 95 + .../src/main/resources/static/login.html | 27 + pigx-upms/pigx-upms-biz/pom.xml | 6 +- .../src/main/resources/bootstrap.yml | 22 +- pigx-visual/pigx-activiti/pom.xml | 7 +- .../src/main/resources/bootstrap.yml | 24 +- pigx-visual/pigx-codegen/pom.xml | 7 +- .../src/main/resources/bootstrap.yml | 23 +- pigx-visual/pigx-daemon-elastic-job/pom.xml | 7 +- .../src/main/resources/bootstrap.yml | 23 +- pigx-visual/pigx-daemon-quartz/pom.xml | 7 +- .../quartz/controller/SysJobController.java | 10 +- .../src/main/resources/bootstrap.yml | 23 +- pigx-visual/pigx-monitor/pom.xml | 13 +- .../src/main/resources/bootstrap.yml | 22 +- pigx-visual/pigx-mp-manager/.rebel.xml.bak | 14 + pigx-visual/pigx-mp-manager/pom.xml | 7 +- .../src/main/resources/bootstrap.yml | 23 +- pigx-visual/pigx-tx-manager/pom.xml | 6 +- .../src/main/resources/bootstrap.yml | 24 +- pigx-visual/pigx-zipkin/pom.xml | 7 +- .../src/main/resources/bootstrap.yml | 23 +- pom.xml | 27 +- 304 files changed, 51587 insertions(+), 710 deletions(-) delete mode 100644 pigx-config/Dockerfile create mode 100644 pigx-config/conf/schema.sql rename pigx-config/{src/main/resources/config => data/config-data/DEFAULT_GROUP}/application-dev.yml (98%) rename pigx-config/{src/main/resources/config => data/config-data/DEFAULT_GROUP}/pigx-activiti-dev.yml (97%) rename pigx-config/{src/main/resources/config => data/config-data/DEFAULT_GROUP}/pigx-auth-dev.yml (94%) rename pigx-config/{src/main/resources/config => data/config-data/DEFAULT_GROUP}/pigx-codegen-dev.yml (100%) rename pigx-config/{src/main/resources/config => data/config-data/DEFAULT_GROUP}/pigx-daemon-elastic-job-dev.yml (97%) rename pigx-config/{src/main/resources/config => data/config-data/DEFAULT_GROUP}/pigx-daemon-quartz-dev.yml (99%) rename pigx-config/{src/main/resources/config => data/config-data/DEFAULT_GROUP}/pigx-gateway-dev.yml (84%) rename pigx-config/{src/main/resources/config => data/config-data/DEFAULT_GROUP}/pigx-monitor-dev.yml (88%) rename pigx-config/{src/main/resources/config => data/config-data/DEFAULT_GROUP}/pigx-mp-manager-dev.yml (100%) rename pigx-config/{src/main/resources/config => data/config-data/DEFAULT_GROUP}/pigx-tx-manager-dev.yml (90%) rename pigx-config/{src/main/resources/config => data/config-data/DEFAULT_GROUP}/pigx-upms-biz-dev.yml (98%) rename pigx-config/{src/main/resources/config => data/config-data/DEFAULT_GROUP}/pigx-zipkin-dev.yml (100%) create mode 100644 pigx-config/data/naming/meta.properties delete mode 100644 pigx-config/pom.xml delete mode 100644 pigx-config/src/main/java/com/pig4cloud/pigx/config/PigxConfigApplication.java delete mode 100644 pigx-config/src/main/resources/banner.txt delete mode 100644 pigx-config/src/main/resources/bootstrap.yml delete mode 100644 pigx-config/src/main/resources/logback-spring.xml delete mode 100644 pigx-eureka/Dockerfile delete mode 100644 pigx-eureka/pom.xml delete mode 100644 pigx-eureka/src/main/java/com/pig4cloud/pigx/eureka/PigxEurekaApplication.java delete mode 100644 pigx-eureka/src/main/java/com/pig4cloud/pigx/eureka/security/WebSecurityConfig.java delete mode 100644 pigx-eureka/src/main/resources/banner.txt delete mode 100644 pigx-eureka/src/main/resources/bootstrap.yml delete mode 100644 pigx-eureka/src/main/resources/logback-spring.xml create mode 100755 pigx-register/pom.xml create mode 100755 pigx-register/src/main/java/com/alibaba/nacos/PigxNacosApplication.java create mode 100755 pigx-register/src/main/java/com/alibaba/nacos/console/config/WebSecurityConfig.java create mode 100755 pigx-register/src/main/java/com/alibaba/nacos/console/controller/AuthController.java create mode 100755 pigx-register/src/main/java/com/alibaba/nacos/console/controller/HealthController.java create mode 100755 pigx-register/src/main/java/com/alibaba/nacos/console/controller/NamespaceController.java create mode 100755 pigx-register/src/main/java/com/alibaba/nacos/console/controller/ServerStateController.java create mode 100755 pigx-register/src/main/java/com/alibaba/nacos/console/filter/JwtAuthenticationTokenFilter.java create mode 100755 pigx-register/src/main/java/com/alibaba/nacos/console/model/Namespace.java create mode 100755 pigx-register/src/main/java/com/alibaba/nacos/console/model/NamespaceAllInfo.java create mode 100755 pigx-register/src/main/java/com/alibaba/nacos/console/security/CustomAuthenticationProvider.java create mode 100755 pigx-register/src/main/java/com/alibaba/nacos/console/security/CustomUserDetails.java create mode 100755 pigx-register/src/main/java/com/alibaba/nacos/console/security/CustomUserDetailsServiceImpl.java create mode 100755 pigx-register/src/main/java/com/alibaba/nacos/console/security/JwtAuthenticationEntryPoint.java create mode 100755 pigx-register/src/main/java/com/alibaba/nacos/console/utils/JwtTokenUtils.java create mode 100755 pigx-register/src/main/java/com/alibaba/nacos/console/utils/PasswordEncoderUtil.java create mode 100755 pigx-register/src/main/resources/bootstrap.yml create mode 100755 pigx-register/src/main/resources/nacos-version.txt create mode 100755 pigx-register/src/main/resources/static/console-fe/.babelrc create mode 100755 pigx-register/src/main/resources/static/console-fe/.editorconfig create mode 100755 pigx-register/src/main/resources/static/console-fe/.eslintignore create mode 100755 pigx-register/src/main/resources/static/console-fe/.eslintrc create mode 100755 pigx-register/src/main/resources/static/console-fe/.gitignore create mode 100755 pigx-register/src/main/resources/static/console-fe/.prettierignore create mode 100755 pigx-register/src/main/resources/static/console-fe/.prettierrc create mode 100755 pigx-register/src/main/resources/static/console-fe/README.md create mode 100755 pigx-register/src/main/resources/static/console-fe/package.json create mode 100755 pigx-register/src/main/resources/static/console-fe/public/css/bootstrap.css create mode 100755 pigx-register/src/main/resources/static/console-fe/public/css/codemirror.css create mode 100755 pigx-register/src/main/resources/static/console-fe/public/css/console1412.css create mode 100755 pigx-register/src/main/resources/static/console-fe/public/css/font-awesome.css create mode 100755 pigx-register/src/main/resources/static/console-fe/public/css/fonts/aliyun-console-font.eot create mode 100755 pigx-register/src/main/resources/static/console-fe/public/css/fonts/aliyun-console-font.ttf create mode 100755 pigx-register/src/main/resources/static/console-fe/public/css/fonts/aliyun-console-font.woff create mode 100755 pigx-register/src/main/resources/static/console-fe/public/css/fonts/font_515771_emcns5054x3whfr.ttf create mode 100755 pigx-register/src/main/resources/static/console-fe/public/css/fonts/font_515771_emcns5054x3whfr.woff create mode 100755 pigx-register/src/main/resources/static/console-fe/public/css/fonts/roboto-bold.ttf create mode 100755 pigx-register/src/main/resources/static/console-fe/public/css/fonts/roboto-bold.woff create mode 100755 pigx-register/src/main/resources/static/console-fe/public/css/fonts/roboto-bold.woff2 create mode 100755 pigx-register/src/main/resources/static/console-fe/public/css/fonts/roboto-regular.ttf create mode 100755 pigx-register/src/main/resources/static/console-fe/public/css/fonts/roboto-regular.woff create mode 100755 pigx-register/src/main/resources/static/console-fe/public/css/fonts/roboto-regular.woff2 create mode 100755 pigx-register/src/main/resources/static/console-fe/public/css/icon.css create mode 100755 pigx-register/src/main/resources/static/console-fe/public/css/merge.css create mode 100755 pigx-register/src/main/resources/static/console-fe/public/img/TB118jPv_mWBKNjSZFBXXXxUFXa-2000-390.svg create mode 100755 pigx-register/src/main/resources/static/console-fe/public/img/black_dot.png create mode 100755 pigx-register/src/main/resources/static/console-fe/public/img/nacos.png create mode 100755 pigx-register/src/main/resources/static/console-fe/public/index.html create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/codemirror.addone.fullscreen.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/codemirror.addone.json-lint.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/codemirror.addone.lint.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/codemirror.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/codemirror.lib.clike-lint.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/codemirror.lib.json-lint.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/diff_match_patch.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/javascript.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/jquery.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/loader.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/merge.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/base/worker/workerMain.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/basic-languages/src/bat.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/basic-languages/src/coffee.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/basic-languages/src/cpp.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/basic-languages/src/csharp.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/basic-languages/src/css.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/basic-languages/src/dockerfile.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/basic-languages/src/fsharp.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/basic-languages/src/go.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/basic-languages/src/handlebars.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/basic-languages/src/html.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/basic-languages/src/ini.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/basic-languages/src/java.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/basic-languages/src/less.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/basic-languages/src/lua.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/basic-languages/src/markdown.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/basic-languages/src/msdax.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/basic-languages/src/objective-c.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/basic-languages/src/php.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/basic-languages/src/postiats.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/basic-languages/src/powershell.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/basic-languages/src/pug.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/basic-languages/src/python.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/basic-languages/src/r.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/basic-languages/src/razor.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/basic-languages/src/ruby.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/basic-languages/src/sb.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/basic-languages/src/scss.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/basic-languages/src/solidity.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/basic-languages/src/sql.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/basic-languages/src/swift.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/basic-languages/src/vb.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/basic-languages/src/xml.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/basic-languages/src/yaml.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/editor/contrib/suggest/browser/media/String_16x.svg create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/editor/contrib/suggest/browser/media/String_inverse_16x.svg create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/editor/editor.main.css create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/editor/editor.main.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/editor/editor.main.nls.de.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/editor/editor.main.nls.es.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/editor/editor.main.nls.fr.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/editor/editor.main.nls.hu.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/editor/editor.main.nls.it.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/editor/editor.main.nls.ja.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/editor/editor.main.nls.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/editor/editor.main.nls.ko.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/editor/editor.main.nls.pt-br.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/editor/editor.main.nls.ru.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/editor/editor.main.nls.tr.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/editor/editor.main.nls.zh-cn.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/editor/editor.main.nls.zh-tw.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/editor/standalone/browser/quickOpen/symbol-sprite.svg create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/language/css/cssMode.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/language/css/cssWorker.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/language/html/htmlMode.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/language/html/htmlWorker.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/language/json/jsonMode.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/language/json/jsonWorker.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/language/typescript/lib/typescriptServices.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/language/typescript/src/mode.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/language/typescript/src/worker.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/vs/loader.js create mode 100755 pigx-register/src/main/resources/static/console-fe/public/js/xml.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/components/BatchHandle/BatchHandle.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/components/BatchHandle/index.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/components/BatchHandle/index.scss create mode 100755 pigx-register/src/main/resources/static/console-fe/src/components/CloneDialog/CloneDialog.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/components/CloneDialog/index.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/components/CloneDialog/index.scss create mode 100755 pigx-register/src/main/resources/static/console-fe/src/components/DeleteDialog/DeleteDialog.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/components/DeleteDialog/index.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/components/DeleteDialog/index.scss create mode 100755 pigx-register/src/main/resources/static/console-fe/src/components/DiffEditorDialog/DiffEditorDialog.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/components/DiffEditorDialog/index.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/components/DiffEditorDialog/index.scss create mode 100755 pigx-register/src/main/resources/static/console-fe/src/components/EditorNameSpace/EditorNameSpace.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/components/EditorNameSpace/index.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/components/EditorNameSpace/index.scss create mode 100755 pigx-register/src/main/resources/static/console-fe/src/components/ExportDialog/ExportDialog.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/components/ExportDialog/index.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/components/ExportDialog/index.scss create mode 100755 pigx-register/src/main/resources/static/console-fe/src/components/ImportDialog/ImportDialog.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/components/ImportDialog/index.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/components/ImportDialog/index.scss create mode 100755 pigx-register/src/main/resources/static/console-fe/src/components/MonacoEditor/MonacoEditor.tsx create mode 100755 pigx-register/src/main/resources/static/console-fe/src/components/MonacoEditor/constant.ts create mode 100755 pigx-register/src/main/resources/static/console-fe/src/components/MonacoEditor/index.scss create mode 100755 pigx-register/src/main/resources/static/console-fe/src/components/MonacoEditor/index.tsx create mode 100755 pigx-register/src/main/resources/static/console-fe/src/components/NameSpaceList/NameSpaceList.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/components/NameSpaceList/index.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/components/NameSpaceList/index.scss create mode 100755 pigx-register/src/main/resources/static/console-fe/src/components/NewNameSpace/NewNameSpace.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/components/NewNameSpace/index.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/components/NewNameSpace/index.scss create mode 100755 pigx-register/src/main/resources/static/console-fe/src/components/RegionGroup/RegionGroup.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/components/RegionGroup/index.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/components/RegionGroup/index.scss create mode 100755 pigx-register/src/main/resources/static/console-fe/src/components/ShowCodeing/ShowCodeing.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/components/ShowCodeing/index.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/components/ShowCodeing/index.scss create mode 100755 pigx-register/src/main/resources/static/console-fe/src/components/SuccessDialog/SuccessDialog.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/components/SuccessDialog/index.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/components/SuccessDialog/index.scss create mode 100755 pigx-register/src/main/resources/static/console-fe/src/config.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/constants.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/globalLib.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/i18ndoc.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/index.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/index.scss create mode 100755 pigx-register/src/main/resources/static/console-fe/src/layouts/Header.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/layouts/MainLayout.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/layouts/index.scss create mode 100755 pigx-register/src/main/resources/static/console-fe/src/lib.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/locales/en-US.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/locales/index.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/locales/zh-CN.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/menu.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/pages/ConfigurationManagement/ConfigDetail/ConfigDetail.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/pages/ConfigurationManagement/ConfigDetail/index.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/pages/ConfigurationManagement/ConfigDetail/index.scss create mode 100755 pigx-register/src/main/resources/static/console-fe/src/pages/ConfigurationManagement/ConfigEditor/ConfigEditor.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/pages/ConfigurationManagement/ConfigEditor/index.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/pages/ConfigurationManagement/ConfigEditor/index.scss create mode 100755 pigx-register/src/main/resources/static/console-fe/src/pages/ConfigurationManagement/ConfigRollback/ConfigRollback.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/pages/ConfigurationManagement/ConfigRollback/index.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/pages/ConfigurationManagement/ConfigRollback/index.scss create mode 100755 pigx-register/src/main/resources/static/console-fe/src/pages/ConfigurationManagement/ConfigSync/ConfigSync.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/pages/ConfigurationManagement/ConfigSync/index.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/pages/ConfigurationManagement/ConfigSync/index.scss create mode 100755 pigx-register/src/main/resources/static/console-fe/src/pages/ConfigurationManagement/ConfigurationManagement/ConfigurationManagement.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/pages/ConfigurationManagement/ConfigurationManagement/DashboardCard.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/pages/ConfigurationManagement/ConfigurationManagement/index.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/pages/ConfigurationManagement/ConfigurationManagement/index.scss create mode 100755 pigx-register/src/main/resources/static/console-fe/src/pages/ConfigurationManagement/HistoryDetail/HistoryDetail.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/pages/ConfigurationManagement/HistoryDetail/index.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/pages/ConfigurationManagement/HistoryDetail/index.scss create mode 100755 pigx-register/src/main/resources/static/console-fe/src/pages/ConfigurationManagement/HistoryRollback/HistoryRollback.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/pages/ConfigurationManagement/HistoryRollback/index.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/pages/ConfigurationManagement/HistoryRollback/index.scss create mode 100755 pigx-register/src/main/resources/static/console-fe/src/pages/ConfigurationManagement/ListeningToQuery/ListeningToQuery.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/pages/ConfigurationManagement/ListeningToQuery/index.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/pages/ConfigurationManagement/ListeningToQuery/index.scss create mode 100755 pigx-register/src/main/resources/static/console-fe/src/pages/ConfigurationManagement/NewConfig/NewConfig.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/pages/ConfigurationManagement/NewConfig/index.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/pages/ConfigurationManagement/NewConfig/index.scss create mode 100755 pigx-register/src/main/resources/static/console-fe/src/pages/Login/Login.jsx create mode 100755 pigx-register/src/main/resources/static/console-fe/src/pages/Login/index.jsx create mode 100755 pigx-register/src/main/resources/static/console-fe/src/pages/Login/index.scss create mode 100755 pigx-register/src/main/resources/static/console-fe/src/pages/NameSpace/NameSpace.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/pages/NameSpace/index.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/pages/NameSpace/index.scss create mode 100755 pigx-register/src/main/resources/static/console-fe/src/pages/ServiceManagement/ServiceDetail/EditClusterDialog.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/pages/ServiceManagement/ServiceDetail/EditInstanceDialog.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/pages/ServiceManagement/ServiceDetail/EditServiceDialog.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/pages/ServiceManagement/ServiceDetail/InstanceTable.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/pages/ServiceManagement/ServiceDetail/ServiceDetail.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/pages/ServiceManagement/ServiceDetail/ServiceDetail.scss create mode 100755 pigx-register/src/main/resources/static/console-fe/src/pages/ServiceManagement/ServiceDetail/constant.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/pages/ServiceManagement/ServiceDetail/index.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/pages/ServiceManagement/ServiceList/ServiceList.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/pages/ServiceManagement/ServiceList/ServiceList.scss create mode 100755 pigx-register/src/main/resources/static/console-fe/src/pages/ServiceManagement/ServiceList/index.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/reducers/base.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/reducers/index.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/reducers/locale.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/utils/ajaxrequest.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/utils/cookie.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/utils/localstorage.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/utils/nacosutil.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/utils/request.js create mode 100755 pigx-register/src/main/resources/static/console-fe/src/utils/validateContent.js create mode 100755 pigx-register/src/main/resources/static/console-fe/test/.editorconfig create mode 100755 pigx-register/src/main/resources/static/console-fe/test/.gitignore create mode 100755 pigx-register/src/main/resources/static/console-fe/test/README.md create mode 100755 pigx-register/src/main/resources/static/console-fe/test/commons/commons.md create mode 100755 pigx-register/src/main/resources/static/console-fe/test/config.json create mode 100755 pigx-register/src/main/resources/static/console-fe/test/hosts create mode 100755 pigx-register/src/main/resources/static/console-fe/test/install.sh create mode 100755 pigx-register/src/main/resources/static/console-fe/test/package.json create mode 100755 pigx-register/src/main/resources/static/console-fe/test/run.bat create mode 100755 pigx-register/src/main/resources/static/console-fe/test/run.sh create mode 100755 pigx-register/src/main/resources/static/console-fe/test/sample/configurationManagement.spec.js create mode 100755 pigx-register/src/main/resources/static/console-fe/test/uploadfiles/uploadfiles.md create mode 100755 pigx-register/src/main/resources/static/console-fe/tsconfig.json create mode 100755 pigx-register/src/main/resources/static/console-fe/yarn.lock create mode 100755 pigx-register/src/main/resources/static/css/main.css create mode 100755 pigx-register/src/main/resources/static/img/TB118jPv_mWBKNjSZFBXXXxUFXa-2000-390.svg create mode 100755 pigx-register/src/main/resources/static/img/black_dot.png create mode 100755 pigx-register/src/main/resources/static/img/nacos.png create mode 100755 pigx-register/src/main/resources/static/index.html create mode 100755 pigx-register/src/main/resources/static/js/main.js create mode 100755 pigx-register/src/main/resources/static/login.html create mode 100644 pigx-visual/pigx-mp-manager/.rebel.xml.bak diff --git a/pigx-auth/pom.xml b/pigx-auth/pom.xml index 0138ddba4..6a3fc385e 100644 --- a/pigx-auth/pom.xml +++ b/pigx-auth/pom.xml @@ -33,10 +33,15 @@ pigx 认证授权中心,基于 spring security oAuth2 + + + org.springframework.cloud + spring-cloud-starter-alibaba-nacos-discovery + org.springframework.cloud - spring-cloud-starter-config + spring-cloud-starter-alibaba-nacos-config diff --git a/pigx-auth/src/main/resources/bootstrap.yml b/pigx-auth/src/main/resources/bootstrap.yml index b1accdfd4..d9e485139 100644 --- a/pigx-auth/src/main/resources/bootstrap.yml +++ b/pigx-auth/src/main/resources/bootstrap.yml @@ -5,20 +5,12 @@ spring: application: name: @artifactId@ cloud: - config: - fail-fast: true - name: ${spring.application.name} - profile: ${spring.profiles.active} + nacos: discovery: - enabled: true - service-id: pigx-config + server-addr: ${NACOS-HOST:pigx-nacos}:${NACOS-PORT:8848} + config: + server-addr: ${spring.cloud.nacos.discovery.server-addr} + file-extension: yml + shared-dataids: application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} profiles: - active: dev - -# 注册中心配置 -eureka: - instance: - prefer-ip-address: true - client: - service-url: - defaultZone: http://pig:pig@${EUREKA-HOST:pigx-eureka}:${EUREKA-PORT:8761}/eureka/ + active: dev \ No newline at end of file diff --git a/pigx-common/pigx-common-core/src/main/resources/logback-spring.xml b/pigx-common/pigx-common-core/src/main/resources/logback-spring.xml index dac7f9c6d..eb1721e59 100644 --- a/pigx-common/pigx-common-core/src/main/resources/logback-spring.xml +++ b/pigx-common/pigx-common-core/src/main/resources/logback-spring.xml @@ -1,15 +1,16 @@ - + + value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/> - - + + + converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/> @@ -47,11 +48,16 @@ - + + + + + + - + diff --git a/pigx-config/Dockerfile b/pigx-config/Dockerfile deleted file mode 100644 index 48a1ce019..000000000 --- a/pigx-config/Dockerfile +++ /dev/null @@ -1,15 +0,0 @@ -FROM anapsix/alpine-java:8_server-jre_unlimited - -MAINTAINER wangiegie@gmail.com - -RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime - -RUN mkdir -p /pigx-config - -WORKDIR /pigx-config - -EXPOSE 8888 - -ADD ./pigx-config/target/pigx-config.jar ./ - -CMD java -Djava.security.egd=file:/dev/./urandom -jar pigx-config.jar diff --git a/pigx-config/conf/schema.sql b/pigx-config/conf/schema.sql new file mode 100644 index 000000000..fd95b3e9f --- /dev/null +++ b/pigx-config/conf/schema.sql @@ -0,0 +1,188 @@ +CREATE SCHEMA nacos AUTHORIZATION nacos; + +CREATE TABLE config_info ( + id bigint NOT NULL generated by default as identity, + data_id varchar(255) NOT NULL, + group_id varchar(128) NOT NULL, + tenant_id varchar(128) default '', + app_name varchar(128), + content CLOB, + md5 varchar(32) DEFAULT NULL, + gmt_create timestamp NOT NULL DEFAULT '2010-05-05 00:00:00', + gmt_modified timestamp NOT NULL DEFAULT '2010-05-05 00:00:00', + src_user varchar(128) DEFAULT NULL, + src_ip varchar(20) DEFAULT NULL, + c_desc varchar(256) DEFAULT NULL, + c_use varchar(64) DEFAULT NULL, + effect varchar(64) DEFAULT NULL, + type varchar(64) DEFAULT NULL, + c_schema LONG VARCHAR DEFAULT NULL, + constraint configinfo_id_key PRIMARY KEY (id), + constraint uk_configinfo_datagrouptenant UNIQUE (data_id,group_id,tenant_id)); + +CREATE INDEX configinfo_dataid_key_idx ON config_info(data_id); +CREATE INDEX configinfo_groupid_key_idx ON config_info(group_id); +CREATE INDEX configinfo_dataid_group_key_idx ON config_info(data_id, group_id); + +CREATE TABLE his_config_info ( + id bigint NOT NULL, + nid bigint NOT NULL generated by default as identity, + data_id varchar(255) NOT NULL, + group_id varchar(128) NOT NULL, + tenant_id varchar(128) default '', + app_name varchar(128), + content CLOB, + md5 varchar(32) DEFAULT NULL, + gmt_create timestamp NOT NULL DEFAULT '2010-05-05 00:00:00.000', + gmt_modified timestamp NOT NULL DEFAULT '2010-05-05 00:00:00.000', + src_user varchar(128), + src_ip varchar(20) DEFAULT NULL, + op_type char(10) DEFAULT NULL, + constraint hisconfiginfo_nid_key PRIMARY KEY (nid)); + +CREATE INDEX hisconfiginfo_dataid_key_idx ON his_config_info(data_id); +CREATE INDEX hisconfiginfo_gmt_create_idx ON his_config_info(gmt_create); +CREATE INDEX hisconfiginfo_gmt_modified_idx ON his_config_info(gmt_modified); + + +CREATE TABLE config_info_beta ( + id bigint NOT NULL generated by default as identity, + data_id varchar(255) NOT NULL, + group_id varchar(128) NOT NULL, + tenant_id varchar(128) default '', + app_name varchar(128), + content CLOB, + beta_ips varchar(1024), + md5 varchar(32) DEFAULT NULL, + gmt_create timestamp NOT NULL DEFAULT '2010-05-05 00:00:00', + gmt_modified timestamp NOT NULL DEFAULT '2010-05-05 00:00:00', + src_user varchar(128), + src_ip varchar(20) DEFAULT NULL, + constraint configinfobeta_id_key PRIMARY KEY (id), + constraint uk_configinfobeta_datagrouptenant UNIQUE (data_id,group_id,tenant_id)); + +CREATE TABLE config_info_tag ( + id bigint NOT NULL generated by default as identity, + data_id varchar(255) NOT NULL, + group_id varchar(128) NOT NULL, + tenant_id varchar(128) default '', + tag_id varchar(128) NOT NULL, + app_name varchar(128), + content CLOB, + md5 varchar(32) DEFAULT NULL, + gmt_create timestamp NOT NULL DEFAULT '2010-05-05 00:00:00', + gmt_modified timestamp NOT NULL DEFAULT '2010-05-05 00:00:00', + src_user varchar(128), + src_ip varchar(20) DEFAULT NULL, + constraint configinfotag_id_key PRIMARY KEY (id), + constraint uk_configinfotag_datagrouptenanttag UNIQUE (data_id,group_id,tenant_id,tag_id)); + +CREATE TABLE config_info_aggr ( + id bigint NOT NULL generated by default as identity, + data_id varchar(255) NOT NULL, + group_id varchar(128) NOT NULL, + tenant_id varchar(128) default '', + datum_id varchar(255) NOT NULL, + app_name varchar(128), + content CLOB, + gmt_modified timestamp NOT NULL DEFAULT '2010-05-05 00:00:00', + constraint configinfoaggr_id_key PRIMARY KEY (id), + constraint uk_configinfoaggr_datagrouptenantdatum UNIQUE (data_id,group_id,tenant_id,datum_id)); + +CREATE TABLE app_list ( + id bigint NOT NULL generated by default as identity, + app_name varchar(128) NOT NULL, + is_dynamic_collect_disabled smallint DEFAULT 0, + last_sub_info_collected_time timestamp DEFAULT '1970-01-01 08:00:00.0', + sub_info_lock_owner varchar(128), + sub_info_lock_time timestamp DEFAULT '1970-01-01 08:00:00.0', + constraint applist_id_key PRIMARY KEY (id), + constraint uk_appname UNIQUE (app_name)); + +CREATE TABLE app_configdata_relation_subs ( + id bigint NOT NULL generated by default as identity, + app_name varchar(128) NOT NULL, + data_id varchar(255) NOT NULL, + group_id varchar(128) NOT NULL, + gmt_modified timestamp DEFAULT '2010-05-05 00:00:00', + constraint configdatarelationsubs_id_key PRIMARY KEY (id), + constraint uk_app_sub_config_datagroup UNIQUE (app_name, data_id, group_id)); + + +CREATE TABLE app_configdata_relation_pubs ( + id bigint NOT NULL generated by default as identity, + app_name varchar(128) NOT NULL, + data_id varchar(255) NOT NULL, + group_id varchar(128) NOT NULL, + gmt_modified timestamp DEFAULT '2010-05-05 00:00:00', + constraint configdatarelationpubs_id_key PRIMARY KEY (id), + constraint uk_app_pub_config_datagroup UNIQUE (app_name, data_id, group_id)); + +CREATE TABLE config_tags_relation ( + id bigint NOT NULL, + tag_name varchar(128) NOT NULL, + tag_type varchar(64) DEFAULT NULL, + data_id varchar(255) NOT NULL, + group_id varchar(128) NOT NULL, + tenant_id varchar(128) DEFAULT '', + nid bigint NOT NULL generated by default as identity, + constraint config_tags_id_key PRIMARY KEY (nid), + constraint uk_configtagrelation_configidtag UNIQUE (id, tag_name, tag_type)); + +CREATE INDEX config_tags_tenant_id_idx ON config_tags_relation(tenant_id); + +CREATE TABLE group_capacity ( + id bigint NOT NULL generated by default as identity, + group_id varchar(128) DEFAULT '', + quota int DEFAULT 0, + usage int DEFAULT 0, + max_size int DEFAULT 0, + max_aggr_count int DEFAULT 0, + max_aggr_size int DEFAULT 0, + max_history_count int DEFAULT 0, + gmt_create timestamp DEFAULT '2010-05-05 00:00:00', + gmt_modified timestamp DEFAULT '2010-05-05 00:00:00', + constraint group_capacity_id_key PRIMARY KEY (id), + constraint uk_group_id UNIQUE (group_id)); + +CREATE TABLE tenant_capacity ( + id bigint NOT NULL generated by default as identity, + tenant_id varchar(128) DEFAULT '', + quota int DEFAULT 0, + usage int DEFAULT 0, + max_size int DEFAULT 0, + max_aggr_count int DEFAULT 0, + max_aggr_size int DEFAULT 0, + max_history_count int DEFAULT 0, + gmt_create timestamp DEFAULT '2010-05-05 00:00:00', + gmt_modified timestamp DEFAULT '2010-05-05 00:00:00', + constraint tenant_capacity_id_key PRIMARY KEY (id), + constraint uk_tenant_id UNIQUE (tenant_id)); + +CREATE TABLE tenant_info ( + id bigint NOT NULL generated by default as identity, + kp varchar(128) NOT NULL, + tenant_id varchar(128) DEFAULT '', + tenant_name varchar(128) DEFAULT '', + tenant_desc varchar(256) DEFAULT NULL, + create_source varchar(32) DEFAULT NULL, + gmt_create bigint NOT NULL, + gmt_modified bigint NOT NULL, + constraint tenant_info_id_key PRIMARY KEY (id), + constraint uk_tenant_info_kptenantid UNIQUE (kp,tenant_id)); +CREATE INDEX tenant_info_tenant_id_idx ON tenant_info(tenant_id); + +CREATE TABLE users ( + username varchar(50) NOT NULL PRIMARY KEY, + password varchar(500) NOT NULL, + enabled boolean NOT NULL +); + +CREATE TABLE roles ( + username varchar(50) NOT NULL, + role varchar(50) NOT NULL +); + +INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE); + +INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN'); diff --git a/pigx-config/src/main/resources/config/application-dev.yml b/pigx-config/data/config-data/DEFAULT_GROUP/application-dev.yml similarity index 98% rename from pigx-config/src/main/resources/config/application-dev.yml rename to pigx-config/data/config-data/DEFAULT_GROUP/application-dev.yml index dee653d92..e959cb021 100644 --- a/pigx-config/src/main/resources/config/application-dev.yml +++ b/pigx-config/data/config-data/DEFAULT_GROUP/application-dev.yml @@ -78,7 +78,7 @@ swagger: host: ${GATEWAY-HOST:pigx-gateway}:${GATEWAY-PORT:9999} title: PigX Swagger API description: 全宇宙最牛逼的Spring Cloud微服务开发脚手架 - version: @project.version@ + version: '@project.version@' license: Powered By PigX licenseUrl: https://pig4cloud.com/ terms-of-service-url: https://pig4cloud.com/ diff --git a/pigx-config/src/main/resources/config/pigx-activiti-dev.yml b/pigx-config/data/config-data/DEFAULT_GROUP/pigx-activiti-dev.yml similarity index 97% rename from pigx-config/src/main/resources/config/pigx-activiti-dev.yml rename to pigx-config/data/config-data/DEFAULT_GROUP/pigx-activiti-dev.yml index bb970d668..55a336ca5 100644 --- a/pigx-config/src/main/resources/config/pigx-activiti-dev.yml +++ b/pigx-config/data/config-data/DEFAULT_GROUP/pigx-activiti-dev.yml @@ -28,4 +28,4 @@ pigx: tenant: column: tenant_id tables: - - oa_leave_bill + - oa_leave_bill \ No newline at end of file diff --git a/pigx-config/src/main/resources/config/pigx-auth-dev.yml b/pigx-config/data/config-data/DEFAULT_GROUP/pigx-auth-dev.yml similarity index 94% rename from pigx-config/src/main/resources/config/pigx-auth-dev.yml rename to pigx-config/data/config-data/DEFAULT_GROUP/pigx-auth-dev.yml index 4582bbbba..e8e501808 100644 --- a/pigx-config/src/main/resources/config/pigx-auth-dev.yml +++ b/pigx-config/data/config-data/DEFAULT_GROUP/pigx-auth-dev.yml @@ -19,4 +19,4 @@ spring: expose-spring-macro-helpers: true prefer-file-system-access: true suffix: .ftl - template-loader-path: classpath:/templates/ + template-loader-path: classpath:/templates/ \ No newline at end of file diff --git a/pigx-config/src/main/resources/config/pigx-codegen-dev.yml b/pigx-config/data/config-data/DEFAULT_GROUP/pigx-codegen-dev.yml similarity index 100% rename from pigx-config/src/main/resources/config/pigx-codegen-dev.yml rename to pigx-config/data/config-data/DEFAULT_GROUP/pigx-codegen-dev.yml diff --git a/pigx-config/src/main/resources/config/pigx-daemon-elastic-job-dev.yml b/pigx-config/data/config-data/DEFAULT_GROUP/pigx-daemon-elastic-job-dev.yml similarity index 97% rename from pigx-config/src/main/resources/config/pigx-daemon-elastic-job-dev.yml rename to pigx-config/data/config-data/DEFAULT_GROUP/pigx-daemon-elastic-job-dev.yml index ee6aa3658..063ffcc9e 100644 --- a/pigx-config/src/main/resources/config/pigx-daemon-elastic-job-dev.yml +++ b/pigx-config/data/config-data/DEFAULT_GROUP/pigx-daemon-elastic-job-dev.yml @@ -49,4 +49,4 @@ spring: listener: distributed-listener-class: com.pig4cloud.pigx.daemon.elastic.listener.PigxDistributeElasticJobListener started-timeout-milliseconds: 5000 - completed-timeout-milliseconds: 10000 + completed-timeout-milliseconds: 10000 \ No newline at end of file diff --git a/pigx-config/src/main/resources/config/pigx-daemon-quartz-dev.yml b/pigx-config/data/config-data/DEFAULT_GROUP/pigx-daemon-quartz-dev.yml similarity index 99% rename from pigx-config/src/main/resources/config/pigx-daemon-quartz-dev.yml rename to pigx-config/data/config-data/DEFAULT_GROUP/pigx-daemon-quartz-dev.yml index dd862b095..27d7b05d2 100644 --- a/pigx-config/src/main/resources/config/pigx-daemon-quartz-dev.yml +++ b/pigx-config/data/config-data/DEFAULT_GROUP/pigx-daemon-quartz-dev.yml @@ -42,4 +42,3 @@ spring: #jdbc: #initialize-schema: never - diff --git a/pigx-config/src/main/resources/config/pigx-gateway-dev.yml b/pigx-config/data/config-data/DEFAULT_GROUP/pigx-gateway-dev.yml similarity index 84% rename from pigx-config/src/main/resources/config/pigx-gateway-dev.yml rename to pigx-config/data/config-data/DEFAULT_GROUP/pigx-gateway-dev.yml index 508d0dd2a..ea7fb846d 100644 --- a/pigx-config/src/main/resources/config/pigx-gateway-dev.yml +++ b/pigx-config/data/config-data/DEFAULT_GROUP/pigx-gateway-dev.yml @@ -9,4 +9,4 @@ ignore: - test swagger-providers: - ${AUTH-HOST:pigx-auth} - - ${TX-MGR-HOST:pigx-tx-manager} + - ${TX-MGR-HOST:pigx-tx-manager} \ No newline at end of file diff --git a/pigx-config/src/main/resources/config/pigx-monitor-dev.yml b/pigx-config/data/config-data/DEFAULT_GROUP/pigx-monitor-dev.yml similarity index 88% rename from pigx-config/src/main/resources/config/pigx-monitor-dev.yml rename to pigx-config/data/config-data/DEFAULT_GROUP/pigx-monitor-dev.yml index 4d9460852..a6e76ee14 100644 --- a/pigx-config/src/main/resources/config/pigx-monitor-dev.yml +++ b/pigx-config/data/config-data/DEFAULT_GROUP/pigx-monitor-dev.yml @@ -10,4 +10,4 @@ spring: resource-locations: 'classpath:/ui/,classpath:/static/' template-location: 'classpath:/ui/' title: 'pigx 服务状态监控' - brand: 'pigx 服务状态监控' + brand: 'pigx 服务状态监控' \ No newline at end of file diff --git a/pigx-config/src/main/resources/config/pigx-mp-manager-dev.yml b/pigx-config/data/config-data/DEFAULT_GROUP/pigx-mp-manager-dev.yml similarity index 100% rename from pigx-config/src/main/resources/config/pigx-mp-manager-dev.yml rename to pigx-config/data/config-data/DEFAULT_GROUP/pigx-mp-manager-dev.yml diff --git a/pigx-config/src/main/resources/config/pigx-tx-manager-dev.yml b/pigx-config/data/config-data/DEFAULT_GROUP/pigx-tx-manager-dev.yml similarity index 90% rename from pigx-config/src/main/resources/config/pigx-tx-manager-dev.yml rename to pigx-config/data/config-data/DEFAULT_GROUP/pigx-tx-manager-dev.yml index 5b9515450..31befaf2c 100644 --- a/pigx-config/src/main/resources/config/pigx-tx-manager-dev.yml +++ b/pigx-config/data/config-data/DEFAULT_GROUP/pigx-tx-manager-dev.yml @@ -21,4 +21,4 @@ tm: auto: false #是否自动补偿 notifyUrl: http://ip:port/path #补偿结果通知(配消息总线里面) tryTime: 30 # z再次重试时间间隔 - maxWaitTime: 5000 # 请求超时的最大时间 (毫秒) + maxWaitTime: 5000 # 请求超时的最大时间 (毫秒) \ No newline at end of file diff --git a/pigx-config/src/main/resources/config/pigx-upms-biz-dev.yml b/pigx-config/data/config-data/DEFAULT_GROUP/pigx-upms-biz-dev.yml similarity index 98% rename from pigx-config/src/main/resources/config/pigx-upms-biz-dev.yml rename to pigx-config/data/config-data/DEFAULT_GROUP/pigx-upms-biz-dev.yml index 9e1bb082f..a5b106445 100644 --- a/pigx-config/src/main/resources/config/pigx-upms-biz-dev.yml +++ b/pigx-config/data/config-data/DEFAULT_GROUP/pigx-upms-biz-dev.yml @@ -38,4 +38,4 @@ pigx: - sys_social_details - sys_dict - sys_dict_item - - sys_log + - sys_log \ No newline at end of file diff --git a/pigx-config/src/main/resources/config/pigx-zipkin-dev.yml b/pigx-config/data/config-data/DEFAULT_GROUP/pigx-zipkin-dev.yml similarity index 100% rename from pigx-config/src/main/resources/config/pigx-zipkin-dev.yml rename to pigx-config/data/config-data/DEFAULT_GROUP/pigx-zipkin-dev.yml diff --git a/pigx-config/data/naming/meta.properties b/pigx-config/data/naming/meta.properties new file mode 100644 index 000000000..e69de29bb diff --git a/pigx-config/pom.xml b/pigx-config/pom.xml deleted file mode 100644 index d7481420d..000000000 --- a/pigx-config/pom.xml +++ /dev/null @@ -1,67 +0,0 @@ - - - - - 4.0.0 - - com.pig4cloud - pigx - 2.8.0 - - - pigx-config - jar - - pigx 配置中心,基于spring cloud config - - - - - org.springframework.cloud - spring-cloud-config-server - - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-undertow - - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - com.spotify - docker-maven-plugin - - - - - diff --git a/pigx-config/src/main/java/com/pig4cloud/pigx/config/PigxConfigApplication.java b/pigx-config/src/main/java/com/pig4cloud/pigx/config/PigxConfigApplication.java deleted file mode 100644 index 23e6f4790..000000000 --- a/pigx-config/src/main/java/com/pig4cloud/pigx/config/PigxConfigApplication.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * - * Copyright (c) 2018-2025, lengleng All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * Neither the name of the pig4cloud.com developer nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * Author: lengleng (wangiegie@gmail.com) - * - */ - -package com.pig4cloud.pigx.config; - -import org.springframework.boot.SpringApplication; -import org.springframework.cloud.client.SpringCloudApplication; -import org.springframework.cloud.config.server.EnableConfigServer; - -/** - * @author lengleng - * @date 2018年06月22日 - * 配置中心 - */ -@EnableConfigServer -@SpringCloudApplication -public class PigxConfigApplication { - - public static void main(String[] args) { - SpringApplication.run(PigxConfigApplication.class, args); - } -} diff --git a/pigx-config/src/main/resources/banner.txt b/pigx-config/src/main/resources/banner.txt deleted file mode 100644 index 63be6e1eb..000000000 --- a/pigx-config/src/main/resources/banner.txt +++ /dev/null @@ -1,16 +0,0 @@ -${AnsiColor.BRIGHT_YELLOW} - - ::::::::: ::::::::::: :::::::: ::: ::: - :+: :+: :+: :+: :+: :+: :+: - +:+ +:+ +:+ +:+ +:+ +:+ - +#++:++#+ +#+ :#: +#++:+ - +#+ +#+ +#+ +#+# +#+ +#+ - #+# #+# #+# #+# #+# #+# - ### ########### ######## ### ### - - www.pig4cloud.com - - Pig Microservice Architecture - - - diff --git a/pigx-config/src/main/resources/bootstrap.yml b/pigx-config/src/main/resources/bootstrap.yml deleted file mode 100644 index 3ff8e1a14..000000000 --- a/pigx-config/src/main/resources/bootstrap.yml +++ /dev/null @@ -1,29 +0,0 @@ -server: - port: 8888 - -spring: - application: - name: @artifactId@ - profiles: - active: native - # 配置中心 - cloud: - config: - server: - native: - search-locations: classpath:/config/ - -# 注册中心配置 -eureka: - instance: - prefer-ip-address: true - client: - service-url: - defaultZone: http://pig:pig@${EUREKA-HOST:pigx-eureka}:${EUREKA-PORT:8761}/eureka/ - -# 暴露监控端点 -management: - endpoints: - web: - exposure: - include: '*' diff --git a/pigx-config/src/main/resources/logback-spring.xml b/pigx-config/src/main/resources/logback-spring.xml deleted file mode 100644 index cb5aabfc8..000000000 --- a/pigx-config/src/main/resources/logback-spring.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - - - - - - ${CONSOLE_LOG_PATTERN} - - - - - - ${log.path}/debug.log - - ${log.path}/%d{yyyy-MM, aux}/debug.%d{yyyy-MM-dd}.%i.log.gz - 50MB - 30 - - - %date [%thread] %-5level [%logger{50}] %file:%line - %msg%n - - - - - - ${log.path}/error.log - - ${log.path}/%d{yyyy-MM, aux}/error.%d{yyyy-MM-dd}.%i.log.gz - 50MB - 30 - - - %date [%thread] %-5level [%logger{50}] %file:%line - %msg%n - - - ERROR - - - - - - - - diff --git a/pigx-eureka/Dockerfile b/pigx-eureka/Dockerfile deleted file mode 100644 index 4e8498253..000000000 --- a/pigx-eureka/Dockerfile +++ /dev/null @@ -1,15 +0,0 @@ -FROM anapsix/alpine-java:8_server-jre_unlimited - -MAINTAINER wangiegie@gmail.com - -RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime - -RUN mkdir -p /pigx-eureka - -WORKDIR /pigx-eureka - -EXPOSE 8761 - -ADD ./pigx-eureka/target/pigx-eureka.jar ./ - -CMD java -Djava.security.egd=file:/dev/./urandom -jar pigx-eureka.jar diff --git a/pigx-eureka/pom.xml b/pigx-eureka/pom.xml deleted file mode 100644 index 205b64354..000000000 --- a/pigx-eureka/pom.xml +++ /dev/null @@ -1,76 +0,0 @@ - - - - - 4.0.0 - - com.pig4cloud - pigx - 2.8.0 - - - pigx-eureka - jar - - pigx 服务中心,基于eureka - - - - - org.springframework.cloud - spring-cloud-starter-netflix-eureka-server - - - - org.springframework.cloud - spring-cloud-starter-security - - - - org.springframework.cloud - spring-cloud-starter-config - - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-undertow - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - com.spotify - docker-maven-plugin - - - - - diff --git a/pigx-eureka/src/main/java/com/pig4cloud/pigx/eureka/PigxEurekaApplication.java b/pigx-eureka/src/main/java/com/pig4cloud/pigx/eureka/PigxEurekaApplication.java deleted file mode 100644 index c95bdb2c3..000000000 --- a/pigx-eureka/src/main/java/com/pig4cloud/pigx/eureka/PigxEurekaApplication.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * - * Copyright (c) 2018-2025, lengleng All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * Neither the name of the pig4cloud.com developer nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * Author: lengleng (wangiegie@gmail.com) - * - */ - -package com.pig4cloud.pigx.eureka; - - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; - -/** - * @author lengleng - * @date 2018年06月21日 - * 服务中心 - */ -@EnableEurekaServer -@SpringBootApplication -public class PigxEurekaApplication { - - public static void main(String[] args) { - SpringApplication.run(PigxEurekaApplication.class, args); - } -} diff --git a/pigx-eureka/src/main/java/com/pig4cloud/pigx/eureka/security/WebSecurityConfig.java b/pigx-eureka/src/main/java/com/pig4cloud/pigx/eureka/security/WebSecurityConfig.java deleted file mode 100644 index 0eb95dbb2..000000000 --- a/pigx-eureka/src/main/java/com/pig4cloud/pigx/eureka/security/WebSecurityConfig.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2018-2025, lengleng All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * Neither the name of the pig4cloud.com developer nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * Author: lengleng (wangiegie@gmail.com) - */ - -package com.pig4cloud.pigx.eureka.security; - -/** - * @author lengleng - * @date 2018/7/12 - */ - -import lombok.SneakyThrows; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; - -@EnableWebSecurity -public class WebSecurityConfig extends WebSecurityConfigurerAdapter { - @Override - @SneakyThrows - protected void configure(HttpSecurity http) { - http.csrf().disable() - .authorizeRequests() - .antMatchers("/actuator/**").permitAll() - .anyRequest() - .authenticated().and().httpBasic(); - } -} diff --git a/pigx-eureka/src/main/resources/banner.txt b/pigx-eureka/src/main/resources/banner.txt deleted file mode 100644 index 63be6e1eb..000000000 --- a/pigx-eureka/src/main/resources/banner.txt +++ /dev/null @@ -1,16 +0,0 @@ -${AnsiColor.BRIGHT_YELLOW} - - ::::::::: ::::::::::: :::::::: ::: ::: - :+: :+: :+: :+: :+: :+: :+: - +:+ +:+ +:+ +:+ +:+ +:+ - +#++:++#+ +#+ :#: +#++:+ - +#+ +#+ +#+ +#+# +#+ +#+ - #+# #+# #+# #+# #+# #+# - ### ########### ######## ### ### - - www.pig4cloud.com - - Pig Microservice Architecture - - - diff --git a/pigx-eureka/src/main/resources/bootstrap.yml b/pigx-eureka/src/main/resources/bootstrap.yml deleted file mode 100644 index a7a7b60bd..000000000 --- a/pigx-eureka/src/main/resources/bootstrap.yml +++ /dev/null @@ -1,34 +0,0 @@ -server: - port: 8761 - -spring: - security: - user: - name: pig - password: pig - application: - name: @artifactId@ - cloud: - config: - enabled: false -# docker-compose部署时候 hostname 换成pigx-eureka -# 类似的 redis 使用pigx-redis ,gateway 换成 pigx-gateway -eureka: - instance: - hostname: pigx-eureka - prefer-ip-address: true - client: - register-with-eureka: false - fetch-registry: false - service-url: - defaultZone: http://pig:pig@${eureka.instance.hostname}:${server.port}/eureka/ - server: - eviction-interval-timer-in-ms: 4000 - enable-self-preservation: false - renewal-percent-threshold: 0.9 - -management: - endpoints: - web: - exposure: - include: '*' diff --git a/pigx-eureka/src/main/resources/logback-spring.xml b/pigx-eureka/src/main/resources/logback-spring.xml deleted file mode 100644 index 31bc1bb5b..000000000 --- a/pigx-eureka/src/main/resources/logback-spring.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - ${CONSOLE_LOG_PATTERN} - - - - - - ${log.path}/debug.log - - ${log.path}/%d{yyyy-MM, aux}/debug.%d{yyyy-MM-dd}.%i.log.gz - 50MB - 30 - - - %date [%thread] %-5level [%logger{50}] %file:%line - %msg%n - - - - - - ${log.path}/error.log - - ${log.path}/%d{yyyy-MM}/error.%d{yyyy-MM-dd}.%i.log.gz - 50MB - 30 - - - %date [%thread] %-5level [%logger{50}] %file:%line - %msg%n - - - ERROR - - - - - - - diff --git a/pigx-gateway/pom.xml b/pigx-gateway/pom.xml index 75e7d739e..9122ed74f 100644 --- a/pigx-gateway/pom.xml +++ b/pigx-gateway/pom.xml @@ -47,10 +47,15 @@ com.pig4cloud pigx-common-gateway + + + org.springframework.cloud + spring-cloud-starter-alibaba-nacos-discovery + org.springframework.cloud - spring-cloud-starter-config + spring-cloud-starter-alibaba-nacos-config diff --git a/pigx-gateway/src/main/resources/bootstrap.yml b/pigx-gateway/src/main/resources/bootstrap.yml index 4a5e6da8e..98383600f 100644 --- a/pigx-gateway/src/main/resources/bootstrap.yml +++ b/pigx-gateway/src/main/resources/bootstrap.yml @@ -4,24 +4,13 @@ server: spring: application: name: @artifactId@ - # 配置中心 cloud: - config: - fail-fast: true - name: ${spring.application.name} - profile: ${spring.profiles.active} + nacos: discovery: - enabled: true - service-id: pigx-config + server-addr: ${NACOS-HOST:pigx-nacos}:${NACOS-PORT:8848} + config: + server-addr: ${spring.cloud.nacos.discovery.server-addr} + file-extension: yml + shared-dataids: application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} profiles: active: dev - -# 注册中心 -eureka: - instance: - prefer-ip-address: true - client: - service-url: - defaultZone: http://pig:pig@${EUREKA-HOST:pigx-eureka}:${EUREKA-PORT:8761}/eureka/ - - diff --git a/pigx-register/pom.xml b/pigx-register/pom.xml new file mode 100755 index 000000000..17e6a502a --- /dev/null +++ b/pigx-register/pom.xml @@ -0,0 +1,75 @@ + + + + 4.0.0 + + com.pig4cloud + pigx + 2.8.0 + + + pigx-register + jar + pigx-register + nacos 注册配置中 + + + + com.alibaba.nacos + nacos-config + 1.0.0 + + + com.alibaba.nacos + nacos-naming + 1.0.0 + + + + org.springframework.boot + spring-boot-starter-security + + + io.jsonwebtoken + jjwt-api + 0.10.5 + + + io.jsonwebtoken + jjwt-impl + 0.10.5 + runtime + + + io.jsonwebtoken + jjwt-jackson + 0.10.5 + runtime + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + com.spotify + docker-maven-plugin + + + + diff --git a/pigx-register/src/main/java/com/alibaba/nacos/PigxNacosApplication.java b/pigx-register/src/main/java/com/alibaba/nacos/PigxNacosApplication.java new file mode 100755 index 000000000..f125fbfda --- /dev/null +++ b/pigx-register/src/main/java/com/alibaba/nacos/PigxNacosApplication.java @@ -0,0 +1,41 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * 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. + */ + +package com.alibaba.nacos; + +import com.alibaba.nacos.core.utils.Constants; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.scheduling.annotation.EnableScheduling; + +/** + * @author nacos + *

+ * nacos console 源码运行,方便开发 + * 生产建议从官网下载最新版配置运行 + */ +@EnableScheduling +@SpringBootApplication +public class PigxNacosApplication { + + public static void main(String[] args) { + System.setProperty("server.tomcat.basedir", "logs"); + System.setProperty("nacos.home", "pigx-config"); + System.setProperty("user.home", "logs"); + System.setProperty(Constants.STANDALONE_MODE_PROPERTY_NAME, "true"); + SpringApplication.run(PigxNacosApplication.class, args); + } +} diff --git a/pigx-register/src/main/java/com/alibaba/nacos/console/config/WebSecurityConfig.java b/pigx-register/src/main/java/com/alibaba/nacos/console/config/WebSecurityConfig.java new file mode 100755 index 000000000..1ef0eaff2 --- /dev/null +++ b/pigx-register/src/main/java/com/alibaba/nacos/console/config/WebSecurityConfig.java @@ -0,0 +1,107 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * 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. + */ +package com.alibaba.nacos.console.config; + +import com.alibaba.nacos.console.filter.JwtAuthenticationTokenFilter; +import com.alibaba.nacos.console.security.CustomUserDetailsServiceImpl; +import com.alibaba.nacos.console.security.JwtAuthenticationEntryPoint; +import com.alibaba.nacos.console.utils.JwtTokenUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.config.BeanIds; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.builders.WebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; + +/** + * Spring security config + * + * @author Nacos + */ +@Configuration +@EnableGlobalMethodSecurity(prePostEnabled = true) +public class WebSecurityConfig extends WebSecurityConfigurerAdapter { + + public static final String AUTHORIZATION_HEADER = "Authorization"; + + public static final String AUTHORIZATION_TOKEN = "access_token"; + + public static final String SECURITY_IGNORE_URLS_SPILT_CHAR = ","; + + @Autowired + private CustomUserDetailsServiceImpl userDetailsService; + + @Autowired + private JwtAuthenticationEntryPoint unauthorizedHandler; + + @Autowired + private JwtTokenUtils tokenProvider; + + @Autowired + private Environment env; + + @Bean(name = BeanIds.AUTHENTICATION_MANAGER) + @Override + public AuthenticationManager authenticationManagerBean() throws Exception { + return super.authenticationManagerBean(); + } + + @Override + protected void configure(AuthenticationManagerBuilder auth) throws Exception { + auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder()); + } + + @Override + public void configure(WebSecurity web) { + String ignoreURLs = env.getProperty("nacos.security.ignore.urls", "/**"); + for (String ignoreURL : ignoreURLs.trim().split(SECURITY_IGNORE_URLS_SPILT_CHAR)) { + web.ignoring().antMatchers(ignoreURL.trim()); + } + } + + @Override + protected void configure(HttpSecurity http) throws Exception { + http + .authorizeRequests() + .anyRequest().authenticated().and() + // custom token authorize exception handler + .exceptionHandling() + .authenticationEntryPoint(unauthorizedHandler).and() + // since we use jwt, session is not necessary + .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and() + // since we use jwt, csrf is not necessary + .csrf().disable(); + http.addFilterBefore(new JwtAuthenticationTokenFilter(tokenProvider), UsernamePasswordAuthenticationFilter.class); + + // disable cache + http.headers().cacheControl(); + } + + @Bean + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } + +} diff --git a/pigx-register/src/main/java/com/alibaba/nacos/console/controller/AuthController.java b/pigx-register/src/main/java/com/alibaba/nacos/console/controller/AuthController.java new file mode 100755 index 000000000..edc3ba5f4 --- /dev/null +++ b/pigx-register/src/main/java/com/alibaba/nacos/console/controller/AuthController.java @@ -0,0 +1,82 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * 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. + */ +package com.alibaba.nacos.console.controller; + +import com.alibaba.nacos.console.config.WebSecurityConfig; +import com.alibaba.nacos.config.server.model.RestResult; +import com.alibaba.nacos.console.utils.JwtTokenUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.web.bind.annotation.*; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * auth + * + * @author wfnuser + */ +@RestController("auth") +@RequestMapping("/v1/auth") +public class AuthController { + + @Autowired + private JwtTokenUtils jwtTokenUtils; + @Autowired + private AuthenticationManager authenticationManager; + + /** + * Whether the Nacos is in broken states or not, and cannot recover except by being restarted + * + * @return HTTP code equal to 200 indicates that Nacos is in right states. HTTP code equal to 500 indicates that + * Nacos is in broken states. + */ + + @ResponseBody + @RequestMapping(value = "login", method = RequestMethod.POST) + public RestResult login(HttpServletRequest request, HttpServletResponse response) throws Exception { + String username = request.getParameter("username"); + String password = request.getParameter("password"); + + // 通过用户名和密码创建一个 Authentication 认证对象,实现类为 UsernamePasswordAuthenticationToken + UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(username, password); + RestResult rr = new RestResult(); + + try { + //通过 AuthenticationManager(默认实现为ProviderManager)的authenticate方法验证 Authentication 对象 + Authentication authentication = authenticationManager.authenticate(authenticationToken); + //将 Authentication 绑定到 SecurityContext + SecurityContextHolder.getContext().setAuthentication(authentication); + //生成Token + String token = jwtTokenUtils.createToken(authentication); + //将Token写入到Http头部 + response.addHeader(WebSecurityConfig.AUTHORIZATION_HEADER, "Bearer " + token); + rr.setCode(200); + rr.setData("Bearer " + token); + return rr; + } catch (BadCredentialsException authentication) { + rr.setCode(401); + rr.setMessage("Login failed"); + return rr; + } + } +} diff --git a/pigx-register/src/main/java/com/alibaba/nacos/console/controller/HealthController.java b/pigx-register/src/main/java/com/alibaba/nacos/console/controller/HealthController.java new file mode 100755 index 000000000..028bbcaad --- /dev/null +++ b/pigx-register/src/main/java/com/alibaba/nacos/console/controller/HealthController.java @@ -0,0 +1,108 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * 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. + */ +package com.alibaba.nacos.console.controller; + +import com.alibaba.nacos.config.server.service.PersistService; +import com.alibaba.nacos.naming.controllers.OperatorController; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletRequest; + +/** + * @author hxy1991 + */ +@RestController("consoleHealth") +@RequestMapping("/v1/console/health") +public class HealthController { + + private static final Logger logger = LoggerFactory.getLogger(HealthController.class); + + private final PersistService persistService; + private final OperatorController apiCommands; + + @Autowired + public HealthController(PersistService persistService, OperatorController apiCommands) { + this.persistService = persistService; + this.apiCommands = apiCommands; + } + + /** + * Whether the Nacos is in broken states or not, and cannot recover except by being restarted + * + * @return HTTP code equal to 200 indicates that Nacos is in right states. HTTP code equal to 500 indicates that + * Nacos is in broken states. + */ + @ResponseBody + @RequestMapping(value = "liveness", method = RequestMethod.GET) + public ResponseEntity liveness() { + return ResponseEntity.ok().body("OK"); + } + + /** + * Ready to receive the request or not + * + * @return HTTP code equal to 200 indicates that Nacos is ready. HTTP code equal to 500 indicates that Nacos is not + * ready. + */ + @ResponseBody + @RequestMapping(value = "readiness", method = RequestMethod.GET) + public ResponseEntity readiness(HttpServletRequest request) { + boolean isConfigReadiness = isConfigReadiness(); + boolean isNamingReadiness = isNamingReadiness(request); + + if (isConfigReadiness && isNamingReadiness) { + return ResponseEntity.ok().body("OK"); + } + + if (!isConfigReadiness && !isNamingReadiness) { + return ResponseEntity.status(500).body("Config and Naming are not in readiness"); + } + + if (!isConfigReadiness) { + return ResponseEntity.status(500).body("Config is not in readiness"); + } + + return ResponseEntity.status(500).body("Naming is not in readiness"); + } + + private boolean isConfigReadiness() { + // check db + try { + persistService.configInfoCount(""); + return true; + } catch (Exception e) { + logger.error("Config health check fail.", e); + } + return false; + } + + private boolean isNamingReadiness(HttpServletRequest request) { + try { + apiCommands.metrics(request); + return true; + } catch (Exception e) { + logger.error("Naming health check fail.", e); + } + return false; + } +} diff --git a/pigx-register/src/main/java/com/alibaba/nacos/console/controller/NamespaceController.java b/pigx-register/src/main/java/com/alibaba/nacos/console/controller/NamespaceController.java new file mode 100755 index 000000000..1e30435b5 --- /dev/null +++ b/pigx-register/src/main/java/com/alibaba/nacos/console/controller/NamespaceController.java @@ -0,0 +1,166 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * 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. + */ +package com.alibaba.nacos.console.controller; + +import com.alibaba.nacos.config.server.exception.NacosException; +import com.alibaba.nacos.config.server.model.RestResult; +import com.alibaba.nacos.config.server.model.TenantInfo; +import com.alibaba.nacos.config.server.service.PersistService; +import com.alibaba.nacos.config.server.utils.StringUtils; +import com.alibaba.nacos.console.model.Namespace; +import com.alibaba.nacos.console.model.NamespaceAllInfo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +/** + * namespace service + * + * @author Nacos + */ +@Controller +@RequestMapping("/v1/console/namespaces") +public class NamespaceController { + + @Autowired + private transient PersistService persistService; + + /** + * Get namespace list + * + * @param request request + * @param response response + * @return namespace list + */ + @ResponseBody + @RequestMapping(method = RequestMethod.GET) + public RestResult> getNamespaces(HttpServletRequest request, HttpServletResponse response) { + RestResult> rr = new RestResult>(); + rr.setCode(200); + // TODO 获取用kp + List tenantInfos = persistService.findTenantByKp("1"); + Namespace namespace0 = new Namespace("", "Public", 200, persistService.configInfoCount(""), 0); + List namespaces = new ArrayList(); + namespaces.add(namespace0); + for (TenantInfo tenantInfo : tenantInfos) { + int configCount = persistService.configInfoCount(tenantInfo.getTenantId()); + Namespace namespaceTmp = new Namespace(tenantInfo.getTenantId(), tenantInfo.getTenantName(), 200, + configCount, 2); + namespaces.add(namespaceTmp); + } + rr.setData(namespaces); + return rr; + } + + /** + * get namespace all info by namespace id + * + * @param request request + * @param response response + * @param namespaceId namespaceId + * @return namespace all info + */ + @ResponseBody + @RequestMapping(params = "show=all", method = RequestMethod.GET) + public NamespaceAllInfo getNamespace(HttpServletRequest request, HttpServletResponse response, + @RequestParam("namespaceId") String namespaceId) { + // TODO 获取用kp + if (StringUtils.isBlank(namespaceId)) { + NamespaceAllInfo namespaceTmp = new NamespaceAllInfo(namespaceId, "Public", 200, persistService.configInfoCount(""), 0, + "Public Namespace"); + return namespaceTmp; + } else { + TenantInfo tenantInfo = persistService.findTenantByKp("1", namespaceId); + int configCount = persistService.configInfoCount(namespaceId); + NamespaceAllInfo namespaceTmp = new NamespaceAllInfo(namespaceId, tenantInfo.getTenantName(), 200, + configCount, 2, tenantInfo.getTenantDesc()); + return namespaceTmp; + } + } + + /** + * create namespace + * + * @param request request + * @param response response + * @param namespaceName namespace Name + * @param namespaceDesc namespace Desc + * @return whether create ok + * @throws NacosException + */ + @RequestMapping(method = RequestMethod.POST) + @ResponseBody + public Boolean createNamespace(HttpServletRequest request, HttpServletResponse response, + @RequestParam("namespaceName") String namespaceName, + @RequestParam(value = "namespaceDesc", required = false) String namespaceDesc) + throws NacosException { + // TODO 获取用kp + String namespaceId = UUID.randomUUID().toString(); + persistService.insertTenantInfoAtomic("1", namespaceId, namespaceName, namespaceDesc, "nacos", + System.currentTimeMillis()); + return true; + } + + /** + * edit namespace + * + * @param request request + * @param response response + * @param namespace namespace + * @param namespaceShowName namespace ShowName + * @param namespaceDesc namespace Desc + * @return whether edit ok + * @throws NacosException NacosException + */ + @RequestMapping(method = RequestMethod.PUT) + @ResponseBody + public Boolean editNamespace(HttpServletRequest request, HttpServletResponse response, + @RequestParam("namespace") String namespace, + @RequestParam("namespaceShowName") String namespaceShowName, + @RequestParam(value = "namespaceDesc", required = false) String namespaceDesc) + throws NacosException { + // TODO 获取用kp + persistService.updateTenantNameAtomic("1", namespace, namespaceShowName, namespaceDesc); + return true; + } + + /** + * del namespace by id + * + * @param request request + * @param response response + * @param namespaceId namespace Id + * @return whether del ok + * @throws NacosException NacosException + */ + @RequestMapping(method = RequestMethod.DELETE) + @ResponseBody + public Boolean deleteConfig(HttpServletRequest request, HttpServletResponse response, + @RequestParam("namespaceId") String namespaceId) throws NacosException { + persistService.removeTenantInfoAtomic("1", namespaceId); + return true; + } + +} diff --git a/pigx-register/src/main/java/com/alibaba/nacos/console/controller/ServerStateController.java b/pigx-register/src/main/java/com/alibaba/nacos/console/controller/ServerStateController.java new file mode 100755 index 000000000..f1fb43ead --- /dev/null +++ b/pigx-register/src/main/java/com/alibaba/nacos/console/controller/ServerStateController.java @@ -0,0 +1,60 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * 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. + */ +package com.alibaba.nacos.console.controller; + + +import com.alibaba.nacos.common.util.VersionUtils; +import com.alibaba.nacos.core.utils.SystemUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; +import java.util.HashMap; +import java.util.Map; + +/** + * @author xingxuechao + * on:2019/2/27 11:17 AM + */ +@RestController +@RequestMapping("/v1/console/server") +public class ServerStateController { + + private static final Logger logger = LoggerFactory.getLogger(ServerStateController.class); + + + public static String VERSION ; + + + @ResponseBody + @RequestMapping(value = "state", method = RequestMethod.GET) + public ResponseEntity serverState() { + Map serverState = new HashMap(3); + serverState.put("standalone_mode",SystemUtils.STANDALONE_MODE ? + SystemUtils.STANDALONE_MODE_ALONE : SystemUtils.STANDALONE_MODE_CLUSTER); + + serverState.put("function_mode", SystemUtils.FUNCTION_MODE); + serverState.put("version", VersionUtils.VERSION); + + return ResponseEntity.ok().body(serverState); + } + + + +} diff --git a/pigx-register/src/main/java/com/alibaba/nacos/console/filter/JwtAuthenticationTokenFilter.java b/pigx-register/src/main/java/com/alibaba/nacos/console/filter/JwtAuthenticationTokenFilter.java new file mode 100755 index 000000000..b760d6d89 --- /dev/null +++ b/pigx-register/src/main/java/com/alibaba/nacos/console/filter/JwtAuthenticationTokenFilter.java @@ -0,0 +1,80 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * 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. + */ +package com.alibaba.nacos.console.filter; + +import com.alibaba.nacos.console.config.WebSecurityConfig; +import com.alibaba.nacos.console.utils.JwtTokenUtils; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.util.StringUtils; +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * jwt auth token filter + * + * @author wfnuser + */ +public class JwtAuthenticationTokenFilter extends OncePerRequestFilter { + + private static final String TOKEN_PREFIX = "Bearer "; + + private JwtTokenUtils tokenProvider; + + public JwtAuthenticationTokenFilter(JwtTokenUtils tokenProvider) { + this.tokenProvider = tokenProvider; + } + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException { + String jwt = resolveToken(request); + + if (jwt != null && !"".equals(jwt.trim()) && SecurityContextHolder.getContext().getAuthentication() == null) { + if (this.tokenProvider.validateToken(jwt)) { + /** + * get auth info + */ + Authentication authentication = this.tokenProvider.getAuthentication(jwt); + /** + * save user info to securityContext + */ + SecurityContextHolder.getContext().setAuthentication(authentication); + } + } + + chain.doFilter(request, response); + } + + /** + * Get token from header + */ + private String resolveToken(HttpServletRequest request) { + String bearerToken = request.getHeader(WebSecurityConfig.AUTHORIZATION_HEADER); + if (StringUtils.hasText(bearerToken) && bearerToken.startsWith(TOKEN_PREFIX)) { + return bearerToken.substring(7, bearerToken.length()); + } + String jwt = request.getParameter(WebSecurityConfig.AUTHORIZATION_TOKEN); + if (StringUtils.hasText(jwt)) { + return jwt; + } + return null; + } +} diff --git a/pigx-register/src/main/java/com/alibaba/nacos/console/model/Namespace.java b/pigx-register/src/main/java/com/alibaba/nacos/console/model/Namespace.java new file mode 100755 index 000000000..c617f10c0 --- /dev/null +++ b/pigx-register/src/main/java/com/alibaba/nacos/console/model/Namespace.java @@ -0,0 +1,93 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * 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. + */ +package com.alibaba.nacos.console.model; + +/** + * Namespace + * + * @author diamond + */ +public class Namespace { + + private String namespace; + + private String namespaceShowName; + + private int quota; + + private int configCount; + /** + * 0 : Global configuration, 1 : Default private namespace ,2 : Custom namespace + */ + private int type; + + public String getNamespaceShowName() { + return namespaceShowName; + } + + public void setNamespaceShowName(String namespaceShowName) { + this.namespaceShowName = namespaceShowName; + } + + public String getNamespace() { + return namespace; + } + + public void setNamespace(String namespace) { + this.namespace = namespace; + } + + public Namespace() { + } + + public Namespace(String namespace, String namespaceShowName) { + this.namespace = namespace; + this.namespaceShowName = namespaceShowName; + } + + public Namespace(String namespace, String namespaceShowName, int quota, int configCount, int type) { + this.namespace = namespace; + this.namespaceShowName = namespaceShowName; + this.quota = quota; + this.configCount = configCount; + this.type = type; + } + + public int getQuota() { + return quota; + } + + public void setQuota(int quota) { + this.quota = quota; + } + + public int getConfigCount() { + return configCount; + } + + public void setConfigCount(int configCount) { + this.configCount = configCount; + } + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + +} diff --git a/pigx-register/src/main/java/com/alibaba/nacos/console/model/NamespaceAllInfo.java b/pigx-register/src/main/java/com/alibaba/nacos/console/model/NamespaceAllInfo.java new file mode 100755 index 000000000..ebd36bdf0 --- /dev/null +++ b/pigx-register/src/main/java/com/alibaba/nacos/console/model/NamespaceAllInfo.java @@ -0,0 +1,46 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * 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. + */ +package com.alibaba.nacos.console.model; + +/** + * all namespace info + * + * @author Nacos + */ +public class NamespaceAllInfo extends Namespace { + + private String namespaceDesc; + + public String getNamespaceDesc() { + return namespaceDesc; + } + + public void setNamespaceDesc(String namespaceDesc) { + this.namespaceDesc = namespaceDesc; + } + + public NamespaceAllInfo() { + } + + ; + + public NamespaceAllInfo(String namespace, String namespaceShowName, int quota, int configCount, int type, + String namespaceDesc) { + super(namespace, namespaceShowName, quota, configCount, type); + this.namespaceDesc = namespaceDesc; + } + +} diff --git a/pigx-register/src/main/java/com/alibaba/nacos/console/security/CustomAuthenticationProvider.java b/pigx-register/src/main/java/com/alibaba/nacos/console/security/CustomAuthenticationProvider.java new file mode 100755 index 000000000..893cc313d --- /dev/null +++ b/pigx-register/src/main/java/com/alibaba/nacos/console/security/CustomAuthenticationProvider.java @@ -0,0 +1,55 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * 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. + */ +package com.alibaba.nacos.console.security; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.AuthenticationProvider; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.stereotype.Component; + +/** + * auth provider + * + * @author wfnuser + */ +@Component +public class CustomAuthenticationProvider implements AuthenticationProvider { + + @Autowired + private CustomUserDetailsServiceImpl userDetailsService; + + @Override + public Authentication authenticate(Authentication authentication) throws AuthenticationException { + + String username = (String) authentication.getPrincipal(); + String password = (String) authentication.getCredentials(); + UserDetails userDetails = userDetailsService.loadUserByUsername(username); + + if (!password.equals(userDetails.getPassword())) { + return new UsernamePasswordAuthenticationToken(username, null, null); + } + return null; + } + + @Override + public boolean supports(Class aClass) { + return aClass.equals(UsernamePasswordAuthenticationToken.class); + } + +} diff --git a/pigx-register/src/main/java/com/alibaba/nacos/console/security/CustomUserDetails.java b/pigx-register/src/main/java/com/alibaba/nacos/console/security/CustomUserDetails.java new file mode 100755 index 000000000..6e34e4a51 --- /dev/null +++ b/pigx-register/src/main/java/com/alibaba/nacos/console/security/CustomUserDetails.java @@ -0,0 +1,73 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * 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. + */ +package com.alibaba.nacos.console.security; + +import com.alibaba.nacos.config.server.model.User; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.AuthorityUtils; +import org.springframework.security.core.userdetails.UserDetails; + +import java.util.Collection; + +/** + * custem user + * + * @author wfnuser + */ +public class CustomUserDetails implements UserDetails { + + private User user; + + public CustomUserDetails(User user) { + this.user = user; + } + + @Override + public Collection getAuthorities() { + // TODO: get authorities + return AuthorityUtils.commaSeparatedStringToAuthorityList(""); + } + + @Override + public String getPassword() { + return user.getPassword(); + } + + @Override + public String getUsername() { + return user.getUsername(); + } + + @Override + public boolean isAccountNonExpired() { + return true; + } + + @Override + public boolean isAccountNonLocked() { + return true; + } + + @Override + public boolean isCredentialsNonExpired() { + return true; + } + + @Override + public boolean isEnabled() { + return true; + } +} diff --git a/pigx-register/src/main/java/com/alibaba/nacos/console/security/CustomUserDetailsServiceImpl.java b/pigx-register/src/main/java/com/alibaba/nacos/console/security/CustomUserDetailsServiceImpl.java new file mode 100755 index 000000000..649bb235d --- /dev/null +++ b/pigx-register/src/main/java/com/alibaba/nacos/console/security/CustomUserDetailsServiceImpl.java @@ -0,0 +1,46 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * 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. + */ +package com.alibaba.nacos.console.security; + + +import com.alibaba.nacos.config.server.model.User; +import com.alibaba.nacos.config.server.service.PersistService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; + +/** + * Custem user service + * + * @author wfnuser + */ +@Service +public class CustomUserDetailsServiceImpl implements UserDetailsService { + + @Autowired + private transient PersistService persistService; + + @Override + public UserDetails loadUserByUsername(String userName) throws UsernameNotFoundException { + User user = persistService.findUserByUsername(userName); + if (user == null) { + throw new UsernameNotFoundException(userName); + } + return new CustomUserDetails(user); + } +} diff --git a/pigx-register/src/main/java/com/alibaba/nacos/console/security/JwtAuthenticationEntryPoint.java b/pigx-register/src/main/java/com/alibaba/nacos/console/security/JwtAuthenticationEntryPoint.java new file mode 100755 index 000000000..9fe911c85 --- /dev/null +++ b/pigx-register/src/main/java/com/alibaba/nacos/console/security/JwtAuthenticationEntryPoint.java @@ -0,0 +1,46 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * 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. + */ +package com.alibaba.nacos.console.security; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.web.AuthenticationEntryPoint; +import org.springframework.stereotype.Component; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * jwt auth fail point + * + * @author wfnuser + */ +@Component +public class JwtAuthenticationEntryPoint implements AuthenticationEntryPoint { + + private static final Logger logger = LoggerFactory.getLogger(JwtAuthenticationEntryPoint.class); + + @Override + public void commence(HttpServletRequest httpServletRequest, + HttpServletResponse httpServletResponse, + AuthenticationException e) throws IOException, ServletException { + logger.error("Responding with unauthorized error. Message - {}", e.getMessage()); + httpServletResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized"); + } +} diff --git a/pigx-register/src/main/java/com/alibaba/nacos/console/utils/JwtTokenUtils.java b/pigx-register/src/main/java/com/alibaba/nacos/console/utils/JwtTokenUtils.java new file mode 100755 index 000000000..1057d4620 --- /dev/null +++ b/pigx-register/src/main/java/com/alibaba/nacos/console/utils/JwtTokenUtils.java @@ -0,0 +1,139 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * 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. + */ +package com.alibaba.nacos.console.utils; + +import io.jsonwebtoken.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.AuthorityUtils; +import org.springframework.security.core.userdetails.User; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import java.util.Date; +import java.util.List; + + +/** + * Jwt token tool + * + * @author wfnuser + */ +@Component +public class JwtTokenUtils { + + private final Logger log = LoggerFactory.getLogger(JwtTokenUtils.class); + + private static final String AUTHORITIES_KEY = "auth"; + + /** + * secret key + */ + private String secretKey; + + /** + * Token validity time(ms) + */ + private long tokenValidityInMilliseconds; + + @PostConstruct + public void init() { + this.secretKey = "SecretKey012345678901234567890123456789012345678901234567890123456789"; + this.tokenValidityInMilliseconds = 1000 * 60 * 30L; + } + + /** + * Create token + * + * @param authentication auth info + * @return token + */ + public String createToken(Authentication authentication) { + /** + * Current time + */ + long now = (new Date()).getTime(); + /** + * Validity date + */ + Date validity; + validity = new Date(now + this.tokenValidityInMilliseconds); + + /** + * create token + */ + return Jwts.builder() + .setSubject(authentication.getName()) + .claim(AUTHORITIES_KEY, "") + .setExpiration(validity) + .signWith(SignatureAlgorithm.HS256, secretKey) + .compact(); + } + + /** + * Get auth Info + * + * @param token token + * @return auth info + */ + public Authentication getAuthentication(String token) { + /** + * parse the payload of token + */ + Claims claims = Jwts.parser() + .setSigningKey(secretKey) + .parseClaimsJws(token) + .getBody(); + + List authorities = AuthorityUtils.commaSeparatedStringToAuthorityList((String) claims.get(AUTHORITIES_KEY)); + + + User principal = new User(claims.getSubject(), "", authorities); + return new UsernamePasswordAuthenticationToken(principal, "", authorities); + } + + /** + * validate token + * + * @param token token + * @return whether valid + */ + public boolean validateToken(String token) { + try { + Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token); + return true; + } catch (SignatureException e) { + log.info("Invalid JWT signature."); + log.trace("Invalid JWT signature trace: {}", e); + } catch (MalformedJwtException e) { + log.info("Invalid JWT token."); + log.trace("Invalid JWT token trace: {}", e); + } catch (ExpiredJwtException e) { + log.info("Expired JWT token."); + log.trace("Expired JWT token trace: {}", e); + } catch (UnsupportedJwtException e) { + log.info("Unsupported JWT token."); + log.trace("Unsupported JWT token trace: {}", e); + } catch (IllegalArgumentException e) { + log.info("JWT token compact of handler are invalid."); + log.trace("JWT token compact of handler are invalid trace: {}", e); + } + return false; + } +} diff --git a/pigx-register/src/main/java/com/alibaba/nacos/console/utils/PasswordEncoderUtil.java b/pigx-register/src/main/java/com/alibaba/nacos/console/utils/PasswordEncoderUtil.java new file mode 100755 index 000000000..4e1587671 --- /dev/null +++ b/pigx-register/src/main/java/com/alibaba/nacos/console/utils/PasswordEncoderUtil.java @@ -0,0 +1,30 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * 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. + */ +package com.alibaba.nacos.console.utils; + +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; + +/** + * Password encoder tool + * + * @author nacos + */ +public class PasswordEncoderUtil { + + public static void main(String[] args) { + System.out.println(new BCryptPasswordEncoder().encode("nacos")); + } +} diff --git a/pigx-register/src/main/resources/bootstrap.yml b/pigx-register/src/main/resources/bootstrap.yml new file mode 100755 index 000000000..345134771 --- /dev/null +++ b/pigx-register/src/main/resources/bootstrap.yml @@ -0,0 +1,26 @@ +nacos: + port: 8849 + cmdb: + dumpTaskInterval: 3600 + eventTaskInterval: 10 + labelTaskInterval: 300 + loadDataAtStart: false + +# 数据源相关配置 +db: + num: 1 + user: root + password: root + url: + 0: jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true + +# 关闭nacos 登录 +spring: + datasource: + platform: mysql + security: + enabled: false + +server: + tomcat: + basedir: logs \ No newline at end of file diff --git a/pigx-register/src/main/resources/nacos-version.txt b/pigx-register/src/main/resources/nacos-version.txt new file mode 100755 index 000000000..defbd4820 --- /dev/null +++ b/pigx-register/src/main/resources/nacos-version.txt @@ -0,0 +1 @@ +version=${project.version} diff --git a/pigx-register/src/main/resources/static/console-fe/.babelrc b/pigx-register/src/main/resources/static/console-fe/.babelrc new file mode 100755 index 000000000..e1ef74e01 --- /dev/null +++ b/pigx-register/src/main/resources/static/console-fe/.babelrc @@ -0,0 +1,26 @@ +{ + "presets": [ + [ + "@babel/preset-env", + { + "useBuiltIns": "entry" + } + ], + "react-app" + ], + "plugins": [ + [ + "@babel/plugin-proposal-decorators", + { + "legacy": true + } + ], + [ + "babel-plugin-import", + { + "libraryName": "@alifd/next", + "style": true + } + ] + ] +} diff --git a/pigx-register/src/main/resources/static/console-fe/.editorconfig b/pigx-register/src/main/resources/static/console-fe/.editorconfig new file mode 100755 index 000000000..3331d7049 --- /dev/null +++ b/pigx-register/src/main/resources/static/console-fe/.editorconfig @@ -0,0 +1,16 @@ +# http://editorconfig.org +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.md] +trim_trailing_whitespace = false + +[Makefile] +indent_style = tab \ No newline at end of file diff --git a/pigx-register/src/main/resources/static/console-fe/.eslintignore b/pigx-register/src/main/resources/static/console-fe/.eslintignore new file mode 100755 index 000000000..2a606840e --- /dev/null +++ b/pigx-register/src/main/resources/static/console-fe/.eslintignore @@ -0,0 +1,6 @@ +*.svg +*.ejs +.DS_Store +build +node_modules +public \ No newline at end of file diff --git a/pigx-register/src/main/resources/static/console-fe/.eslintrc b/pigx-register/src/main/resources/static/console-fe/.eslintrc new file mode 100755 index 000000000..bbb6e5c04 --- /dev/null +++ b/pigx-register/src/main/resources/static/console-fe/.eslintrc @@ -0,0 +1,35 @@ +{ + "extends": "eslint-config-ali/react", + "parser": "babel-eslint", + "env": {}, + "globals": { + "window": true + }, + "rules": { + "no-shadow": "off", + "no-empty": "off", + "no-useless-escape": "off", + "no-template-curly-in-string": "off", + "no-unused-vars": "off", + "no-tabs": "off", + "no-param-reassign": "off", + "react/no-string-refs": "off", + "react/no-unused-state": "off", + "no-return-assign": "off", + "no-plusplus": "off", + "no-script-url": "off", + "no-mixed-operators": "off", + "react/jsx-indent": "off", + "react/jsx-no-bind": "off", + "react/forbid-prop-types": "off", + "react/no-array-index-key": "off", + "react/sort-comp": "off", + "implicit-arrow-linebreak": "off", + "prefer-const": "off", + "space-before-function-paren": "off", + "generator-star-spacing": "off", + "wrap-iife": "off", + "arrow-parens": "off", + "indent": "off" + } +} diff --git a/pigx-register/src/main/resources/static/console-fe/.gitignore b/pigx-register/src/main/resources/static/console-fe/.gitignore new file mode 100755 index 000000000..5539ad8a5 --- /dev/null +++ b/pigx-register/src/main/resources/static/console-fe/.gitignore @@ -0,0 +1,16 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules + +# production +/dist + +# misc +.DS_Store +npm-debug.log* + +# test +test/uirecorder.log +test/reports +test/screenshots/* \ No newline at end of file diff --git a/pigx-register/src/main/resources/static/console-fe/.prettierignore b/pigx-register/src/main/resources/static/console-fe/.prettierignore new file mode 100755 index 000000000..2a606840e --- /dev/null +++ b/pigx-register/src/main/resources/static/console-fe/.prettierignore @@ -0,0 +1,6 @@ +*.svg +*.ejs +.DS_Store +build +node_modules +public \ No newline at end of file diff --git a/pigx-register/src/main/resources/static/console-fe/.prettierrc b/pigx-register/src/main/resources/static/console-fe/.prettierrc new file mode 100755 index 000000000..0f6921f61 --- /dev/null +++ b/pigx-register/src/main/resources/static/console-fe/.prettierrc @@ -0,0 +1,9 @@ +{ + "tabWidth": 2, + "printWidth": 100, + "semi": true, + "useTabs": false, + "bracketSpacing": true, + "singleQuote": true, + "trailingComma": "es5" +} diff --git a/pigx-register/src/main/resources/static/console-fe/README.md b/pigx-register/src/main/resources/static/console-fe/README.md new file mode 100755 index 000000000..4fda681bc --- /dev/null +++ b/pigx-register/src/main/resources/static/console-fe/README.md @@ -0,0 +1,60 @@ +# 开始项目 +## cnpm 安装(可忽略) +```sh +npm install -g cnpm --registry=https://registry.npm.taobao.org + +# 设置匿名 +alias cnpm="npm --registry=https://registry.npm.taobao.org \ +--cache=$HOME/.npm/.cache/cnpm \ +--disturl=https://npm.taobao.org/dist \ +--userconfig=$HOME/.cnpmrc" + +# Or alias it in .bashrc or .zshrc +$ echo '\n#alias for cnpm\nalias cnpm="npm --registry=https://registry.npm.taobao.org \ + --cache=$HOME/.npm/.cache/cnpm \ + --disturl=https://npm.taobao.org/dist \ + --userconfig=$HOME/.cnpmrc"' >> ~/.zshrc && source ~/.zshrc + +``` +[详情地址: http://npm.taobao.org/](http://npm.taobao.org/) + +## 安装依赖 +```sh +yarn +``` +或 +``` +cnpm install +``` + +## 启动 +```sh +yarn start +``` +或 +``` +npm start +``` + +## 构建打包 +```sh +yarn build +``` +或 +``` +npm run build +``` +## + +# 代理配置 +`build/webpack.dev.conf.js` +修改proxy属性 + +``` +proxy: [{ + context: ['/'], + changeOrigin: true, + secure: false, + target: 'http://ip:port', +}], +``` diff --git a/pigx-register/src/main/resources/static/console-fe/package.json b/pigx-register/src/main/resources/static/console-fe/package.json new file mode 100755 index 000000000..8cbc20288 --- /dev/null +++ b/pigx-register/src/main/resources/static/console-fe/package.json @@ -0,0 +1,80 @@ +{ + "name": "console-fe", + "version": "1.0.0", + "description": "console fe", + "main": "index.js", + "scripts": { + "start": "cross-env NODE_ENV=development webpack-dev-server --config build/webpack.dev.conf.js", + "build": "cross-env NODE_ENV=production webpack --config build/webpack.prod.conf.js && node build/copyFile.js", + "eslint": "eslint --ext .js src/", + "eslint-fix": "eslint --ext .js --fix src/" + }, + "husky": { + "hooks": { + "pre-commit": "lint-staged" + } + }, + "lint-staged": { + "*.{js,css,less}": [ + "prettier --write", + "git add" + ] + }, + "license": "Apache-2.0", + "repository": { + "type": "git", + "url": "git+https://github.com/alibaba/nacos.git" + }, + "devDependencies": { + "@babel/cli": "^7.2.3", + "@babel/core": "^7.2.2", + "@babel/plugin-proposal-decorators": "^7.2.3", + "@babel/preset-env": "^7.2.3", + "@babel/runtime": "^7.2.0", + "babel-eslint": "^10.0.1", + "babel-loader": "^8.0.4", + "babel-plugin-import": "^1.11.0", + "babel-preset-react-app": "^6.1.0", + "clean-webpack-plugin": "^0.1.19", + "copy-webpack-plugin": "^4.6.0", + "cross-env": "^5.2.0", + "css-loader": "^2.0.2", + "eslint": "^5.11.0", + "eslint-config-ali": "^4.1.0", + "eslint-config-prettier": "^3.3.0", + "eslint-loader": "^2.1.1", + "eslint-plugin-import": "^2.14.0", + "eslint-plugin-prettier": "^3.0.0", + "eslint-plugin-react": "^7.11.1", + "file-loader": "^2.0.0", + "html-webpack-plugin": "^3.2.0", + "husky": "^1.1.4", + "lint-staged": "^8.0.4", + "mini-css-extract-plugin": "^0.5.0", + "node-sass": "^4.11.0", + "optimize-css-assets-webpack-plugin": "^5.0.1", + "prettier": "1.15.2", + "sass-loader": "^7.1.0", + "style-loader": "^0.23.1", + "uglifyjs-webpack-plugin": "^2.1.0", + "url-loader": "^1.1.2", + "webpack": "^4.28.2", + "webpack-cli": "^3.1.2", + "webpack-dev-server": "^3.1.13" + }, + "dependencies": { + "@alifd/next": "^1.11.10", + "axios": "^0.18.0", + "jquery": "^3.3.1", + "moment": "^2.23.0", + "prop-types": "^15.6.2", + "react": "^16.7.0", + "react-dom": "^16.7.0", + "react-redux": "^5.1.1", + "react-router": "^4.3.1", + "react-router-dom": "^4.3.1", + "react-router-redux": "^4.0.8", + "redux": "^4.0.1", + "redux-thunk": "^2.3.0" + } +} diff --git a/pigx-register/src/main/resources/static/console-fe/public/css/bootstrap.css b/pigx-register/src/main/resources/static/console-fe/public/css/bootstrap.css new file mode 100755 index 000000000..ce3ef2335 --- /dev/null +++ b/pigx-register/src/main/resources/static/console-fe/public/css/bootstrap.css @@ -0,0 +1,7124 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * 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. + */ + +/*! normalize.css v2.1.3 | MIT License | git.io/normalize */ + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +nav, +section, +summary { + display: block; +} + +audio, +canvas, +video { + display: inline-block; +} + +audio:not([controls]) { + display: none; + height: 0; +} + +[hidden], +template { + display: none; +} + +html { + font-family: sans-serif; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} + +body { + margin: 0; +} + +a { + background: transparent; +} + +a:focus { + outline: thin dotted; +} + +a:active, +a:hover { + outline: 0; +} + +h1 { + margin: 0.67em 0; + font-size: 2em; +} + +abbr[title] { + border-bottom: 1px dotted; +} + +b, +strong { + font-weight: bold; +} + +dfn { + font-style: italic; +} + +hr { + height: 0; + -moz-box-sizing: content-box; + box-sizing: content-box; +} + +mark { + color: #000; + background: #ff0; +} + +code, +kbd, +pre, +samp { + font-family: monospace, serif; + font-size: 1em; +} + +pre { + white-space: pre-wrap; +} + +q { + quotes: "\201C" "\201D" "\2018" "\2019"; +} + +small { + font-size: 80%; +} + +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +img { + border: 0; +} + +svg:not(:root) { + overflow: hidden; +} + +figure { + margin: 0; +} + +fieldset { + padding: 0.35em 0.625em 0.75em; + margin: 0 2px; + border: 1px solid #c0c0c0; +} + +legend { + padding: 0; + border: 0; +} + +button, +input, +select, +textarea { + margin: 0; + font-family: inherit; + font-size: 100%; +} + +button, +input { + line-height: normal; +} + +button, +select { + text-transform: none; +} + +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + cursor: pointer; + -webkit-appearance: button; +} + +button[disabled], +html input[disabled] { + cursor: default; +} + +input[type="checkbox"], +input[type="radio"] { + padding: 0; + box-sizing: border-box; +} + +input[type="search"] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; +} + +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} + +textarea { + overflow: auto; + vertical-align: top; +} + +table { + border-collapse: collapse; + border-spacing: 0; +} + +@media print { + * { + color: #000 !important; + text-shadow: none !important; + background: transparent !important; + box-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; + } + abbr[title]:after { + content: " (" attr(title) ")"; + } + a[href^="javascript:"]:after, + a[href^="#"]:after { + content: ""; + } + pre, + blockquote { + border: 1px solid #999; + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + img { + max-width: 100% !important; + } + @page { + margin: 2cm .5cm; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } + select { + background: #fff !important; + } + .navbar { + display: none; + } + .table td, + .table th { + background-color: #fff !important; + } + .btn > .caret, + .dropup > .btn > .caret { + border-top-color: #000 !important; + } + .label { + border: 1px solid #000; + } + .table { + border-collapse: collapse !important; + } + .table-bordered th, + .table-bordered td { + border: 1px solid #ddd !important; + } +} + +*, +*:before, +*:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +html { + font-size: 62.5%; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} + +body { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 1.428571429; + color: #333333; + background-color: #ffffff; +} + +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; +} + +a { + color: #428bca; + text-decoration: none; +} + +a:hover, +a:focus { + color: #2a6496; + text-decoration: underline; +} + +a:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +img { + vertical-align: middle; +} + +.img-responsive { + display: block; + height: auto; + max-width: 100%; +} + +.img-rounded { + border-radius: 6px; +} + +.img-thumbnail { + display: inline-block; + height: auto; + max-width: 100%; + padding: 4px; + line-height: 1.428571429; + background-color: #ffffff; + border: 1px solid #dddddd; + border-radius: 4px; + -webkit-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} + +.img-circle { + border-radius: 50%; +} + +hr { + margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eeeeee; +} + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} + +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-weight: 500; + line-height: 1.1; + color: inherit; +} + +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small, +.h1 small, +.h2 small, +.h3 small, +.h4 small, +.h5 small, +.h6 small, +h1 .small, +h2 .small, +h3 .small, +h4 .small, +h5 .small, +h6 .small, +.h1 .small, +.h2 .small, +.h3 .small, +.h4 .small, +.h5 .small, +.h6 .small { + font-weight: normal; + line-height: 1; + color: #999999; +} + +h1, +h2, +h3 { + margin-top: 20px; + margin-bottom: 10px; +} + +h1 small, +h2 small, +h3 small, +h1 .small, +h2 .small, +h3 .small { + font-size: 65%; +} + +h4, +h5, +h6 { + margin-top: 10px; + margin-bottom: 10px; +} + +h4 small, +h5 small, +h6 small, +h4 .small, +h5 .small, +h6 .small { + font-size: 75%; +} + +h1, +.h1 { + font-size: 36px; +} + +h2, +.h2 { + font-size: 30px; +} + +h3, +.h3 { + font-size: 24px; +} + +h4, +.h4 { + font-size: 18px; +} + +h5, +.h5 { + font-size: 14px; +} + +h6, +.h6 { + font-size: 12px; +} + +p { + margin: 0 0 10px; +} + +.lead { + margin-bottom: 20px; + font-size: 16px; + font-weight: 200; + line-height: 1.4; +} + +@media (min-width: 768px) { + .lead { + font-size: 21px; + } +} + +small, +.small { + font-size: 85%; +} + +cite { + font-style: normal; +} + +.text-muted { + color: #999999; +} + +.text-primary { + color: #428bca; +} + +.text-primary:hover { + color: #3071a9; +} + +.text-warning { + color: #8a6d3b; +} + +.text-warning:hover { + color: #66512c; +} + +.text-danger { + color: #a94442; +} + +.text-danger:hover { + color: #843534; +} + +.text-success { + color: #3c763d; +} + +.text-success:hover { + color: #2b542c; +} + +.text-info { + color: #31708f; +} + +.text-info:hover { + color: #245269; +} + +.text-left { + text-align: left; +} + +.text-right { + text-align: right; +} + +.text-center { + text-align: center; +} + +.page-header { + padding-bottom: 9px; + margin: 40px 0 20px; + border-bottom: 1px solid #eeeeee; +} + +ul, +ol { + margin-top: 0; + margin-bottom: 10px; +} + +ul ul, +ol ul, +ul ol, +ol ol { + margin-bottom: 0; +} + +.list-unstyled { + padding-left: 0; + list-style: none; +} + +.list-inline { + padding-left: 0; + list-style: none; +} + +.list-inline > li { + display: inline-block; + padding-right: 5px; + padding-left: 5px; +} + +.list-inline > li:first-child { + padding-left: 0; +} + +dl { + margin-top: 0; + margin-bottom: 20px; +} + +dt, +dd { + line-height: 1.428571429; +} + +dt { + font-weight: bold; +} + +dd { + margin-left: 0; +} + +@media (min-width: 768px) { + .dl-horizontal dt { + float: left; + width: 160px; + overflow: hidden; + clear: left; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap; + } + .dl-horizontal dd { + margin-left: 180px; + } + .dl-horizontal dd:before, + .dl-horizontal dd:after { + display: table; + content: " "; + } + .dl-horizontal dd:after { + clear: both; + } + .dl-horizontal dd:before, + .dl-horizontal dd:after { + display: table; + content: " "; + } + .dl-horizontal dd:after { + clear: both; + } +} + +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #999999; +} + +.initialism { + font-size: 90%; + text-transform: uppercase; +} + +blockquote { + padding: 10px 20px; + margin: 0 0 20px; + border-left: 5px solid #eeeeee; +} + +blockquote p { + font-size: 17.5px; + font-weight: 300; + line-height: 1.25; +} + +blockquote p:last-child { + margin-bottom: 0; +} + +blockquote small, +blockquote .small { + display: block; + line-height: 1.428571429; + color: #999999; +} + +blockquote small:before, +blockquote .small:before { + content: '\2014 \00A0'; +} + +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #eeeeee; + border-left: 0; +} + +blockquote.pull-right p, +blockquote.pull-right small, +blockquote.pull-right .small { + text-align: right; +} + +blockquote.pull-right small:before, +blockquote.pull-right .small:before { + content: ''; +} + +blockquote.pull-right small:after, +blockquote.pull-right .small:after { + content: '\00A0 \2014'; +} + +blockquote:before, +blockquote:after { + content: ""; +} + +address { + margin-bottom: 20px; + font-style: normal; + line-height: 1.428571429; +} + +code, +kbd, +pre, +samp { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; +} + +code { + padding: 2px 4px; + font-size: 90%; + color: #c7254e; + white-space: nowrap; + background-color: #f9f2f4; + border-radius: 4px; +} + +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 1.428571429; + color: #333333; + word-break: break-all; + word-wrap: break-word; + background-color: #f5f5f5; + border: 1px solid #cccccc; + border-radius: 4px; +} + +pre code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border-radius: 0; +} + +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} + +.container { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} + +.container:before, +.container:after { + display: table; + content: " "; +} + +.container:after { + clear: both; +} + +.container:before, +.container:after { + display: table; + content: " "; +} + +.container:after { + clear: both; +} + +@media (min-width: 768px) { + .container { + width: 750px; + } +} + +@media (min-width: 992px) { + .container { + width: 970px; + } +} + +@media (min-width: 1200px) { + .container { + width: 1170px; + } +} + +.row { + margin-right: -15px; + margin-left: -15px; +} + +.row:before, +.row:after { + display: table; + content: " "; +} + +.row:after { + clear: both; +} + +.row:before, +.row:after { + display: table; + content: " "; +} + +.row:after { + clear: both; +} + +.col-xs-1, +.col-sm-1, +.col-md-1, +.col-lg-1, +.col-xs-2, +.col-sm-2, +.col-md-2, +.col-lg-2, +.col-xs-3, +.col-sm-3, +.col-md-3, +.col-lg-3, +.col-xs-4, +.col-sm-4, +.col-md-4, +.col-lg-4, +.col-xs-5, +.col-sm-5, +.col-md-5, +.col-lg-5, +.col-xs-6, +.col-sm-6, +.col-md-6, +.col-lg-6, +.col-xs-7, +.col-sm-7, +.col-md-7, +.col-lg-7, +.col-xs-8, +.col-sm-8, +.col-md-8, +.col-lg-8, +.col-xs-9, +.col-sm-9, +.col-md-9, +.col-lg-9, +.col-xs-10, +.col-sm-10, +.col-md-10, +.col-lg-10, +.col-xs-11, +.col-sm-11, +.col-md-11, +.col-lg-11, +.col-xs-12, +.col-sm-12, +.col-md-12, +.col-lg-12 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; +} + +.col-xs-1, +.col-xs-2, +.col-xs-3, +.col-xs-4, +.col-xs-5, +.col-xs-6, +.col-xs-7, +.col-xs-8, +.col-xs-9, +.col-xs-10, +.col-xs-11, +.col-xs-12 { + float: left; +} + +.col-xs-12 { + width: 100%; +} + +.col-xs-11 { + width: 91.66666666666666%; +} + +.col-xs-10 { + width: 83.33333333333334%; +} + +.col-xs-9 { + width: 75%; +} + +.col-xs-8 { + width: 66.66666666666666%; +} + +.col-xs-7 { + width: 58.333333333333336%; +} + +.col-xs-6 { + width: 50%; +} + +.col-xs-5 { + width: 41.66666666666667%; +} + +.col-xs-4 { + width: 33.33333333333333%; +} + +.col-xs-3 { + width: 25%; +} + +.col-xs-2 { + width: 16.666666666666664%; +} + +.col-xs-1 { + width: 8.333333333333332%; +} + +.col-xs-pull-12 { + right: 100%; +} + +.col-xs-pull-11 { + right: 91.66666666666666%; +} + +.col-xs-pull-10 { + right: 83.33333333333334%; +} + +.col-xs-pull-9 { + right: 75%; +} + +.col-xs-pull-8 { + right: 66.66666666666666%; +} + +.col-xs-pull-7 { + right: 58.333333333333336%; +} + +.col-xs-pull-6 { + right: 50%; +} + +.col-xs-pull-5 { + right: 41.66666666666667%; +} + +.col-xs-pull-4 { + right: 33.33333333333333%; +} + +.col-xs-pull-3 { + right: 25%; +} + +.col-xs-pull-2 { + right: 16.666666666666664%; +} + +.col-xs-pull-1 { + right: 8.333333333333332%; +} + +.col-xs-pull-0 { + right: 0; +} + +.col-xs-push-12 { + left: 100%; +} + +.col-xs-push-11 { + left: 91.66666666666666%; +} + +.col-xs-push-10 { + left: 83.33333333333334%; +} + +.col-xs-push-9 { + left: 75%; +} + +.col-xs-push-8 { + left: 66.66666666666666%; +} + +.col-xs-push-7 { + left: 58.333333333333336%; +} + +.col-xs-push-6 { + left: 50%; +} + +.col-xs-push-5 { + left: 41.66666666666667%; +} + +.col-xs-push-4 { + left: 33.33333333333333%; +} + +.col-xs-push-3 { + left: 25%; +} + +.col-xs-push-2 { + left: 16.666666666666664%; +} + +.col-xs-push-1 { + left: 8.333333333333332%; +} + +.col-xs-push-0 { + left: 0; +} + +.col-xs-offset-12 { + margin-left: 100%; +} + +.col-xs-offset-11 { + margin-left: 91.66666666666666%; +} + +.col-xs-offset-10 { + margin-left: 83.33333333333334%; +} + +.col-xs-offset-9 { + margin-left: 75%; +} + +.col-xs-offset-8 { + margin-left: 66.66666666666666%; +} + +.col-xs-offset-7 { + margin-left: 58.333333333333336%; +} + +.col-xs-offset-6 { + margin-left: 50%; +} + +.col-xs-offset-5 { + margin-left: 41.66666666666667%; +} + +.col-xs-offset-4 { + margin-left: 33.33333333333333%; +} + +.col-xs-offset-3 { + margin-left: 25%; +} + +.col-xs-offset-2 { + margin-left: 16.666666666666664%; +} + +.col-xs-offset-1 { + margin-left: 8.333333333333332%; +} + +.col-xs-offset-0 { + margin-left: 0; +} + +@media (min-width: 768px) { + .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 { + float: left; + } + .col-sm-12 { + width: 100%; + } + .col-sm-11 { + width: 91.66666666666666%; + } + .col-sm-10 { + width: 83.33333333333334%; + } + .col-sm-9 { + width: 75%; + } + .col-sm-8 { + width: 66.66666666666666%; + } + .col-sm-7 { + width: 58.333333333333336%; + } + .col-sm-6 { + width: 50%; + } + .col-sm-5 { + width: 41.66666666666667%; + } + .col-sm-4 { + width: 33.33333333333333%; + } + .col-sm-3 { + width: 25%; + } + .col-sm-2 { + width: 16.666666666666664%; + } + .col-sm-1 { + width: 8.333333333333332%; + } + .col-sm-pull-12 { + right: 100%; + } + .col-sm-pull-11 { + right: 91.66666666666666%; + } + .col-sm-pull-10 { + right: 83.33333333333334%; + } + .col-sm-pull-9 { + right: 75%; + } + .col-sm-pull-8 { + right: 66.66666666666666%; + } + .col-sm-pull-7 { + right: 58.333333333333336%; + } + .col-sm-pull-6 { + right: 50%; + } + .col-sm-pull-5 { + right: 41.66666666666667%; + } + .col-sm-pull-4 { + right: 33.33333333333333%; + } + .col-sm-pull-3 { + right: 25%; + } + .col-sm-pull-2 { + right: 16.666666666666664%; + } + .col-sm-pull-1 { + right: 8.333333333333332%; + } + .col-sm-pull-0 { + right: 0; + } + .col-sm-push-12 { + left: 100%; + } + .col-sm-push-11 { + left: 91.66666666666666%; + } + .col-sm-push-10 { + left: 83.33333333333334%; + } + .col-sm-push-9 { + left: 75%; + } + .col-sm-push-8 { + left: 66.66666666666666%; + } + .col-sm-push-7 { + left: 58.333333333333336%; + } + .col-sm-push-6 { + left: 50%; + } + .col-sm-push-5 { + left: 41.66666666666667%; + } + .col-sm-push-4 { + left: 33.33333333333333%; + } + .col-sm-push-3 { + left: 25%; + } + .col-sm-push-2 { + left: 16.666666666666664%; + } + .col-sm-push-1 { + left: 8.333333333333332%; + } + .col-sm-push-0 { + left: 0; + } + .col-sm-offset-12 { + margin-left: 100%; + } + .col-sm-offset-11 { + margin-left: 91.66666666666666%; + } + .col-sm-offset-10 { + margin-left: 83.33333333333334%; + } + .col-sm-offset-9 { + margin-left: 75%; + } + .col-sm-offset-8 { + margin-left: 66.66666666666666%; + } + .col-sm-offset-7 { + margin-left: 58.333333333333336%; + } + .col-sm-offset-6 { + margin-left: 50%; + } + .col-sm-offset-5 { + margin-left: 41.66666666666667%; + } + .col-sm-offset-4 { + margin-left: 33.33333333333333%; + } + .col-sm-offset-3 { + margin-left: 25%; + } + .col-sm-offset-2 { + margin-left: 16.666666666666664%; + } + .col-sm-offset-1 { + margin-left: 8.333333333333332%; + } + .col-sm-offset-0 { + margin-left: 0; + } +} + +@media (min-width: 992px) { + .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 { + float: left; + } + .col-md-12 { + width: 100%; + } + .col-md-11 { + width: 91.66666666666666%; + } + .col-md-10 { + width: 83.33333333333334%; + } + .col-md-9 { + width: 75%; + } + .col-md-8 { + width: 66.66666666666666%; + } + .col-md-7 { + width: 58.333333333333336%; + } + .col-md-6 { + width: 50%; + } + .col-md-5 { + width: 41.66666666666667%; + } + .col-md-4 { + width: 33.33333333333333%; + } + .col-md-3 { + width: 25%; + } + .col-md-2 { + width: 16.666666666666664%; + } + .col-md-1 { + width: 8.333333333333332%; + } + .col-md-pull-12 { + right: 100%; + } + .col-md-pull-11 { + right: 91.66666666666666%; + } + .col-md-pull-10 { + right: 83.33333333333334%; + } + .col-md-pull-9 { + right: 75%; + } + .col-md-pull-8 { + right: 66.66666666666666%; + } + .col-md-pull-7 { + right: 58.333333333333336%; + } + .col-md-pull-6 { + right: 50%; + } + .col-md-pull-5 { + right: 41.66666666666667%; + } + .col-md-pull-4 { + right: 33.33333333333333%; + } + .col-md-pull-3 { + right: 25%; + } + .col-md-pull-2 { + right: 16.666666666666664%; + } + .col-md-pull-1 { + right: 8.333333333333332%; + } + .col-md-pull-0 { + right: 0; + } + .col-md-push-12 { + left: 100%; + } + .col-md-push-11 { + left: 91.66666666666666%; + } + .col-md-push-10 { + left: 83.33333333333334%; + } + .col-md-push-9 { + left: 75%; + } + .col-md-push-8 { + left: 66.66666666666666%; + } + .col-md-push-7 { + left: 58.333333333333336%; + } + .col-md-push-6 { + left: 50%; + } + .col-md-push-5 { + left: 41.66666666666667%; + } + .col-md-push-4 { + left: 33.33333333333333%; + } + .col-md-push-3 { + left: 25%; + } + .col-md-push-2 { + left: 16.666666666666664%; + } + .col-md-push-1 { + left: 8.333333333333332%; + } + .col-md-push-0 { + left: 0; + } + .col-md-offset-12 { + margin-left: 100%; + } + .col-md-offset-11 { + margin-left: 91.66666666666666%; + } + .col-md-offset-10 { + margin-left: 83.33333333333334%; + } + .col-md-offset-9 { + margin-left: 75%; + } + .col-md-offset-8 { + margin-left: 66.66666666666666%; + } + .col-md-offset-7 { + margin-left: 58.333333333333336%; + } + .col-md-offset-6 { + margin-left: 50%; + } + .col-md-offset-5 { + margin-left: 41.66666666666667%; + } + .col-md-offset-4 { + margin-left: 33.33333333333333%; + } + .col-md-offset-3 { + margin-left: 25%; + } + .col-md-offset-2 { + margin-left: 16.666666666666664%; + } + .col-md-offset-1 { + margin-left: 8.333333333333332%; + } + .col-md-offset-0 { + margin-left: 0; + } +} + +@media (min-width: 1200px) { + .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 { + float: left; + } + .col-lg-12 { + width: 100%; + } + .col-lg-11 { + width: 91.66666666666666%; + } + .col-lg-10 { + width: 83.33333333333334%; + } + .col-lg-9 { + width: 75%; + } + .col-lg-8 { + width: 66.66666666666666%; + } + .col-lg-7 { + width: 58.333333333333336%; + } + .col-lg-6 { + width: 50%; + } + .col-lg-5 { + width: 41.66666666666667%; + } + .col-lg-4 { + width: 33.33333333333333%; + } + .col-lg-3 { + width: 25%; + } + .col-lg-2 { + width: 16.666666666666664%; + } + .col-lg-1 { + width: 8.333333333333332%; + } + .col-lg-pull-12 { + right: 100%; + } + .col-lg-pull-11 { + right: 91.66666666666666%; + } + .col-lg-pull-10 { + right: 83.33333333333334%; + } + .col-lg-pull-9 { + right: 75%; + } + .col-lg-pull-8 { + right: 66.66666666666666%; + } + .col-lg-pull-7 { + right: 58.333333333333336%; + } + .col-lg-pull-6 { + right: 50%; + } + .col-lg-pull-5 { + right: 41.66666666666667%; + } + .col-lg-pull-4 { + right: 33.33333333333333%; + } + .col-lg-pull-3 { + right: 25%; + } + .col-lg-pull-2 { + right: 16.666666666666664%; + } + .col-lg-pull-1 { + right: 8.333333333333332%; + } + .col-lg-pull-0 { + right: 0; + } + .col-lg-push-12 { + left: 100%; + } + .col-lg-push-11 { + left: 91.66666666666666%; + } + .col-lg-push-10 { + left: 83.33333333333334%; + } + .col-lg-push-9 { + left: 75%; + } + .col-lg-push-8 { + left: 66.66666666666666%; + } + .col-lg-push-7 { + left: 58.333333333333336%; + } + .col-lg-push-6 { + left: 50%; + } + .col-lg-push-5 { + left: 41.66666666666667%; + } + .col-lg-push-4 { + left: 33.33333333333333%; + } + .col-lg-push-3 { + left: 25%; + } + .col-lg-push-2 { + left: 16.666666666666664%; + } + .col-lg-push-1 { + left: 8.333333333333332%; + } + .col-lg-push-0 { + left: 0; + } + .col-lg-offset-12 { + margin-left: 100%; + } + .col-lg-offset-11 { + margin-left: 91.66666666666666%; + } + .col-lg-offset-10 { + margin-left: 83.33333333333334%; + } + .col-lg-offset-9 { + margin-left: 75%; + } + .col-lg-offset-8 { + margin-left: 66.66666666666666%; + } + .col-lg-offset-7 { + margin-left: 58.333333333333336%; + } + .col-lg-offset-6 { + margin-left: 50%; + } + .col-lg-offset-5 { + margin-left: 41.66666666666667%; + } + .col-lg-offset-4 { + margin-left: 33.33333333333333%; + } + .col-lg-offset-3 { + margin-left: 25%; + } + .col-lg-offset-2 { + margin-left: 16.666666666666664%; + } + .col-lg-offset-1 { + margin-left: 8.333333333333332%; + } + .col-lg-offset-0 { + margin-left: 0; + } +} + +table { + max-width: 100%; + background-color: transparent; +} + +th { + text-align: left; +} + +.table { + width: 100%; + margin-bottom: 20px; +} + +.table > thead > tr > th, +.table > tbody > tr > th, +.table > tfoot > tr > th, +.table > thead > tr > td, +.table > tbody > tr > td, +.table > tfoot > tr > td { + padding: 8px; + line-height: 1.428571429; + vertical-align: top; + border-top: 1px solid #dddddd; +} + +.table > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #dddddd; +} + +.table > caption + thead > tr:first-child > th, +.table > colgroup + thead > tr:first-child > th, +.table > thead:first-child > tr:first-child > th, +.table > caption + thead > tr:first-child > td, +.table > colgroup + thead > tr:first-child > td, +.table > thead:first-child > tr:first-child > td { + border-top: 0; +} + +.table > tbody + tbody { + border-top: 2px solid #dddddd; +} + +.table .table { + background-color: #ffffff; +} + +.table-condensed > thead > tr > th, +.table-condensed > tbody > tr > th, +.table-condensed > tfoot > tr > th, +.table-condensed > thead > tr > td, +.table-condensed > tbody > tr > td, +.table-condensed > tfoot > tr > td { + padding: 5px; +} + +.table-bordered { + border: 1px solid #dddddd; +} + +.table-bordered > thead > tr > th, +.table-bordered > tbody > tr > th, +.table-bordered > tfoot > tr > th, +.table-bordered > thead > tr > td, +.table-bordered > tbody > tr > td, +.table-bordered > tfoot > tr > td { + border: 1px solid #dddddd; +} + +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td { + border-bottom-width: 2px; +} + +.table-striped > tbody > tr:nth-child(odd) > td, +.table-striped > tbody > tr:nth-child(odd) > th { + background-color: #f9f9f9; +} + +.table-hover > tbody > tr:hover > td, +.table-hover > tbody > tr:hover > th { + background-color: #f5f5f5; +} + +table col[class*="col-"] { + position: static; + display: table-column; + float: none; +} + +table td[class*="col-"], +table th[class*="col-"] { + display: table-cell; + float: none; +} + +.table > thead > tr > .active, +.table > tbody > tr > .active, +.table > tfoot > tr > .active, +.table > thead > .active > td, +.table > tbody > .active > td, +.table > tfoot > .active > td, +.table > thead > .active > th, +.table > tbody > .active > th, +.table > tfoot > .active > th { + background-color: #f5f5f5; +} + +.table-hover > tbody > tr > .active:hover, +.table-hover > tbody > .active:hover > td, +.table-hover > tbody > .active:hover > th { + background-color: #e8e8e8; +} + +.table > thead > tr > .success, +.table > tbody > tr > .success, +.table > tfoot > tr > .success, +.table > thead > .success > td, +.table > tbody > .success > td, +.table > tfoot > .success > td, +.table > thead > .success > th, +.table > tbody > .success > th, +.table > tfoot > .success > th { + background-color: #dff0d8; +} + +.table-hover > tbody > tr > .success:hover, +.table-hover > tbody > .success:hover > td, +.table-hover > tbody > .success:hover > th { + background-color: #d0e9c6; +} + +.table > thead > tr > .danger, +.table > tbody > tr > .danger, +.table > tfoot > tr > .danger, +.table > thead > .danger > td, +.table > tbody > .danger > td, +.table > tfoot > .danger > td, +.table > thead > .danger > th, +.table > tbody > .danger > th, +.table > tfoot > .danger > th { + background-color: #f2dede; +} + +.table-hover > tbody > tr > .danger:hover, +.table-hover > tbody > .danger:hover > td, +.table-hover > tbody > .danger:hover > th { + background-color: #ebcccc; +} + +.table > thead > tr > .warning, +.table > tbody > tr > .warning, +.table > tfoot > tr > .warning, +.table > thead > .warning > td, +.table > tbody > .warning > td, +.table > tfoot > .warning > td, +.table > thead > .warning > th, +.table > tbody > .warning > th, +.table > tfoot > .warning > th { + background-color: #fcf8e3; +} + +.table-hover > tbody > tr > .warning:hover, +.table-hover > tbody > .warning:hover > td, +.table-hover > tbody > .warning:hover > th { + background-color: #faf2cc; +} + +@media (max-width: 767px) { + .table-responsive { + width: 100%; + margin-bottom: 15px; + overflow-x: scroll; + overflow-y: hidden; + border: 1px solid #dddddd; + -ms-overflow-style: -ms-autohiding-scrollbar; + -webkit-overflow-scrolling: touch; + } + .table-responsive > .table { + margin-bottom: 0; + } + .table-responsive > .table > thead > tr > th, + .table-responsive > .table > tbody > tr > th, + .table-responsive > .table > tfoot > tr > th, + .table-responsive > .table > thead > tr > td, + .table-responsive > .table > tbody > tr > td, + .table-responsive > .table > tfoot > tr > td { + white-space: nowrap; + } + .table-responsive > .table-bordered { + border: 0; + } + .table-responsive > .table-bordered > thead > tr > th:first-child, + .table-responsive > .table-bordered > tbody > tr > th:first-child, + .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .table-responsive > .table-bordered > thead > tr > td:first-child, + .table-responsive > .table-bordered > tbody > tr > td:first-child, + .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; + } + .table-responsive > .table-bordered > thead > tr > th:last-child, + .table-responsive > .table-bordered > tbody > tr > th:last-child, + .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .table-responsive > .table-bordered > thead > tr > td:last-child, + .table-responsive > .table-bordered > tbody > tr > td:last-child, + .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; + } + .table-responsive > .table-bordered > tbody > tr:last-child > th, + .table-responsive > .table-bordered > tfoot > tr:last-child > th, + .table-responsive > .table-bordered > tbody > tr:last-child > td, + .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; + } +} + +fieldset { + padding: 0; + margin: 0; + border: 0; +} + +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: inherit; + color: #333333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} + +label { + display: inline-block; + margin-bottom: 5px; + font-weight: bold; +} + +input[type="search"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + /* IE8-9 */ + + line-height: normal; +} + +input[type="file"] { + display: block; +} + +select[multiple], +select[size] { + height: auto; +} + +select optgroup { + font-family: inherit; + font-size: inherit; + font-style: inherit; +} + +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +input[type="number"]::-webkit-outer-spin-button, +input[type="number"]::-webkit-inner-spin-button { + height: auto; +} + +output { + display: block; + padding-top: 7px; + font-size: 14px; + line-height: 1.428571429; + color: #555555; + vertical-align: middle; +} + +.form-control { + display: block; + width: 100%; + height: 34px; + padding: 6px 12px; + font-size: 14px; + line-height: 1.428571429; + color: #555555; + vertical-align: middle; + background-color: #ffffff; + background-image: none; + border: 1px solid #cccccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; + transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; +} + +.form-control:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); +} + +.form-control:-moz-placeholder { + color: #999999; +} + +.form-control::-moz-placeholder { + color: #999999; + opacity: 1; +} + +.form-control:-ms-input-placeholder { + color: #999999; +} + +.form-control::-webkit-input-placeholder { + color: #999999; +} + +.form-control[disabled], +.form-control[readonly], +fieldset[disabled] .form-control { + cursor: not-allowed; + background-color: #eeeeee; +} + +textarea.form-control { + height: auto; +} + +.form-group { + margin-bottom: 15px; +} + +.radio, +.checkbox { + display: block; + min-height: 20px; + padding-left: 20px; + margin-top: 10px; + margin-bottom: 10px; + vertical-align: middle; +} + +.radio label, +.checkbox label { + display: inline; + margin-bottom: 0; + font-weight: normal; + cursor: pointer; +} + +.radio input[type="radio"], +.radio-inline input[type="radio"], +.checkbox input[type="checkbox"], +.checkbox-inline input[type="checkbox"] { + float: left; + margin-left: -20px; +} + +.radio + .radio, +.checkbox + .checkbox { + margin-top: -5px; +} + +.radio-inline, +.checkbox-inline { + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + vertical-align: middle; + cursor: pointer; +} + +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; +} + +input[type="radio"][disabled], +input[type="checkbox"][disabled], +.radio[disabled], +.radio-inline[disabled], +.checkbox[disabled], +.checkbox-inline[disabled], +fieldset[disabled] input[type="radio"], +fieldset[disabled] input[type="checkbox"], +fieldset[disabled] .radio, +fieldset[disabled] .radio-inline, +fieldset[disabled] .checkbox, +fieldset[disabled] .checkbox-inline { + cursor: not-allowed; +} + +.input-sm { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} + +select.input-sm { + height: 30px; + line-height: 30px; +} + +textarea.input-sm { + height: auto; +} + +.input-lg { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.33; + border-radius: 6px; +} + +select.input-lg { + height: 46px; + line-height: 46px; +} + +textarea.input-lg { + height: auto; +} + +.has-warning .help-block, +.has-warning .control-label, +.has-warning .radio, +.has-warning .checkbox, +.has-warning .radio-inline, +.has-warning .checkbox-inline { + color: #8a6d3b; +} + +.has-warning .form-control { + border-color: #8a6d3b; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.has-warning .form-control:focus { + border-color: #66512c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; +} + +.has-warning .input-group-addon { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #8a6d3b; +} + +.has-error .help-block, +.has-error .control-label, +.has-error .radio, +.has-error .checkbox, +.has-error .radio-inline, +.has-error .checkbox-inline { + color: #a94442; +} + +.has-error .form-control { + border-color: #a94442; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.has-error .form-control:focus { + border-color: #843534; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; +} + +.has-error .input-group-addon { + color: #a94442; + background-color: #f2dede; + border-color: #a94442; +} + +.has-success .help-block, +.has-success .control-label, +.has-success .radio, +.has-success .checkbox, +.has-success .radio-inline, +.has-success .checkbox-inline { + color: #3c763d; +} + +.has-success .form-control { + border-color: #3c763d; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.has-success .form-control:focus { + border-color: #2b542c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; +} + +.has-success .input-group-addon { + color: #3c763d; + background-color: #dff0d8; + border-color: #3c763d; +} + +.form-control-static { + margin-bottom: 0; +} + +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: #737373; +} + +@media (min-width: 768px) { + .form-inline .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .form-control { + display: inline-block; + } + .form-inline select.form-control { + width: auto; + } + .form-inline .radio, + .form-inline .checkbox { + display: inline-block; + padding-left: 0; + margin-top: 0; + margin-bottom: 0; + } + .form-inline .radio input[type="radio"], + .form-inline .checkbox input[type="checkbox"] { + float: none; + margin-left: 0; + } +} + +.form-horizontal .control-label, +.form-horizontal .radio, +.form-horizontal .checkbox, +.form-horizontal .radio-inline, +.form-horizontal .checkbox-inline { + padding-top: 7px; + margin-top: 0; + margin-bottom: 0; +} + +.form-horizontal .radio, +.form-horizontal .checkbox { + min-height: 27px; +} + +.form-horizontal .form-group { + margin-right: -15px; + margin-left: -15px; +} + +.form-horizontal .form-group:before, +.form-horizontal .form-group:after { + display: table; + content: " "; +} + +.form-horizontal .form-group:after { + clear: both; +} + +.form-horizontal .form-group:before, +.form-horizontal .form-group:after { + display: table; + content: " "; +} + +.form-horizontal .form-group:after { + clear: both; +} + +.form-horizontal .form-control-static { + padding-top: 7px; +} + +@media (min-width: 768px) { + .form-horizontal .control-label { + text-align: right; + } +} + +.btn { + display: inline-block; + padding: 6px 12px; + margin-bottom: 0; + font-size: 14px; + font-weight: normal; + line-height: 1.428571429; + text-align: center; + white-space: nowrap; + vertical-align: middle; + cursor: pointer; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + -o-user-select: none; + user-select: none; +} + +.btn:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +.btn:hover, +.btn:focus { + color: #333333; + text-decoration: none; +} + +.btn:active, +.btn.active { + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} + +.btn.disabled, +.btn[disabled], +fieldset[disabled] .btn { + pointer-events: none; + cursor: not-allowed; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; +} + +.btn-default { + color: #333333; + background-color: #ffffff; + border-color: #cccccc; +} + +.btn-default:hover, +.btn-default:focus, +.btn-default:active, +.btn-default.active, +.open .dropdown-toggle.btn-default { + color: #333333; + background-color: #ebebeb; + border-color: #adadad; +} + +.btn-default:active, +.btn-default.active, +.open .dropdown-toggle.btn-default { + background-image: none; +} + +.btn-default.disabled, +.btn-default[disabled], +fieldset[disabled] .btn-default, +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled:active, +.btn-default[disabled]:active, +fieldset[disabled] .btn-default:active, +.btn-default.disabled.active, +.btn-default[disabled].active, +fieldset[disabled] .btn-default.active { + background-color: #ffffff; + border-color: #cccccc; +} + +.btn-default .badge { + color: #ffffff; + background-color: #fff; +} + +.btn-primary { + color: #ffffff; + background-color: #428bca; + border-color: #357ebd; +} + +.btn-primary:hover, +.btn-primary:focus, +.btn-primary:active, +.btn-primary.active, +.open .dropdown-toggle.btn-primary { + color: #ffffff; + background-color: #3276b1; + border-color: #285e8e; +} + +.btn-primary:active, +.btn-primary.active, +.open .dropdown-toggle.btn-primary { + background-image: none; +} + +.btn-primary.disabled, +.btn-primary[disabled], +fieldset[disabled] .btn-primary, +.btn-primary.disabled:hover, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary:hover, +.btn-primary.disabled:focus, +.btn-primary[disabled]:focus, +fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled:active, +.btn-primary[disabled]:active, +fieldset[disabled] .btn-primary:active, +.btn-primary.disabled.active, +.btn-primary[disabled].active, +fieldset[disabled] .btn-primary.active { + background-color: #428bca; + border-color: #357ebd; +} + +.btn-primary .badge { + color: #428bca; + background-color: #fff; +} + +.btn-warning { + color: #ffffff; + background-color: #f0ad4e; + border-color: #eea236; +} + +.btn-warning:hover, +.btn-warning:focus, +.btn-warning:active, +.btn-warning.active, +.open .dropdown-toggle.btn-warning { + color: #ffffff; + background-color: #ed9c28; + border-color: #d58512; +} + +.btn-warning:active, +.btn-warning.active, +.open .dropdown-toggle.btn-warning { + background-image: none; +} + +.btn-warning.disabled, +.btn-warning[disabled], +fieldset[disabled] .btn-warning, +.btn-warning.disabled:hover, +.btn-warning[disabled]:hover, +fieldset[disabled] .btn-warning:hover, +.btn-warning.disabled:focus, +.btn-warning[disabled]:focus, +fieldset[disabled] .btn-warning:focus, +.btn-warning.disabled:active, +.btn-warning[disabled]:active, +fieldset[disabled] .btn-warning:active, +.btn-warning.disabled.active, +.btn-warning[disabled].active, +fieldset[disabled] .btn-warning.active { + background-color: #f0ad4e; + border-color: #eea236; +} + +.btn-warning .badge { + color: #f0ad4e; + background-color: #fff; +} + +.btn-danger { + color: #ffffff; + background-color: #d9534f; + border-color: #d43f3a; +} + +.btn-danger:hover, +.btn-danger:focus, +.btn-danger:active, +.btn-danger.active, +.open .dropdown-toggle.btn-danger { + color: #ffffff; + background-color: #d2322d; + border-color: #ac2925; +} + +.btn-danger:active, +.btn-danger.active, +.open .dropdown-toggle.btn-danger { + background-image: none; +} + +.btn-danger.disabled, +.btn-danger[disabled], +fieldset[disabled] .btn-danger, +.btn-danger.disabled:hover, +.btn-danger[disabled]:hover, +fieldset[disabled] .btn-danger:hover, +.btn-danger.disabled:focus, +.btn-danger[disabled]:focus, +fieldset[disabled] .btn-danger:focus, +.btn-danger.disabled:active, +.btn-danger[disabled]:active, +fieldset[disabled] .btn-danger:active, +.btn-danger.disabled.active, +.btn-danger[disabled].active, +fieldset[disabled] .btn-danger.active { + background-color: #d9534f; + border-color: #d43f3a; +} + +.btn-danger .badge { + color: #d9534f; + background-color: #fff; +} + +.btn-success { + color: #ffffff; + background-color: #5cb85c; + border-color: #4cae4c; +} + +.btn-success:hover, +.btn-success:focus, +.btn-success:active, +.btn-success.active, +.open .dropdown-toggle.btn-success { + color: #ffffff; + background-color: #47a447; + border-color: #398439; +} + +.btn-success:active, +.btn-success.active, +.open .dropdown-toggle.btn-success { + background-image: none; +} + +.btn-success.disabled, +.btn-success[disabled], +fieldset[disabled] .btn-success, +.btn-success.disabled:hover, +.btn-success[disabled]:hover, +fieldset[disabled] .btn-success:hover, +.btn-success.disabled:focus, +.btn-success[disabled]:focus, +fieldset[disabled] .btn-success:focus, +.btn-success.disabled:active, +.btn-success[disabled]:active, +fieldset[disabled] .btn-success:active, +.btn-success.disabled.active, +.btn-success[disabled].active, +fieldset[disabled] .btn-success.active { + background-color: #5cb85c; + border-color: #4cae4c; +} + +.btn-success .badge { + color: #5cb85c; + background-color: #fff; +} + +.btn-info { + color: #ffffff; + background-color: #5bc0de; + border-color: #46b8da; +} + +.btn-info:hover, +.btn-info:focus, +.btn-info:active, +.btn-info.active, +.open .dropdown-toggle.btn-info { + color: #ffffff; + background-color: #39b3d7; + border-color: #269abc; +} + +.btn-info:active, +.btn-info.active, +.open .dropdown-toggle.btn-info { + background-image: none; +} + +.btn-info.disabled, +.btn-info[disabled], +fieldset[disabled] .btn-info, +.btn-info.disabled:hover, +.btn-info[disabled]:hover, +fieldset[disabled] .btn-info:hover, +.btn-info.disabled:focus, +.btn-info[disabled]:focus, +fieldset[disabled] .btn-info:focus, +.btn-info.disabled:active, +.btn-info[disabled]:active, +fieldset[disabled] .btn-info:active, +.btn-info.disabled.active, +.btn-info[disabled].active, +fieldset[disabled] .btn-info.active { + background-color: #5bc0de; + border-color: #46b8da; +} + +.btn-info .badge { + color: #5bc0de; + background-color: #fff; +} + +.btn-link { + font-weight: normal; + color: #428bca; + cursor: pointer; + border-radius: 0; +} + +.btn-link, +.btn-link:active, +.btn-link[disabled], +fieldset[disabled] .btn-link { + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} + +.btn-link, +.btn-link:hover, +.btn-link:focus, +.btn-link:active { + border-color: transparent; +} + +.btn-link:hover, +.btn-link:focus { + color: #2a6496; + text-decoration: underline; + background-color: transparent; +} + +.btn-link[disabled]:hover, +fieldset[disabled] .btn-link:hover, +.btn-link[disabled]:focus, +fieldset[disabled] .btn-link:focus { + color: #999999; + text-decoration: none; +} + +.btn-lg { + padding: 10px 16px; + font-size: 18px; + line-height: 1.33; + border-radius: 6px; +} + +.btn-sm { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} + +.btn-xs { + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} + +.btn-block { + display: block; + width: 100%; + padding-right: 0; + padding-left: 0; +} + +.btn-block + .btn-block { + margin-top: 5px; +} + +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} + +.fade { + opacity: 0; + -webkit-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; +} + +.fade.in { + opacity: 1; +} + +.collapse { + display: none; +} + +.collapse.in { + display: block; +} + +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition: height 0.35s ease; + transition: height 0.35s ease; +} + +@font-face { + font-family: 'Glyphicons Halflings'; + src: url('../fonts/glyphicons-halflings-regular.eot'); + src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons-halflingsregular') format('svg'); +} + +.glyphicon { + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + -webkit-font-smoothing: antialiased; + font-style: normal; + font-weight: normal; + line-height: 1; + -moz-osx-font-smoothing: grayscale; +} + +.glyphicon:empty { + width: 1em; +} + +.glyphicon-asterisk:before { + content: "\2a"; +} + +.glyphicon-plus:before { + content: "\2b"; +} + +.glyphicon-euro:before { + content: "\20ac"; +} + +.glyphicon-minus:before { + content: "\2212"; +} + +.glyphicon-cloud:before { + content: "\2601"; +} + +.glyphicon-envelope:before { + content: "\2709"; +} + +.glyphicon-pencil:before { + content: "\270f"; +} + +.glyphicon-glass:before { + content: "\e001"; +} + +.glyphicon-music:before { + content: "\e002"; +} + +.glyphicon-search:before { + content: "\e003"; +} + +.glyphicon-heart:before { + content: "\e005"; +} + +.glyphicon-star:before { + content: "\e006"; +} + +.glyphicon-star-empty:before { + content: "\e007"; +} + +.glyphicon-user:before { + content: "\e008"; +} + +.glyphicon-film:before { + content: "\e009"; +} + +.glyphicon-th-large:before { + content: "\e010"; +} + +.glyphicon-th:before { + content: "\e011"; +} + +.glyphicon-th-list:before { + content: "\e012"; +} + +.glyphicon-ok:before { + content: "\e013"; +} + +.glyphicon-remove:before { + content: "\e014"; +} + +.glyphicon-zoom-in:before { + content: "\e015"; +} + +.glyphicon-zoom-out:before { + content: "\e016"; +} + +.glyphicon-off:before { + content: "\e017"; +} + +.glyphicon-signal:before { + content: "\e018"; +} + +.glyphicon-cog:before { + content: "\e019"; +} + +.glyphicon-trash:before { + content: "\e020"; +} + +.glyphicon-home:before { + content: "\e021"; +} + +.glyphicon-file:before { + content: "\e022"; +} + +.glyphicon-time:before { + content: "\e023"; +} + +.glyphicon-road:before { + content: "\e024"; +} + +.glyphicon-download-alt:before { + content: "\e025"; +} + +.glyphicon-download:before { + content: "\e026"; +} + +.glyphicon-upload:before { + content: "\e027"; +} + +.glyphicon-inbox:before { + content: "\e028"; +} + +.glyphicon-play-circle:before { + content: "\e029"; +} + +.glyphicon-repeat:before { + content: "\e030"; +} + +.glyphicon-refresh:before { + content: "\e031"; +} + +.glyphicon-list-alt:before { + content: "\e032"; +} + +.glyphicon-lock:before { + content: "\e033"; +} + +.glyphicon-flag:before { + content: "\e034"; +} + +.glyphicon-headphones:before { + content: "\e035"; +} + +.glyphicon-volume-off:before { + content: "\e036"; +} + +.glyphicon-volume-down:before { + content: "\e037"; +} + +.glyphicon-volume-up:before { + content: "\e038"; +} + +.glyphicon-qrcode:before { + content: "\e039"; +} + +.glyphicon-barcode:before { + content: "\e040"; +} + +.glyphicon-tag:before { + content: "\e041"; +} + +.glyphicon-tags:before { + content: "\e042"; +} + +.glyphicon-book:before { + content: "\e043"; +} + +.glyphicon-bookmark:before { + content: "\e044"; +} + +.glyphicon-print:before { + content: "\e045"; +} + +.glyphicon-camera:before { + content: "\e046"; +} + +.glyphicon-font:before { + content: "\e047"; +} + +.glyphicon-bold:before { + content: "\e048"; +} + +.glyphicon-italic:before { + content: "\e049"; +} + +.glyphicon-text-height:before { + content: "\e050"; +} + +.glyphicon-text-width:before { + content: "\e051"; +} + +.glyphicon-align-left:before { + content: "\e052"; +} + +.glyphicon-align-center:before { + content: "\e053"; +} + +.glyphicon-align-right:before { + content: "\e054"; +} + +.glyphicon-align-justify:before { + content: "\e055"; +} + +.glyphicon-list:before { + content: "\e056"; +} + +.glyphicon-indent-left:before { + content: "\e057"; +} + +.glyphicon-indent-right:before { + content: "\e058"; +} + +.glyphicon-facetime-video:before { + content: "\e059"; +} + +.glyphicon-picture:before { + content: "\e060"; +} + +.glyphicon-map-marker:before { + content: "\e062"; +} + +.glyphicon-adjust:before { + content: "\e063"; +} + +.glyphicon-tint:before { + content: "\e064"; +} + +.glyphicon-edit:before { + content: "\e065"; +} + +.glyphicon-share:before { + content: "\e066"; +} + +.glyphicon-check:before { + content: "\e067"; +} + +.glyphicon-move:before { + content: "\e068"; +} + +.glyphicon-step-backward:before { + content: "\e069"; +} + +.glyphicon-fast-backward:before { + content: "\e070"; +} + +.glyphicon-backward:before { + content: "\e071"; +} + +.glyphicon-play:before { + content: "\e072"; +} + +.glyphicon-pause:before { + content: "\e073"; +} + +.glyphicon-stop:before { + content: "\e074"; +} + +.glyphicon-forward:before { + content: "\e075"; +} + +.glyphicon-fast-forward:before { + content: "\e076"; +} + +.glyphicon-step-forward:before { + content: "\e077"; +} + +.glyphicon-eject:before { + content: "\e078"; +} + +.glyphicon-chevron-left:before { + content: "\e079"; +} + +.glyphicon-chevron-right:before { + content: "\e080"; +} + +.glyphicon-plus-sign:before { + content: "\e081"; +} + +.glyphicon-minus-sign:before { + content: "\e082"; +} + +.glyphicon-remove-sign:before { + content: "\e083"; +} + +.glyphicon-ok-sign:before { + content: "\e084"; +} + +.glyphicon-question-sign:before { + content: "\e085"; +} + +.glyphicon-info-sign:before { + content: "\e086"; +} + +.glyphicon-screenshot:before { + content: "\e087"; +} + +.glyphicon-remove-circle:before { + content: "\e088"; +} + +.glyphicon-ok-circle:before { + content: "\e089"; +} + +.glyphicon-ban-circle:before { + content: "\e090"; +} + +.glyphicon-arrow-left:before { + content: "\e091"; +} + +.glyphicon-arrow-right:before { + content: "\e092"; +} + +.glyphicon-arrow-up:before { + content: "\e093"; +} + +.glyphicon-arrow-down:before { + content: "\e094"; +} + +.glyphicon-share-alt:before { + content: "\e095"; +} + +.glyphicon-resize-full:before { + content: "\e096"; +} + +.glyphicon-resize-small:before { + content: "\e097"; +} + +.glyphicon-exclamation-sign:before { + content: "\e101"; +} + +.glyphicon-gift:before { + content: "\e102"; +} + +.glyphicon-leaf:before { + content: "\e103"; +} + +.glyphicon-fire:before { + content: "\e104"; +} + +.glyphicon-eye-open:before { + content: "\e105"; +} + +.glyphicon-eye-close:before { + content: "\e106"; +} + +.glyphicon-warning-sign:before { + content: "\e107"; +} + +.glyphicon-plane:before { + content: "\e108"; +} + +.glyphicon-calendar:before { + content: "\e109"; +} + +.glyphicon-random:before { + content: "\e110"; +} + +.glyphicon-comment:before { + content: "\e111"; +} + +.glyphicon-magnet:before { + content: "\e112"; +} + +.glyphicon-chevron-up:before { + content: "\e113"; +} + +.glyphicon-chevron-down:before { + content: "\e114"; +} + +.glyphicon-retweet:before { + content: "\e115"; +} + +.glyphicon-shopping-cart:before { + content: "\e116"; +} + +.glyphicon-folder-close:before { + content: "\e117"; +} + +.glyphicon-folder-open:before { + content: "\e118"; +} + +.glyphicon-resize-vertical:before { + content: "\e119"; +} + +.glyphicon-resize-horizontal:before { + content: "\e120"; +} + +.glyphicon-hdd:before { + content: "\e121"; +} + +.glyphicon-bullhorn:before { + content: "\e122"; +} + +.glyphicon-bell:before { + content: "\e123"; +} + +.glyphicon-certificate:before { + content: "\e124"; +} + +.glyphicon-thumbs-up:before { + content: "\e125"; +} + +.glyphicon-thumbs-down:before { + content: "\e126"; +} + +.glyphicon-hand-right:before { + content: "\e127"; +} + +.glyphicon-hand-left:before { + content: "\e128"; +} + +.glyphicon-hand-up:before { + content: "\e129"; +} + +.glyphicon-hand-down:before { + content: "\e130"; +} + +.glyphicon-circle-arrow-right:before { + content: "\e131"; +} + +.glyphicon-circle-arrow-left:before { + content: "\e132"; +} + +.glyphicon-circle-arrow-up:before { + content: "\e133"; +} + +.glyphicon-circle-arrow-down:before { + content: "\e134"; +} + +.glyphicon-globe:before { + content: "\e135"; +} + +.glyphicon-wrench:before { + content: "\e136"; +} + +.glyphicon-tasks:before { + content: "\e137"; +} + +.glyphicon-filter:before { + content: "\e138"; +} + +.glyphicon-briefcase:before { + content: "\e139"; +} + +.glyphicon-fullscreen:before { + content: "\e140"; +} + +.glyphicon-dashboard:before { + content: "\e141"; +} + +.glyphicon-paperclip:before { + content: "\e142"; +} + +.glyphicon-heart-empty:before { + content: "\e143"; +} + +.glyphicon-link:before { + content: "\e144"; +} + +.glyphicon-phone:before { + content: "\e145"; +} + +.glyphicon-pushpin:before { + content: "\e146"; +} + +.glyphicon-usd:before { + content: "\e148"; +} + +.glyphicon-gbp:before { + content: "\e149"; +} + +.glyphicon-sort:before { + content: "\e150"; +} + +.glyphicon-sort-by-alphabet:before { + content: "\e151"; +} + +.glyphicon-sort-by-alphabet-alt:before { + content: "\e152"; +} + +.glyphicon-sort-by-order:before { + content: "\e153"; +} + +.glyphicon-sort-by-order-alt:before { + content: "\e154"; +} + +.glyphicon-sort-by-attributes:before { + content: "\e155"; +} + +.glyphicon-sort-by-attributes-alt:before { + content: "\e156"; +} + +.glyphicon-unchecked:before { + content: "\e157"; +} + +.glyphicon-expand:before { + content: "\e158"; +} + +.glyphicon-collapse-down:before { + content: "\e159"; +} + +.glyphicon-collapse-up:before { + content: "\e160"; +} + +.glyphicon-log-in:before { + content: "\e161"; +} + +.glyphicon-flash:before { + content: "\e162"; +} + +.glyphicon-log-out:before { + content: "\e163"; +} + +.glyphicon-new-window:before { + content: "\e164"; +} + +.glyphicon-record:before { + content: "\e165"; +} + +.glyphicon-save:before { + content: "\e166"; +} + +.glyphicon-open:before { + content: "\e167"; +} + +.glyphicon-saved:before { + content: "\e168"; +} + +.glyphicon-import:before { + content: "\e169"; +} + +.glyphicon-export:before { + content: "\e170"; +} + +.glyphicon-send:before { + content: "\e171"; +} + +.glyphicon-floppy-disk:before { + content: "\e172"; +} + +.glyphicon-floppy-saved:before { + content: "\e173"; +} + +.glyphicon-floppy-remove:before { + content: "\e174"; +} + +.glyphicon-floppy-save:before { + content: "\e175"; +} + +.glyphicon-floppy-open:before { + content: "\e176"; +} + +.glyphicon-credit-card:before { + content: "\e177"; +} + +.glyphicon-transfer:before { + content: "\e178"; +} + +.glyphicon-cutlery:before { + content: "\e179"; +} + +.glyphicon-header:before { + content: "\e180"; +} + +.glyphicon-compressed:before { + content: "\e181"; +} + +.glyphicon-earphone:before { + content: "\e182"; +} + +.glyphicon-phone-alt:before { + content: "\e183"; +} + +.glyphicon-tower:before { + content: "\e184"; +} + +.glyphicon-stats:before { + content: "\e185"; +} + +.glyphicon-sd-video:before { + content: "\e186"; +} + +.glyphicon-hd-video:before { + content: "\e187"; +} + +.glyphicon-subtitles:before { + content: "\e188"; +} + +.glyphicon-sound-stereo:before { + content: "\e189"; +} + +.glyphicon-sound-dolby:before { + content: "\e190"; +} + +.glyphicon-sound-5-1:before { + content: "\e191"; +} + +.glyphicon-sound-6-1:before { + content: "\e192"; +} + +.glyphicon-sound-7-1:before { + content: "\e193"; +} + +.glyphicon-copyright-mark:before { + content: "\e194"; +} + +.glyphicon-registration-mark:before { + content: "\e195"; +} + +.glyphicon-cloud-download:before { + content: "\e197"; +} + +.glyphicon-cloud-upload:before { + content: "\e198"; +} + +.glyphicon-tree-conifer:before { + content: "\e199"; +} + +.glyphicon-tree-deciduous:before { + content: "\e200"; +} + +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px solid; + border-right: 4px solid transparent; + border-left: 4px solid transparent; +} + +.dropdown { + position: relative; +} + +.dropdown-toggle:focus { + outline: 0; +} + +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + font-size: 14px; + list-style: none; + background-color: #ffffff; + border: 1px solid #cccccc; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 4px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + background-clip: padding-box; +} + +.dropdown-menu.pull-right { + right: 0; + left: auto; +} + +.dropdown-menu .divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} + +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.428571429; + color: #333333; + white-space: nowrap; +} + +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + color: #262626; + text-decoration: none; + background-color: #f5f5f5; +} + +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + color: #ffffff; + text-decoration: none; + background-color: #428bca; + outline: 0; +} + +.dropdown-menu > .disabled > a, +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + color: #999999; +} + +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + text-decoration: none; + cursor: not-allowed; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.open > .dropdown-menu { + display: block; +} + +.open > a { + outline: 0; +} + +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.428571429; + color: #999999; +} + +.dropdown-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 990; +} + +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} + +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + border-top: 0; + border-bottom: 4px solid; + content: ""; +} + +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 1px; +} + +@media (min-width: 768px) { + .navbar-right .dropdown-menu { + right: 0; + left: auto; + } +} + +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle; +} + +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + float: left; +} + +.btn-group > .btn:hover, +.btn-group-vertical > .btn:hover, +.btn-group > .btn:focus, +.btn-group-vertical > .btn:focus, +.btn-group > .btn:active, +.btn-group-vertical > .btn:active, +.btn-group > .btn.active, +.btn-group-vertical > .btn.active { + z-index: 2; +} + +.btn-group > .btn:focus, +.btn-group-vertical > .btn:focus { + outline: none; +} + +.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:before, +.btn-toolbar:after { + display: table; + content: " "; +} + +.btn-toolbar:after { + clear: both; +} + +.btn-toolbar:before, +.btn-toolbar:after { + display: table; + content: " "; +} + +.btn-toolbar:after { + clear: both; +} + +.btn-toolbar .btn-group { + float: left; +} + +.btn-toolbar > .btn + .btn, +.btn-toolbar > .btn-group + .btn, +.btn-toolbar > .btn + .btn-group, +.btn-toolbar > .btn-group + .btn-group { + margin-left: 5px; +} + +.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; +} + +.btn-group > .btn:first-child { + margin-left: 0; +} + +.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} + +.btn-group > .btn-group { + float: left; +} + +.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} + +.btn-group > .btn-group:first-child > .btn:last-child, +.btn-group > .btn-group:first-child > .dropdown-toggle { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.btn-group > .btn-group:last-child > .btn:first-child { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} + +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} + +.btn-group-xs > .btn { + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} + +.btn-group-sm > .btn { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} + +.btn-group-lg > .btn { + padding: 10px 16px; + font-size: 18px; + line-height: 1.33; + border-radius: 6px; +} + +.btn-group > .btn + .dropdown-toggle { + padding-right: 8px; + padding-left: 8px; +} + +.btn-group > .btn-lg + .dropdown-toggle { + padding-right: 12px; + padding-left: 12px; +} + +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} + +.btn-group.open .dropdown-toggle.btn-link { + -webkit-box-shadow: none; + box-shadow: none; +} + +.btn .caret { + margin-left: 0; +} + +.btn-lg .caret { + border-width: 5px 5px 0; + border-bottom-width: 0; +} + +.dropup .btn-lg .caret { + border-width: 0 5px 5px; +} + +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group, +.btn-group-vertical > .btn-group > .btn { + display: block; + float: none; + width: 100%; + max-width: 100%; +} + +.btn-group-vertical > .btn-group:before, +.btn-group-vertical > .btn-group:after { + display: table; + content: " "; +} + +.btn-group-vertical > .btn-group:after { + clear: both; +} + +.btn-group-vertical > .btn-group:before, +.btn-group-vertical > .btn-group:after { + display: table; + content: " "; +} + +.btn-group-vertical > .btn-group:after { + clear: both; +} + +.btn-group-vertical > .btn-group > .btn { + float: none; +} + +.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-vertical > .btn:not(:first-child):not(:last-child) { + border-radius: 0; +} + +.btn-group-vertical > .btn:first-child:not(:last-child) { + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} + +.btn-group-vertical > .btn:last-child:not(:first-child) { + border-top-right-radius: 0; + border-bottom-left-radius: 4px; + border-top-left-radius: 0; +} + +.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} + +.btn-group-vertical > .btn-group:first-child > .btn:last-child, +.btn-group-vertical > .btn-group:first-child > .dropdown-toggle { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} + +.btn-group-vertical > .btn-group:last-child > .btn:first-child { + border-top-right-radius: 0; + border-top-left-radius: 0; +} + +.btn-group-justified { + display: table; + width: 100%; + border-collapse: separate; + table-layout: fixed; +} + +.btn-group-justified > .btn, +.btn-group-justified > .btn-group { + display: table-cell; + float: none; + width: 1%; +} + +.btn-group-justified > .btn-group .btn { + width: 100%; +} + +[data-toggle="buttons"] > .btn > input[type="radio"], +[data-toggle="buttons"] > .btn > input[type="checkbox"] { + display: none; +} + +.input-group { + position: relative; + display: table; + border-collapse: separate; +} + +.input-group[class*="col-"] { + float: none; + padding-right: 0; + padding-left: 0; +} + +.input-group .form-control { + width: 100%; + margin-bottom: 0; +} + +.input-group-lg > .form-control, +.input-group-lg > .input-group-addon, +.input-group-lg > .input-group-btn > .btn { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.33; + border-radius: 6px; +} + +select.input-group-lg > .form-control, +select.input-group-lg > .input-group-addon, +select.input-group-lg > .input-group-btn > .btn { + height: 46px; + line-height: 46px; +} + +textarea.input-group-lg > .form-control, +textarea.input-group-lg > .input-group-addon, +textarea.input-group-lg > .input-group-btn > .btn { + height: auto; +} + +.input-group-sm > .form-control, +.input-group-sm > .input-group-addon, +.input-group-sm > .input-group-btn > .btn { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} + +select.input-group-sm > .form-control, +select.input-group-sm > .input-group-addon, +select.input-group-sm > .input-group-btn > .btn { + height: 30px; + line-height: 30px; +} + +textarea.input-group-sm > .form-control, +textarea.input-group-sm > .input-group-addon, +textarea.input-group-sm > .input-group-btn > .btn { + height: auto; +} + +.input-group-addon, +.input-group-btn, +.input-group .form-control { + display: table-cell; +} + +.input-group-addon:not(:first-child):not(:last-child), +.input-group-btn:not(:first-child):not(:last-child), +.input-group .form-control:not(:first-child):not(:last-child) { + border-radius: 0; +} + +.input-group-addon, +.input-group-btn { + width: 1%; + white-space: nowrap; + vertical-align: middle; +} + +.input-group-addon { + padding: 6px 12px; + font-size: 14px; + font-weight: normal; + line-height: 1; + color: #555555; + text-align: center; + background-color: #eeeeee; + border: 1px solid #cccccc; + border-radius: 4px; +} + +.input-group-addon.input-sm { + padding: 5px 10px; + font-size: 12px; + border-radius: 3px; +} + +.input-group-addon.input-lg { + padding: 10px 16px; + font-size: 18px; + border-radius: 6px; +} + +.input-group-addon input[type="radio"], +.input-group-addon input[type="checkbox"] { + margin-top: 0; +} + +.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.input-group-addon:first-child { + border-right: 0; +} + +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child) { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} + +.input-group-addon:last-child { + border-left: 0; +} + +.input-group-btn { + position: relative; + white-space: nowrap; +} + +.input-group-btn:first-child > .btn { + margin-right: -1px; +} + +.input-group-btn:last-child > .btn { + margin-left: -1px; +} + +.input-group-btn > .btn { + position: relative; +} + +.input-group-btn > .btn + .btn { + margin-left: -4px; +} + +.input-group-btn > .btn:hover, +.input-group-btn > .btn:active { + z-index: 2; +} + +.nav { + padding-left: 0; + margin-bottom: 0; + list-style: none; +} + +.nav:before, +.nav:after { + display: table; + content: " "; +} + +.nav:after { + clear: both; +} + +.nav:before, +.nav:after { + display: table; + content: " "; +} + +.nav:after { + clear: both; +} + +.nav > li { + position: relative; + display: block; +} + +.nav > li > a { + position: relative; + display: block; + padding: 10px 15px; +} + +.nav > li > a:hover, +.nav > li > a:focus { + text-decoration: none; + background-color: #eeeeee; +} + +.nav > li.disabled > a { + color: #999999; +} + +.nav > li.disabled > a:hover, +.nav > li.disabled > a:focus { + color: #999999; + text-decoration: none; + cursor: not-allowed; + background-color: transparent; +} + +.nav .open > a, +.nav .open > a:hover, +.nav .open > a:focus { + background-color: #eeeeee; + border-color: #428bca; +} + +.nav .nav-divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} + +.nav > li > a > img { + max-width: none; +} + +.nav-tabs { + border-bottom: 1px solid #dddddd; +} + +.nav-tabs > li { + float: left; + margin-bottom: -1px; +} + +.nav-tabs > li > a { + margin-right: 2px; + line-height: 1.428571429; + border: 1px solid transparent; + border-radius: 4px 4px 0 0; +} + +.nav-tabs > li > a:hover { + border-color: #eeeeee #eeeeee #dddddd; +} + +.nav-tabs > li.active > a, +.nav-tabs > li.active > a:hover, +.nav-tabs > li.active > a:focus { + color: #555555; + cursor: default; + background-color: #ffffff; + border: 1px solid #dddddd; + border-bottom-color: transparent; +} + +.nav-tabs.nav-justified { + width: 100%; + border-bottom: 0; +} + +.nav-tabs.nav-justified > li { + float: none; +} + +.nav-tabs.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; +} + +.nav-tabs.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} + +@media (min-width: 768px) { + .nav-tabs.nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-tabs.nav-justified > li > a { + margin-bottom: 0; + } +} + +.nav-tabs.nav-justified > li > a { + margin-right: 0; + border-radius: 4px; +} + +.nav-tabs.nav-justified > .active > a, +.nav-tabs.nav-justified > .active > a:hover, +.nav-tabs.nav-justified > .active > a:focus { + border: 1px solid #dddddd; +} + +@media (min-width: 768px) { + .nav-tabs.nav-justified > li > a { + border-bottom: 1px solid #dddddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs.nav-justified > .active > a, + .nav-tabs.nav-justified > .active > a:hover, + .nav-tabs.nav-justified > .active > a:focus { + border-bottom-color: #ffffff; + } +} + +.nav-pills > li { + float: left; +} + +.nav-pills > li > a { + border-radius: 4px; +} + +.nav-pills > li + li { + margin-left: 2px; +} + +.nav-pills > li.active > a, +.nav-pills > li.active > a:hover, +.nav-pills > li.active > a:focus { + color: #ffffff; + background-color: #428bca; +} + +.nav-stacked > li { + float: none; +} + +.nav-stacked > li + li { + margin-top: 2px; + margin-left: 0; +} + +.nav-justified { + width: 100%; +} + +.nav-justified > li { + float: none; +} + +.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; +} + +.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} + +@media (min-width: 768px) { + .nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-justified > li > a { + margin-bottom: 0; + } +} + +.nav-tabs-justified { + border-bottom: 0; +} + +.nav-tabs-justified > li > a { + margin-right: 0; + border-radius: 4px; +} + +.nav-tabs-justified > .active > a, +.nav-tabs-justified > .active > a:hover, +.nav-tabs-justified > .active > a:focus { + border: 1px solid #dddddd; +} + +@media (min-width: 768px) { + .nav-tabs-justified > li > a { + border-bottom: 1px solid #dddddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs-justified > .active > a, + .nav-tabs-justified > .active > a:hover, + .nav-tabs-justified > .active > a:focus { + border-bottom-color: #ffffff; + } +} + +.tab-content > .tab-pane { + display: none; +} + +.tab-content > .active { + display: block; +} + +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-right-radius: 0; + border-top-left-radius: 0; +} + +.navbar { + position: relative; + min-height: 50px; + margin-bottom: 20px; + border: 1px solid transparent; +} + +.navbar:before, +.navbar:after { + display: table; + content: " "; +} + +.navbar:after { + clear: both; +} + +.navbar:before, +.navbar:after { + display: table; + content: " "; +} + +.navbar:after { + clear: both; +} + +@media (min-width: 768px) { + .navbar { + border-radius: 4px; + } +} + +.navbar-header:before, +.navbar-header:after { + display: table; + content: " "; +} + +.navbar-header:after { + clear: both; +} + +.navbar-header:before, +.navbar-header:after { + display: table; + content: " "; +} + +.navbar-header:after { + clear: both; +} + +@media (min-width: 768px) { + .navbar-header { + float: left; + } +} + +.navbar-collapse { + max-height: 340px; + padding-right: 15px; + padding-left: 15px; + overflow-x: visible; + border-top: 1px solid transparent; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); + -webkit-overflow-scrolling: touch; +} + +.navbar-collapse:before, +.navbar-collapse:after { + display: table; + content: " "; +} + +.navbar-collapse:after { + clear: both; +} + +.navbar-collapse:before, +.navbar-collapse:after { + display: table; + content: " "; +} + +.navbar-collapse:after { + clear: both; +} + +.navbar-collapse.in { + overflow-y: auto; +} + +@media (min-width: 768px) { + .navbar-collapse { + width: auto; + border-top: 0; + box-shadow: none; + } + .navbar-collapse.collapse { + display: block !important; + height: auto !important; + padding-bottom: 0; + overflow: visible !important; + } + .navbar-collapse.in { + overflow-y: visible; + } + .navbar-fixed-top .navbar-collapse, + .navbar-static-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + padding-right: 0; + padding-left: 0; + } +} + +.container > .navbar-header, +.container > .navbar-collapse { + margin-right: -15px; + margin-left: -15px; +} + +@media (min-width: 768px) { + .container > .navbar-header, + .container > .navbar-collapse { + margin-right: 0; + margin-left: 0; + } +} + +.navbar-static-top { + z-index: 1000; + border-width: 0 0 1px; +} + +@media (min-width: 768px) { + .navbar-static-top { + border-radius: 0; + } +} + +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; +} + +@media (min-width: 768px) { + .navbar-fixed-top, + .navbar-fixed-bottom { + border-radius: 0; + } +} + +.navbar-fixed-top { + top: 0; + border-width: 0 0 1px; +} + +.navbar-fixed-bottom { + bottom: 0; + margin-bottom: 0; + border-width: 1px 0 0; +} + +.navbar-brand { + float: left; + padding: 15px 15px; + font-size: 18px; + line-height: 20px; +} + +.navbar-brand:hover, +.navbar-brand:focus { + text-decoration: none; +} + +@media (min-width: 768px) { + .navbar > .container .navbar-brand { + margin-left: -15px; + } +} + +.navbar-toggle { + position: relative; + float: right; + padding: 9px 10px; + margin-top: 8px; + margin-right: 15px; + margin-bottom: 8px; + background-color: transparent; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} + +.navbar-toggle .icon-bar { + display: block; + width: 22px; + height: 2px; + border-radius: 1px; +} + +.navbar-toggle .icon-bar + .icon-bar { + margin-top: 4px; +} + +@media (min-width: 768px) { + .navbar-toggle { + display: none; + } +} + +.navbar-nav { + margin: 7.5px -15px; +} + +.navbar-nav > li > a { + padding-top: 10px; + padding-bottom: 10px; + line-height: 20px; +} + +@media (max-width: 767px) { + .navbar-nav .open .dropdown-menu { + position: static; + float: none; + width: auto; + margin-top: 0; + background-color: transparent; + border: 0; + box-shadow: none; + } + .navbar-nav .open .dropdown-menu > li > a, + .navbar-nav .open .dropdown-menu .dropdown-header { + padding: 5px 15px 5px 25px; + } + .navbar-nav .open .dropdown-menu > li > a { + line-height: 20px; + } + .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-nav .open .dropdown-menu > li > a:focus { + background-image: none; + } +} + +@media (min-width: 768px) { + .navbar-nav { + float: left; + margin: 0; + } + .navbar-nav > li { + float: left; + } + .navbar-nav > li > a { + padding-top: 15px; + padding-bottom: 15px; + } + .navbar-nav.navbar-right:last-child { + margin-right: -15px; + } +} + +@media (min-width: 768px) { + .navbar-left { + float: left !important; + } + .navbar-right { + float: right !important; + } +} + +.navbar-form { + padding: 10px 15px; + margin-top: 8px; + margin-right: -15px; + margin-bottom: 8px; + margin-left: -15px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); +} + +@media (min-width: 768px) { + .navbar-form .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .form-control { + display: inline-block; + } + .navbar-form select.form-control { + width: auto; + } + .navbar-form .radio, + .navbar-form .checkbox { + display: inline-block; + padding-left: 0; + margin-top: 0; + margin-bottom: 0; + } + .navbar-form .radio input[type="radio"], + .navbar-form .checkbox input[type="checkbox"] { + float: none; + margin-left: 0; + } +} + +@media (max-width: 767px) { + .navbar-form .form-group { + margin-bottom: 5px; + } +} + +@media (min-width: 768px) { + .navbar-form { + width: auto; + padding-top: 0; + padding-bottom: 0; + margin-right: 0; + margin-left: 0; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-form.navbar-right:last-child { + margin-right: -15px; + } +} + +.navbar-nav > li > .dropdown-menu { + margin-top: 0; + border-top-right-radius: 0; + border-top-left-radius: 0; +} + +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} + +.navbar-nav.pull-right > li > .dropdown-menu, +.navbar-nav > li > .dropdown-menu.pull-right { + right: 0; + left: auto; +} + +.navbar-btn { + margin-top: 8px; + margin-bottom: 8px; +} + +.navbar-btn.btn-sm { + margin-top: 10px; + margin-bottom: 10px; +} + +.navbar-btn.btn-xs { + margin-top: 14px; + margin-bottom: 14px; +} + +.navbar-text { + margin-top: 15px; + margin-bottom: 15px; +} + +@media (min-width: 768px) { + .navbar-text { + float: left; + margin-right: 15px; + margin-left: 15px; + } + .navbar-text.navbar-right:last-child { + margin-right: 0; + } +} + +.navbar-default { + background-color: #f8f8f8; + border-color: #e7e7e7; +} + +.navbar-default .navbar-brand { + color: #777777; +} + +.navbar-default .navbar-brand:hover, +.navbar-default .navbar-brand:focus { + color: #5e5e5e; + background-color: transparent; +} + +.navbar-default .navbar-text { + color: #777777; +} + +.navbar-default .navbar-nav > li > a { + color: #777777; +} + +.navbar-default .navbar-nav > li > a:hover, +.navbar-default .navbar-nav > li > a:focus { + color: #333333; + background-color: transparent; +} + +.navbar-default .navbar-nav > .active > a, +.navbar-default .navbar-nav > .active > a:hover, +.navbar-default .navbar-nav > .active > a:focus { + color: #555555; + background-color: #e7e7e7; +} + +.navbar-default .navbar-nav > .disabled > a, +.navbar-default .navbar-nav > .disabled > a:hover, +.navbar-default .navbar-nav > .disabled > a:focus { + color: #cccccc; + background-color: transparent; +} + +.navbar-default .navbar-toggle { + border-color: #dddddd; +} + +.navbar-default .navbar-toggle:hover, +.navbar-default .navbar-toggle:focus { + background-color: #dddddd; +} + +.navbar-default .navbar-toggle .icon-bar { + background-color: #cccccc; +} + +.navbar-default .navbar-collapse, +.navbar-default .navbar-form { + border-color: #e7e7e7; +} + +.navbar-default .navbar-nav > .open > a, +.navbar-default .navbar-nav > .open > a:hover, +.navbar-default .navbar-nav > .open > a:focus { + color: #555555; + background-color: #e7e7e7; +} + +@media (max-width: 767px) { + .navbar-default .navbar-nav .open .dropdown-menu > li > a { + color: #777777; + } + .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { + color: #333333; + background-color: transparent; + } + .navbar-default .navbar-nav .open .dropdown-menu > .active > a, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #555555; + background-color: #e7e7e7; + } + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #cccccc; + background-color: transparent; + } +} + +.navbar-default .navbar-link { + color: #777777; +} + +.navbar-default .navbar-link:hover { + color: #333333; +} + +.navbar-inverse { + background-color: #222222; + border-color: #080808; +} + +.navbar-inverse .navbar-brand { + color: #999999; +} + +.navbar-inverse .navbar-brand:hover, +.navbar-inverse .navbar-brand:focus { + color: #ffffff; + background-color: transparent; +} + +.navbar-inverse .navbar-text { + color: #999999; +} + +.navbar-inverse .navbar-nav > li > a { + color: #999999; +} + +.navbar-inverse .navbar-nav > li > a:hover, +.navbar-inverse .navbar-nav > li > a:focus { + color: #ffffff; + background-color: transparent; +} + +.navbar-inverse .navbar-nav > .active > a, +.navbar-inverse .navbar-nav > .active > a:hover, +.navbar-inverse .navbar-nav > .active > a:focus { + color: #ffffff; + background-color: #080808; +} + +.navbar-inverse .navbar-nav > .disabled > a, +.navbar-inverse .navbar-nav > .disabled > a:hover, +.navbar-inverse .navbar-nav > .disabled > a:focus { + color: #444444; + background-color: transparent; +} + +.navbar-inverse .navbar-toggle { + border-color: #333333; +} + +.navbar-inverse .navbar-toggle:hover, +.navbar-inverse .navbar-toggle:focus { + background-color: #333333; +} + +.navbar-inverse .navbar-toggle .icon-bar { + background-color: #ffffff; +} + +.navbar-inverse .navbar-collapse, +.navbar-inverse .navbar-form { + border-color: #101010; +} + +.navbar-inverse .navbar-nav > .open > a, +.navbar-inverse .navbar-nav > .open > a:hover, +.navbar-inverse .navbar-nav > .open > a:focus { + color: #ffffff; + background-color: #080808; +} + +@media (max-width: 767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { + border-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu .divider { + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { + color: #999999; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { + color: #ffffff; + background-color: transparent; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #ffffff; + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #444444; + background-color: transparent; + } +} + +.navbar-inverse .navbar-link { + color: #999999; +} + +.navbar-inverse .navbar-link:hover { + color: #ffffff; +} + +.breadcrumb { + padding: 8px 15px; + margin-bottom: 20px; + list-style: none; + background-color: #f5f5f5; + border-radius: 4px; +} + +.breadcrumb > li { + display: inline-block; +} + +.breadcrumb > li + li:before { + padding: 0 5px; + color: #cccccc; + content: "/\00a0"; +} + +.breadcrumb > .active { + color: #999999; +} + +.pagination { + display: inline-block; + padding-left: 0; + margin: 20px 0; + border-radius: 4px; +} + +.pagination > li { + display: inline; +} + +.pagination > li > a, +.pagination > li > span { + position: relative; + float: left; + padding: 6px 12px; + margin-left: -1px; + line-height: 1.428571429; + text-decoration: none; + background-color: #ffffff; + border: 1px solid #dddddd; +} + +.pagination > li:first-child > a, +.pagination > li:first-child > span { + margin-left: 0; + border-bottom-left-radius: 4px; + border-top-left-radius: 4px; +} + +.pagination > li:last-child > a, +.pagination > li:last-child > span { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; +} + +.pagination > li > a:hover, +.pagination > li > span:hover, +.pagination > li > a:focus, +.pagination > li > span:focus { + background-color: #eeeeee; +} + +.pagination > .active > a, +.pagination > .active > span, +.pagination > .active > a:hover, +.pagination > .active > span:hover, +.pagination > .active > a:focus, +.pagination > .active > span:focus { + z-index: 2; + color: #ffffff; + cursor: default; + background-color: #428bca; + border-color: #428bca; +} + +.pagination > .disabled > span, +.pagination > .disabled > span:hover, +.pagination > .disabled > span:focus, +.pagination > .disabled > a, +.pagination > .disabled > a:hover, +.pagination > .disabled > a:focus { + color: #999999; + cursor: not-allowed; + background-color: #ffffff; + border-color: #dddddd; +} + +.pagination-lg > li > a, +.pagination-lg > li > span { + padding: 10px 16px; + font-size: 18px; +} + +.pagination-lg > li:first-child > a, +.pagination-lg > li:first-child > span { + border-bottom-left-radius: 6px; + border-top-left-radius: 6px; +} + +.pagination-lg > li:last-child > a, +.pagination-lg > li:last-child > span { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; +} + +.pagination-sm > li > a, +.pagination-sm > li > span { + padding: 5px 10px; + font-size: 12px; +} + +.pagination-sm > li:first-child > a, +.pagination-sm > li:first-child > span { + border-bottom-left-radius: 3px; + border-top-left-radius: 3px; +} + +.pagination-sm > li:last-child > a, +.pagination-sm > li:last-child > span { + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} + +.pager { + padding-left: 0; + margin: 20px 0; + text-align: center; + list-style: none; +} + +.pager:before, +.pager:after { + display: table; + content: " "; +} + +.pager:after { + clear: both; +} + +.pager:before, +.pager:after { + display: table; + content: " "; +} + +.pager:after { + clear: both; +} + +.pager li { + display: inline; +} + +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #ffffff; + border: 1px solid #dddddd; + border-radius: 15px; +} + +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: #eeeeee; +} + +.pager .next > a, +.pager .next > span { + float: right; +} + +.pager .previous > a, +.pager .previous > span { + float: left; +} + +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #999999; + cursor: not-allowed; + background-color: #ffffff; +} + +.label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: #ffffff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; +} + +.label[href]:hover, +.label[href]:focus { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} + +.label:empty { + display: none; +} + +.btn .label { + position: relative; + top: -1px; +} + +.label-default { + background-color: #999999; +} + +.label-default[href]:hover, +.label-default[href]:focus { + background-color: #808080; +} + +.label-primary { + background-color: #428bca; +} + +.label-primary[href]:hover, +.label-primary[href]:focus { + background-color: #3071a9; +} + +.label-success { + background-color: #5cb85c; +} + +.label-success[href]:hover, +.label-success[href]:focus { + background-color: #449d44; +} + +.label-info { + background-color: #5bc0de; +} + +.label-info[href]:hover, +.label-info[href]:focus { + background-color: #31b0d5; +} + +.label-warning { + background-color: #f0ad4e; +} + +.label-warning[href]:hover, +.label-warning[href]:focus { + background-color: #ec971f; +} + +.label-danger { + background-color: #d9534f; +} + +.label-danger[href]:hover, +.label-danger[href]:focus { + background-color: #c9302c; +} + +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: 12px; + font-weight: bold; + line-height: 1; + color: #ffffff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + background-color: #999999; + border-radius: 10px; +} + +.badge:empty { + display: none; +} + +.btn .badge { + position: relative; + top: -1px; +} + +a.badge:hover, +a.badge:focus { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} + +a.list-group-item.active > .badge, +.nav-pills > .active > a > .badge { + color: #428bca; + background-color: #ffffff; +} + +.nav-pills > li > a > .badge { + margin-left: 3px; +} + +.jumbotron { + padding: 30px; + margin-bottom: 30px; + font-size: 21px; + font-weight: 200; + line-height: 2.1428571435; + color: inherit; + background-color: #eeeeee; +} + +.jumbotron h1, +.jumbotron .h1 { + line-height: 1; + color: inherit; +} + +.jumbotron p { + line-height: 1.4; +} + +.container .jumbotron { + border-radius: 6px; +} + +.jumbotron .container { + max-width: 100%; +} + +@media screen and (min-width: 768px) { + .jumbotron { + padding-top: 48px; + padding-bottom: 48px; + } + .container .jumbotron { + padding-right: 60px; + padding-left: 60px; + } + .jumbotron h1, + .jumbotron .h1 { + font-size: 63px; + } +} + +.thumbnail { + display: block; + padding: 4px; + margin-bottom: 20px; + line-height: 1.428571429; + background-color: #ffffff; + border: 1px solid #dddddd; + border-radius: 4px; + -webkit-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} + +.thumbnail > img, +.thumbnail a > img { + display: block; + height: auto; + max-width: 100%; + margin-right: auto; + margin-left: auto; +} + +a.thumbnail:hover, +a.thumbnail:focus, +a.thumbnail.active { + border-color: #428bca; +} + +.thumbnail .caption { + padding: 9px; + color: #333333; +} + +.alert { + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 4px; +} + +.alert h4 { + margin-top: 0; + color: inherit; +} + +.alert .alert-link { + font-weight: bold; +} + +.alert > p, +.alert > ul { + margin-bottom: 0; +} + +.alert > p + p { + margin-top: 5px; +} + +.alert-dismissable { + padding-right: 35px; +} + +.alert-dismissable .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; +} + +.alert-success { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} + +.alert-success hr { + border-top-color: #c9e2b3; +} + +.alert-success .alert-link { + color: #2b542c; +} + +.alert-info { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} + +.alert-info hr { + border-top-color: #a6e1ec; +} + +.alert-info .alert-link { + color: #245269; +} + +.alert-warning { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} + +.alert-warning hr { + border-top-color: #f7e1b5; +} + +.alert-warning .alert-link { + color: #66512c; +} + +.alert-danger { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} + +.alert-danger hr { + border-top-color: #e4b9c0; +} + +.alert-danger .alert-link { + color: #843534; +} + +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +.progress { + height: 20px; + margin-bottom: 20px; + overflow: hidden; + background-color: #f5f5f5; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); +} + +.progress-bar { + float: left; + width: 0; + height: 100%; + font-size: 12px; + line-height: 20px; + color: #ffffff; + text-align: center; + background-color: #428bca; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-transition: width 0.6s ease; + transition: width 0.6s ease; +} + +.progress-striped .progress-bar { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-size: 40px 40px; +} + +.progress.active .progress-bar { + -webkit-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} + +.progress-bar-success { + background-color: #5cb85c; +} + +.progress-striped .progress-bar-success { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-bar-info { + background-color: #5bc0de; +} + +.progress-striped .progress-bar-info { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-bar-warning { + background-color: #f0ad4e; +} + +.progress-striped .progress-bar-warning { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-bar-danger { + background-color: #d9534f; +} + +.progress-striped .progress-bar-danger { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.media, +.media-body { + overflow: hidden; + zoom: 1; +} + +.media, +.media .media { + margin-top: 15px; +} + +.media:first-child { + margin-top: 0; +} + +.media-object { + display: block; +} + +.media-heading { + margin: 0 0 5px; +} + +.media > .pull-left { + margin-right: 10px; +} + +.media > .pull-right { + margin-left: 10px; +} + +.media-list { + padding-left: 0; + list-style: none; +} + +.list-group { + padding-left: 0; + margin-bottom: 20px; +} + +.list-group-item { + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: #ffffff; + border: 1px solid #dddddd; +} + +.list-group-item:first-child { + border-top-right-radius: 4px; + border-top-left-radius: 4px; +} + +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} + +.list-group-item > .badge { + float: right; +} + +.list-group-item > .badge + .badge { + margin-right: 5px; +} + +a.list-group-item { + color: #555555; +} + +a.list-group-item .list-group-item-heading { + color: #333333; +} + +a.list-group-item:hover, +a.list-group-item:focus { + text-decoration: none; + background-color: #f5f5f5; +} + +a.list-group-item.active, +a.list-group-item.active:hover, +a.list-group-item.active:focus { + z-index: 2; + color: #ffffff; + background-color: #428bca; + border-color: #428bca; +} + +a.list-group-item.active .list-group-item-heading, +a.list-group-item.active:hover .list-group-item-heading, +a.list-group-item.active:focus .list-group-item-heading { + color: inherit; +} + +a.list-group-item.active .list-group-item-text, +a.list-group-item.active:hover .list-group-item-text, +a.list-group-item.active:focus .list-group-item-text { + color: #e1edf7; +} + +.list-group-item-heading { + margin-top: 0; + margin-bottom: 5px; +} + +.list-group-item-text { + margin-bottom: 0; + line-height: 1.3; +} + +.panel { + margin-bottom: 20px; + background-color: #ffffff; + border: 1px solid transparent; + border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); +} + +.panel-body { + padding: 15px; +} + +.panel-body:before, +.panel-body:after { + display: table; + content: " "; +} + +.panel-body:after { + clear: both; +} + +.panel-body:before, +.panel-body:after { + display: table; + content: " "; +} + +.panel-body:after { + clear: both; +} + +.panel > .list-group { + margin-bottom: 0; +} + +.panel > .list-group .list-group-item { + border-width: 1px 0; +} + +.panel > .list-group .list-group-item:first-child { + border-top-right-radius: 0; + border-top-left-radius: 0; +} + +.panel > .list-group .list-group-item:last-child { + border-bottom: 0; +} + +.panel-heading + .list-group .list-group-item:first-child { + border-top-width: 0; +} + +.panel > .table, +.panel > .table-responsive > .table { + margin-bottom: 0; +} + +.panel > .panel-body + .table, +.panel > .panel-body + .table-responsive { + border-top: 1px solid #dddddd; +} + +.panel > .table > tbody:first-child th, +.panel > .table > tbody:first-child td { + border-top: 0; +} + +.panel > .table-bordered, +.panel > .table-responsive > .table-bordered { + border: 0; +} + +.panel > .table-bordered > thead > tr > th:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, +.panel > .table-bordered > tbody > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, +.panel > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-bordered > thead > tr > td:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, +.panel > .table-bordered > tbody > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, +.panel > .table-bordered > tfoot > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; +} + +.panel > .table-bordered > thead > tr > th:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, +.panel > .table-bordered > tbody > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, +.panel > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-bordered > thead > tr > td:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, +.panel > .table-bordered > tbody > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, +.panel > .table-bordered > tfoot > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; +} + +.panel > .table-bordered > thead > tr:last-child > th, +.panel > .table-responsive > .table-bordered > thead > tr:last-child > th, +.panel > .table-bordered > tbody > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, +.panel > .table-bordered > tfoot > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th, +.panel > .table-bordered > thead > tr:last-child > td, +.panel > .table-responsive > .table-bordered > thead > tr:last-child > td, +.panel > .table-bordered > tbody > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, +.panel > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; +} + +.panel > .table-responsive { + margin-bottom: 0; + border: 0; +} + +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-right-radius: 3px; + border-top-left-radius: 3px; +} + +.panel-heading > .dropdown .dropdown-toggle { + color: inherit; +} + +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 16px; + color: inherit; +} + +.panel-title > a { + color: inherit; +} + +.panel-footer { + padding: 10px 15px; + background-color: #f5f5f5; + border-top: 1px solid #dddddd; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} + +.panel-group .panel { + margin-bottom: 0; + overflow: hidden; + border-radius: 4px; +} + +.panel-group .panel + .panel { + margin-top: 5px; +} + +.panel-group .panel-heading { + border-bottom: 0; +} + +.panel-group .panel-heading + .panel-collapse .panel-body { + border-top: 1px solid #dddddd; +} + +.panel-group .panel-footer { + border-top: 0; +} + +.panel-group .panel-footer + .panel-collapse .panel-body { + border-bottom: 1px solid #dddddd; +} + +.panel-default { + border-color: #dddddd; +} + +.panel-default > .panel-heading { + color: #333333; + background-color: #f5f5f5; + border-color: #dddddd; +} + +.panel-default > .panel-heading + .panel-collapse .panel-body { + border-top-color: #dddddd; +} + +.panel-default > .panel-footer + .panel-collapse .panel-body { + border-bottom-color: #dddddd; +} + +.panel-primary { + border-color: #428bca; +} + +.panel-primary > .panel-heading { + color: #ffffff; + background-color: #428bca; + border-color: #428bca; +} + +.panel-primary > .panel-heading + .panel-collapse .panel-body { + border-top-color: #428bca; +} + +.panel-primary > .panel-footer + .panel-collapse .panel-body { + border-bottom-color: #428bca; +} + +.panel-success { + border-color: #d6e9c6; +} + +.panel-success > .panel-heading { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} + +.panel-success > .panel-heading + .panel-collapse .panel-body { + border-top-color: #d6e9c6; +} + +.panel-success > .panel-footer + .panel-collapse .panel-body { + border-bottom-color: #d6e9c6; +} + +.panel-warning { + border-color: #faebcc; +} + +.panel-warning > .panel-heading { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} + +.panel-warning > .panel-heading + .panel-collapse .panel-body { + border-top-color: #faebcc; +} + +.panel-warning > .panel-footer + .panel-collapse .panel-body { + border-bottom-color: #faebcc; +} + +.panel-danger { + border-color: #ebccd1; +} + +.panel-danger > .panel-heading { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} + +.panel-danger > .panel-heading + .panel-collapse .panel-body { + border-top-color: #ebccd1; +} + +.panel-danger > .panel-footer + .panel-collapse .panel-body { + border-bottom-color: #ebccd1; +} + +.panel-info { + border-color: #bce8f1; +} + +.panel-info > .panel-heading { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} + +.panel-info > .panel-heading + .panel-collapse .panel-body { + border-top-color: #bce8f1; +} + +.panel-info > .panel-footer + .panel-collapse .panel-body { + border-bottom-color: #bce8f1; +} + +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); +} + +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, 0.15); +} + +.well-lg { + padding: 24px; + border-radius: 6px; +} + +.well-sm { + padding: 9px; + border-radius: 3px; +} + +.close { + float: right; + font-size: 21px; + font-weight: bold; + line-height: 1; + color: #000000; + text-shadow: 0 1px 0 #ffffff; + opacity: 0.2; + filter: alpha(opacity=20); +} + +.close:hover, +.close:focus { + color: #000000; + text-decoration: none; + cursor: pointer; + opacity: 0.5; + filter: alpha(opacity=50); +} + +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} + +.modal-open { + overflow: hidden; +} + +.modal { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + display: none; + overflow: auto; + overflow-y: scroll; +} + +.modal.fade .modal-dialog { + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + transform: translate(0, -25%); + -webkit-transition: -webkit-transform 0.3s ease-out; + -moz-transition: -moz-transform 0.3s ease-out; + -o-transition: -o-transform 0.3s ease-out; + transition: transform 0.3s ease-out; +} + +.modal.in .modal-dialog { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + transform: translate(0, 0); +} + +.modal-dialog { + position: relative; + z-index: 1050; + width: auto; + margin: 10px; +} + +.modal-content { + position: relative; + background-color: #ffffff; + border: 1px solid #999999; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 6px; + outline: none; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + background-clip: padding-box; +} + +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1030; + background-color: #000000; +} + +.modal-backdrop.fade { + opacity: 0; + filter: alpha(opacity=0); +} + +.modal-backdrop.in { + opacity: 0.5; + filter: alpha(opacity=50); +} + +.modal-header { + min-height: 16.428571429px; + padding: 15px; + border-bottom: 1px solid #e5e5e5; +} + +.modal-header .close { + margin-top: -2px; +} + +.modal-title { + margin: 0; + line-height: 1.428571429; +} + +.modal-body { + position: relative; + padding: 20px; +} + +.modal-footer { + padding: 19px 20px 20px; + margin-top: 15px; + text-align: right; + border-top: 1px solid #e5e5e5; +} + +.modal-footer:before, +.modal-footer:after { + display: table; + content: " "; +} + +.modal-footer:after { + clear: both; +} + +.modal-footer:before, +.modal-footer:after { + display: table; + content: " "; +} + +.modal-footer:after { + clear: both; +} + +.modal-footer .btn + .btn { + margin-bottom: 0; + margin-left: 5px; +} + +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} + +.modal-footer .btn-block + .btn-block { + margin-left: 0; +} + +@media screen and (min-width: 768px) { + .modal-dialog { + width: 600px; + margin: 30px auto; + } + .modal-content { + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); + } +} + +.tooltip { + position: absolute; + z-index: 1030; + display: block; + font-size: 12px; + line-height: 1.4; + opacity: 0; + filter: alpha(opacity=0); + visibility: visible; +} + +.tooltip.in { + opacity: 0.9; + filter: alpha(opacity=90); +} + +.tooltip.top { + padding: 5px 0; + margin-top: -3px; +} + +.tooltip.right { + padding: 0 5px; + margin-left: 3px; +} + +.tooltip.bottom { + padding: 5px 0; + margin-top: 3px; +} + +.tooltip.left { + padding: 0 5px; + margin-left: -3px; +} + +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #ffffff; + text-align: center; + text-decoration: none; + background-color: #000000; + border-radius: 4px; +} + +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} + +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-top-color: #000000; + border-width: 5px 5px 0; +} + +.tooltip.top-left .tooltip-arrow { + bottom: 0; + left: 5px; + border-top-color: #000000; + border-width: 5px 5px 0; +} + +.tooltip.top-right .tooltip-arrow { + right: 5px; + bottom: 0; + border-top-color: #000000; + border-width: 5px 5px 0; +} + +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-right-color: #000000; + border-width: 5px 5px 5px 0; +} + +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-left-color: #000000; + border-width: 5px 0 5px 5px; +} + +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-bottom-color: #000000; + border-width: 0 5px 5px; +} + +.tooltip.bottom-left .tooltip-arrow { + top: 0; + left: 5px; + border-bottom-color: #000000; + border-width: 0 5px 5px; +} + +.tooltip.bottom-right .tooltip-arrow { + top: 0; + right: 5px; + border-bottom-color: #000000; + border-width: 0 5px 5px; +} + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1010; + display: none; + max-width: 276px; + padding: 1px; + text-align: left; + white-space: normal; + background-color: #ffffff; + border: 1px solid #cccccc; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + background-clip: padding-box; +} + +.popover.top { + margin-top: -10px; +} + +.popover.right { + margin-left: 10px; +} + +.popover.bottom { + margin-top: 10px; +} + +.popover.left { + margin-left: -10px; +} + +.popover-title { + padding: 8px 14px; + margin: 0; + font-size: 14px; + font-weight: normal; + line-height: 18px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-radius: 5px 5px 0 0; +} + +.popover-content { + padding: 9px 14px; +} + +.popover .arrow, +.popover .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} + +.popover .arrow { + border-width: 11px; +} + +.popover .arrow:after { + border-width: 10px; + content: ""; +} + +.popover.top .arrow { + bottom: -11px; + left: 50%; + margin-left: -11px; + border-top-color: #999999; + border-top-color: rgba(0, 0, 0, 0.25); + border-bottom-width: 0; +} + +.popover.top .arrow:after { + bottom: 1px; + margin-left: -10px; + border-top-color: #ffffff; + border-bottom-width: 0; + content: " "; +} + +.popover.right .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-right-color: #999999; + border-right-color: rgba(0, 0, 0, 0.25); + border-left-width: 0; +} + +.popover.right .arrow:after { + bottom: -10px; + left: 1px; + border-right-color: #ffffff; + border-left-width: 0; + content: " "; +} + +.popover.bottom .arrow { + top: -11px; + left: 50%; + margin-left: -11px; + border-bottom-color: #999999; + border-bottom-color: rgba(0, 0, 0, 0.25); + border-top-width: 0; +} + +.popover.bottom .arrow:after { + top: 1px; + margin-left: -10px; + border-bottom-color: #ffffff; + border-top-width: 0; + content: " "; +} + +.popover.left .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-left-color: #999999; + border-left-color: rgba(0, 0, 0, 0.25); + border-right-width: 0; +} + +.popover.left .arrow:after { + right: 1px; + bottom: -10px; + border-left-color: #ffffff; + border-right-width: 0; + content: " "; +} + +.carousel { + position: relative; +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} + +.carousel-inner > .item { + position: relative; + display: none; + -webkit-transition: 0.6s ease-in-out left; + transition: 0.6s ease-in-out left; +} + +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + display: block; + height: auto; + max-width: 100%; + line-height: 1; +} + +.carousel-inner > .active, +.carousel-inner > .next, +.carousel-inner > .prev { + display: block; +} + +.carousel-inner > .active { + left: 0; +} + +.carousel-inner > .next, +.carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; +} + +.carousel-inner > .next { + left: 100%; +} + +.carousel-inner > .prev { + left: -100%; +} + +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + left: 0; +} + +.carousel-inner > .active.left { + left: -100%; +} + +.carousel-inner > .active.right { + left: 100%; +} + +.carousel-control { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 15%; + font-size: 20px; + color: #ffffff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); + opacity: 0.5; + filter: alpha(opacity=50); +} + +.carousel-control.left { + background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.5) 0), color-stop(rgba(0, 0, 0, 0.0001) 100%)); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0, rgba(0, 0, 0, 0.0001) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); +} + +.carousel-control.right { + right: 0; + left: auto; + background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.0001) 0), color-stop(rgba(0, 0, 0, 0.5) 100%)); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0, rgba(0, 0, 0, 0.5) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); +} + +.carousel-control:hover, +.carousel-control:focus { + color: #ffffff; + text-decoration: none; + outline: none; + opacity: 0.9; + filter: alpha(opacity=90); +} + +.carousel-control .icon-prev, +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-left, +.carousel-control .glyphicon-chevron-right { + position: absolute; + top: 50%; + z-index: 5; + display: inline-block; +} + +.carousel-control .icon-prev, +.carousel-control .glyphicon-chevron-left { + left: 50%; +} + +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-right { + right: 50%; +} + +.carousel-control .icon-prev, +.carousel-control .icon-next { + width: 20px; + height: 20px; + margin-top: -10px; + margin-left: -10px; + font-family: serif; +} + +.carousel-control .icon-prev:before { + content: '\2039'; +} + +.carousel-control .icon-next:before { + content: '\203a'; +} + +.carousel-indicators { + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + padding-left: 0; + margin-left: -30%; + text-align: center; + list-style: none; +} + +.carousel-indicators li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + cursor: pointer; + background-color: #000 \9; + background-color: rgba(0, 0, 0, 0); + border: 1px solid #ffffff; + border-radius: 10px; +} + +.carousel-indicators .active { + width: 12px; + height: 12px; + margin: 0; + background-color: #ffffff; +} + +.carousel-caption { + position: absolute; + right: 15%; + bottom: 20px; + left: 15%; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #ffffff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); +} + +.carousel-caption .btn { + text-shadow: none; +} + +@media screen and (min-width: 768px) { + .carousel-control .glyphicons-chevron-left, + .carousel-control .glyphicons-chevron-right, + .carousel-control .icon-prev, + .carousel-control .icon-next { + width: 30px; + height: 30px; + margin-top: -15px; + margin-left: -15px; + font-size: 30px; + } + .carousel-caption { + right: 20%; + left: 20%; + padding-bottom: 30px; + } + .carousel-indicators { + bottom: 20px; + } +} + +.clearfix:before, +.clearfix:after { + display: table; + content: " "; +} + +.clearfix:after { + clear: both; +} + +.center-block { + display: block; + margin-right: auto; + margin-left: auto; +} + +.pull-right { + float: right !important; +} + +.pull-left { + float: left !important; +} + +.hide { + display: none !important; +} + +.show { + display: block !important; +} + +.invisible { + visibility: hidden; +} + +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.hidden { + display: none !important; + visibility: hidden !important; +} + +.affix { + position: fixed; +} + +@-ms-viewport { + width: device-width; +} + +.visible-xs, +tr.visible-xs, +th.visible-xs, +td.visible-xs { + display: none !important; +} + +@media (max-width: 767px) { + .visible-xs { + display: block !important; + } + table.visible-xs { + display: table; + } + tr.visible-xs { + display: table-row !important; + } + th.visible-xs, + td.visible-xs { + display: table-cell !important; + } +} + +@media (min-width: 768px) and (max-width: 991px) { + .visible-xs.visible-sm { + display: block !important; + } + table.visible-xs.visible-sm { + display: table; + } + tr.visible-xs.visible-sm { + display: table-row !important; + } + th.visible-xs.visible-sm, + td.visible-xs.visible-sm { + display: table-cell !important; + } +} + +@media (min-width: 992px) and (max-width: 1199px) { + .visible-xs.visible-md { + display: block !important; + } + table.visible-xs.visible-md { + display: table; + } + tr.visible-xs.visible-md { + display: table-row !important; + } + th.visible-xs.visible-md, + td.visible-xs.visible-md { + display: table-cell !important; + } +} + +@media (min-width: 1200px) { + .visible-xs.visible-lg { + display: block !important; + } + table.visible-xs.visible-lg { + display: table; + } + tr.visible-xs.visible-lg { + display: table-row !important; + } + th.visible-xs.visible-lg, + td.visible-xs.visible-lg { + display: table-cell !important; + } +} + +.visible-sm, +tr.visible-sm, +th.visible-sm, +td.visible-sm { + display: none !important; +} + +@media (max-width: 767px) { + .visible-sm.visible-xs { + display: block !important; + } + table.visible-sm.visible-xs { + display: table; + } + tr.visible-sm.visible-xs { + display: table-row !important; + } + th.visible-sm.visible-xs, + td.visible-sm.visible-xs { + display: table-cell !important; + } +} + +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm { + display: block !important; + } + table.visible-sm { + display: table; + } + tr.visible-sm { + display: table-row !important; + } + th.visible-sm, + td.visible-sm { + display: table-cell !important; + } +} + +@media (min-width: 992px) and (max-width: 1199px) { + .visible-sm.visible-md { + display: block !important; + } + table.visible-sm.visible-md { + display: table; + } + tr.visible-sm.visible-md { + display: table-row !important; + } + th.visible-sm.visible-md, + td.visible-sm.visible-md { + display: table-cell !important; + } +} + +@media (min-width: 1200px) { + .visible-sm.visible-lg { + display: block !important; + } + table.visible-sm.visible-lg { + display: table; + } + tr.visible-sm.visible-lg { + display: table-row !important; + } + th.visible-sm.visible-lg, + td.visible-sm.visible-lg { + display: table-cell !important; + } +} + +.visible-md, +tr.visible-md, +th.visible-md, +td.visible-md { + display: none !important; +} + +@media (max-width: 767px) { + .visible-md.visible-xs { + display: block !important; + } + table.visible-md.visible-xs { + display: table; + } + tr.visible-md.visible-xs { + display: table-row !important; + } + th.visible-md.visible-xs, + td.visible-md.visible-xs { + display: table-cell !important; + } +} + +@media (min-width: 768px) and (max-width: 991px) { + .visible-md.visible-sm { + display: block !important; + } + table.visible-md.visible-sm { + display: table; + } + tr.visible-md.visible-sm { + display: table-row !important; + } + th.visible-md.visible-sm, + td.visible-md.visible-sm { + display: table-cell !important; + } +} + +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md { + display: block !important; + } + table.visible-md { + display: table; + } + tr.visible-md { + display: table-row !important; + } + th.visible-md, + td.visible-md { + display: table-cell !important; + } +} + +@media (min-width: 1200px) { + .visible-md.visible-lg { + display: block !important; + } + table.visible-md.visible-lg { + display: table; + } + tr.visible-md.visible-lg { + display: table-row !important; + } + th.visible-md.visible-lg, + td.visible-md.visible-lg { + display: table-cell !important; + } +} + +.visible-lg, +tr.visible-lg, +th.visible-lg, +td.visible-lg { + display: none !important; +} + +@media (max-width: 767px) { + .visible-lg.visible-xs { + display: block !important; + } + table.visible-lg.visible-xs { + display: table; + } + tr.visible-lg.visible-xs { + display: table-row !important; + } + th.visible-lg.visible-xs, + td.visible-lg.visible-xs { + display: table-cell !important; + } +} + +@media (min-width: 768px) and (max-width: 991px) { + .visible-lg.visible-sm { + display: block !important; + } + table.visible-lg.visible-sm { + display: table; + } + tr.visible-lg.visible-sm { + display: table-row !important; + } + th.visible-lg.visible-sm, + td.visible-lg.visible-sm { + display: table-cell !important; + } +} + +@media (min-width: 992px) and (max-width: 1199px) { + .visible-lg.visible-md { + display: block !important; + } + table.visible-lg.visible-md { + display: table; + } + tr.visible-lg.visible-md { + display: table-row !important; + } + th.visible-lg.visible-md, + td.visible-lg.visible-md { + display: table-cell !important; + } +} + +@media (min-width: 1200px) { + .visible-lg { + display: block !important; + } + table.visible-lg { + display: table; + } + tr.visible-lg { + display: table-row !important; + } + th.visible-lg, + td.visible-lg { + display: table-cell !important; + } +} + +.hidden-xs { + display: block !important; +} + +table.hidden-xs { + display: table; +} + +tr.hidden-xs { + display: table-row !important; +} + +th.hidden-xs, +td.hidden-xs { + display: table-cell !important; +} + +@media (max-width: 767px) { + .hidden-xs, + tr.hidden-xs, + th.hidden-xs, + td.hidden-xs { + display: none !important; + } +} + +@media (min-width: 768px) and (max-width: 991px) { + .hidden-xs.hidden-sm, + tr.hidden-xs.hidden-sm, + th.hidden-xs.hidden-sm, + td.hidden-xs.hidden-sm { + display: none !important; + } +} + +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-xs.hidden-md, + tr.hidden-xs.hidden-md, + th.hidden-xs.hidden-md, + td.hidden-xs.hidden-md { + display: none !important; + } +} + +@media (min-width: 1200px) { + .hidden-xs.hidden-lg, + tr.hidden-xs.hidden-lg, + th.hidden-xs.hidden-lg, + td.hidden-xs.hidden-lg { + display: none !important; + } +} + +.hidden-sm { + display: block !important; +} + +table.hidden-sm { + display: table; +} + +tr.hidden-sm { + display: table-row !important; +} + +th.hidden-sm, +td.hidden-sm { + display: table-cell !important; +} + +@media (max-width: 767px) { + .hidden-sm.hidden-xs, + tr.hidden-sm.hidden-xs, + th.hidden-sm.hidden-xs, + td.hidden-sm.hidden-xs { + display: none !important; + } +} + +@media (min-width: 768px) and (max-width: 991px) { + .hidden-sm, + tr.hidden-sm, + th.hidden-sm, + td.hidden-sm { + display: none !important; + } +} + +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-sm.hidden-md, + tr.hidden-sm.hidden-md, + th.hidden-sm.hidden-md, + td.hidden-sm.hidden-md { + display: none !important; + } +} + +@media (min-width: 1200px) { + .hidden-sm.hidden-lg, + tr.hidden-sm.hidden-lg, + th.hidden-sm.hidden-lg, + td.hidden-sm.hidden-lg { + display: none !important; + } +} + +.hidden-md { + display: block !important; +} + +table.hidden-md { + display: table; +} + +tr.hidden-md { + display: table-row !important; +} + +th.hidden-md, +td.hidden-md { + display: table-cell !important; +} + +@media (max-width: 767px) { + .hidden-md.hidden-xs, + tr.hidden-md.hidden-xs, + th.hidden-md.hidden-xs, + td.hidden-md.hidden-xs { + display: none !important; + } +} + +@media (min-width: 768px) and (max-width: 991px) { + .hidden-md.hidden-sm, + tr.hidden-md.hidden-sm, + th.hidden-md.hidden-sm, + td.hidden-md.hidden-sm { + display: none !important; + } +} + +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-md, + tr.hidden-md, + th.hidden-md, + td.hidden-md { + display: none !important; + } +} + +@media (min-width: 1200px) { + .hidden-md.hidden-lg, + tr.hidden-md.hidden-lg, + th.hidden-md.hidden-lg, + td.hidden-md.hidden-lg { + display: none !important; + } +} + +.hidden-lg { + display: block !important; +} + +table.hidden-lg { + display: table; +} + +tr.hidden-lg { + display: table-row !important; +} + +th.hidden-lg, +td.hidden-lg { + display: table-cell !important; +} + +@media (max-width: 767px) { + .hidden-lg.hidden-xs, + tr.hidden-lg.hidden-xs, + th.hidden-lg.hidden-xs, + td.hidden-lg.hidden-xs { + display: none !important; + } +} + +@media (min-width: 768px) and (max-width: 991px) { + .hidden-lg.hidden-sm, + tr.hidden-lg.hidden-sm, + th.hidden-lg.hidden-sm, + td.hidden-lg.hidden-sm { + display: none !important; + } +} + +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-lg.hidden-md, + tr.hidden-lg.hidden-md, + th.hidden-lg.hidden-md, + td.hidden-lg.hidden-md { + display: none !important; + } +} + +@media (min-width: 1200px) { + .hidden-lg, + tr.hidden-lg, + th.hidden-lg, + td.hidden-lg { + display: none !important; + } +} + +.visible-print, +tr.visible-print, +th.visible-print, +td.visible-print { + display: none !important; +} + +@media print { + .visible-print { + display: block !important; + } + table.visible-print { + display: table; + } + tr.visible-print { + display: table-row !important; + } + th.visible-print, + td.visible-print { + display: table-cell !important; + } + .hidden-print, + tr.hidden-print, + th.hidden-print, + td.hidden-print { + display: none !important; + } +} diff --git a/pigx-register/src/main/resources/static/console-fe/public/css/codemirror.css b/pigx-register/src/main/resources/static/console-fe/public/css/codemirror.css new file mode 100755 index 000000000..b54156be5 --- /dev/null +++ b/pigx-register/src/main/resources/static/console-fe/public/css/codemirror.css @@ -0,0 +1,353 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * 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. + */ + +/* BASICS */ + +.CodeMirror { + /* Set height, width, borders, and global font properties here */ + font-family: monospace; + height: 300px; + color: black; +} + +/* PADDING */ + +.CodeMirror-lines { + padding: 4px 0; /* Vertical padding around content */ +} +.CodeMirror pre { + padding: 0 4px; /* Horizontal padding of content */ +} + +.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler { + background-color: white; /* The little square between H and V scrollbars */ +} + +/* GUTTER */ + +.CodeMirror-gutters { + border-right: 1px solid #ddd; + background-color: #f7f7f7; + white-space: nowrap; +} +.CodeMirror-linenumbers {} +.CodeMirror-linenumber { + padding: 0 3px 0 5px; + min-width: 20px; + text-align: right; + color: #999; + white-space: nowrap; +} + +.CodeMirror-guttermarker { color: black; } +.CodeMirror-guttermarker-subtle { color: #999; } + +/* CURSOR */ + +.CodeMirror-cursor { + border-left: 1px solid black; + border-right: none; + width: 0; +} +/* Shown when moving in bi-directional text */ +.CodeMirror div.CodeMirror-secondarycursor { + border-left: 1px solid silver; +} +.cm-fat-cursor .CodeMirror-cursor { + width: auto; + border: 0 !important; + background: #7e7; +} +.cm-fat-cursor div.CodeMirror-cursors { + z-index: 1; +} + +.cm-animate-fat-cursor { + width: auto; + border: 0; + -webkit-animation: blink 1.06s steps(1) infinite; + -moz-animation: blink 1.06s steps(1) infinite; + animation: blink 1.06s steps(1) infinite; + background-color: #7e7; +} +@-moz-keyframes blink { + 0% {} + 50% { background-color: transparent; } + 100% {} +} +@-webkit-keyframes blink { + 0% {} + 50% { background-color: transparent; } + 100% {} +} +@keyframes blink { + 0% {} + 50% { background-color: transparent; } + 100% {} +} + +/* Can style cursor different in overwrite (non-insert) mode */ +.CodeMirror-overwrite .CodeMirror-cursor {} + +.cm-tab { display: inline-block; text-decoration: inherit; } + +.CodeMirror-rulers { + position: absolute; + left: 0; right: 0; top: -50px; bottom: -20px; + overflow: hidden; +} +.CodeMirror-ruler { + border-left: 1px solid #ccc; + top: 0; bottom: 0; + position: absolute; +} + +/* DEFAULT THEME */ + +.cm-s-default .cm-header {color: blue;} +.cm-s-default .cm-quote {color: #090;} +.cm-negative {color: #d44;} +.cm-positive {color: #292;} +.cm-header, .cm-strong {font-weight: bold;} +.cm-em {font-style: italic;} +.cm-link {text-decoration: underline;} +.cm-strikethrough {text-decoration: line-through;} + +.cm-s-default .cm-keyword {color: #708;} +.cm-s-default .cm-atom {color: #219;} +.cm-s-default .cm-number {color: #164;} +.cm-s-default .cm-def {color: #00f;} +.cm-s-default .cm-variable, +.cm-s-default .cm-punctuation, +.cm-s-default .cm-property, +.cm-s-default .cm-operator {} +.cm-s-default .cm-variable-2 {color: #05a;} +.cm-s-default .cm-variable-3, .cm-s-default .cm-type {color: #085;} +.cm-s-default .cm-comment {color: #a50;} +.cm-s-default .cm-string {color: #a11;} +.cm-s-default .cm-string-2 {color: #f50;} +.cm-s-default .cm-meta {color: #555;} +.cm-s-default .cm-qualifier {color: #555;} +.cm-s-default .cm-builtin {color: #30a;} +.cm-s-default .cm-bracket {color: #997;} +.cm-s-default .cm-tag {color: #170;} +.cm-s-default .cm-attribute {color: #00c;} +.cm-s-default .cm-hr {color: #999;} +.cm-s-default .cm-link {color: #00c;} + +.cm-s-default .cm-error {color: #f00;} +.cm-invalidchar {color: #f00;} + +.CodeMirror-composing { border-bottom: 2px solid; } + +/* Default styles for common addons */ + +div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;} +div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;} +.CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); } +.CodeMirror-activeline-background {background: #e8f2ff;} + +/* STOP */ + +/* The rest of this file contains styles related to the mechanics of + the editor. You probably shouldn't touch them. */ + +.CodeMirror { + position: relative; + overflow: hidden; + background: white; +} + +.CodeMirror-scroll { + overflow: scroll !important; /* Things will break if this is overridden */ + /* 30px is the magic margin used to hide the element's real scrollbars */ + /* See overflow: hidden in .CodeMirror */ + margin-bottom: -30px; margin-right: -30px; + padding-bottom: 30px; + height: 100%; + outline: none; /* Prevent dragging from highlighting the element */ + position: relative; +} +.CodeMirror-sizer { + position: relative; + border-right: 30px solid transparent; +} + +/* The fake, visible scrollbars. Used to force redraw during scrolling + before actual scrolling happens, thus preventing shaking and + flickering artifacts. */ +.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler { + position: absolute; + z-index: 6; + display: none; +} +.CodeMirror-vscrollbar { + right: 0; top: 0; + overflow-x: hidden; + overflow-y: scroll; +} +.CodeMirror-hscrollbar { + bottom: 0; left: 0; + overflow-y: hidden; + overflow-x: scroll; +} +.CodeMirror-scrollbar-filler { + right: 0; bottom: 0; +} +.CodeMirror-gutter-filler { + left: 0; bottom: 0; +} + +.CodeMirror-gutters { + position: absolute; left: 0; top: 0; + min-height: 100%; + z-index: 3; +} +.CodeMirror-gutter { + white-space: normal; + height: 100%; + display: inline-block; + vertical-align: top; + margin-bottom: -30px; +} +.CodeMirror-gutter-wrapper { + position: absolute; + z-index: 4; + background: none !important; + border: none !important; +} +.CodeMirror-gutter-background { + position: absolute; + top: 0; bottom: 0; + z-index: 4; +} +.CodeMirror-gutter-elt { + position: absolute; + cursor: default; + z-index: 4; +} +.CodeMirror-gutter-wrapper ::selection { background-color: transparent } +.CodeMirror-gutter-wrapper ::-moz-selection { background-color: transparent } + +.CodeMirror-lines { + cursor: text; + min-height: 1px; /* prevents collapsing before first draw */ +} +.CodeMirror pre { + /* Reset some styles that the rest of the page might have set */ + -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0; + border-width: 0; + background: transparent; + font-family: inherit; + font-size: inherit; + margin: 0; + white-space: pre; + word-wrap: normal; + line-height: inherit; + color: inherit; + z-index: 2; + position: relative; + overflow: visible; + -webkit-tap-highlight-color: transparent; + -webkit-font-variant-ligatures: contextual; + font-variant-ligatures: contextual; +} +.CodeMirror-wrap pre { + word-wrap: break-word; + white-space: pre-wrap; + word-break: normal; +} + +.CodeMirror-linebackground { + position: absolute; + left: 0; right: 0; top: 0; bottom: 0; + z-index: 0; +} + +.CodeMirror-linewidget { + position: relative; + z-index: 2; + overflow: auto; +} + +.CodeMirror-widget {} + +.CodeMirror-rtl pre { direction: rtl; } + +.CodeMirror-code { + outline: none; +} + +/* Force content-box sizing for the elements where we expect it */ +.CodeMirror-scroll, +.CodeMirror-sizer, +.CodeMirror-gutter, +.CodeMirror-gutters, +.CodeMirror-linenumber { + -moz-box-sizing: content-box; + box-sizing: content-box; +} + +.CodeMirror-measure { + position: absolute; + width: 100%; + height: 0; + overflow: hidden; + visibility: hidden; +} + +.CodeMirror-cursor { + position: absolute; + pointer-events: none; +} +.CodeMirror-measure pre { position: static; } + +div.CodeMirror-cursors { + visibility: hidden; + position: relative; + z-index: 3; +} +div.CodeMirror-dragcursors { + visibility: visible; +} + +.CodeMirror-focused div.CodeMirror-cursors { + visibility: visible; +} + +.CodeMirror-selected { background: #d9d9d9; } +.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; } +.CodeMirror-crosshair { cursor: crosshair; } +.CodeMirror-line::selection, .CodeMirror-line > span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; } +.CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection { background: #d7d4f0; } + +.cm-searching { + background: #ffa; + background: rgba(255, 255, 0, .4); +} + +/* Used to force a border model for a node */ +.cm-force-border { padding-right: .1px; } + +@media print { + /* Hide the cursor when printing */ + .CodeMirror div.CodeMirror-cursors { + visibility: hidden; + } +} + +/* See issue #2901 */ +.cm-tab-wrap-hack:after { content: ''; } + +/* Help users use markselection to safely style text background */ +span.CodeMirror-selectedtext { background: none; } diff --git a/pigx-register/src/main/resources/static/console-fe/public/css/console1412.css b/pigx-register/src/main/resources/static/console-fe/public/css/console1412.css new file mode 100755 index 000000000..838132db0 --- /dev/null +++ b/pigx-register/src/main/resources/static/console-fe/public/css/console1412.css @@ -0,0 +1 @@ +@charset "UTF-8";.viewFramework-topbar{position:fixed;width:100%;height:50px;background:#09C;z-index:101}.viewFramework-body{position:absolute;width:100%;top:50px;bottom:0px;background-color:#000;z-index:100}.viewFramework-body .console-global-notice .console-global-notice-nav{top:14px}.viewFramework-body .console-global-notice .console-global-notice-list{margin:0;height:40px}.viewFramework-body .console-global-notice .console-global-notice-list .console-global-notice-item{padding:11px 12px;border:none}.viewFramework-body .console-global-notice .console-global-notice-list .console-global-notice-item .console-global-notice-nomore{top:10px}.viewFramework-body.viewFramework-topbar-hide{top:0px}.viewFramework-body.viewFramework-topbar-hide .viewFramework-sidebar{top:0px}.viewFramework-sidebar{width:0px;display:none;position:fixed;top:50px;bottom:0px;background-color:#293038;z-index:102;overflow-x:hidden}.viewFramework-sidebar .sidebar-content{width:200px;height:100%;overflow:auto;overflow-x:hidden}.viewFramework-sidebar .sidebar-trans{-o-transition:all 0.12s ease,0.12s ease;-ms-transition:all 0.12s ease,0.12s ease;-moz-transition:all 0.12s ease,0.12s ease;-webkit-transition:all 0.12s ease,0.12s ease}.viewFramework-sidebar .sidebar-fold{height:30px;width:180px;background:#394555;color:#aeb9c2;text-align:center;line-height:30px !important;font-size:12px;user-select:none;cursor:pointer;-webkit-user-select:none;-moz-user-select:none}.viewFramework-sidebar .sidebar-fold:hover{background:#37424f}.viewFramework-sidebar .sidebar-nav{width:180px}.viewFramework-sidebar .sidebar-nav ul{margin:0px;padding:0px;list-style:none;overflow:hidden}.viewFramework-sidebar .sidebar-nav li a{display:block;width:100%;height:40px;line-height:40px;overflow:hidden}.viewFramework-sidebar .sidebar-nav li a:hover{background:#37424f}.viewFramework-sidebar .sidebar-nav li a:hover .nav-icon,.viewFramework-sidebar .sidebar-nav li a:hover .nav-title{color:#fff}.viewFramework-sidebar .sidebar-nav .nav-item{position:relative}.viewFramework-sidebar .sidebar-nav .nav-comment{background:#2d3945;color:#cccccc;height:26px;margin-left:8px;line-height:26px;padding:0 7px;vertical-align:middle;position:relative;display:none}.viewFramework-sidebar .sidebar-nav .nav-comment .icon-arrow-left{position:absolute;left:-14px;line-height:26px;font-size:24px;color:#2d3945}.viewFramework-sidebar .sidebar-nav .nav-tooltip-comment{color:#ccc}.viewFramework-sidebar .sidebar-nav .sidebar-title{height:40px;background:#22282e;color:#fff;line-height:40px;position:relative;cursor:pointer;-webkit-user-select:none;-moz-user-select:none}.viewFramework-sidebar .sidebar-nav .sidebar-title:hover{background:#414d5c}.viewFramework-sidebar .sidebar-nav .sidebar-title-icon{display:inline-block;margin:0 8px 0 20px;vertical-align:middle;transition:transform 0.12s;-o-transition:-o-transform 0.12s;-ms-transition:-ms-transform 0.12s;-moz-transition:-moz-transform 0.12s;-webkit-transition:-webkit-transform 0.12s}.viewFramework-sidebar .sidebar-manage{vertical-align:middle;position:absolute;height:40px;width:40px;right:0}.viewFramework-sidebar .sidebar-manage a{display:block;width:100%;height:100%;text-align:center;line-height:40px;font-size:14px;color:#a0abb3;text-decoration:none}.viewFramework-sidebar .sidebar-nav-fold ul{height:0 !important;overflow:hidden}.viewFramework-sidebar .sidebar-nav-fold .sidebar-title-icon{transform:rotate(-90deg);-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg)}.viewFramework-sidebar .sidebar-nav-fold .sidebar-title{background:#37424f;border-bottom:1px solid #414d5c}.viewFramework-sidebar .sidebar-nav .nav-item:hover .nav-comment{display:inline-block}.viewFramework-sidebar .entrance-nav .nav-comment{margin-left:10px}.viewFramework-sidebar .sidebar-nav .nav-icon{width:50px;text-align:center;font-size:16px;float:left;color:#aeb9c2}.viewFramework-sidebar .sidebar-nav .nav-title{float:left;overflow:hidden;color:#fff;white-space:nowrap;text-overflow:ellipsis;display:block;width:130px}.viewFramework-sidebar .entrance-nav .nav-title{width:auto}.viewFramework-sidebar .sidebar-nav li.consolehome .nav-tooltip{top:15px;line-height:40px}.viewFramework-sidebar .sidebar-nav li.consolehome a{height:70px;line-height:70px;background:#293038}.viewFramework-sidebar .sidebar-nav li.consolehome a .nav-icon{font-size:20px}.viewFramework-sidebar .sidebar-nav li.consolehome.active a{background:#293038}.viewFramework-sidebar .sidebar-nav li.active a{background:#0099cc}.viewFramework-sidebar .sidebar-nav li.active a .nav-title{color:#fff}.viewFramework-sidebar .sidebar-nav li.active a .nav-icon{color:#fff}.viewFramework-sidebar .sidebar-nav .manage-nav{height:30px;overflow:hidden}.viewFramework-sidebar .sidebar-nav .manage-nav:hover .nav-icon{color:#fff}.viewFramework-sidebar .sidebar-nav .manage-nav a{display:block;height:100%}.viewFramework-sidebar .sidebar-nav .manage-nav .nav-icon{height:100%;line-height:30px;font-size:16px}.viewFramework-sidebar .sidebar-nav .manage-nav .nav-title{margin-top:14px;background:#293038;height:1px;width:120px}.viewFramework-sidebar .sidebar-nav .more-nav{display:block;width:100%;height:40px;line-height:40px;position:relative}.viewFramework-sidebar .sidebar-nav .more-nav.open .more-nav-switch{background:#09c}.viewFramework-sidebar .sidebar-nav .more-nav.open .more-nav-switch .nav-icon,.viewFramework-sidebar .sidebar-nav .more-nav.open .more-nav-switch .nav-title{color:#fff}.viewFramework-sidebar .sidebar-nav .more-nav.open .more-nav-switch:hover{background:#09c}.viewFramework-sidebar .sidebar-nav .more-nav.open .icon-up{display:none}.viewFramework-sidebar .sidebar-nav .more-nav.open .icon-down{display:inline-block}.viewFramework-sidebar .sidebar-nav .more-nav .icon-up{display:inline-block}.viewFramework-sidebar .sidebar-nav .more-nav .icon-down{display:none}.viewFramework-sidebar .sidebar-nav .more-nav .more-nav-switch{display:block;width:100%;height:40px;line-height:40px}.viewFramework-sidebar .sidebar-nav .more-nav .more-nav-switch:hover{background:#425160}.viewFramework-sidebar .sidebar-nav .more-nav .more-nav-switch:hover .nav-icon,.viewFramework-sidebar .sidebar-nav .more-nav .more-nav-switch:hover .nav-title{color:#fff}.viewFramework-sidebar .sidebar-nav .more-nav .more-nav-container{background:#425160;position:absolute;bottom:40px;top:auto;border:none;border-radius:0 0;box-shadow:none;margin:0;width:100%}.viewFramework-sidebar .sidebar-nav .more-nav .more-nav-container a{color:#fff;text-decoration:none}.viewFramework-sidebar .sidebar-nav .more-nav .more-nav-container .more-nav-item{display:block;height:40px;line-height:40px}.viewFramework-sidebar .sidebar-nav .more-nav .more-nav-container .more-nav-item:hover{background:#3a4856}.viewFramework-sidebar .sidebar-nav .more-nav .more-nav-container .more-nav-item:hover .more-nav-item-icon{color:#aeb9c2}.viewFramework-sidebar .sidebar-nav .more-nav .more-nav-container .more-nav-item-icon{width:50px;display:inline-block;vertical-align:text-top;text-align:center;color:#546478}.viewFramework-sidebar .sidebar-nav .more-nav .more-nav-container .more-nav-item.active{background:#2d3945}.viewFramework-sidebar .sidebar-nav .more-nav .more-nav-container .more-nav-item.active .more-nav-item-icon{color:#0099cc}.viewFramework-sidebar .sidebar-nav .more-nav .more-nav-close{height:20px;background:#09c;text-align:right;line-height:20px;cursor:pointer}.viewFramework-sidebar .sidebar-nav .more-nav .more-nav-close .icon-down{text-align:left;width:32px;display:inline-block;color:#80cce6;vertical-align:middle}.viewFramework-sidebar-mini .viewFramework-sidebar,.viewFramework-sidebar.sidebar-mini{width:50px;display:block}.viewFramework-sidebar-mini .viewFramework-sidebar .sidebar-content,.viewFramework-sidebar.sidebar-mini .sidebar-content{width:70px}.viewFramework-sidebar-mini .viewFramework-sidebar .sidebar-fold,.viewFramework-sidebar.sidebar-mini .sidebar-fold{width:50px}.viewFramework-sidebar-mini .viewFramework-sidebar .sidebar-nav,.viewFramework-sidebar.sidebar-mini .sidebar-nav{width:50px}.viewFramework-sidebar-mini .viewFramework-sidebar .sidebar-nav .nav-item a:hover+.nav-tooltip,.viewFramework-sidebar.sidebar-mini .sidebar-nav .nav-item a:hover+.nav-tooltip{display:block}.viewFramework-sidebar-mini .viewFramework-sidebar .sidebar-nav .nav-title,.viewFramework-sidebar.sidebar-mini .sidebar-nav .nav-title{display:none}.viewFramework-sidebar-mini .viewFramework-sidebar .sidebar-nav .more-nav .more-nav-switch:hover,.viewFramework-sidebar.sidebar-mini .sidebar-nav .more-nav .more-nav-switch:hover{background:#425160 !important}.viewFramework-sidebar-mini .viewFramework-sidebar .sidebar-nav .more-nav.open .more-nav-switch,.viewFramework-sidebar.sidebar-mini .sidebar-nav .more-nav.open .more-nav-switch{background:#425160 !important}.viewFramework-sidebar-mini .viewFramework-sidebar .sidebar-nav .more-nav .more-nav-container,.viewFramework-sidebar.sidebar-mini .sidebar-nav .more-nav .more-nav-container{bottom:0px;left:50px;width:180px}.viewFramework-sidebar-mini .viewFramework-sidebar .sidebar-nav .more-nav .more-nav-container .more-nav-item,.viewFramework-sidebar.sidebar-mini .sidebar-nav .more-nav .more-nav-container .more-nav-item{display:block;height:40px;line-height:40px}.viewFramework-sidebar-mini .viewFramework-sidebar .sidebar-nav .more-nav .more-nav-container .more-nav-item-icon,.viewFramework-sidebar.sidebar-mini .sidebar-nav .more-nav .more-nav-container .more-nav-item-icon{width:50px;padding-left:0}.viewFramework-sidebar-mini .viewFramework-sidebar .sidebar-nav .more-nav .more-nav-close,.viewFramework-sidebar.sidebar-mini .sidebar-nav .more-nav .more-nav-close{display:none}.viewFramework-sidebar-mini .viewFramework-sidebar .sidebar-nav li.consolehome a :hover,.viewFramework-sidebar.sidebar-mini .sidebar-nav li.consolehome a :hover{background:#425160}.viewFramework-sidebar-mini .viewFramework-sidebar .sidebar-title .sidebar-title-text,.viewFramework-sidebar.sidebar-mini .sidebar-title .sidebar-title-text{display:none}.viewFramework-sidebar-mini .viewFramework-sidebar .sidebar-title-inner:hover+.nav-tooltip,.viewFramework-sidebar.sidebar-mini .sidebar-title-inner:hover+.nav-tooltip{display:block}.viewFramework-sidebar-mini .viewFramework-sidebar .sidebar-manage,.viewFramework-sidebar.sidebar-mini .sidebar-manage{display:none}.viewFramework-sidebar-mini .viewFramework-sidebar .entrance-nav .nav-item:hover .nav-comment,.viewFramework-sidebar.sidebar-mini .entrance-nav .nav-item:hover .nav-comment{display:none}.viewFramework-sidebar-full .viewFramework-sidebar,.viewFramework-sidebar.sidebar-full{width:180px;display:block}.viewFramework-sidebar-full .viewFramework-sidebar .sidebar-nav .nav-icon,.viewFramework-sidebar.sidebar-full .sidebar-nav .nav-icon{width:50px}.viewFramework-sidebar-mini .viewFramework-product{left:50px}.viewFramework-sidebar-full .viewFramework-product{left:180px}.viewFramework-sidebar-dialog .modal-dialog{width:730px}.viewFramework-sidebar-dialog .modal-dialog .modal-title{user-select:none;-webkit-user-select:none}.viewFramework-sidebar-manage .sidebar-item-list{padding:4px 0 0 0;height:auto}.viewFramework-sidebar-manage .sidebar-item-list-picked .sidebar-item{border:1px solid #37a9d5}.viewFramework-sidebar-manage .sidebar-item-list-picked .sidebar-item .sidebar-item-opt-icon{display:block}.viewFramework-sidebar-manage .sidebar-item-list-picked .sidebar-item .sidebar-item-icon{color:#516176}.viewFramework-sidebar-manage .sidebar-config-title{padding-left:6px;user-select:none;-webkit-user-select:none}.viewFramework-sidebar-manage .sidebar-item-wrap{padding:6px;width:33.3%;float:left;user-select:none;-webkit-user-select:none}.viewFramework-sidebar-manage .sidebar-item-wrap.on-drag-hover .sidebar-item{border:1px dashed #ddd}.viewFramework-sidebar-manage .sidebar-item{height:32px;padding:4px;line-height:24px;background:#fff;border:1px solid #d3dce3;position:relative;cursor:pointer;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;-o-transition:all 0.1s, 0.1s;-ms-transition:all 0.1s, 0.1s;-moz-transition:all 0.1s, 0.1s;-webkit-transition:all 0.1s, 0.1s}.viewFramework-sidebar-manage .sidebar-item:hover{border:1px solid #37a9d5}.viewFramework-sidebar-manage .sidebar-item:hover .sidebar-item-opt-icon{display:block}.viewFramework-sidebar-manage .sidebar-item .sidebar-item-icon{color:#aeb9c2;font-size:14px;margin:0 2px;position:relative;top:1px}.viewFramework-sidebar-manage .sidebar-item .sidebar-item-opt-icon{display:none;position:absolute;height:30px;width:30px;right:0;top:0;line-height:30px;text-align:center;border-left:1px solid #37a9d5;color:#37a9d5;font-size:14px}.viewFramework-sidebar-manage .sidebar-config-gap{border:1px dashed #e8ecf0;margin:16px 5px;user-select:none;-webkit-user-select:none}.aliyun-console-sidebar-tooltip{position:absolute;z-index:1030;display:block;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.aliyun-console-sidebar-tooltip .tooltip-inner{max-width:200px;padding:12px 8px;color:#ffffff;text-align:center;text-decoration:none;border-radius:0 0;background-color:#425160}.aliyun-console-sidebar-tooltip .tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.aliyun-console-sidebar-tooltip.in{opacity:0.9;filter:alpha(opacity=90)}.aliyun-console-sidebar-tooltip.right{padding:0 5px;margin-left:3px}.aliyun-console-sidebar-tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#425160;border-width:5px 5px 5px 0}.viewFramework-product{width:auto;position:absolute;top:0px;left:0px;bottom:0px;right:0px;overflow:hidden;background:#FFF}.viewFramework-product-navbar{width:0px;float:left;background-color:#EAEDF1;position:absolute;top:0px;bottom:0px;z-index:2;overflow:hidden;-o-transition:all 0.2s ease;-ms-transition:all 0.2s ease;-moz-transition:all 0.2s ease;-webkit-transition:all 0.2s ease}.viewFramework-product-navbar .product-nav-stage{width:180px;overflow:hidden;position:absolute;top:0px;bottom:0px;right:0px}.viewFramework-product-navbar .product-nav-stage .product-nav-scene{width:180px;position:absolute;top:0px;bottom:0px;-webkit-transition:position,.2s,linear;-moz-transition:position,.2s,linear}.viewFramework-product-navbar .product-nav-stage .product-nav-main-scene{left:0px}.viewFramework-product-navbar .product-nav-stage .product-nav-sub-scene{left:180px}.viewFramework-product-navbar .product-nav-stage-main .product-nav-main-scene{left:0px}.viewFramework-product-navbar .product-nav-stage-main .product-nav-sub-scene{left:180px}.viewFramework-product-navbar .product-nav-stage-sub .product-nav-main-scene{left:-180px}.viewFramework-product-navbar .product-nav-stage-sub .product-nav-sub-scene{left:0px}.viewFramework-product-navbar .product-nav-scene .product-nav-title{width:180px;height:70px;line-height:70px;background:#D9DEE4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.viewFramework-product-navbar .product-nav-main-scene .product-nav-title{font-weight:bold;text-indent:20px}.viewFramework-product-navbar .product-nav-sub-scene .product-nav-title{text-align:center}.viewFramework-product-navbar .product-nav-sub-scene .product-nav-title a{font-size:20px;color:#546478;text-decoration:none}.viewFramework-product-navbar .product-nav-sub-scene .product-nav-title a:hover{color:#09C}.viewFramework-product-navbar .product-nav-list{position:absolute;top:70px;left:0px;right:0px;bottom:0px;overflow-y:auto;overflow-x:hidden}.viewFramework-product-navbar .product-nav-list .nav-icon{width:30px;height:40px;float:left;text-align:center;font-size:16px;color:#333}.viewFramework-product-navbar .product-nav-list .nav-title{width:138px;float:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.viewFramework-product-navbar .product-nav-list .nav-extend{height:40px;line-height:40px;float:right;margin-top:-40px}.viewFramework-product-navbar .product-nav-list ul{list-style:none;padding:0px;margin:0px}.viewFramework-product-navbar .product-nav-list li a{width:180px;height:40px;line-height:40px;display:block;color:#333}.viewFramework-product-navbar .product-nav-list ul ul li a{color:#666}.viewFramework-product-navbar .product-nav-list ul ul li a .nav-title{text-indent:8px}.viewFramework-product-navbar .product-nav-list li a:hover{background-color:#F4F6F8}.viewFramework-product-navbar .product-nav-list li.active a{background-color:#FFF}.viewFramework-product-navbar-collapse{position:absolute;left:0;top:50%;width:20px;height:50px;z-index:3;-o-transition:all 0.2s ease;-ms-transition:all 0.2s ease;-moz-transition:all 0.2s ease;-webkit-transition:all 0.2s ease}.viewFramework-product-navbar-collapse:hover .product-navbar-collapse{left:0}.viewFramework-product-navbar-collapse:hover .product-navbar-collapse-bg{border-bottom:8px solid transparent;border-left:20px solid #D9DEE4;border-top:8px solid transparent}.viewFramework-product-navbar-collapse .product-navbar-collapse-inner{top:-50%;position:relative;overflow:hidden}.viewFramework-product-navbar-collapse .product-navbar-collapse{height:50px;position:relative;left:-7px;text-align:center;cursor:pointer;-o-transition:all 0.1s ease,0.1s ease;-ms-transition:all 0.1s ease,0.1s ease;-moz-transition:all 0.1s ease,0.1s ease;-webkit-transition:all 0.1s ease,0.1s ease}.viewFramework-product-navbar-collapse .product-navbar-collapse>span{font-size:15px;line-height:50px;vertical-align:text-top}.viewFramework-product-navbar-collapse .product-navbar-collapse-bg{width:0;height:50px;position:absolute;top:0;left:0;border-bottom:9px solid transparent;border-left:13px solid #D9DEE4;border-top:9px solid transparent;-o-transition:all 0.1s ease,0.1s ease;-ms-transition:all 0.1s ease,0.1s ease;-moz-transition:all 0.1s ease,0.1s ease;-webkit-transition:all 0.1s ease,0.1s ease}.viewFramework-product-navbar-collapse .icon-collapse-left{display:none}.viewFramework-product-navbar-collapse .icon-collapse-right{display:inline}.viewFramework-product-body{position:absolute;width:auto;top:0px;bottom:0px;left:0px;right:0px;overflow:hidden;overflow-y:auto;-o-transition:all 0.2s ease;-ms-transition:all 0.2s ease;-moz-transition:all 0.2s ease;-webkit-transition:all 0.2s ease}.viewFramework-product-col-1 .viewFramework-product-navbar-bg,.viewFramework-product-col-1 .viewFramework-product-navbar{width:180px}.viewFramework-product-col-1 .viewFramework-product-body{left:180px}.viewFramework-product-col-1 .viewFramework-product-navbar-collapse{left:160px}.viewFramework-product-col-1 .viewFramework-product-navbar-collapse .product-navbar-collapse{right:-7px;left:auto}.viewFramework-product-col-1 .viewFramework-product-navbar-collapse .product-navbar-collapse>span{color:#546478}.viewFramework-product-col-1 .viewFramework-product-navbar-collapse .product-navbar-collapse-bg{right:0;left:auto;border-bottom:9px solid transparent;border-left:none;border-right:13px solid #f7f7f7;border-top:9px solid transparent}.viewFramework-product-col-1 .viewFramework-product-navbar-collapse .icon-collapse-left{display:inline}.viewFramework-product-col-1 .viewFramework-product-navbar-collapse .icon-collapse-right{display:none}.viewFramework-product-col-1 .viewFramework-product-navbar-collapse:hover .product-navbar-collapse{right:0;left:auto}.viewFramework-product-col-1 .viewFramework-product-navbar-collapse:hover .product-navbar-collapse-bg{border-bottom:8px solid transparent;border-left:none;border-right:20px solid #f7f7f7;border-top:8px solid transparent}.viewFramework-product-col-2 .viewFramework-product-navbar-bg,.viewFramework-product-col-2 .viewFramework-product-navbar{width:360px}.viewFramework-product-col-2 .viewFramework-product-body{left:360px}.viewFramework-animate{-webkit-animation-duration:0.1s;animation-duration:0.1s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.viewFramework-fadeIn{-webkit-animation-name:viewFrameworkFadeIn;animation-name:viewFrameworkFadeIn}@-webkit-keyframes viewFrameworkFadeIn{0%{opacity:0}100%{opacity:1}}@keyframes viewFrameworkFadeIn{0%{opacity:0}100%{opacity:1}}.text-muted{color:#999 !important}.text-muted:hover{color:#999 !important}.text-info{color:#69C !important}.text-info:hover{color:#69C !important}.text-primary{color:#09C !important}.text-primary:hover{color:#09C !important}.text-success{color:#090 !important}.text-success:hover{color:#090 !important}.text-warning{color:#F90 !important}.text-warning:hover{color:#F90 !important}.text-danger{color:#F00 !important}.text-danger:hover{color:#F00 !important}.text-explode{color:#CCC !important;font-weight:normal !important;margin:0px 4px !important}span.label{font-weight:normal}.text-size-14{font-size:14px !important}.text-size-16{font-size:16px !important}.text-size-24{font-size:24px !important}.text-size-32{font-size:32px !important}.text-size-48{font-size:48px !important}.text-size-64{font-size:64px !important}.btn{font-size:12px;border-radius:0px;padding:8px 16px;height:32px;line-height:14px}.btn-default{color:#333;border:1px solid #ddd;background-color:#f7f7f7}.btn-default:active{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.125);box-shadow:inset 0 1px 2px rgba(0,0,0,0.125)}.btn-default:focus{color:#333;border:1px solid #ddd;background-color:#f7f7f7;outline:none}.btn-default:hover{color:#333;border:1px solid #ddd;background-color:#fff}.btn-primary{color:#fff;border:1px solid #09c;background-color:#09c}.btn-primary:active{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.125);box-shadow:inset 0 1px 2px rgba(0,0,0,0.125)}.btn-primary:focus{color:#fff;border:1px solid #09c;background-color:#09c;outline:none}.btn-primary:hover{color:#fff;border:1px solid #28b5d6;background-color:#28b5d6}.btn-success{color:#fff;border:1px solid #57a235;background-color:#4db118}.btn-success:active{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.125);box-shadow:inset 0 1px 2px rgba(0,0,0,0.125)}.btn-success:focus{color:#fff;border:1px solid #57a235;background-color:#4db118;outline:none}.btn-success:hover{color:#fff;border:1px solid #57bc20;background-color:#57bc20}.btn-warning{color:#333;border:1px solid #ddd;background-color:#f7f7f7}.btn-warning:active{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.125);box-shadow:inset 0 1px 2px rgba(0,0,0,0.125)}.btn-warning:focus{color:#333;border:1px solid #ddd;background-color:#f7f7f7;outline:none}.btn-warning:hover{color:#fff;border:1px solid #ffa200;background-color:#ffa200}.btn-danger{color:#333;color:#333;border:1px solid #ddd;background-color:#f7f7f7}.btn-danger:active{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.125);box-shadow:inset 0 1px 2px rgba(0,0,0,0.125)}.btn-danger:focus{color:#333;border:1px solid #ddd;background-color:#f7f7f7;outline:none}.btn-danger:hover{color:#fff;border:1px solid #f25721;background-color:#f25721}.btn-link{color:#06C;text-shadow:none;border:none}.btn-link:hover{color:#039}.btn-lg{font-size:14px;padding:12px 20px;height:40px;line-height:16px}.btn-sm{font-size:12px;padding:4px 12px;height:24px;line-height:14px}.btn-xs{font-size:12px;padding:2px 8px;height:20px;line-height:14px}.btn.disabled,.btn[disabled]{text-shadow:none;filter:none;opacity:1;color:#bbb;border:1px solid #ddd;background-color:#f7f7f7}.btn.disabled:active,.btn[disabled]:active{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.125);box-shadow:inset 0 1px 2px rgba(0,0,0,0.125)}.btn.disabled:focus,.btn[disabled]:focus{color:#bbb;border:1px solid #ddd;background-color:#f7f7f7;outline:none}.btn.disabled:hover,.btn[disabled]:hover{color:#bbb;border:1px solid #ddd;background-color:#f7f7f7}.btn.btn-link.disabled,.btn.btn-link[disabled]{border:none;background:transparent none}.btn.btn-primary.disabled,.btn.btn-primary[disabled]{color:#EEE;text-shadow:none;filter:none;opacity:1;color:#fff;border:1px solid #ccc;background-color:#ccc}.btn.btn-primary.disabled:active,.btn.btn-primary[disabled]:active{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.125);box-shadow:inset 0 1px 2px rgba(0,0,0,0.125)}.btn.btn-primary.disabled:focus,.btn.btn-primary[disabled]:focus{color:#fff;border:1px solid #ccc;background-color:#ccc;outline:none}.btn.btn-primary.disabled:hover,.btn.btn-primary[disabled]:hover{color:#fff;border:1px solid #ccc;background-color:#ccc}.btn-default-active,.btn-default-active:hover,.btn-default-active:focus{border:1px solid #485260;background-color:#525d6d;background:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #525d6d), color-stop(100%, #525d6d));background:-webkit-linear-gradient(top, #525d6d,#525d6d);background:-moz-linear-gradient(top, #525d6d,#525d6d);background:-o-linear-gradient(top, #525d6d,#525d6d);background:linear-gradient(top, #525d6d,#525d6d);color:#FFFFFF;box-shadow:inset 0px 1px 2px rgba(0,0,0,0.3)}.btn-toinstlist{border:1px solid #BBB;color:#666;text-shadow:none;vertical-align:middle;margin-top:7px}.btn-toinstlist .icon-toinstlist{width:12px;height:12px;display:-moz-inline-stack;display:inline-block;vertical-align:middle;*vertical-align:auto;zoom:1;*display:inline;background:url(images/toinstlist.png) center 1px no-repeat}.console-sub-title+.table{margin-top:0px}.table-header{border:1px solid #e1e6eb;width:100%;z-index:1;margin-bottom:-1px;padding:8px;line-height:32px;display:table}.table-header+.table{margin-top:0px}.table{background:#FFF;font-size:12px;border-top:1px solid #e1e6eb;margin-top:8px;border:1px solid #e1e6eb}.table thead tr th{padding:8px 8px;font-weight:normal;color:#999;border-bottom:1px solid #e1e6eb;background-color:#F5F6FA}.table thead tr th a.dropdown-toggle{color:#999}.table thead tr th .dropdown.open a{color:#333}.table tbody tr td{padding:12px 8px;border-top:0px;border-bottom:1px solid #e1e6eb;vertical-align:middle}.table tbody tr td p{margin-bottom:0px}.table tfoot tr td{padding:12px 8px;border-bottom:1px solid #e1e6eb;vertical-align:middle}.table .text-right .dropdown-menu{text-align:left;left:auto;right:0px}.table-hover tbody tr:hover td{background-color:#F9F9FA}.pagination{margin:0px;vertical-align:middle;border-radius:0px}.pagination li a,.pagination li span{height:32px;line-height:20px;color:#333;cursor:pointer;border-color:#CCC}.pagination li a:hover{color:#FFF;background-color:#28B5D6;border-color:#28B5D6}.pagination li span{color:#999}.pagination li span:hover{background:none}.pagination li:first-child>a,.pagination li:first-child>span{border-radius:0px}.pagination li:last-child>a,.pagination li:last-child>span{border-radius:0px}.pagination li.active a,.pagination li.active span{background-color:#09C;border:1px solid #09C}.pagination li.active a:hover,.pagination li.active span:hover{background-color:#09C;border:1px solid #09C}.pagination-info{display:-moz-inline-stack;display:inline-block;vertical-align:middle;*vertical-align:auto;zoom:1;*display:inline;padding:0px 16px;color:#888}.form-group{margin-top:8px;margin-bottom:16px}.help-block{margin:4px 0px}.form-control{height:32px;border-radius:0px;padding:6px;-webkit-transition:none;transition:none;font-size:12px}.form-control:focus{-webkit-box-shadow:none;box-shadow:none}.form-control[size],.form-control[cols],.form-control.autosize{width:auto}.form-control.inline{display:-moz-inline-stack;display:inline-block;vertical-align:middle;*vertical-align:auto;zoom:1;*display:inline}select{color:#555555;vertical-align:middle;background-color:#ffffff;background-image:none;border:1px solid #cccccc}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#090}.has-success .form-control,input.ng-valid.ng-dirty,textarea.ng-valid.ng-dirty{border-color:#090}.has-success .form-control:focus,input.ng-valid.ng-dirty:focus,textarea.ng-valid.ng-dirty:focus{border-color:#2A0;-webkit-box-shadow:none;box-shadow:none}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#F90}.has-warning .form-control{border-color:#F90}.has-warning .form-control:focus{border-color:#FA0;-webkit-box-shadow:none;box-shadow:none}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#E40}.has-error .form-control,input.ng-invalid.ng-dirty,textarea.ng-invalid.ng-dirty{border-color:#E40}.has-error .form-control:focus,input.ng-invalid.ng-dirty:focus,textarea.ng-invalid.ng-dirty:focus{border-color:#F30;-webkit-box-shadow:none;box-shadow:none}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{color:#999}label.control-label{font-weight:normal;font-size:12px;color:#666}.form-inline .form-group{margin:4px 8px 4px 0px}.form-inline .form-control{width:auto}.form-inline .input-group-btn{width:auto}select.input-lg,.input-lg{height:40px}select.input-sm,.input-sm{height:24px}.console-onoff{vertical-align:middle;width:50px;height:20px;display:-moz-inline-stack;display:inline-block;vertical-align:middle;*vertical-align:auto;zoom:1;*display:inline;background-image:url("images/on-off.png");background-image:-webkit-image-set(url("images/on-off.png") 1x, url("images/on-off@2x.png") 2x);background-image:-moz-image-set(url("images/onoff.png") 1x, url("images/onoff@2x.png") 2x);background-image:-o-image-set(url("images/onoff.png") 1x, url("images/onoff@2x.png") 2x);background-image:-ms-image-set(url("images/onoff.png") 1x, url("images/onoff@2x.png") 2x);background-repeat:no-repeat;background-position:0px 0px;cursor:pointer}.console-onoff .onoff-handle{display:block;width:50px;height:20px;-webkit-transition:background-position 0.2s ease;-moz-transition:background-position 0.2s ease;-o-transition:background-position 0.2s ease;transition:background-position 0.2s ease;background-image:url("images/on-off.png");background-image:-webkit-image-set(url("images/on-off.png") 1x, url("images/on-off@2x.png") 2x);background-image:-moz-image-set(url("images/onoff.png") 1x, url("images/onoff@2x.png") 2x);background-image:-o-image-set(url("images/onoff.png") 1x, url("images/onoff@2x.png") 2x);background-image:-ms-image-set(url("images/onoff.png") 1x, url("images/onoff@2x.png") 2x);background-repeat:no-repeat;background-position:0px 0px}.console-onoff .onoff-loading{display:block;width:50px;height:20px;-webkit-transition:background-position 0.2s ease;-moz-transition:background-position 0.2s ease;-o-transition:background-position 0.2s ease;transition:background-position 0.2s ease;background-image:url("images/on-off-loading.gif");background-image:-webkit-image-set(url("images/on-off-loading.gif") 1x, url("images/on-off-loading@2x.gif") 2x);background-image:-moz-image-set(url("images/on-off-loading.gif") 1x, url("images/on-off-loading@2x.gif") 2x);background-image:-o-image-set(url("images/on-off-loading.gif") 1x, url("images/on-off-loading@2x.gif") 2x);background-image:-ms-image-set(url("images/on-off-loading.gif") 1x, url("images/on-off-loading@2x.gif") 2x);background-repeat:no-repeat;background-position:0px 0px}.console-onoff-on{background-position:0px -40px}.console-onoff-on .onoff-handle{background-position:0px 0px}.console-onoff-on .onoff-loading{background-position:32px 4px}.console-onoff-off{background-position:0px -60px}.console-onoff-off .onoff-handle{background-position:-28px 0px}.console-onoff-off .onoff-loading{background-position:4px 4px}.console-onoff[disabled="disabled"]{cursor:not-allowed;background-position:0px -80px}.console-onoff[disabled="disabled"] .onoff-loading{display:none}.console-onoff-on[disabled="disabled"] .onoff-handle{background-position:0px -20px}.console-onoff-off[disabled="disabled"] .onoff-handle{background-position:-28px -20px}.console-number-spinner{display:-moz-inline-stack;display:inline-block;vertical-align:middle;*vertical-align:auto;zoom:1;*display:inline;vertical-align:middle}.console-number-spinner .form-control{width:auto;float:left;text-indent:-16px}.console-number-spinner .console-number-spinner-action{width:14px;height:30px;float:left;margin-left:-16px;border-left:1px solid #E3E3E3;margin-top:1px}.console-number-spinner .console-number-spinner-action button{width:14px;height:15px;overflow:hidden;line-height:16px;font-size:12px;border:0px;background-color:transparent;padding:0px;margin:0px;display:block;color:#999;text-align:center;outline:0px}.console-number-spinner .console-number-spinner-action button:hover{color:#06C}.console-number-spinner .console-number-spinner-action button[disabled]{color:#999}.console-number-spinner .console-number-spinner-action .console-number-spinner-down{border-top:1px solid #E3E3E3}.console-timepicker{display:-moz-inline-stack;display:inline-block;vertical-align:middle;*vertical-align:auto;zoom:1;*display:inline;vertical-align:middle}.console-datepicker{padding:8px}.console-datepicker thead .h6 th{padding-top:8px}.console-datepicker tbody tr:first-child td{padding-top:8px}.console-datepicker tbody .btn{border:0px !important}.console-datepicker tbody .btn:hover{background:#F3F3F3}.console-datepicker tbody .btn-default{background:transparent}.console-datepicker tbody .active,.console-datepicker tbody .active:hover,.console-datepicker tbody .active span{background:#3C0;color:#FFF}.console-datepicker tbody .btn[disabled="disabled"] .btn[disabled="disabled"] span{color:#CCC}.console-datepicker em{font-size:12px;color:#ACD}.aliyun-console-topbar{position:relative;z-index:100;clear:both;height:50px;background:#09C;font-size:12px;min-width:990px}.aliyun-console-topbar a{text-decoration:none}.aliyun-console-topbar a:focus{outline:none}.aliyun-console-topbar .accessibility-ast{position:absolute;top:-10000px;left:-10000px;width:100px}.aliyun-console-topbar .accessibility-ast:focus{position:absolute;top:0;left:310px}.aliyun-console-topbar .icon-arrow-down{display:inline-block;width:18px;text-align:center;vertical-align:middle;transition:transform 0.2s, vertical-align 0.2s;-o-transition:transform 0.2s, vertical-align 0.2s;-ms-transition:transform 0.2s, vertical-align 0.2s;-moz-transition:transform 0.2s, vertical-align 0.2s;-webkit-transition:transform 0.2s, vertical-align 0.2s}.aliyun-console-topbar .dropdown .dropdown-menu{z-index:1;font-size:12px;border-radius:0;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.aliyun-console-topbar .dropdown .dropdown-menu a{padding:0}.aliyun-console-topbar .dropdown.open .icon-arrow-down{vertical-align:text-top;transform:rotate(180deg);-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg)}.aliyun-console-topbar .topbar-wrap,.aliyun-console-topbar .topbar-logo,.aliyun-console-topbar .topbar-home,.aliyun-console-topbar .topbar-home-link,.aliyun-console-topbar .topbar-nav,.aliyun-console-topbar .topbar-info{height:100%}.aliyun-console-topbar .topbar-left{float:left}.aliyun-console-topbar .topbar-right{float:right}.aliyun-console-topbar .topbar-clearfix:before,.aliyun-console-topbar .topbar-clearfix:after{display:table;content:" "}.aliyun-console-topbar .topbar-clearfix:after{clear:both}.aliyun-console-topbar .topbar-head{background:#008fbf;height:50px;position:relative;z-index:3}.aliyun-console-topbar .topbar-nav{position:relative;z-index:2;background:#09C}.aliyun-console-topbar .topbar-logo,.aliyun-console-topbar .topbar-home{display:block;width:50px;background:#0099cc;font-size:28px;color:#FFF;text-align:center;line-height:50px}.aliyun-console-topbar .topbar-logo span,.aliyun-console-topbar .topbar-home span{line-height:50px}.aliyun-console-topbar .topbar-logo{background:#0087b4}.aliyun-console-topbar .topbar-home{margin-right:1px;font-size:20px}.aliyun-console-topbar .topbar-home:hover{background:#008fbf}.aliyun-console-topbar .topbar-home-link{padding:0 20px;margin-right:1px;background:#09c}.aliyun-console-topbar .topbar-home{-o-transition:all 0.15s, 0.15s;-ms-transition:all 0.15s, 0.15s;-moz-transition:all 0.15s, 0.15s;-webkit-transition:all 0.15s, 0.15s}.aliyun-console-topbar .topbar-btn{color:#fff;font-size:14px;line-height:50px}.aliyun-console-topbar .topbar-btn:hover,.aliyun-console-topbar .topbar-btn.topbar-btn-dark{background:#008fbf}.aliyun-console-topbar .topbar-nav.open .topbar-nav-btn{background:#fff;color:#333}.aliyun-console-topbar .topbar-nav-btn{padding:0 20px;display:inline-block;height:50px}.aliyun-console-topbar .topbar-nav-list{border:none;padding:10px;margin-top:0;white-space:nowrap}.aliyun-console-topbar .topbar-nav-list .topbar-nav-col{display:inline-block;vertical-align:top;padding:0 10px}.aliyun-console-topbar .topbar-nav-list .topbar-nav-item .topbar-nav-item-title{margin:3px 0px;color:#999;font-weight:600}.aliyun-console-topbar .topbar-nav-list .topbar-nav-item .topbar-nav-gap{border-top:1px solid #f2f2f2;width:100%;margin:6px 0 10px}.aliyun-console-topbar .topbar-nav-list .topbar-nav-item ul{padding:0;margin:8px 0 0 0;list-style:none}.aliyun-console-topbar .topbar-nav-list .topbar-nav-item ul li{min-width:160px;height:28px;line-height:28px;margin-bottom:2px}.aliyun-console-topbar .topbar-nav-list .topbar-nav-item ul li a{display:block;height:100%;padding:0 10px;text-decoration:none;color:#333}.aliyun-console-topbar .topbar-nav-list .topbar-nav-item ul li a:hover{background-color:#f2f2f2}.aliyun-console-topbar .topbar-nav-list .topbar-nav-item ul li a .topbar-nav-item-icon{padding-right:2px;font-size:16px;vertical-align:text-bottom;display:inline-block}.aliyun-console-topbar .topbar-nav-list .topbar-nav-item ul li.topbar-unservice a{color:#999}.aliyun-console-topbar .topbar-nav-list .topbar-nav-item ul li.topbar-unservice a .topbar-nav-item-icon{color:#999}.aliyun-console-topbar .topbar-info{background:#008fbf;position:absolute;z-index:1;top:0;right:0}.aliyun-console-topbar .topbar-info .topbar-btn{padding:0 10px;height:50px;display:block;z-index:2;background:#09c}.aliyun-console-topbar .topbar-info .topbar-btn:hover,.aliyun-console-topbar .topbar-info .topbar-btn.topbar-btn-dark{background:#008fbf}.aliyun-console-topbar .topbar-info .topbar-btn.open{position:relative}.aliyun-console-topbar .topbar-info .topbar-btn-search{padding:0;margin-left:1px}.aliyun-console-topbar .topbar-info .topbar-info-gap{color:#fff}.aliyun-console-topbar .topbar-info .dropdown .dropdown-menu{width:100%;min-width:0;margin:0;border:none}.aliyun-console-topbar .topbar-info .dropdown.open .topbar-btn{color:#333;background:#fff;border-bottom:1px solid #eaedf1;position:relative}.aliyun-console-topbar .topbar-info .topbar-info-btn{height:40px;border-bottom:1px solid #eaedf1}.aliyun-console-topbar .topbar-info .topbar-info-btn a{line-height:39px;padding-left:10px}.aliyun-console-topbar .topbar-info .topbar-user-large .dropdown-menu{width:310px;left:auto;right:0}.aliyun-console-topbar .topbar-info .topbar-user-large .dropdown-menu .user-identity{height:80px;padding:8px 16px;position:relative}.aliyun-console-topbar .topbar-info .topbar-user-large .dropdown-menu .user-identity .user-identity-item{height:32px;line-height:32px;display:block}.aliyun-console-topbar .topbar-info .topbar-user-large .dropdown-menu .user-identity .user-identity-colon{padding:0 5px}.aliyun-console-topbar .topbar-info .topbar-user-large .dropdown-menu .user-identity-sign{padding:2px 6px;background:#7ecef4;color:#fff;border-radius:1px}.aliyun-console-topbar .topbar-info .topbar-user-large .dropdown-menu .user-identity-sign-wrap{position:absolute;top:14px;right:30px}.aliyun-console-topbar .topbar-info .topbar-user-large .dropdown-menu .user-btn-link{display:inline-block;color:#06C}.aliyun-console-topbar .topbar-info .topbar-user-large .dropdown-menu .user-btn-link:hover{background:none;text-decoration:underline}.aliyun-console-topbar .topbar-info .topbar-user-large .dropdown-menu .user-btn-link.user-btn-link-signout{float:right;padding:0 16px}.aliyun-console-topbar .topbar-info-item{display:inline-block;margin-left:1px}.aliyun-console-topbar .topbar-notice{position:relative;font-size:12px;margin-left:1px;padding:0 12px 0 8px !important}.aliyun-console-topbar .topbar-notice .topbar-notice-panel{display:none}.aliyun-console-topbar .topbar-notice.open .topbar-notice-panel{display:block}.aliyun-console-topbar .topbar-notice .topbar-notice-panel{position:absolute;top:48px;left:-185px;width:440px;border-radius:2px;z-index:15;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.175);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.175);box-shadow:0 1px 2px rgba(0,0,0,0.175)}.aliyun-console-topbar .topbar-notice .topbar-notice-panel .topbar-notice-arrow{background:url(images/notice-arrow.png) 0 0 no-repeat;width:11px;height:6px;position:absolute;top:-6px;left:220px}.aliyun-console-topbar .topbar-notice .topbar-notice-panel .topbar-notice-head{height:50px;background-color:#eaedf1;padding:0 15px;line-height:50px;color:#333;font-size:14px}.aliyun-console-topbar .topbar-notice .topbar-notice-panel .topbar-notice-body{height:300px;overflow-y:auto;background:#fff;font-size:12px}.aliyun-console-topbar .topbar-notice .topbar-notice-panel .topbar-notice-body ul{list-style:none;margin:0;padding:0}.aliyun-console-topbar .topbar-notice .topbar-notice-panel .topbar-notice-body ul li{height:60px;line-height:20px;border-bottom:1px solid #eaedf1}.aliyun-console-topbar .topbar-notice .topbar-notice-panel .topbar-notice-body ul li a{display:block;height:100%;padding:10px 10px;background:#fff;color:#333}.aliyun-console-topbar .topbar-notice .topbar-notice-panel .topbar-notice-body ul li a .topbar-notice-link{display:block;max-width:300px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color:#06c}.aliyun-console-topbar .topbar-notice .topbar-notice-panel .topbar-notice-body ul li a:hover{background:#f9f9f9}.aliyun-console-topbar .topbar-notice .topbar-notice-panel .topbar-notice-body ul li.topbar-notice-readed a{color:#666}.aliyun-console-topbar .topbar-notice .topbar-notice-panel .topbar-notice-body ul li.topbar-notice-readed a .topbar-notice-time{color:#999}.aliyun-console-topbar .topbar-notice .topbar-notice-panel .topbar-notice-body .topbar-notice-empty{text-align:center;color:#666;margin-top:80px}.aliyun-console-topbar .topbar-notice .topbar-notice-panel .topbar-notice-foot{height:50px;line-height:50px;background:#fff;text-align:center}.aliyun-console-topbar .topbar-notice .topbar-notice-panel .topbar-notice-class{padding:8px 0;float:right}.aliyun-console-topbar .topbar-notice .topbar-notice-panel .topbar-notice-class .topbar-notice-class-name{display:block;height:24px;line-height:24px;width:66px;background:#eaedf1;text-align:center;border-radius:3px}.aliyun-console-topbar .topbar-btn-notice{width:auto;display:block;height:50px}.aliyun-console-topbar .topbar-btn-notice .topbar-btn-notice-icon{font-size:24px;line-height:50px;vertical-align:text-bottom;color:#fff}.aliyun-console-topbar .topbar-btn-notice .topbar-btn-notice-num{font-size:12px;color:#fff;background:#ff9900;border-radius:5px;padding:2px 5px;display:inline-block;margin-top:15px;line-height:16px;vertical-align:top;text-align:center}.aliyun-console-topbar .topbar-btn-notice .topbar-btn-notice-num.topbar-btn-notice-num-zero{color:#00ace9;background-color:#0087b4}.aliyun-console-topbar .topbar-btn-notice .topbar-nav-item-short{padding-left:2px}.aliyun-console-topbar .topbar-qrcode{position:relative;margin-left:1px}.aliyun-console-topbar .topbar-qrcode:hover .topbar-qrcode-panel{display:block}.aliyun-console-topbar .topbar-qrcode .topbar-qrcode-panel{top:50px;left:0;position:absolute;width:130px;padding:12px 8px;background:#fff;border:1px solid #eaedf1;box-shadow:0 1px 3px rgba(0,0,0,0.1);display:none}.aliyun-console-topbar .topbar-qrcode .topbar-qrcode-image{width:100px;margin:0 auto}.aliyun-console-topbar .topbar-qrcode .topbar-qrcode-title{text-align:center;padding-top:10px}.aliyun-console-topbar .topbar-new-icon{position:relative;top:-4px;padding-left:2px}.aliyun-console-topbar-search{position:relative;z-index:1}.aliyun-console-topbar-search:hover{background:#008fbf}.aliyun-console-topbar-search:hover .topbar-search-ask{background:#008fbf}.aliyun-console-topbar-search .topbar-search-ask{width:200px;height:50px;border:0;background:#09c;line-height:26px;padding:12px 30px 12px 10px;display:block;color:#fff;-webkit-border-radius:1px 1px;-moz-border-radius:1px / 1px;border-radius:1px / 1px;-o-transition:all 0.15s, 0.15s;-ms-transition:all 0.15s, 0.15s;-moz-transition:all 0.15s, 0.15s;-webkit-transition:all 0.15s, 0.15s}.aliyun-console-topbar-search .topbar-search-ask:focus{outline:none}.aliyun-console-topbar-search .topbar-search-ask-shade{color:#00ace9}.aliyun-console-topbar-search .topbar-search-mark{font-size:16px;line-height:50px;position:absolute;height:50px;width:40px;color:#fff;text-decoration:none;display:block;text-align:center;top:0;right:0}.aliyun-console-topbar-search .topbar-search-mark .icon-search,.aliyun-console-topbar-search .topbar-search-mark .icon-enter{line-height:50px}.aliyun-console-topbar-search.topbar-search-active{background:#008fbf}.aliyun-console-topbar-search.topbar-search-active .topbar-search-ask{background:#008fbf}.aliyun-console-topbar-search.topbar-search-active .topbar-search-ask-shade{color:#fff}.aliyun-console-topbar-search-v1_3_21{position:relative}.aliyun-console-topbar-search-v1_3_21.topbar-search-dropdown-open .topbar-btn{background:#008fbf}.aliyun-console-topbar-search-v1_3_21 .icon-search{font-size:16px;padding-right:4px;position:relative;top:2px}.aliyun-console-topbar-search-v1_3_21 .topbar-search-dropdown{height:38px;position:absolute;bottom:-38px;right:-1px;border:2px solid #008fbf;background:#fff}.aliyun-console-topbar-search-v1_3_21 .topbar-search-dropdown input{display:block;height:34px;padding:4px 6px;margin-right:30px;width:250px;border-width:0;outline:0;line-height:34px;color:#546478;font-size:12px}.aliyun-console-topbar-search-v1_3_21 .topbar-search-dropdown .topbar-search-mark{position:absolute;right:0;top:0;height:34px;width:34px;display:block;line-height:34px;text-align:center;color:#546478}.aliyun-console-topbar-help{position:fixed;top:0;right:0;bottom:0}.aliyun-console-topbar-help .topbar-help-inner{width:486px;overflow:hidden;background:#fff;border-left:1px solid #e1e6eb;position:absolute;right:-486px;-webkit-box-shadow:0 0px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 0px 10px rgba(0,0,0,0.1);box-shadow:0 0px 10px rgba(0,0,0,0.1);-o-transition:all 0.2s ease, 0.2s ease;-ms-transition:all 0.2s ease, 0.2s ease;-moz-transition:all 0.2s ease, 0.2s ease;-webkit-transition:all 0.2s ease, 0.2s ease;z-index:1;top:50px;bottom:0}.aliyun-console-topbar-help .topbar-help-inner.topbar-help-show{right:0px}.aliyun-console-topbar-help .topbar-help-head{height:68px;padding-left:20px;line-height:68px;border-bottom:1px solid #e1e6eb;position:relative;color:#333}.aliyun-console-topbar-help .topbar-help-body{position:absolute;top:68px;bottom:0;background:#fff}.aliyun-console-topbar-help .topbar-help-iframe{height:100%}.aliyun-console-topbar-help .topbar-help-close{font-size:18px;float:right;height:68px;width:68px;line-height:68px !important;text-align:center;color:#546478;cursor:pointer;user-select:none;-webkit-user-select:none;-moz-user-select:none}.aliyun-console-topbar-help .topbar-help-close:hover{color:#000}.console-topbar-new{position:relative;z-index:100;clear:both;height:40px;background:#34383c;font-size:12px;min-width:1000px}.console-topbar-new .console-topbar-btn{width:50px;height:40px;display:inline-block;vertical-align:middle;margin-right:1px;background-color:#2a2e31;text-decoration:none;text-align:center;color:#fff;line-height:40px;-o-transition:all 0.3s;-ms-transition:all 0.3s;-moz-transition:all 0.3s;-webkit-transition:all 0.3s}.console-topbar-new .console-topbar-btn .console-topbar-btn-text{font-size:14px;text-align:center;white-space:nowrap;display:none}.console-topbar-new .console-topbar-btn .console-topbar-btn-icon{font-size:22px;display:inline;line-height:40px;color:#fff}.console-topbar-new .console-topbar-btn .caret{-o-transition:-o-transform 0.3s;-ms-transition:-ms-transform 0.3s;-moz-transition:-moz-transform 0.3s;-webkit-transition:-webkit-transform 0.3s;transition:transform 0.3s}.console-topbar-new .console-topbar-btn:hover{width:auto}.console-topbar-new .console-topbar-btn:hover.console-topbar-btn-inverse,.console-topbar-new .console-topbar-btn:hover.console-topbar-btn-inverse-white{background-color:#585e65;color:#fff}.console-topbar-new .console-topbar-btn:hover .console-topbar-btn-text{display:inline}.console-topbar-new .console-topbar-btn:hover .console-topbar-btn-icon{display:none;vertical-align:text-bottom}.console-topbar-new .console-topbar-btn:hover.console-topbar-btn-home{width:106px}.console-topbar-new .console-topbar-btn:hover.console-topbar-btn-nav{width:120px}.console-topbar-new .console-topbar-btn:hover.console-topbar-btn-ak{width:104px}.console-topbar-new .console-topbar-btn:hover.console-topbar-btn-workorder{width:94px}.console-topbar-new .console-topbar-btn.console-topbar-btn-last{margin-right:0}.console-topbar-new .console-topbar-btn.console-topbar-logo-icon{-o-transition:none;-ms-transition:none;-moz-transition:none;-webkit-transition:none;color:#2a2e31}.console-topbar-new .console-topbar-btn.console-topbar-logo-icon img{width:22px;height:22px;display:block;margin:9px 14px}.console-topbar-new .console-topbar-btn.console-topbar-nav-link{font-size:12px;width:auto;padding:0 15px}.console-topbar-new .console-topbar-btn.console-topbar-nav-link .console-topbar-nav-link-icon{width:16px;height:19px;vertical-align:middle;position:relative;display:inline-block;margin-right:4px;overflow:hidden;font-size:16px}.console-topbar-new .console-topbar-btn.console-topbar-btn-user{width:auto}.console-topbar-new .console-topbar-btn.console-topbar-btn-user .console-topbar-btn-text{display:inline;padding:0 15px}.console-topbar-new .console-topbar-btn.console-topbar-btn-notice{width:auto;padding:0 10px}.console-topbar-new .console-topbar-btn.console-topbar-btn-notice .console-topbar-btn-notice-icon{font-size:24px;line-height:40px;vertical-align:text-bottom}.console-topbar-new .console-topbar-btn.console-topbar-btn-notice .console-topbar-btn-notice-num{font-size:12px;color:#fff;background:#ff9900;border-radius:5px;padding:2px 1px;width:20px;display:inline-block;margin-top:10px;line-height:16px;vertical-align:top}.console-topbar-new .console-topbar-btn.console-topbar-btn-notice .console-topbar-btn-notice-num.console-topbar-btn-notice-num-zero{color:#999;background-color:#34383c}.console-topbar-new .console-topbar-btn.console-topbar-btn-notice .console-topbar-nav-item-short{padding-left:2px}.console-topbar-new .console-topbar-btn.console-topbar-btn-ak{overflow:hidden}.console-topbar-new .console-topbar-btn.console-topbar-btn-nav{overflow:hidden;position:relative;z-index:2}.console-topbar-new .console-topbar-nav .console-topbar-nav-list{border:1px solid #ddd;border-top:none;padding:10px;margin-top:0;margin-left:-1px}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-col{float:left;padding:0 10px}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item .console-topbar-nav-item-title{margin:3px 0px;color:#999;font-weight:600}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item .console-topbar-nav-gap{border-top:1px solid #f2f2f2;width:100%;margin:10px 0}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul{padding:0;margin:10px 0 0 0;list-style:none}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li{width:170px;height:30px;line-height:30px;margin-bottom:2px}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li a{display:block;height:100%;padding-left:10px;text-decoration:none;color:#333}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li a:hover{background-color:#f2f2f2}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li a .console-topbar-nav-item-icon{padding-right:2px;font-size:16px;vertical-align:text-bottom}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li a .console-topbar-nav-item-icon.icon-ecs{color:#007eff}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li a .console-topbar-nav-item-icon.icon-slb{color:#f27741}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li a .console-topbar-nav-item-icon.icon-rds{color:#20f8b8}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li a .console-topbar-nav-item-icon.icon-oss{color:#ade675}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li a .console-topbar-nav-item-icon.icon-cdn{color:#bff3fe}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li a .console-topbar-nav-item-icon.icon-ots{color:#15d4f0}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li a .console-topbar-nav-item-icon.icon-ocs{color:#40ff8f}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li a .console-topbar-nav-item-icon.icon-odps{color:#ffba00}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li a .console-topbar-nav-item-icon.icon-ace{color:#c8341c}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li a .console-topbar-nav-item-icon.icon-yundun{color:#298edb}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li a .console-topbar-nav-item-icon.icon-yunjiankong{color:#86f2af}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li a .console-topbar-nav-item-icon.icon-sls{color:#075ac0}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li a .console-topbar-nav-item-icon.icon-oas{color:#79df71}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li a .console-topbar-nav-item-icon.icon-ess{color:#0cf}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li a .console-topbar-nav-item-icon.icon-mqs{color:#fff400}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li a .console-topbar-nav-item-icon.icon-vpc{color:#6cf}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li a .console-topbar-nav-item-icon.icon-opensearch{color:#5bc8e8}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li a .console-topbar-nav-item-icon.icon-lightcloud{color:#6bbd52}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li a .console-topbar-nav-item-icon.icon-pts{color:#009dff}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li a .console-topbar-nav-item-icon.icon-ons{color:#6b3100}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li a .console-topbar-nav-item-icon.icon-dpc{color:#289de9}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li a .console-topbar-nav-item-icon.icon-ads{color:#71ceec}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li a .console-topbar-nav-item-icon.icon-mts{color:#f93}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li a .console-topbar-nav-item-icon.icon-drds{color:#6f9}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li.console-topbar-unservice a{color:#999}.console-topbar-new .console-topbar-nav .console-topbar-nav-list .console-topbar-nav-item ul li.console-topbar-unservice a .console-topbar-nav-item-icon{color:#999}.console-topbar-new .dropdown .dropdown-menu{z-index:1;border-radius:0;-webkit-box-shadow:0 2px 4px rgba(0,0,0,0.175);-moz-box-shadow:0 2px 4px rgba(0,0,0,0.175);box-shadow:0 2px 4px rgba(0,0,0,0.175)}.console-topbar-new .dropdown.open .console-topbar-btn.console-topbar-btn-inverse{background-color:#585e65;color:#fff}.console-topbar-new .dropdown.open .console-topbar-btn.console-topbar-btn-inverse-white{background-color:#fff;color:#333}.console-topbar-new .dropdown.open .console-topbar-btn .console-topbar-btn-text{display:inline}.console-topbar-new .dropdown.open .console-topbar-btn .console-topbar-btn-icon{display:none;vertical-align:text-bottom}.console-topbar-new .dropdown.open .console-topbar-btn:hover.console-topbar-btn-inverse-white{background-color:#fff !important;color:#333 !important}.console-topbar-new .dropdown.open .console-topbar-btn.console-topbar-btn-nav{width:120px}.console-topbar-new .dropdown.open .console-topbar-btn.console-topbar-btn-workorder{width:94px}.console-topbar-new .dropdown.open .console-topbar-btn .caret{transform:rotate(180deg);-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg)}.console-topbar-new .console-topbar-user .dropdown-menu,.console-topbar-new .console-topbar-dropdown .dropdown-menu{margin-top:-1px}.console-topbar-new .console-topbar-user .dropdown-menu>li a,.console-topbar-new .console-topbar-dropdown .dropdown-menu>li a{padding:6px 20px}.console-topbar-new .console-topbar-workorder .dropdown-menu{min-width:96px}.console-topbar-new .console-topbar-workorder .dropdown-menu>li a{padding:6px 24px 6px 16px}.console-topbar-new .console-topbar-notice{position:relative}.console-topbar-new .console-topbar-notice .console-topbar-notice-panel{display:none}.console-topbar-new .console-topbar-notice.open .console-topbar-notice-panel{display:block}.console-topbar-new .console-topbar-notice .console-topbar-notice-panel{position:absolute;top:38px;left:-170px;width:390px;border:1px solid #bbb;border-radius:2px;z-index:15;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.175);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.175);box-shadow:0 1px 2px rgba(0,0,0,0.175)}.console-topbar-new .console-topbar-notice .console-topbar-notice-panel .console-topbar-notice-arrow{background:url(images/notice-arrow.png) 0 0 no-repeat;width:11px;height:6px;position:absolute;top:-6px;left:196px}.console-topbar-new .console-topbar-notice .console-topbar-notice-panel .console-topbar-notice-head{height:40px;border-bottom:1px solid #ccc;background-color:#f2f2f2;padding:0 15px;line-height:40px;color:#333;font-size:14px}.console-topbar-new .console-topbar-notice .console-topbar-notice-panel .console-topbar-notice-body{height:240px;overflow-y:auto;background:#fff}.console-topbar-new .console-topbar-notice .console-topbar-notice-panel .console-topbar-notice-body ul{list-style:none;margin:0 5px;padding:0}.console-topbar-new .console-topbar-notice .console-topbar-notice-panel .console-topbar-notice-body ul li{height:40px;line-height:40px;border-bottom:1px solid #ececec}.console-topbar-new .console-topbar-notice .console-topbar-notice-panel .console-topbar-notice-body ul li a{display:block;height:100%;padding:0 10px;background:#fff}.console-topbar-new .console-topbar-notice .console-topbar-notice-panel .console-topbar-notice-body ul li a span{display:block}.console-topbar-new .console-topbar-notice .console-topbar-notice-panel .console-topbar-notice-body ul li a .console-topbar-notice-link{float:left;max-width:272px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.console-topbar-new .console-topbar-notice .console-topbar-notice-panel .console-topbar-notice-body ul li a .console-topbar-notice-time{float:right;color:#333}.console-topbar-new .console-topbar-notice .console-topbar-notice-panel .console-topbar-notice-body ul li a:hover{background:#f9f9f9}.console-topbar-new .console-topbar-notice .console-topbar-notice-panel .console-topbar-notice-body ul li.console-topbar-notice-readed a{color:#666}.console-topbar-new .console-topbar-notice .console-topbar-notice-panel .console-topbar-notice-body ul li.console-topbar-notice-readed a .console-topbar-notice-time{color:#999}.console-topbar-new .console-topbar-notice .console-topbar-notice-panel .console-topbar-notice-body .console-topbar-notice-empty{text-align:center;color:#666;margin-top:80px}.console-topbar-new .console-topbar-notice .console-topbar-notice-panel .console-topbar-notice-foot{height:48px;line-height:48px;background:#fff}.console-topbar-new .console-topbar-notice .console-topbar-notice-panel .console-topbar-notice-foot .console-topbar-notice-more{padding-right:15px}.console-topbar-new .console-topbar-locale{float:left}.console-topbar-new .console-topbar-locale .dropdown-menu{right:0;left:auto;margin-top:-1px;width:50px;min-width:60px}.console-topbar-new .console-topbar-locale .console-topbar-btn.console-topbar-btn-locale{width:60px;background:none}.console-topbar-new .console-topbar-locale .console-topbar-btn.console-topbar-btn-locale .console-topbar-btn-text{display:block}.console-topbar-new.console-topbar-new-en .console-topbar-btn:hover.console-topbar-btn-home{width:116px}.console-topbar-new.console-topbar-new-en .console-topbar-btn:hover.console-topbar-btn-nav{width:170px}.console-topbar-new.console-topbar-new-en .console-topbar-btn:hover.console-topbar-btn-workorder{width:146px}.console-topbar-new.console-topbar-new-en .console-topbar-nav .console-topbar-nav-item ul li{width:auto !important}.console-topbar-new.console-topbar-new-en .console-topbar-nav .console-topbar-nav-item ul li a{padding:0 10px}.console-topbar-new.console-topbar-new-en .dropdown.open .console-topbar-btn.console-topbar-btn-nav{width:170px}.console-topbar-new.console-topbar-new-en .dropdown.open .console-topbar-btn.console-topbar-btn-workorder{width:146px}.console-navbar{font-size:12px;color:#666666;word-wrap:break-word;height:56px;border:none;border-bottom:1px solid #dddddd;box-shadow:0px 0px 4px rgba(0,0,0,0.1);position:relative;box-sizing:content-box;margin-bottom:0px;background-color:#fff;border-radius:0 !important;z-index:2}.console-navbar *{box-sizing:content-box}.console-navbar a{color:#333}.console-navbar .console-navbar-title{float:left;line-height:56px;padding:0 40px 0 14px;font-size:18px;color:#999999}.console-navbar .console-navbar-title .console-navbar-subtitle{margin-right:5px}.console-navbar .nav li{float:left;display:inline;margin:0 20px;height:56px;font-size:14px}.console-navbar .nav li a{padding:0 2px;float:left;height:55px;color:#333333;line-height:56px;text-decoration:none}.console-navbar .nav li a:hover,.console-navbar .nav li a:focus{background-color:#fff}.console-navbar .nav li.active{height:55px}.console-navbar .nav li.active a{color:#ff4902;border-bottom:2px solid #ff4902}.console-navbar .console-navbar-a-default{cursor:default}.console-navbar .console-navbar-links-example{margin-top:15px;padding:0 15px 0;line-height:24px;border-left:1px solid #eeeeee}.console-navbar .console-navbar-links-example a{color:#b3b3b3}.console-title{padding:16px 0px;min-height:70px}.console-title .nav-pills{display:inline-block;vertical-align:bottom}.console-title .nav-pills li a,.console-title .nav-pills li a:focus,.console-title .nav-pills li button,.console-title .nav-pills li button:focus{padding:6px 6px}.console-title h1,.console-title h2,.console-title h3,.console-title h4,.console-title h5,.console-title h6{display:inline-block;text-indent:8px;border-left:2px solid #88B7E0;margin-top:0px;margin-bottom:0px;margin-right:8px}.console-title h1{margin-top:0px;margin-bottom:0px}.console-title h2{margin-top:2px;margin-bottom:2px}.console-title h3{margin-top:4px;margin-bottom:4px}.console-title h4{margin-top:6px;margin-bottom:6px}.console-title h5{margin-top:8px;margin-bottom:8px}.console-title-border{border-bottom:1px solid #DDD}.console-sub-title{position:relative;padding-left:16px;margin-bottom:-1px;display:table;width:100%;z-index:1;height:40px;border:1px solid #E1E6EB;border-left:3px solid #778;background-color:#F4F5F9}.console-sub-title h5{color:#666;font-size:14px}.console-box-border{border:1px solid #E1E6EB}.margin-left,.margin-left-1{margin-left:8px !important}.margin-left-2{margin-left:16px !important}.margin-left-3{margin-left:24px !important}.margin-left-4{margin-left:32px !important}.margin-right,.margin-right-1{margin-right:8px !important}.margin-right-2{margin-right:16px !important}.margin-right-3{margin-right:24px !important}.margin-right-4{margin-right:32px !important}.margin-top,.margin-top-1{margin-top:8px !important}.margin-top-2{margin-top:16px !important}.margin-top-3{margin-top:24px !important}.margin-top-4{margin-top:32px !important}.row-padding-1{padding-top:8px;padding-bottom:8px}.row-padding,.row-padding-2{padding-top:16px;padding-bottom:16px}.row-padding-3{padding-top:24px;padding-bottom:24px}.row-padding-4{padding-top:32px;padding-bottom:32px}.row-margin-1{margin-top:8px;margin-bottom:8px}.row-margin,.row-margin-2{margin-top:16px;margin-bottom:16px}.row-margin-3{margin-top:24px;margin-bottom:24px}.row-margin-4{margin-top:32px;margin-bottom:32px}.col-padding-1{padding-left:8px;padding-right:8px}.col-padding,.col-padding-2{padding-left:16px;padding-right:16px}.col-padding-3{padding-left:24px;padding-right:24px}.col-padding-4{padding-left:32px;padding-right:32px}.col-margin-1{margin-left:8px;margin-right:8px}.col-margin,.col-margin-2{margin-left:16px;margin-right:16px}.col-margin-3{margin-left:24px;margin-right:24px}.col-margin-4{margin-left:32px;margin-right:32px}.inline-block{display:inline-block !important;display:-moz-inline-stack;display:inline-block;vertical-align:middle;*vertical-align:auto;zoom:1;*display:inline}.partition{display:-moz-inline-stack;display:inline-block;vertical-align:middle;*vertical-align:auto;zoom:1;*display:inline;padding:0px 4px}.no-data{padding:24px 0px;text-align:center;color:#666}@font-face{font-family:'aliyun-console-font';src:url("fonts/aliyun-console-font.eot?t91au5");src:url("fonts/aliyun-console-font.eot?t91au5#iefix") format("embedded-opentype"),url("fonts/aliyun-console-font.ttf?t91au5") format("truetype"),url("fonts/aliyun-console-font.woff?t91au5") format("woff"),url("fonts/aliyun-console-font.svg?t91au5#aliyun-console-font") format("svg");font-weight:normal;font-style:normal}[class^="icon-"],[class*=" icon-"]{font-family:'aliyun-console-font' !important;speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon-logo2:before{content:"\e63b"}.icon-logo1:before{content:"\e63a"}.icon-logo-new:before{content:"\e97f"}.icon-dms-2:before{content:"\e92d"}.icon-dms-3:before{content:"\e92e"}.icon-dms:before{content:"\e92f"}.icon-gpdb-2:before{content:"\e983"}.icon-gpdb-3:before{content:"\e984"}.icon-gpdb:before{content:"\e985"}.icon-schedulerx-2:before{content:"\e986"}.icon-schedulerx-3:before{content:"\e987"}.icon-schedulerx:before{content:"\e988"}.icon-txc-2:before{content:"\e989"}.icon-txc-3:before{content:"\e98a"}.icon-txc:before{content:"\e98b"}.icon-csb-2:before{content:"\e909"}.icon-csb-3:before{content:"\e90a"}.icon-csb:before{content:"\e90b"}.icon-mobsec-2:before{content:"\e96d"}.icon-mobsec-3:before{content:"\e96e"}.icon-mobsec:before{content:"\e96f"}.icon-mss-2:before{content:"\e970"}.icon-mss-3:before{content:"\e971"}.icon-mss:before{content:"\e972"}.icon-sos-2:before{content:"\e973"}.icon-sos-3:before{content:"\e974"}.icon-sos:before{content:"\e975"}.icon-sppc-2:before{content:"\e976"}.icon-sppc-3:before{content:"\e977"}.icon-sppc:before{content:"\e978"}.icon-webfirewall-2:before{content:"\e979"}.icon-webfirewall-3:before{content:"\e97a"}.icon-webfirewall:before{content:"\e97b"}.icon-xianzhi-2:before{content:"\e97c"}.icon-xianzhi-3:before{content:"\e97d"}.icon-xianzhi:before{content:"\e97e"}.icon-livevideo-2:before{content:"\e964"}.icon-livevideo-3:before{content:"\e965"}.icon-livevideo:before{content:"\e966"}.icon-slm-2:before{content:"\e967"}.icon-slm-3:before{content:"\e968"}.icon-slm:before{content:"\e969"}.icon-vod-2:before{content:"\e96a"}.icon-vod-3:before{content:"\e96b"}.icon-vod:before{content:"\e96c"}.icon-kms-2:before{content:"\e95e"}.icon-kms-3:before{content:"\e95f"}.icon-kms:before{content:"\e960"}.icon-nas-2:before{content:"\e961"}.icon-nas-3:before{content:"\e962"}.icon-nas:before{content:"\e963"}.icon-apigateway-2:before{content:"\e94f"}.icon-apigateway-3:before{content:"\e950"}.icon-apigateway:before{content:"\e951"}.icon-oceanbase-2:before{content:"\e952"}.icon-oceanbase-3:before{content:"\e953"}.icon-oceanbase:before{content:"\e954"}.icon-petadata-2:before{content:"\e955"}.icon-petadata-3:before{content:"\e956"}.icon-petadata:before{content:"\e957"}.icon-ecsm-2:before{content:"\e958"}.icon-ecsm-3:before{content:"\e959"}.icon-ecsm:before{content:"\e95a"}.icon-yundunzhengshu-2:before{content:"\e95b"}.icon-yundunzhengshu-3:before{content:"\e95c"}.icon-yundunzhengshu:before{content:"\e95d"}.icon-cdi-2:before{content:"\e93a"}.icon-cdi-3:before{content:"\e93b"}.icon-cdi:before{content:"\e93c"}.icon-disk-2:before{content:"\e93d"}.icon-disk-3:before{content:"\e93e"}.icon-disk:before{content:"\e93f"}.icon-dsi-2:before{content:"\e940"}.icon-dsi-3:before{content:"\e941"}.icon-dsi:before{content:"\e942"}.icon-hpc-2:before{content:"\e943"}.icon-hpc-3:before{content:"\e944"}.icon-hpc:before{content:"\e945"}.icon-httpdns-2:before{content:"\e946"}.icon-httpdns-3:before{content:"\e947"}.icon-httpdns:before{content:"\e948"}.icon-iot-2:before{content:"\e949"}.icon-iot-3:before{content:"\e94a"}.icon-iot2:before{content:"\e94b"}.icon-vipaegis-2:before{content:"\e94c"}.icon-vipaegis-3:before{content:"\e94d"}.icon-vipaegis:before{content:"\e94e"}.icon-cs-2:before{content:"\e92a"}.icon-cs-3:before{content:"\e92b"}.icon-cs:before{content:"\e92c"}.icon-ewh-2:before{content:"\e930"}.icon-ewh-3:before{content:"\e931"}.icon-ewh:before{content:"\e932"}.icon-expressconnect-2:before{content:"\e933"}.icon-expressconnect-3:before{content:"\e934"}.icon-expressconnect:before{content:"\e935"}.icon-hsm-2:before{content:"\e936"}.icon-hsm-3:before{content:"\e937"}.icon-hsm:before{content:"\e938"}.icon-kuaizhaolian:before{content:"\e939"}.icon-mongodb-2:before{content:"\e927"}.icon-mongodb-3:before{content:"\e928"}.icon-mongodb:before{content:"\e929"}.icon-actiontrail-2:before{content:"\e90f"}.icon-actiontrail-3:before{content:"\e910"}.icon-actiontrail:before{content:"\e911"}.icon-ats-2:before{content:"\e912"}.icon-ats-3:before{content:"\e913"}.icon-ats:before{content:"\e914"}.icon-cli-2:before{content:"\e915"}.icon-cli-3:before{content:"\e916"}.icon-cli:before{content:"\e917"}.icon-directmail-2:before{content:"\e918"}.icon-directmail-3:before{content:"\e919"}.icon-directmail:before{content:"\e91a"}.icon-eclipse-2:before{content:"\e91b"}.icon-eclipse-3:before{content:"\e91c"}.icon-eclipse:before{content:"\e91d"}.icon-havip-2:before{content:"\e91e"}.icon-havip-3:before{content:"\e91f"}.icon-havip:before{content:"\e920"}.icon-ros-2:before{content:"\e921"}.icon-ros-3:before{content:"\e922"}.icon-ros:before{content:"\e923"}.icon-visualstudio-2:before{content:"\e924"}.icon-visualstudio-3:before{content:"\e925"}.icon-visualstudio:before{content:"\e926"}.icon-emr-2:before{content:"\e90c"}.icon-emr-3:before{content:"\e90d"}.icon-emr:before{content:"\e90e"}.icon-antifraud-3:before{content:"\e903"}.icon-antifraud:before{content:"\e904"}.icon-antifraud-2:before{content:"\e905"}.icon-ddosbasic:before{content:"\e906"}.icon-ddosbasic-3:before{content:"\e907"}.icon-ddosbasic-2:before{content:"\e908"}.icon-aegis:before{content:"\e900"}.icon-aegis-3:before{content:"\e901"}.icon-aegis-2:before{content:"\e902"}.icon-amr-2:before{content:"\e71c"}.icon-amr-3:before{content:"\e71d"}.icon-amr:before{content:"\e71e"}.icon-eip-2:before{content:"\e71f"}.icon-eip-3:before{content:"\e720"}.icon-eip:before{content:"\e721"}.icon-expense-i18n:before{content:"\e71b"}.icon-aps-2:before{content:"\e715"}.icon-aps-3:before{content:"\e716"}.icon-aps:before{content:"\e717"}.icon-batchcompute-2:before{content:"\e718"}.icon-batchcompute-3:before{content:"\e719"}.icon-batchcompute:before{content:"\e71a"}.icon-sas-2:before{content:"\e70c"}.icon-sas-3:before{content:"\e70d"}.icon-sas:before{content:"\e70e"}.icon-scan-2:before{content:"\e70f"}.icon-scan-3:before{content:"\e710"}.icon-scan:before{content:"\e711"}.icon-waf-2:before{content:"\e712"}.icon-waf-3:before{content:"\e713"}.icon-waf:before{content:"\e714"}.icon-mns-2:before{content:"\e709"}.icon-mns-3:before{content:"\e70a"}.icon-mns:before{content:"\e70b"}.icon-qrcode:before{content:"\e708"}.icon-unfold:before{content:"\e707"}.icon-fold:before{content:"\e706"}.icon-form:before{content:"\e6fd"}.icon-accelerate:before{content:"\e6fe"}.icon-feedback:before{content:"\e702"}.icon-vdc-2:before{content:"\e703"}.icon-vdc-3:before{content:"\e704"}.icon-vdc:before{content:"\e705"}.icon-new:before{content:"\e6fc"}.icon-collapse-right:before{content:"\e6fb"}.icon-collapse-left:before{content:"\e6fa"}.icon-aec:before{content:"\e6f3"}.icon-aic:before{content:"\e6f4"}.icon-mobile-2:before{content:"\e6f5"}.icon-amc:before{content:"\e6f6"}.icon-arc:before{content:"\e6f7"}.icon-game:before{content:"\e6f8"}.icon-iot:before{content:"\e6f9"}.icon-right:before{content:"\e6f2"}.icon-afc:before{content:"\e6f0"}.icon-specs:before{content:"\e6f1"}.icon-pen-2:before{content:"\e6c8"}.icon-key:before{content:"\e635"}.icon-bsn:before{content:"\e6ea"}.icon-mac-2:before{content:"\e6eb"}.icon-mac-3:before{content:"\e6ec"}.icon-mac:before{content:"\e6ed"}.icon-fenxiao:before{content:"\e6ee"}.icon-account-2:before{content:"\e6ef"}.icon-qiyeyouxiang-2:before{content:"\e6be"}.icon-qiyeyouxiang-3:before{content:"\e6bf"}.icon-qiyeyouxiang:before{content:"\e6c0"}.icon-yuming-2:before{content:"\e6d3"}.icon-yuming-3:before{content:"\e6df"}.icon-yuming:before{content:"\e6e0"}.icon-yumingyuwangzhan-2:before{content:"\e6e1"}.icon-yumingyuwangzhan-3:before{content:"\e6e2"}.icon-yumingyuwangzhan:before{content:"\e6e3"}.icon-yunjiexi-2:before{content:"\e6e4"}.icon-yunjiexi-3:before{content:"\e6e5"}.icon-yunjiexi:before{content:"\e6e6"}.icon-yunxunizhuji-2:before{content:"\e6e7"}.icon-yunxunizhuji-3:before{content:"\e6e8"}.icon-yunxunizhuji:before{content:"\e6e9"}.icon-api-3:before{content:"\e6d2"}.icon-api-2:before{content:"\e6d4"}.icon-api:before{content:"\e6d5"}.icon-dpa-2:before{content:"\e6d6"}.icon-dpa-3:before{content:"\e6d7"}.icon-dpa:before{content:"\e6d8"}.icon-lvwang-2:before{content:"\e6d9"}.icon-lvwang-3:before{content:"\e6da"}.icon-lvwang:before{content:"\e6db"}.icon-mas-2:before{content:"\e6dc"}.icon-mas-3:before{content:"\e6dd"}.icon-mas:before{content:"\e6de"}.icon-dts-2:before{content:"\e6cf"}.icon-dts-3:before{content:"\e6d0"}.icon-dts:before{content:"\e6d1"}.icon-android:before{content:"\e6c9"}.icon-cps-2:before{content:"\e6ca"}.icon-cps-3:before{content:"\e6cb"}.icon-cps:before{content:"\e6cc"}.icon-ios:before{content:"\e6cd"}.icon-vitality:before{content:"\e6ce"}.icon-dfs-2:before{content:"\e6bb"}.icon-dfs-3:before{content:"\e6bc"}.icon-dfs:before{content:"\e6bd"}.icon-edas-2:before{content:"\e6c1"}.icon-edas-3:before{content:"\e6c2"}.icon-edas:before{content:"\e6c3"}.icon-enter:before{content:"\e6c4"}.icon-usableCenter-2:before{content:"\e6c5"}.icon-usableCenter-3:before{content:"\e6c6"}.icon-usableCenter:before{content:"\e6c7"}.icon-ace-2:before{content:"\e600"}.icon-ace:before{content:"\e601"}.icon-add-1:before{content:"\e602"}.icon-add-2:before{content:"\e603"}.icon-add:before{content:"\e604"}.icon-ads-2:before{content:"\e605"}.icon-ads:before{content:"\e606"}.icon-amplify:before{content:"\e607"}.icon-arrow-down:before{content:"\e608"}.icon-arrow-left:before{content:"\e609"}.icon-arrow-right:before{content:"\e60a"}.icon-arrow-up:before{content:"\e60b"}.icon-backup:before{content:"\e60c"}.icon-bell:before{content:"\e60d"}.icon-buy:before{content:"\e60e"}.icon-calendar:before{content:"\e60f"}.icon-cdn-2:before{content:"\e610"}.icon-cdn:before{content:"\e611"}.icon-cdp:before{content:"\e612"}.icon-clock:before{content:"\e613"}.icon-cloudisk:before{content:"\e614"}.icon-cloudisk2:before{content:"\e615"}.icon-db-g:before{content:"\e616"}.icon-db-r:before{content:"\e617"}.icon-db-sign:before{content:"\e618"}.icon-db-t:before{content:"\e619"}.icon-db:before{content:"\e61a"}.icon-ddos-2:before{content:"\e61b"}.icon-ddos:before{content:"\e61c"}.icon-detail-2:before{content:"\e61d"}.icon-detail:before{content:"\e61e"}.icon-disk-image:before{content:"\e61f"}.icon-down:before{content:"\e620"}.icon-dpc-2:before{content:"\e621"}.icon-dpc:before{content:"\e622"}.icon-drds-2:before{content:"\e623"}.icon-drds:before{content:"\e624"}.icon-ecs-2:before{content:"\e625"}.icon-ecs:before{content:"\e626"}.icon-ess-2:before{content:"\e627"}.icon-ess:before{content:"\e628"}.icon-exec-snapshot-policy:before{content:"\e629"}.icon-goback:before{content:"\e62a"}.icon-graphs:before{content:"\e62b"}.icon-help-1:before{content:"\e62c"}.icon-help-2:before{content:"\e62d"}.icon-help:before{content:"\e62e"}.icon-home:before{content:"\e62f"}.icon-info-1:before{content:"\e630"}.icon-info-2:before{content:"\e631"}.icon-info:before{content:"\e632"}.icon-invite:before{content:"\e633"}.icon-jiankong-2:before{content:"\e634"}.icon-lightcloud-2:before{content:"\e636"}.icon-lightcloud:before{content:"\e637"}.icon-log:before{content:"\e638"}.icon-logo:before{content:"\e639"}.icon-menu:before{content:"\e63c"}.icon-mqs-2:before{content:"\e63d"}.icon-mqs:before{content:"\e63e"}.icon-mts:before{content:"\e63f"}.icon-narrow:before{content:"\e640"}.icon-no-1:before{content:"\e641"}.icon-no-2:before{content:"\e642"}.icon-no:before{content:"\e643"}.icon-oas-2:before{content:"\e644"}.icon-oas:before{content:"\e645"}.icon-ocs-2:before{content:"\e646"}.icon-ocs:before{content:"\e647"}.icon-odps-2:before{content:"\e648"}.icon-odps:before{content:"\e649"}.icon-ons-2:before{content:"\e64a"}.icon-ons:before{content:"\e64b"}.icon-opensearch-2:before{content:"\e64c"}.icon-opensearch:before{content:"\e64d"}.icon-oss-2:before{content:"\e64e"}.icon-oss:before{content:"\e64f"}.icon-ots-2:before{content:"\e650"}.icon-ots:before{content:"\e651"}.icon-pen:before{content:"\e652"}.icon-performance:before{content:"\e653"}.icon-pts-2:before{content:"\e654"}.icon-pts:before{content:"\e655"}.icon-ram-2:before{content:"\e656"}.icon-ram:before{content:"\e657"}.icon-rds-2:before{content:"\e658"}.icon-rds:before{content:"\e659"}.icon-regional:before{content:"\e65a"}.icon-remove-1:before{content:"\e65b"}.icon-remove-2:before{content:"\e65c"}.icon-remove:before{content:"\e65d"}.icon-renew-mgt:before{content:"\e65e"}.icon-safe-lock:before{content:"\e65f"}.icon-safetycontrol:before{content:"\e660"}.icon-search:before{content:"\e661"}.icon-setup:before{content:"\e662"}.icon-shift-in:before{content:"\e663"}.icon-slb-2:before{content:"\e664"}.icon-slb:before{content:"\e665"}.icon-sls-2:before{content:"\e666"}.icon-sls:before{content:"\e667"}.icon-snapshot:before{content:"\e668"}.icon-text-free:before{content:"\e669"}.icon-threshold:before{content:"\e66a"}.icon-tree:before{content:"\e66b"}.icon-unlock:before{content:"\e66c"}.icon-up:before{content:"\e66d"}.icon-updown:before{content:"\e66e"}.icon-viewtable:before{content:"\e66f"}.icon-vpc-2:before{content:"\e670"}.icon-vpc:before{content:"\e671"}.icon-warning-1:before{content:"\e672"}.icon-warning-2:before{content:"\e673"}.icon-warning:before{content:"\e674"}.icon-weekly:before{content:"\e675"}.icon-yes-1:before{content:"\e676"}.icon-yes-2:before{content:"\e677"}.icon-yes:before{content:"\e678"}.icon-yundun-2:before{content:"\e679"}.icon-yundun:before{content:"\e67a"}.icon-yunjiankong:before{content:"\e67b"}.icon-annex:before{content:"\e67c"}.icon-renew:before{content:"\e67d"}.icon-renew-2:before{content:"\e67e"}.icon-plus-border:before{content:"\e67f"}.icon-wo-domain:before{content:"\e680"}.icon-wo-email:before{content:"\e681"}.icon-wo-host:before{content:"\e682"}.icon-wo-sitebuild:before{content:"\e683"}.icon-wo-salepre:before{content:"\e684"}.icon-wo-beian:before{content:"\e685"}.icon-wo-account:before{content:"\e686"}.icon-wo-finance:before{content:"\e687"}.icon-square:before{content:"\e688"}.icon-left:before{content:"\e689"}.icon-upload:before{content:"\e68a"}.icon-list-open:before{content:"\e68b"}.icon-pause:before{content:"\e68c"}.icon-list-close:before{content:"\e68d"}.icon-circle:before{content:"\e68e"}.icon-refresh:before{content:"\e68f"}.icon-return:before{content:"\e690"}.icon-undo:before{content:"\e691"}.icon-alipay:before{content:"\e692"}.icon-auto-renew:before{content:"\e693"}.icon-mobile:before{content:"\e694"}.icon-account:before{content:"\e695"}.icon-services:before{content:"\e696"}.icon-expense:before{content:"\e697"}.icon-redisa-2:before{content:"\e698"}.icon-redisa:before{content:"\e699"}.icon-ddos-3:before{content:"\e69a"}.icon-redisa-3:before{content:"\e69b"}.icon-toolsimage-2:before{content:"\e69c"}.icon-cdp-2:before{content:"\e69d"}.icon-mts-2:before{content:"\e69e"}.icon-toolsimage:before{content:"\e69f"}.icon-toolsimage-3:before{content:"\e6a0"}.icon-ons-3:before{content:"\e6a1"}.icon-ram-3:before{content:"\e6a2"}.icon-yundun-3:before{content:"\e6a3"}.icon-pts-3:before{content:"\e6a4"}.icon-mts-3:before{content:"\e6a5"}.icon-mqs-3:before{content:"\e6a6"}.icon-drds-3:before{content:"\e6a7"}.icon-cdp-3:before{content:"\e6a8"}.icon-dpc-3:before{content:"\e6a9"}.icon-ads-3:before{content:"\e6aa"}.icon-jiankong-3:before{content:"\e6ab"}.icon-vpc-3:before{content:"\e6ac"}.icon-slb-3:before{content:"\e6ad"}.icon-rds-3:before{content:"\e6ae"}.icon-ots-3:before{content:"\e6af"}.icon-oss-3:before{content:"\e6b0"}.icon-ess-3:before{content:"\e6b1"}.icon-opensearch-3:before{content:"\e6b2"}.icon-odps-3:before{content:"\e6b3"}.icon-ocs-3:before{content:"\e6b4"}.icon-oas-3:before{content:"\e6b5"}.icon-lightcloud-3:before{content:"\e6b6"}.icon-cdn-3:before{content:"\e6b7"}.icon-ace-3:before{content:"\e6b8"}.icon-sls-3:before{content:"\e6b9"}.icon-ecs-3:before{content:"\e6ba"}.modal-content{border-radius:0px;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);-webkit-box-shadow:0px 5px 10px rgba(0,0,0,0.5);-moz-box-shadow:0px 5px 10px rgba(0,0,0,0.5);box-shadow:0px 5px 10px rgba(0,0,0,0.5)}.modal-footer{margin-top:0px}.modal-title{font-size:14px}.modal-header .close{font-size:28px;margin-top:-8px;font-weight:normal}.modal-backdrop{background-color:#FFF}.console-message-dialog .modal-body .lead{font-size:16px}.console-message-dialog .modal-body p{margin-top:6px}.nav-tabs>li>a,.nav-tabs.nav-justified>li>a{border-radius:0px 0px 0px 0px}.nav-tabs{border-color:#ddd}.nav-tabs>li{margin-left:-1px;border-top:1px solid #ddd;border-left:1px solid #ddd;border-right:1px solid #ddd;z-index:1}.nav-tabs>li>a,.nav-tabs>li>a:focus{color:#666;border-left:0px;border-right:0px;margin-right:0px;padding:10px 16px;background:#FBFAF8;border-bottom:0px}.nav-tabs>li.active{border-top:0px;border-left:1px solid #ddd;border-right:1px solid #ddd;z-index:3}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{border-top:2px solid #00a2ca;border-left:0px;border-right:0px;border-bottom:1px solid #FFF;color:#333}.nav-tabs>li>a:hover{background-color:#FFF;color:#09C}.nav-tabs .open>a,.nav-tabs .open>a:hover,.nav-tabs .open>a:focus{color:#000;background-color:#FAFAFA;border-color:#EEE}.nav-tabs.nav-justified>li:first-child{border-left:1px solid #ddd}.nav-tabs.nav-justified>li{border-top:1px solid #ddd;border-left:0px solid #ddd;border-right:1px solid #ddd;z-index:1}.nav-tabs.nav-justified>li>a{border-left:0px;border-right:0px;margin-right:0px;background-color:#fbfaf8;border-bottom:1px solid #ddd}.nav-tabs.nav-justified>li>a:hover{color:#09C;background-color:#FFF}.nav-tabs.nav-justified>li.active{border-top:0px;z-index:3}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-top:2px solid #00a2ca;border-left:0px;border-right:0px;border-bottom:1px solid #FFF;color:#333;background-color:#FFF}.nav-pills li a,.nav-pills li a:focus,.nav-pills li button,.nav-pills li button:focus{padding:6px 12px;border-radius:0px;border:1px solid #D9DEE4;background-color:#D9DEE4;color:#666;line-height:20px;height:32px;margin-left:2px}.nav-pills li a:hover,.nav-pills li a:focus:hover,.nav-pills li button:hover,.nav-pills li button:focus:hover{border:1px solid #D9DEE4;background-color:#DCE2E7;color:#444}.nav-pills li.active a,.nav-pills li.active a:hover,.nav-pills li.active a:focus,.nav-pills li.active button,.nav-pills li.active button:hover,.nav-pills li.active button:focus{border:1px solid #546478;background-color:#546478;color:#FFFFFF}.c-texttrimmer-pen{position:absolute;width:18px;height:18px;font-size:12px;padding:2px;text-align:center;margin-left:6px}.c-texttrimmer-box{position:absolute;padding:16px;background:#fff;z-index:1000;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);-webkit-border-radius:0px;-moz-border-radius:0px;-ms-border-radius:0px;-o-border-radius:0px;border-radius:0px;-webkit-box-shadow:1px 1px 8px rgba(0,0,0,0.5);-moz-box-shadow:1px 1px 8px rgba(0,0,0,0.5);box-shadow:1px 1px 8px rgba(0,0,0,0.5)}.c-texttrimmer-box:focus{outline:none}.c-texttrimmer-box p{margin:0 0 10px}.c-texttrimmer-box p.c-texttrimmer-tip{color:red}.c-texttrimmer-box .c-texttrimmer-btnbox a{margin-right:8px}.modal,.modal-open{overflow:auto;overflow-y:auto}.console-helper{position:absolute;height:100%;width:400px;right:0px;top:32px;z-index:1000;border:1px solid #eee;background:#fff;border-left:1px solid #dddddd;box-shadow:0px 0px 4px rgba(0,0,0,0.2);position:fixed}.console-helper-animation{-webkit-transition:all 0.3s cubic-bezier(0.25, 0.5, 0.5, 0.9);transition:all 0.3s cubic-bezier(0.25, 0.5, 0.5, 0.9);-webkit-transform:translateX(0);transform:translateX(0)}.console-helper-folded{right:-400px}.console-helper-folded .console-helper-head .console-helper-button{margin-left:-44px}.console-helper-head{height:56px;background:#f5f5f5;border-bottom:1px solid #dddddd}.console-helper-head .console-helper-button{float:left;background:url(images/helper-icon.png) center center no-repeat;height:32px;width:32px;margin:12px;cursor:pointer;opacity:0.6}.console-helper-head .console-helper-button:hover{opacity:1}.console-helper-head .console-helper-title{float:left;font-size:14px;line-height:32px;height:32px;margin:12px 0;color:#333}.console-helper-body .console-helper-nav{border-bottom:1px solid #dddddd;margin:0 20px;list-style:none;overflow:hidden;zoom:1;padding:0}.console-helper-body .console-helper-nav li{float:left;padding:12px}.console-helper-body .console-helper-nav li a{color:#666}.console-helper-body .console-helper-nav li a:hover{color:#000}.console-helper-body .console-helper-nav li.active{border-bottom:2px solid #999}.console-helper-body .console-helper-panel-list .console-helper-panel{margin:20px}.console-helper-body .console-helper-panel-list .console-helper-panel .console-helper-xiaoyun .console-helper-xiaoyun-search{height:32px}.console-helper-body .console-helper-panel-list .console-helper-panel .console-helper-xiaoyun .console-helper-xiaoyun-recommend ul{list-style:none;margin:0;padding:0}.console-helper-foot{background:#f5f5f5;position:absolute;width:100%;bottom:0;left:0;border-top:1px solid #eee}.console-helper-foot .console-helper-service{overflow:hidden;zoom:1;height:32px;margin:12px;list-style:none}.console-helper-foot .console-helper-service li{width:48%;float:left}.console-helper-foot .console-helper-service li p{margin:0;color:#666}.console-helper-foot .console-helper-service li p a{color:#666}.console-helper-foot .console-helper-service li p a:hover{text-decoration:underline}.growl{z-index:9999999;top:50px;width:260px}.alert-success{color:#090;background-color:#F2FFEA;border-color:#C7DDB9}.alert-success .alert-link{color:#063;font-weight:normal}.alert-info{color:#555;background-color:#F9F9F9;border-color:#DDD}.alert-info .alert-link{color:#06C;font-weight:normal}.alert-warning{color:#f68300;background-color:#FCF8E2;border-color:#FBECCB}.alert-warning .alert-link{color:#c50;font-weight:normal}.alert-danger{color:#ee2117;background-color:#FFF6F2;border-color:#F1ACAC}.alert-danger .alert-link{color:#b00;font-weight:normal}.alert{padding:6px 12px;line-height:18px;margin-bottom:6px;border-radius:0px}.alert .close{margin-top:-5px}.alert ul{padding-left:16px}.product-icons-32,.product-icons-48,.product-icons-64{background-repeat:no-repeat;display:-moz-inline-stack;display:inline-block;vertical-align:middle;*vertical-align:auto;zoom:1;*display:inline;background-image:url(aliyun-logo/product.icons.png);background-image:-webkit-image-set(url(aliyun-logo/product.icons.png) 1x, url(aliyun-logo/product.icons@2x.png) 2x);background-image:-moz-image-set(url(aliyun-logo/product.icons.png) 1x, url(aliyun-logo/product.icons@2x.png) 2x);background-image:-ms-image-set(url(aliyun-logo/product.icons.png) 1x, url(aliyun-logo/product.icons@2x.png) 2x);background-image:-os-image-set(url(aliyun-logo/product.icons.png) 1x, url(aliyun-logo/product.icons@2x.png) 2x)}.product-icons-32{width:32px;height:32px}.product-icons-48{width:48px;height:48px}.product-icons-64{width:64px;height:64px}.product-icons-32.product-icons-ace-grey{background-position:-448px -1088px !important}.product-icons-32.product-icons-ace{background-position:-800px -1024px !important}.product-icons-48.product-icons-ace-grey{background-position:-192px -832px !important}.product-icons-48.product-icons-ace{background-position:-720px -880px !important}.product-icons-64.product-icons-ace-grey{background-position:-576px -128px !important}.product-icons-64.product-icons-ace{background-position:0px -64px !important}.product-icons-32.product-icons-actiontrail-grey{background-position:-416px -1088px !important}.product-icons-32.product-icons-actiontrail{background-position:-384px -1088px !important}.product-icons-48.product-icons-actiontrail-grey{background-position:-976px -288px !important}.product-icons-48.product-icons-actiontrail{background-position:-432px -976px !important}.product-icons-64.product-icons-actiontrail-grey{background-position:-128px 0px !important}.product-icons-64.product-icons-actiontrail{background-position:-128px -64px !important}.product-icons-32.product-icons-ads-grey{background-position:-352px -1088px !important}.product-icons-32.product-icons-ads{background-position:-256px -1088px !important}.product-icons-48.product-icons-ads-grey{background-position:-768px -880px !important}.product-icons-48.product-icons-ads{background-position:-928px -384px !important}.product-icons-64.product-icons-ads-grey{background-position:-64px -128px !important}.product-icons-64.product-icons-ads{background-position:-128px -128px !important}.product-icons-32.product-icons-aegis-grey{background-position:-224px -1088px !important}.product-icons-32.product-icons-aegis{background-position:-192px -1088px !important}.product-icons-48.product-icons-aegis-grey{background-position:-688px -768px !important}.product-icons-48.product-icons-aegis{background-position:-832px -96px !important}.product-icons-64.product-icons-aegis-grey{background-position:-192px -64px !important}.product-icons-64.product-icons-aegis{background-position:-192px -128px !important}.product-icons-32.product-icons-antifraud-grey{background-position:-160px -1088px !important}.product-icons-32.product-icons-antifraud{background-position:-64px -1088px !important}.product-icons-48.product-icons-antifraud-grey{background-position:-880px -480px !important}.product-icons-48.product-icons-antifraud{background-position:-880px -720px !important}.product-icons-64.product-icons-antifraud-grey{background-position:-64px -192px !important}.product-icons-64.product-icons-antifraud{background-position:-128px -192px !important}.product-icons-32.product-icons-api-grey{background-position:-32px -1088px !important}.product-icons-32.product-icons-api{background-position:0px -1088px !important}.product-icons-48.product-icons-api-grey{background-position:-96px -928px !important}.product-icons-48.product-icons-api{background-position:-192px -928px !important}.product-icons-64.product-icons-api-grey{background-position:-256px 0px !important}.product-icons-64.product-icons-api{background-position:-256px -64px !important}.product-icons-32.product-icons-apigateway-grey{background-position:-1104px -1056px !important}.product-icons-32.product-icons-apigateway{background-position:-1104px -960px !important}.product-icons-48.product-icons-apigateway-grey{background-position:-480px -976px !important}.product-icons-48.product-icons-apigateway{background-position:-576px -976px !important}.product-icons-64.product-icons-apigateway-grey{background-position:-256px -192px !important}.product-icons-64.product-icons-apigateway{background-position:0px -256px !important}.product-icons-32.product-icons-aps-grey{background-position:-1104px -928px !important}.product-icons-32.product-icons-aps{background-position:-1104px -896px !important}.product-icons-48.product-icons-aps-grey{background-position:-832px -432px !important}.product-icons-48.product-icons-aps{background-position:-832px -528px !important}.product-icons-64.product-icons-aps-grey{background-position:-128px -256px !important}.product-icons-64.product-icons-aps{background-position:-192px -256px !important}.product-icons-32.product-icons-ats-grey{background-position:-1104px -864px !important}.product-icons-32.product-icons-ats{background-position:-1104px -768px !important}.product-icons-48.product-icons-ats-grey{background-position:-768px -832px !important}.product-icons-48.product-icons-ats{background-position:-880px 0px !important}.product-icons-64.product-icons-ats-grey{background-position:-320px 0px !important}.product-icons-64.product-icons-ats{background-position:-320px -64px !important}.product-icons-32.product-icons-batchcompute-grey{background-position:-1104px -736px !important}.product-icons-32.product-icons-batchcompute{background-position:-1104px -704px !important}.product-icons-48.product-icons-batchcompute-grey{background-position:-192px -880px !important}.product-icons-48.product-icons-batchcompute{background-position:-288px -880px !important}.product-icons-64.product-icons-batchcompute-grey{background-position:-320px -192px !important}.product-icons-64.product-icons-batchcompute{background-position:-320px -256px !important}.product-icons-32.product-icons-cas-grey{background-position:-1104px -672px !important}.product-icons-32.product-icons-cas{background-position:-1104px -576px !important}.product-icons-48.product-icons-cas-grey{background-position:-928px -432px !important}.product-icons-48.product-icons-cas{background-position:-928px -480px !important}.product-icons-64.product-icons-cas-grey{background-position:-64px -320px !important}.product-icons-64.product-icons-cas{background-position:-128px -320px !important}.product-icons-32.product-icons-cdi-grey{background-position:-1104px -544px !important}.product-icons-32.product-icons-cdi{background-position:-1104px -512px !important}.product-icons-48.product-icons-cdi-grey{background-position:-672px -928px !important}.product-icons-48.product-icons-cdi{background-position:-720px -928px !important}.product-icons-64.product-icons-cdi-grey{background-position:-256px -320px !important}.product-icons-64.product-icons-cdi{background-position:-320px -320px !important}.product-icons-32.product-icons-cdn-grey{background-position:-1104px -480px !important}.product-icons-32.product-icons-cdn{background-position:-1104px -384px !important}.product-icons-48.product-icons-cdn-grey{background-position:-976px -864px !important}.product-icons-48.product-icons-cdn{background-position:-976px -912px !important}.product-icons-64.product-icons-cdn-grey{background-position:-384px -64px !important}.product-icons-64.product-icons-cdn{background-position:-384px -128px !important}.product-icons-32.product-icons-cdp-grey{background-position:-1104px -352px !important}.product-icons-32.product-icons-cdp{background-position:-1104px -320px !important}.product-icons-48.product-icons-cdp-grey{background-position:-1024px -48px !important}.product-icons-48.product-icons-cdp{background-position:-1024px -96px !important}.product-icons-64.product-icons-cdp-grey{background-position:-384px -256px !important}.product-icons-64.product-icons-cdp{background-position:-384px -320px !important}.product-icons-32.product-icons-cli-grey{background-position:-1104px -288px !important}.product-icons-32.product-icons-cli{background-position:-1104px -192px !important}.product-icons-48.product-icons-cli-grey{background-position:-832px -144px !important}.product-icons-48.product-icons-cli{background-position:-832px -192px !important}.product-icons-64.product-icons-cli-grey{background-position:-64px -384px !important}.product-icons-64.product-icons-cli{background-position:-128px -384px !important}.product-icons-32.product-icons-containerservice-grey{background-position:-1104px -160px !important}.product-icons-32.product-icons-containerservice{background-position:-1104px -128px !important}.product-icons-48.product-icons-containerservice-grey{background-position:-832px -720px !important}.product-icons-48.product-icons-containerservice{background-position:-832px -768px !important}.product-icons-64.product-icons-containerservice-grey{background-position:-256px -384px !important}.product-icons-64.product-icons-containerservice{background-position:-320px -384px !important}.product-icons-32.product-icons-cps-grey{background-position:-1104px -96px !important}.product-icons-32.product-icons-cps{background-position:-1104px 0px !important}.product-icons-48.product-icons-cps-grey{background-position:-480px -832px !important}.product-icons-48.product-icons-cps{background-position:-528px -832px !important}.product-icons-64.product-icons-cps-grey{background-position:-448px 0px !important}.product-icons-64.product-icons-cps{background-position:-448px -64px !important}.product-icons-32.product-icons-csb-grey{background-position:-1056px -1056px !important}.product-icons-32.product-icons-csb{background-position:-1024px -1056px !important}.product-icons-48.product-icons-csb-grey{background-position:-880px -192px !important}.product-icons-48.product-icons-csb{background-position:-880px -240px !important}.product-icons-64.product-icons-csb-grey{background-position:-448px -192px !important}.product-icons-64.product-icons-csb{background-position:-448px -256px !important}.product-icons-32.product-icons-ddos-grey{background-position:-992px -1056px !important}.product-icons-32.product-icons-ddos{background-position:-896px -1056px !important}.product-icons-48.product-icons-ddos-grey{background-position:-880px -768px !important}.product-icons-48.product-icons-ddos{background-position:-880px -816px !important}.product-icons-64.product-icons-ddos-grey{background-position:-448px -384px !important}.product-icons-64.product-icons-ddos{background-position:0px -448px !important}.product-icons-32.product-icons-ddosbasic-grey{background-position:-864px -1056px !important}.product-icons-32.product-icons-ddosbasic{background-position:-832px -1056px !important}.product-icons-48.product-icons-ddosbasic-grey{background-position:-480px -880px !important}.product-icons-48.product-icons-ddosbasic{background-position:-528px -880px !important}.product-icons-64.product-icons-ddosbasic-grey{background-position:-128px -448px !important}.product-icons-64.product-icons-ddosbasic{background-position:-192px -448px !important}.product-icons-32.product-icons-dfs-grey{background-position:-800px -1056px !important}.product-icons-32.product-icons-dfs{background-position:-704px -1056px !important}.product-icons-48.product-icons-dfs-grey{background-position:-928px -144px !important}.product-icons-48.product-icons-dfs{background-position:-928px -192px !important}.product-icons-64.product-icons-dfs-grey{background-position:-320px -448px !important}.product-icons-64.product-icons-dfs{background-position:-384px -448px !important}.product-icons-32.product-icons-directmail-grey{background-position:-672px -1056px !important}.product-icons-32.product-icons-directmail{background-position:-640px -1056px !important}.product-icons-48.product-icons-directmail-grey{background-position:-928px -672px !important}.product-icons-48.product-icons-directmail{background-position:-928px -720px !important}.product-icons-64.product-icons-directmail-grey{background-position:-512px 0px !important}.product-icons-64.product-icons-directmail{background-position:-512px -64px !important}.product-icons-32.product-icons-disk-grey{background-position:-608px -1056px !important}.product-icons-32.product-icons-disk{background-position:-512px -1056px !important}.product-icons-48.product-icons-disk-grey{background-position:-336px -928px !important}.product-icons-48.product-icons-disk{background-position:-384px -928px !important}.product-icons-64.product-icons-disk-grey{background-position:-512px -192px !important}.product-icons-64.product-icons-disk{background-position:-512px -256px !important}.product-icons-32.product-icons-dms-grey{background-position:-480px -1056px !important}.product-icons-32.product-icons-dms{background-position:-448px -1056px !important}.product-icons-48.product-icons-dms-grey{background-position:-912px -928px !important}.product-icons-48.product-icons-dms{background-position:-976px 0px !important}.product-icons-64.product-icons-dms-grey{background-position:-512px -384px !important}.product-icons-64.product-icons-dms{background-position:-512px -448px !important}.product-icons-32.product-icons-dpc-grey{background-position:-416px -1056px !important}.product-icons-32.product-icons-dpc{background-position:-320px -1056px !important}.product-icons-48.product-icons-dpc-grey{background-position:-976px -528px !important}.product-icons-48.product-icons-dpc{background-position:-976px -576px !important}.product-icons-64.product-icons-dpc-grey{background-position:-64px -512px !important}.product-icons-64.product-icons-dpc{background-position:-128px -512px !important}.product-icons-32.product-icons-drds-grey{background-position:-288px -1056px !important}.product-icons-32.product-icons-drds{background-position:-256px -1056px !important}.product-icons-48.product-icons-drds-grey{background-position:-144px -976px !important}.product-icons-48.product-icons-drds{background-position:-192px -976px !important}.product-icons-64.product-icons-drds-grey{background-position:-256px -512px !important}.product-icons-64.product-icons-drds{background-position:-320px -512px !important}.product-icons-32.product-icons-dsi-grey{background-position:-224px -1056px !important}.product-icons-32.product-icons-dsi{background-position:-128px -1056px !important}.product-icons-48.product-icons-dsi-grey{background-position:-720px -976px !important}.product-icons-48.product-icons-dsi{background-position:-768px -976px !important}.product-icons-64.product-icons-dsi-grey{background-position:-448px -512px !important}.product-icons-64.product-icons-dsi{background-position:-512px -512px !important}.product-icons-32.product-icons-dts-grey{background-position:-96px -1056px !important}.product-icons-32.product-icons-dts{background-position:-64px -1056px !important}.product-icons-48.product-icons-dts-grey{background-position:-1024px -288px !important}.product-icons-48.product-icons-dts{background-position:-1024px -336px !important}.product-icons-64.product-icons-dts-grey{background-position:-576px -64px !important}.product-icons-64.product-icons-dts{background-position:0px 0px !important}.product-icons-32.product-icons-eclipse-grey{background-position:-32px -1056px !important}.product-icons-32.product-icons-eclipse{background-position:-1072px -992px !important}.product-icons-48.product-icons-eclipse-grey{background-position:-832px 0px !important}.product-icons-48.product-icons-eclipse{background-position:-832px -48px !important}.product-icons-64.product-icons-eclipse-grey{background-position:-576px -256px !important}.product-icons-64.product-icons-eclipse{background-position:-576px -320px !important}.product-icons-32.product-icons-ecs-grey{background-position:-1072px -960px !important}.product-icons-32.product-icons-ecs{background-position:-1072px -928px !important}.product-icons-48.product-icons-ecs-grey{background-position:-832px -288px !important}.product-icons-48.product-icons-ecs{background-position:-832px -336px !important}.product-icons-64.product-icons-ecs-grey{background-position:-576px -448px !important}.product-icons-64.product-icons-ecs{background-position:-576px -512px !important}.product-icons-32.product-icons-edas-grey{background-position:-1072px -896px !important}.product-icons-32.product-icons-edas{background-position:-1072px -800px !important}.product-icons-48.product-icons-edas-grey{background-position:-832px -576px !important}.product-icons-48.product-icons-edas{background-position:-832px -624px !important}.product-icons-64.product-icons-edas-grey{background-position:-64px -576px !important}.product-icons-64.product-icons-edas{background-position:-128px -576px !important}.product-icons-32.product-icons-elp-grey{background-position:-1072px -768px !important}.product-icons-32.product-icons-elp{background-position:-1072px -736px !important}.product-icons-48.product-icons-elp-grey{background-position:-48px -832px !important}.product-icons-48.product-icons-elp{background-position:-96px -832px !important}.product-icons-64.product-icons-elp-grey{background-position:-256px -576px !important}.product-icons-64.product-icons-elp{background-position:-320px -576px !important}.product-icons-32.product-icons-emapreduce-grey{background-position:-1072px -704px !important}.product-icons-32.product-icons-emapreduce{background-position:-1072px -608px !important}.product-icons-48.product-icons-emapreduce-grey{background-position:-336px -832px !important}.product-icons-48.product-icons-emapreduce{background-position:-384px -832px !important}.product-icons-64.product-icons-emapreduce-grey{background-position:-448px -576px !important}.product-icons-64.product-icons-emapreduce{background-position:-512px -576px !important}.product-icons-32.product-icons-esn-grey{background-position:-1072px -576px !important}.product-icons-32.product-icons-esn{background-position:-1072px -544px !important}.product-icons-48.product-icons-esn-grey{background-position:-624px -832px !important}.product-icons-48.product-icons-esn{background-position:-672px -832px !important}.product-icons-64.product-icons-esn-grey{background-position:-640px 0px !important}.product-icons-64.product-icons-esn{background-position:-640px -64px !important}.product-icons-32.product-icons-ess-grey{background-position:-1072px -512px !important}.product-icons-32.product-icons-ess{background-position:-1072px -416px !important}.product-icons-48.product-icons-ess-grey{background-position:-880px -48px !important}.product-icons-48.product-icons-ess{background-position:-880px -96px !important}.product-icons-64.product-icons-ess-grey{background-position:-640px -192px !important}.product-icons-64.product-icons-ess{background-position:-640px -256px !important}.product-icons-32.product-icons-expressconnect-grey{background-position:-1072px -384px !important}.product-icons-32.product-icons-expressconnect{background-position:-1072px -352px !important}.product-icons-48.product-icons-expressconnect-grey{background-position:-880px -336px !important}.product-icons-48.product-icons-expressconnect{background-position:-880px -384px !important}.product-icons-64.product-icons-expressconnect-grey{background-position:-640px -384px !important}.product-icons-64.product-icons-expressconnect{background-position:-640px -448px !important}.product-icons-32.product-icons-havip-grey{background-position:-1072px -320px !important}.product-icons-32.product-icons-havip{background-position:-1072px -224px !important}.product-icons-48.product-icons-havip-grey{background-position:-880px -624px !important}.product-icons-48.product-icons-havip{background-position:-880px -672px !important}.product-icons-64.product-icons-havip-grey{background-position:-640px -576px !important}.product-icons-64.product-icons-havip{background-position:0px -640px !important}.product-icons-32.product-icons-hpc-grey{background-position:-1072px -192px !important}.product-icons-32.product-icons-hpc{background-position:-1072px -160px !important}.product-icons-48.product-icons-hpc-grey{background-position:-48px -880px !important}.product-icons-48.product-icons-hpc{background-position:-96px -880px !important}.product-icons-64.product-icons-hpc-grey{background-position:-128px -640px !important}.product-icons-64.product-icons-hpc{background-position:-192px -640px !important}.product-icons-32.product-icons-hsm-grey{background-position:-1072px -128px !important}.product-icons-32.product-icons-hsm{background-position:-1072px -32px !important}.product-icons-48.product-icons-hsm-grey{background-position:-336px -880px !important}.product-icons-48.product-icons-hsm{background-position:-384px -880px !important}.product-icons-64.product-icons-hsm-grey{background-position:-320px -640px !important}.product-icons-64.product-icons-hsm{background-position:-384px -640px !important}.product-icons-32.product-icons-iot-grey{background-position:-1072px 0px !important}.product-icons-32.product-icons-iot{background-position:-1024px -1024px !important}.product-icons-48.product-icons-iot-grey{background-position:-624px -880px !important}.product-icons-48.product-icons-iot{background-position:-672px -880px !important}.product-icons-64.product-icons-iot-grey{background-position:-512px -640px !important}.product-icons-64.product-icons-iot{background-position:-576px -640px !important}.product-icons-32.product-icons-jiankong-grey{background-position:-992px -1024px !important}.product-icons-32.product-icons-jiankong{background-position:-896px -1024px !important}.product-icons-48.product-icons-jiankong-grey{background-position:-928px 0px !important}.product-icons-48.product-icons-jiankong{background-position:-928px -48px !important}.product-icons-64.product-icons-jiankong-grey{background-position:-704px 0px !important}.product-icons-64.product-icons-jiankong{background-position:-704px -64px !important}.product-icons-32.product-icons-keyongxingzhongxin-grey{background-position:-864px -1024px !important}.product-icons-32.product-icons-keyongxingzhongxin{background-position:-832px -1024px !important}.product-icons-48.product-icons-keyongxingzhongxin-grey{background-position:-928px -288px !important}.product-icons-48.product-icons-keyongxingzhongxin{background-position:-144px -832px !important}.product-icons-64.product-icons-keyongxingzhongxin-grey{background-position:-704px -192px !important}.product-icons-64.product-icons-keyongxingzhongxin{background-position:-704px -256px !important}.product-icons-32.product-icons-kms-grey{background-position:-704px -1024px !important}.product-icons-32.product-icons-kms{background-position:-672px -1024px !important}.product-icons-48.product-icons-kms-grey{background-position:-928px -576px !important}.product-icons-48.product-icons-kms{background-position:-928px -624px !important}.product-icons-64.product-icons-kms-grey{background-position:-704px -448px !important}.product-icons-64.product-icons-kms{background-position:-704px -512px !important}.product-icons-32.product-icons-kvstore-grey{background-position:-640px -1024px !important}.product-icons-32.product-icons-kvstore{background-position:-608px -1024px !important}.product-icons-48.product-icons-kvstore-grey{background-position:-928px -864px !important}.product-icons-48.product-icons-kvstore{background-position:0px -928px !important}.product-icons-64.product-icons-kvstore-grey{background-position:-704px -576px !important}.product-icons-64.product-icons-kvstore{background-position:-704px -640px !important}.product-icons-32.product-icons-livevideo-grey{background-position:-512px -1024px !important}.product-icons-32.product-icons-livevideo{background-position:-480px -1024px !important}.product-icons-48.product-icons-livevideo-grey{background-position:-240px -928px !important}.product-icons-48.product-icons-livevideo{background-position:-288px -928px !important}.product-icons-64.product-icons-livevideo-grey{background-position:-128px -704px !important}.product-icons-64.product-icons-livevideo{background-position:-192px -704px !important}.product-icons-32.product-icons-lvwang-grey{background-position:-448px -1024px !important}.product-icons-32.product-icons-lvwang{background-position:-416px -1024px !important}.product-icons-48.product-icons-lvwang-grey{background-position:-528px -928px !important}.product-icons-48.product-icons-lvwang{background-position:-576px -928px !important}.product-icons-64.product-icons-lvwang-grey{background-position:-256px -704px !important}.product-icons-64.product-icons-lvwang{background-position:-320px -704px !important}.product-icons-32.product-icons-mac-grey{background-position:-320px -1024px !important}.product-icons-32.product-icons-mac{background-position:-288px -1024px !important}.product-icons-48.product-icons-mac-grey{background-position:-816px -928px !important}.product-icons-48.product-icons-mac{background-position:-864px -928px !important}.product-icons-64.product-icons-mac-grey{background-position:-512px -704px !important}.product-icons-64.product-icons-mac{background-position:-576px -704px !important}.product-icons-32.product-icons-man-grey{background-position:-256px -1024px !important}.product-icons-32.product-icons-man{background-position:-224px -1024px !important}.product-icons-48.product-icons-man-grey{background-position:-976px -144px !important}.product-icons-48.product-icons-man{background-position:-976px -192px !important}.product-icons-64.product-icons-man-grey{background-position:-640px -704px !important}.product-icons-64.product-icons-man{background-position:-704px -704px !important}.product-icons-32.product-icons-mns-grey{background-position:-128px -1024px !important}.product-icons-32.product-icons-mns{background-position:-96px -1024px !important}.product-icons-48.product-icons-mns-grey{background-position:-976px -432px !important}.product-icons-48.product-icons-mns{background-position:-976px -480px !important}.product-icons-64.product-icons-mns-grey{background-position:-768px -128px !important}.product-icons-64.product-icons-mns{background-position:-768px -192px !important}.product-icons-32.product-icons-mongodb-grey{background-position:-64px -1024px !important}.product-icons-32.product-icons-mongodb{background-position:-32px -1024px !important}.product-icons-48.product-icons-mongodb-grey{background-position:-976px -720px !important}.product-icons-48.product-icons-mongodb{background-position:-976px -768px !important}.product-icons-64.product-icons-mongodb-grey{background-position:-768px -256px !important}.product-icons-64.product-icons-mongodb{background-position:-768px -320px !important}.product-icons-32.product-icons-mqs-grey{background-position:-1024px -960px !important}.product-icons-32.product-icons-mqs{background-position:-1024px -928px !important}.product-icons-48.product-icons-mqs-grey{background-position:-48px -976px !important}.product-icons-48.product-icons-mqs{background-position:-96px -976px !important}.product-icons-64.product-icons-mqs-grey{background-position:-768px -512px !important}.product-icons-64.product-icons-mqs{background-position:-768px -576px !important}.product-icons-32.product-icons-mss-grey{background-position:-1024px -896px !important}.product-icons-32.product-icons-mss{background-position:-1024px -864px !important}.product-icons-48.product-icons-mss-grey{background-position:-336px -976px !important}.product-icons-48.product-icons-mss{background-position:-384px -976px !important}.product-icons-64.product-icons-mss-grey{background-position:-768px -640px !important}.product-icons-64.product-icons-mss{background-position:-768px -704px !important}.product-icons-32.product-icons-mts-grey{background-position:-1024px -768px !important}.product-icons-32.product-icons-mts{background-position:-1024px -736px !important}.product-icons-48.product-icons-mts-grey{background-position:-624px -976px !important}.product-icons-48.product-icons-mts{background-position:-672px -976px !important}.product-icons-64.product-icons-mts-grey{background-position:-128px -768px !important}.product-icons-64.product-icons-mts{background-position:-192px -768px !important}.product-icons-32.product-icons-nas-grey{background-position:-1024px -704px !important}.product-icons-32.product-icons-nas{background-position:-1024px -672px !important}.product-icons-48.product-icons-nas-grey{background-position:-912px -976px !important}.product-icons-48.product-icons-nas{background-position:-960px -976px !important}.product-icons-64.product-icons-nas-grey{background-position:-256px -768px !important}.product-icons-64.product-icons-nas{background-position:-320px -768px !important}.product-icons-32.product-icons-oas-grey{background-position:-1024px -576px !important}.product-icons-32.product-icons-oas{background-position:-1024px -544px !important}.product-icons-48.product-icons-oas-grey{background-position:-1024px -192px !important}.product-icons-48.product-icons-oas{background-position:-1024px -240px !important}.product-icons-64.product-icons-oas-grey{background-position:-512px -768px !important}.product-icons-64.product-icons-oas{background-position:-576px -768px !important}.product-icons-32.product-icons-oceanbase-grey{background-position:0px -1056px !important}.product-icons-32.product-icons-oceanbase{background-position:-1024px -512px !important}.product-icons-48.product-icons-oceanbase-grey{background-position:-1024px -432px !important}.product-icons-48.product-icons-oceanbase{background-position:-1024px -384px !important}.product-icons-64.product-icons-oceanbase-grey{background-position:-448px -768px !important}.product-icons-64.product-icons-oceanbase{background-position:-384px -768px !important}.product-icons-32.product-icons-ocs-grey{background-position:-1024px -608px !important}.product-icons-32.product-icons-ocs{background-position:-1024px -640px !important}.product-icons-48.product-icons-ocs-grey{background-position:-864px -976px !important}.product-icons-48.product-icons-ocs{background-position:-816px -976px !important}.product-icons-64.product-icons-ocs-grey{background-position:-64px -768px !important}.product-icons-64.product-icons-ocs{background-position:0px -768px !important}.product-icons-32.product-icons-odps-grey{background-position:-1024px -800px !important}.product-icons-32.product-icons-odps{background-position:-1024px -832px !important}.product-icons-48.product-icons-odps-grey{background-position:-288px -976px !important}.product-icons-48.product-icons-odps{background-position:-240px -976px !important}.product-icons-64.product-icons-odps-grey{background-position:-768px -448px !important}.product-icons-64.product-icons-odps{background-position:-768px -384px !important}.product-icons-32.product-icons-ons-grey{background-position:-1024px -992px !important}.product-icons-32.product-icons-ons{background-position:0px -1024px !important}.product-icons-48.product-icons-ons-grey{background-position:-976px -672px !important}.product-icons-48.product-icons-ons{background-position:-976px -624px !important}.product-icons-64.product-icons-ons-grey{background-position:-768px -64px !important}.product-icons-64.product-icons-ons{background-position:-768px 0px !important}.product-icons-32.product-icons-opensearch-grey{background-position:-160px -1024px !important}.product-icons-32.product-icons-opensearch{background-position:-192px -1024px !important}.product-icons-48.product-icons-opensearch-grey{background-position:-976px -96px !important}.product-icons-48.product-icons-opensearch{background-position:-976px -48px !important}.product-icons-64.product-icons-opensearch-grey{background-position:-448px -704px !important}.product-icons-64.product-icons-opensearch{background-position:-384px -704px !important}.product-icons-32.product-icons-oss-grey{background-position:-352px -1024px !important}.product-icons-32.product-icons-oss{background-position:-384px -1024px !important}.product-icons-48.product-icons-oss-grey{background-position:-480px -928px !important}.product-icons-48.product-icons-oss{background-position:-432px -928px !important}.product-icons-64.product-icons-oss-grey{background-position:-64px -704px !important}.product-icons-64.product-icons-oss{background-position:0px -704px !important}.product-icons-32.product-icons-ots-grey{background-position:-544px -1024px !important}.product-icons-32.product-icons-ots{background-position:-576px -1024px !important}.product-icons-48.product-icons-ots-grey{background-position:-928px -816px !important}.product-icons-48.product-icons-ots{background-position:-928px -768px !important}.product-icons-64.product-icons-ots-grey{background-position:-704px -384px !important}.product-icons-64.product-icons-ots{background-position:-704px -320px !important}.product-icons-32.product-icons-petadata-grey{background-position:-736px -1024px !important}.product-icons-32.product-icons-petadata{background-position:-768px -1024px !important}.product-icons-48.product-icons-petadata-grey{background-position:-928px -336px !important}.product-icons-48.product-icons-petadata{background-position:-928px -240px !important}.product-icons-64.product-icons-petadata-grey{background-position:-704px -128px !important}.product-icons-64.product-icons-petadata{background-position:-640px -640px !important}.product-icons-32.product-icons-pts-grey{background-position:-928px -1024px !important}.product-icons-32.product-icons-pts{background-position:-960px -1024px !important}.product-icons-48.product-icons-pts-grey{background-position:-816px -880px !important}.product-icons-48.product-icons-pts{background-position:-576px -880px !important}.product-icons-64.product-icons-pts-grey{background-position:-448px -640px !important}.product-icons-64.product-icons-pts{background-position:-256px -640px !important}.product-icons-32.product-icons-ram-grey{background-position:-1072px -64px !important}.product-icons-32.product-icons-ram{background-position:-1072px -96px !important}.product-icons-48.product-icons-ram-grey{background-position:-240px -880px !important}.product-icons-48.product-icons-ram{background-position:0px -880px !important}.product-icons-64.product-icons-ram-grey{background-position:-64px -640px !important}.product-icons-64.product-icons-ram{background-position:-640px -512px !important}.product-icons-32.product-icons-rds-grey{background-position:-1072px -256px !important}.product-icons-32.product-icons-rds{background-position:-1072px -288px !important}.product-icons-48.product-icons-rds-grey{background-position:-880px -528px !important}.product-icons-48.product-icons-rds{background-position:-880px -288px !important}.product-icons-64.product-icons-rds-grey{background-position:-640px -320px !important}.product-icons-64.product-icons-rds{background-position:-640px -128px !important}.product-icons-32.product-icons-ros-grey{background-position:-1072px -448px !important}.product-icons-32.product-icons-ros{background-position:-1072px -480px !important}.product-icons-48.product-icons-ros-grey{background-position:-816px -832px !important}.product-icons-48.product-icons-ros{background-position:-576px -832px !important}.product-icons-64.product-icons-ros-grey{background-position:-576px -576px !important}.product-icons-64.product-icons-ros{background-position:-384px -576px !important}.product-icons-32.product-icons-sas-grey{background-position:-1072px -640px !important}.product-icons-32.product-icons-sas{background-position:-1072px -672px !important}.product-icons-48.product-icons-sas-grey{background-position:-240px -832px !important}.product-icons-48.product-icons-sas{background-position:0px -832px !important}.product-icons-64.product-icons-sas-grey{background-position:-192px -576px !important}.product-icons-64.product-icons-sas{background-position:0px -576px !important}.product-icons-32.product-icons-scan-grey{background-position:-1072px -832px !important}.product-icons-32.product-icons-scan{background-position:-1072px -864px !important}.product-icons-48.product-icons-scan-grey{background-position:-832px -480px !important}.product-icons-48.product-icons-scan{background-position:-832px -240px !important}.product-icons-64.product-icons-scan-grey{background-position:-576px -384px !important}.product-icons-64.product-icons-scan{background-position:-576px -192px !important}.product-icons-32.product-icons-slb-grey{background-position:-1072px -1024px !important}.product-icons-32.product-icons-slb{background-position:-1024px -480px !important}.product-icons-48.product-icons-slb-grey{background-position:-736px -768px !important}.product-icons-48.product-icons-slb{background-position:-1024px -144px !important}.product-icons-64.product-icons-slb-grey{background-position:-576px 0px !important}.product-icons-64.product-icons-slb{background-position:-384px -512px !important}.product-icons-32.product-icons-slm-grey{background-position:-160px -1056px !important}.product-icons-32.product-icons-slm{background-position:-192px -1056px !important}.product-icons-48.product-icons-slm-grey{background-position:-528px -976px !important}.product-icons-48.product-icons-slm{background-position:0px -976px !important}.product-icons-64.product-icons-slm-grey{background-position:-192px -512px !important}.product-icons-64.product-icons-slm{background-position:0px -512px !important}.product-icons-32.product-icons-sls-grey{background-position:-352px -1056px !important}.product-icons-32.product-icons-sls{background-position:-384px -1056px !important}.product-icons-48.product-icons-sls-grey{background-position:-976px -336px !important}.product-icons-48.product-icons-sls{background-position:-768px -928px !important}.product-icons-64.product-icons-sls-grey{background-position:-512px -320px !important}.product-icons-64.product-icons-sls{background-position:-512px -128px !important}.product-icons-32.product-icons-sos-grey{background-position:-544px -1056px !important}.product-icons-32.product-icons-sos{background-position:-576px -1056px !important}.product-icons-48.product-icons-sos-grey{background-position:-144px -928px !important}.product-icons-48.product-icons-sos{background-position:-928px -528px !important}.product-icons-64.product-icons-sos-grey{background-position:-448px -448px !important}.product-icons-64.product-icons-sos{background-position:-256px -448px !important}.product-icons-32.product-icons-toolsimage-grey{background-position:-736px -1056px !important}.product-icons-32.product-icons-toolsimage{background-position:-768px -1056px !important}.product-icons-48.product-icons-toolsimage-grey{background-position:-864px -880px !important}.product-icons-48.product-icons-toolsimage{background-position:-432px -880px !important}.product-icons-64.product-icons-toolsimage-grey{background-position:-64px -448px !important}.product-icons-64.product-icons-toolsimage{background-position:-448px -320px !important}.product-icons-32.product-icons-vipaegis-grey{background-position:-928px -1056px !important}.product-icons-32.product-icons-vipaegis{background-position:-960px -1056px !important}.product-icons-48.product-icons-vipaegis-grey{background-position:-880px -576px !important}.product-icons-48.product-icons-vipaegis{background-position:-880px -144px !important}.product-icons-64.product-icons-vipaegis-grey{background-position:-448px -128px !important}.product-icons-64.product-icons-vipaegis{background-position:-384px -384px !important}.product-icons-32.product-icons-visualstudio-grey{background-position:-1104px -32px !important}.product-icons-32.product-icons-visualstudio{background-position:-1104px -64px !important}.product-icons-48.product-icons-visualstudio-grey{background-position:-288px -832px !important}.product-icons-48.product-icons-visualstudio{background-position:-832px -672px !important}.product-icons-64.product-icons-visualstudio-grey{background-position:-192px -384px !important}.product-icons-64.product-icons-visualstudio{background-position:0px -384px !important}.product-icons-32.product-icons-vod-grey{background-position:-1104px -224px !important}.product-icons-32.product-icons-vod{background-position:-1104px -256px !important}.product-icons-48.product-icons-vod-grey{background-position:-784px -768px !important}.product-icons-48.product-icons-vod{background-position:-1024px 0px !important}.product-icons-64.product-icons-vod-grey{background-position:-384px -192px !important}.product-icons-64.product-icons-vod{background-position:-384px 0px !important}.product-icons-32.product-icons-vpc-grey{background-position:-1104px -416px !important}.product-icons-32.product-icons-vpc{background-position:-1104px -448px !important}.product-icons-48.product-icons-vpc-grey{background-position:-976px -384px !important}.product-icons-48.product-icons-vpc{background-position:-624px -928px !important}.product-icons-64.product-icons-vpc-grey{background-position:-192px -320px !important}.product-icons-64.product-icons-vpc{background-position:0px -320px !important}.product-icons-32.product-icons-waf-grey{background-position:-1104px -608px !important}.product-icons-32.product-icons-waf{background-position:-1104px -640px !important}.product-icons-48.product-icons-waf-grey{background-position:-928px -96px !important}.product-icons-48.product-icons-waf{background-position:-144px -880px !important}.product-icons-64.product-icons-waf-grey{background-position:-320px -128px !important}.product-icons-64.product-icons-waf{background-position:-256px -256px !important}.product-icons-32.product-icons-xianzhi-grey{background-position:-1104px -800px !important}.product-icons-32.product-icons-xianzhi{background-position:-1104px -832px !important}.product-icons-48.product-icons-xianzhi-grey{background-position:-432px -832px !important}.product-icons-48.product-icons-xianzhi{background-position:-832px -384px !important}.product-icons-64.product-icons-xianzhi-grey{background-position:-64px -256px !important}.product-icons-64.product-icons-xianzhi{background-position:-256px -128px !important}.product-icons-32.product-icons-ysf-grey{background-position:-1104px -992px !important}.product-icons-32.product-icons-ysf{background-position:-1104px -1024px !important}.product-icons-48.product-icons-ysf-grey{background-position:-976px -816px !important}.product-icons-48.product-icons-ysf{background-position:-48px -928px !important}.product-icons-64.product-icons-ysf-grey{background-position:-192px -192px !important}.product-icons-64.product-icons-ysf{background-position:0px -192px !important}.product-icons-32.product-icons-yundun-grey{background-position:-96px -1088px !important}.product-icons-32.product-icons-yundun{background-position:-128px -1088px !important}.product-icons-48.product-icons-yundun-grey{background-position:-720px -832px !important}.product-icons-48.product-icons-yundun{background-position:-640px -768px !important}.product-icons-64.product-icons-yundun-grey{background-position:-192px 0px !important}.product-icons-64.product-icons-yundun{background-position:0px -128px !important}.product-icons-32.product-icons-yunjiankong-grey{background-position:-288px -1088px !important}.product-icons-32.product-icons-yunjiankong{background-position:-320px -1088px !important}.product-icons-48.product-icons-yunjiankong-grey{background-position:-880px -432px !important}.product-icons-48.product-icons-yunjiankong{background-position:-976px -240px !important}.product-icons-64.product-icons-yunjiankong-grey{background-position:-64px -64px !important}.product-icons-64.product-icons-yunjiankong{background-position:-64px 0px !important}.console-search{box-sizing:border-box;float:left;margin-right:1px;position:relative;z-index:11}.console-search *{box-sizing:border-box}.console-search .console-search-ask{position:relative}.console-search .console-search-ask .console-search-ask-input{width:200px;height:40px;background:#2a2e31;border:0;padding:12px 30px 12px 10px;display:inline-block;color:#999;-webkit-border-radius:1px 1px;-moz-border-radius:1px / 1px;border-radius:1px / 1px;-o-transition:all 0.3s, 0.3s;-ms-transition:all 0.3s, 0.3s;-moz-transition:all 0.3s, 0.3s;-webkit-transition:all 0.3s, 0.3s}.console-search .console-search-ask .console-search-ask-input:focus{outline:none}.console-search .console-search-ask .console-search-mark{font-size:16px;line-height:30px;position:absolute;height:100%;width:40px;color:#eee;padding:5px;text-decoration:none;display:block}.console-search .console-search-ask .console-search-questionmark{right:0;top:0}.console-search .console-search-ask-active .console-search-ask-input{width:320px;height:40px;background:#f2f2f2;border:0;color:#000}.console-search .console-search-ask-active .console-search-questionmark{color:#0099cc}.console-search .console-search-answer{width:402px;margin-top:2px;left:-1px;border:1px solid #d4d4d4;border-top:none;background:#fff;position:absolute;-webkit-border-radius:2px 2px;-moz-border-radius:2px / 2px;border-radius:2px / 2px;text-shadow:1px}.console-search .console-search-answer .console-search-answer-head{background:#f8f8f8;border-bottom:1px solid #eee;height:42px}.console-search .console-search-answer .console-search-answer-head ul{list-style:none;margin:0;padding:0 24px}.console-search .console-search-answer .console-search-answer-head ul li{float:left;margin-right:14px;height:42px;line-height:42px}.console-search .console-search-answer .console-search-answer-head ul li a{display:block;width:100%;height:100%;color:#666;text-decoration:none}.console-search .console-search-answer .console-search-answer-head ul li a:hover{color:#ff6500;border-bottom:2px solid #ff6500}.console-search .console-search-answer .console-search-answer-head ul li.console-search-tab-active a{color:#ff6500;border-bottom:2px solid #ff6500}.console-search .console-search-answer .console-search-answer-body{padding:0 24px}.console-search .console-search-answer .console-search-answer-body .console-search-answer-list .console-search-answer-item{height:40px;line-height:40px;border-bottom:1px solid #eee}.console-search .console-search-answer .console-search-answer-body .console-search-answer-list .console-search-answer-item a{color:#00a2ca}.console-search .console-search-answer .console-search-answer-body .console-search-answer-more{height:40px;line-height:40px;text-align:right}.console-search .console-search-answer .console-search-answer-body .console-search-answer-more a{color:#00a2ca}.selector{width:100%;height:140px;border:1px solid #999;background-color:#FFF;overflow-x:hidden;overflow-y:auto}.selector .selector-list{list-style:none;margin:0px;padding:0px}.selector .selector-list .selector-item{height:32px;line-height:32px;overflow:hidden;border-bottom:1px solid #DDD;text-overflow:ellipsis;white-space:nowrap;text-indent:8px}.selector .selector-list .selector-item:hover{color:#06C;background-color:#FAFCFF;cursor:pointer}.selector .selector-list .selector-item.active{background-color:#37C;color:#FFF}.selector .selector-list .selector-item.disabled{color:#AAA;cursor:not-allowed;background-color:#FAFAFA}.selector .selector-msg{text-align:center;color:#999;height:32px;line-height:32px}.selector.selector-status-error .selector-msg{cursor:pointer}.selector.selector-status-hasmore .selector-msg{cursor:pointer}.list-selector .selector-box{width:45%;float:left}.list-selector .selector-box .inner-wrap{border:1px solid #bbb;height:200px;overflow:hidden}.list-selector .selector-box .inner-wrap .inner-head{border:1px solid #eee;margin:6px;position:relative}.list-selector .selector-box .inner-wrap .inner-head input{border:0;width:90%}.list-selector .selector-box .inner-wrap .inner-head input:focus{outline:0}.list-selector .selector-box .inner-wrap .inner-head .search{width:20px;height:20px;line-height:20px;padding:0 6px;cursor:pointer;position:absolute;right:0;top:0}.list-selector .selector-box .inner-wrap .inner-body{height:160px;overflow-y:auto;overflow-x:hidden;border:0}.list-selector .selector-box .inner-wrap .inner-body2{height:200px;overflow-y:auto;overflow-x:hidden;border:0}.list-selector .selector-mid{width:10%;text-align:center;float:left}.list-selector .selector-mid .mid-box{margin:10px auto;height:40px;width:40px;font-weight:bold;border:1px solid #bbb;background:#f7f7f7;display:block;cursor:pointer}.list-selector .selector-mid .mid-margin{margin-top:80px;margin-bottom:10px}.aliyun-console-table-search-list{min-width:100px}.console-global-notice{position:relative;margin-top:-1px;z-index:1}.console-global-notice .console-global-notice-nav{position:absolute;top:13px;left:25px;z-index:2}.console-global-notice .console-global-notice-nav span{width:12px;height:12px;display:block;float:left;background:#e8e8e8;border-radius:12px;margin-right:3px;cursor:pointer}.console-global-notice .console-global-notice-nav span.active{background:#999999}.console-global-notice .console-global-notice-list{height:50px;position:relative}.console-global-notice .console-global-notice-list .console-global-notice-item{position:absolute;width:100%;top:0;left:0;z-index:1;padding:10px 12px;border-radius:2px;margin-bottom:0px;text-align:left}.console-global-notice .console-global-notice-list .console-global-notice-item .console-global-notice-nomore{position:absolute;top:8px;right:12px}.console-global-notice .console-global-notice-list .console-global-notice-item .console-global-notice-content{padding-right:80px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.console-clip-copy{background:rgba(0,0,0,0.75);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#bf000000,endColorstr=#bf000000);position:absolute;color:#fff;line-height:24px;height:24px;overflow:hidden;padding:0px 12px 0px 30px}.console-clip-copy .rectangle1,.console-clip-copy .rectangle2{position:absolute;top:8px;left:13px;border:1px solid #fff;width:10px;height:12px;background:#404040;z-index:2}.console-clip-copy .rectangle2{left:15px;z-index:1;top:5px}.console-clip-copyed{padding-left:12px}.console-clip-copyed .rectangle1,.console-clip-copyed .rectangle2{display:none}.console-aside-wrap{position:fixed;z-index:105}.console-aside-wrap .console-aside{position:absolute;display:none}.console-aside-wrap .console-aside.console-aside-transform{-o-transition:all 0.3s, 0.3s;-ms-transition:all 0.3s, 0.3s;-moz-transition:all 0.3s, 0.3s;-webkit-transition:all 0.3s, 0.3s}.console-aside-wrap.top{top:0;width:100%}.console-aside-wrap.top .console-aside{top:0;width:100%}.console-aside-wrap.right{right:0;height:100%;top:0}.console-aside-wrap.right .console-aside{right:0;height:100%}.console-aside-wrap.left{left:0;height:100%;top:0}.console-aside-wrap.left .console-aside{left:0;height:100%}.console-aside-wrap.bottom{bottom:0;width:100%}.console-aside-wrap.bottom .console-aside{bottom:0;width:100%}.table-default-viewer{width:100%;background-color:#FFF}.table-default-viewer td{padding:11px 20px;border:1px solid #eeeeee}.table-default-viewer.off{display:none}.table-viewer-topbar-content{padding:0px;margin:0px;margin-right:8px}.table-viewer-header{margin-top:10px;margin-bottom:-1px;height:40px;background:#F5f6FA;line-height:38px;border:1px solid #e1e6eb;position:relative;border-left:4px solid #6d7781}.table-viewer-header .table-viewer-topbar-title{font-size:14px;color:#333333;display:inline-block;margin-left:16px}.table-viewer-header .table-viewer-topbar-content{margin-right:60px}.table-viewer-header .toggle-drop-down-icon{-webkit-user-select:none;-moz-user-select:none;user-select:none;-o-user-select:none;-ms-user-select:none;position:absolute;width:40px;height:39px;right:0;top:0;border-left:1px solid #e1e6eb}.table-viewer-header .table-viewer-dropdown{display:inline-block;margin:10px;font-size:20px}.simple-chart{height:100%;border:1px solid #ccd6e0;position:relative;-webkit-box-shadow:0px 0px 3px rgba(0,0,0,0.1);-moz-box-shadow:0px 0px 3px rgba(0,0,0,0.1);box-shadow:0px 0px 3px rgba(0,0,0,0.1)}.simple-chart .simple-chart-head{height:40px;line-height:40px;font-size:14px;padding-left:10px;background:#f8f9fb}.simple-chart .simple-chart-head-title{float:left}.simple-chart .simple-chart-operations{float:right}.simple-chart .simple-chart-operations .simple-chart-btn{display:inline-block;border-left:1px solid #e1e6eb;width:40px;text-align:center;cursor:pointer}.simple-chart .simple-chart-operations .simple-chart-btn span{font-size:14px;font-weight:bold;vertical-align:text-bottom}.simple-chart .simple-chart-body{border-top:1px solid #ccd6e0;padding:0px 2px 2px 0px}.simple-chart .simple-chart-body .highcharts-container{float:left}.simple-chart .simple-chart-body-inner{height:100%}.simple-chart .simple-chart-annulus-center{position:absolute;text-align:center}.simple-chart .simple-chart-annulus-center .simple-chart-annulus-number{color:#0099cc;font-size:32px}.simple-chart.simple-chart-nowrap{border:none;-webkit-box-shadow:0px 0px 0px;-moz-box-shadow:0px 0px 0px;box-shadow:0px 0px 0px}.simple-chart.simple-chart-nowrap .simple-chart-head{display:none}.simple-chart.simple-chart-nowrap .simple-chart-body{border:none;height:100% !important}.console-middle-page{margin-top:80px}.console-middle-page .console-middle-page-icon{text-align:right}.console-middle-page .console-middle-page-title{font-size:20px;margin:0;line-height:48px}.console-middle-page .console-middle-page-text{font-size:12px;color:#666}.console-middle-page .console-middle-page-link{border-top:1px solid #EEE;margin-top:16px;padding-top:16px}.console-middle-page .console-middle-page-link>a{padding-right:14px}.console-rank-select{height:32px;padding:8px 0px;overflow:hidden}.console-rank-select .rank-item{width:20px;height:16px;line-height:16px;overflow:hidden;display:block;float:left;font-size:16px;color:#CCC;cursor:pointer;zoom:1}.console-rank-select .rank-active{color:#09C}.console-rank-select .rank-hover{color:#3CF}.simple-loading{position:relative}.simple-loading .simple-loading-inner{margin-left:auto;margin-right:auto}.simple-loading-1:before,.simple-loading-1:after,.simple-loading-1{border-radius:50%;width:14px;height:14px;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation:simple-loading-1 1.8s infinite ease-in-out;animation:simple-loading-1 1.8s infinite ease-in-out}.simple-loading-1{font-size:10px;position:relative;text-indent:-9999em;-webkit-animation-delay:0.16s;animation-delay:0.16s}.simple-loading-1:before{left:-30px}.simple-loading-1:after{left:30px;-webkit-animation-delay:0.32s;animation-delay:0.32s}.simple-loading-1:before,.simple-loading-1:after{content:'';position:absolute;top:0}@-webkit-keyframes simple-loading-1{0%,80%,100%{box-shadow:0 2.5em 0 -1.3em #ddd}40%{box-shadow:0 2.5em 0 0 #ddd}}@keyframes simple-loading-1{0%,80%,100%{box-shadow:0 2.5em 0 -1.3em #ddd}40%{box-shadow:0 2.5em 0 0 #ddd}}.feedback-container{position:fixed;right:0px;bottom:100px;font-family:微软雅黑, 'Microsoft Yahei', 'Hiragino Sans GB', tahoma, arial, 宋体;font-size:12px;font-stretch:normal;font-style:normal;font-variant:normal;font-weight:normal;z-index:100}.feedback-container:hover .feedback-trigger .feedback-trigger-text,.feedback-container.active .feedback-trigger .feedback-trigger-text{width:56px;padding:0 0px 0 4px}.feedback-container h1,.feedback-container h2,.feedback-container textarea,.feedback-container input{margin:0;padding:0;border:0}.feedback-container .feedback{position:absolute;width:396px;background:rgba(0,162,202,0.5);padding:3px;right:81px;bottom:0}.feedback-container .feedback .feedback-panel{width:390px;background:#fff;padding:20px}.feedback-container .feedback .feedback-title{border-bottom:1px solid #eee;padding-bottom:8px;margin-bottom:15px}.feedback-container .feedback .feedback-title h1{color:#000;font-size:16px;display:inline-block}.feedback-container .feedback .feedback-title h1 i{cursor:pointer;margin-top:6px;float:right}.feedback-container .feedback .feedback-content{position:relative;margin-bottom:15px}.feedback-container .feedback .feedback-content h2{font-size:14px;margin-bottom:5px}.feedback-container .feedback .feedback-content .must{position:absolute;left:-10px;top:3px;color:red}.feedback-container .feedback textarea,.feedback-container .feedback input{font:12px/1.5 "\5FAE\8F6F\96C5\9ED1","Microsoft Yahei","Hiragino Sans GB",tahoma,arial,"\5B8B\4F53"}.feedback-container .feedback .feedback-content textarea{resize:none;height:106px;width:100%;padding:9px 10px;margin:6px 1px 1px 0;border:solid 1px #e8e8e8;border-radius:4px;line-height:16px;color:#333;font-size:12px;outline:0}.feedback-container .feedback .feedback-content .feedback-content-count{color:#666;margin-top:5px}.feedback-container .feedback .feedback-contact{margin-bottom:25px;position:relative}.feedback-container .feedback .feedback-contact h2{font-size:14px;margin-bottom:5px}.feedback-container .feedback .feedback-contact input{height:36px;margin-bottom:20px;resize:none;width:100%;padding:9px 10px;margin:6px 1px 1px 0;border:solid 1px #e8e8e8;line-height:16px;color:#333;font-size:12px;outline:0;background:#fff;border-radius:4px;text-decoration:none;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;user-select:none}.feedback-container .feedback .feedback-contact input:focus{background:#e9fbfe;border:solid 1px #e8e8e8}.feedback-container .feedback .feedback-contact .inputError{position:absolute;bottom:-22px;left:2px;color:red}.feedback-container .feedback .submit-btn{padding:0;height:24px;line-height:24px;font-size:12px;display:inline-block;min-width:78px;background:#00a2ca;color:#fff;text-align:center;outline:none;border-radius:0;text-decoration:none;cursor:pointer}.feedback-container .feedback .submit-btn:hover{background:#33b5d4;border-color:#33b5d4;text-decoration:none}.feedback-container .feedback .feedback-footer{text-align:center;padding:5px 0}.feedback-container .feedback .submit-btn.disabled{background:#efefef;border-color:#efefef;color:#ccc;cursor:default}.feedback .thanks{font-size:16px;margin-left:15px;color:#000;position:relative;top:-9px}.feedback .feedback-close{display:inline-block;float:right;cursor:pointer;font-size:18px}.feedback .feedback-check{font-size:30px;color:#65ce00}.feedback-container .feedback-trigger{display:inline-block;background-color:#3d5061;font-size:12px;color:#fff;border-radius:4px;cursor:pointer;padding:4px 4px 1px 1px}.feedback-container .feedback-trigger .feedback-trigger-text{padding:0;display:inline-block;height:16px;overflow:hidden;width:0;-moz-transition:all 0.3s ease-in;-webkit-transition:all 0.3s ease-in;-o-transition:all 0.3s ease-in;transition:all 0.3s ease-in}.feedback-container .feedback-trigger .feedback-trigger-icon{padding:0;display:inline-block;font-size:15px}.console-guide-dialog .modal-dialog{width:840px}.console-guide-dialog .modal-body{margin-bottom:15px}.console-guide-dialog .carousel-control{display:none}.console-guide-dialog .carousel-indicators{bottom:-40px !important}.console-guide-dialog .carousel-indicators li{background:#e8e8e8;width:16px;height:16px;border-radius:12px;margin:0 0 0 2px}.console-guide-dialog .carousel-indicators li.active{background:#09c;width:16px;height:16px;border-radius:12px;margin:0 0 0 2px}.console-guide-dialog .console-guide-dialog-link{position:absolute;z-index:100;bottom:20px;right:20px}.console-tag-select{position:absolute;width:320px}.console-tag-select ul{list-style:none;box-shadow:none !important;display:block;margin:0;padding:0}.console-tag-select .console-tag-dropdown{position:absolute;top:100%;left:0;z-index:1000;margin-top:2px;width:326px}.console-tag-select .console-tag-dropdown .dropdown-menu{position:static;border:1px solid #e1e6eb;width:160px}.console-tag-select .console-tag-dropdown .dropdown-menu .console-tag-key-item-block{padding:7px 16px;display:block}.console-tag-select .console-tag-dropdown .dropdown-menu .console-tag-key-item-empty{color:#999;font-style:italic}.console-tag-select .console-tag-dropdown .dropdown-menu .console-tag-key-item-title .console-tag-key-item-block{background:#F5F6FA;border-bottom:1px solid #eee}.console-tag-select .console-tag-dropdown .dropdown-menu li a{border-bottom:1px solid #eee;white-space:pre-line;position:relative}.console-tag-select .console-tag-dropdown .dropdown-menu li a:hover,.console-tag-select .console-tag-dropdown .dropdown-menu li a:focus{background-color:#F9F9FA}.console-tag-select .console-tag-dropdown .dropdown-menu li:last-child a{border-bottom:none}.console-tag-select .console-tag-dropdown .dropdown-menu li.tag-active a,.console-tag-select .console-tag-dropdown .dropdown-menu li.tag-active a:hover,.console-tag-select .console-tag-dropdown .dropdown-menu li.tag-active a:focus{text-decoration:none;outline:0;-webkit-transition:backgroud 0.2s ease, 0.2s ease}.console-tag-select .console-tag-dropdown .dropdown-menu li.tag-active a .console-tag-selected-icon,.console-tag-select .console-tag-dropdown .dropdown-menu li.tag-active a:hover .console-tag-selected-icon,.console-tag-select .console-tag-dropdown .dropdown-menu li.tag-active a:focus .console-tag-selected-icon{display:block}.console-tag-select .console-tag-dropdown .dropdown-menu li.tag-key-active{border-left:2px solid #09c;margin-left:-1px}.console-tag-select .console-tag-dropdown .dropdown-menu li.tag-key-active a,.console-tag-select .console-tag-dropdown .dropdown-menu li.tag-key-active a:hover,.console-tag-select .console-tag-dropdown .dropdown-menu li.tag-key-active a:focus{padding-left:15px}.console-tag-select .console-tag-dropdown .dropdown-menu .console-tag-value-item a.tag-active,.console-tag-select .console-tag-dropdown .dropdown-menu .console-tag-value-item a.tag-active:hover,.console-tag-select .console-tag-dropdown .dropdown-menu .console-tag-value-item a.tag-active:focus{background-color:#F9F9FA}.console-tag-select .console-tag-dropdown .console-tag-value-dropdown{margin-left:-1px}.console-tag-select .console-tag-pagepick{padding:0 5px}.console-tag-select .console-tag-pagepick a{display:inline-block !important;border-bottom:none !important;-webkit-user-select:none}.console-tag-select .console-tag-selected-icon{display:none;float:right;font-size:14px;position:absolute;right:8px;top:8px}.console-tag-select .console-tag-label-wrap{padding-left:2px}.console-tag-select .console-tag-label{padding:5px 20px 5px 5px;background:#f1f1f1;position:relative;margin-left:2px}.console-tag-select .console-tag-label .console-tag-label-remove{position:absolute;top:0;right:0;width:20px;height:27px;line-height:27px;text-align:center;cursor:pointer}.console-tag-select-view .console-tag-label{padding:5px 20px 5px 5px;background:#f1f1f1;position:relative;margin-left:2px}.console-tag-select-view .console-tag-label .console-tag-label-remove{position:absolute;top:0;right:0;width:20px;height:27px;line-height:27px;text-align:center;cursor:pointer;color:#666}.console-tag-select-view .console-tag-label .console-tag-label-colon{padding:0 1px}.console-tag-edit .tag-panel{min-height:120px;border:2px dashed #ddd;padding:8px}.console-tag-edit .tag-panel .console-tag-select-view .console-tag-label{margin:4px}.console-tag-edit .tag-edit-tip{color:#999;font-style:italic;margin-top:8px}.console-tag-edit-form{display:inline-block}.console-tag-edit-form input.form-control{width:80px}.console-tag-edit-form.form-inline .form-group{margin:0 8px 0 0px}.console-tag-loading-overlay{position:absolute;height:100%;width:100%;top:0;left:0;background:#fff;opacity:0.5;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50)}.console-tag-loading-block{position:absolute;top:50%;left:50%}.console-searchbar-textinput{min-width:180px}.console-shuttle .title{border-left:1px solid #e1e6eb;border-right:1px solid #e1e6eb;border-top:1px solid #e1e6eb;background-color:#F5F6FA;padding-left:5px;line-height:30px}.console-shuttle .search{position:relative}.console-shuttle .search .icon-search{position:absolute;right:5px;top:10px;font-size:12px}.console-shuttle .search input{width:100%;height:32px}.console-shuttle .selector{border:1px solid #e1e6eb;height:240px}.console-shuttle .left-selector{height:220px}.console-shuttle .right-selector{height:240px}.console-shuttle .search-hidden{height:240px}.console-shuttle .btn{display:block;margin:12px 45%}.console-shuttle .console-selector{width:40%}.console-shuttle .console-selector-result{width:40%}.console-shuttle .selector-group-options{vertical-align:middle;width:20%;text-align:center;margin-top:100px}.console-shuttle .selector-list .line-head{line-height:12px;margin-bottom:8px;color:#000}.console-shuttle .selector-list .line-bottom{line-height:12px;color:#999}.console-shuttle .selector-list .line-column-left{display:inline-block}.console-shuttle .selector-list .line-column-right{display:inline-block;float:right;padding:5px 0;color:#000}.console-shuttle .selector-list .line-yellow-text{color:#ff6600}.console-shuttle .selector-list .selector-item{height:auto;line-height:normal;padding:10px;text-indent:0}.console-shuttle .selector-list .selector-item:hover{color:auto;background:#f9f9f9}.console-shuttle .selector-list .selector-item.active{color:#fff;background:#0099cb}.console-shuttle .selector-list .selector-item.active .line-head{color:#fff}.console-shuttle .selector-list .selector-item.active .line-bottom{color:#fff}.console-shuttle .selector-list .selector-item.active .line-yellow-text{color:#fff}.console-shuttle .selector-list .selector-item.active .line-column-right{color:#fff}body{font-size:12px}body,h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:"Helvetica Neue", "Luxi Sans", "DejaVu Sans", Tahoma, "Hiragino Sans GB", STHeiti, "Microsoft YaHei"}a{color:#06C;cursor:pointer}a:hover{color:#039}label{font-size:100%}.nowrap{white-space:nowrap}.breakall{word-break:break-all;word-wrap:break-word}input::-ms-clear{display:none}input[type="radio"],input[type="checkbox"]{margin-top:2px;margin-top:1px \9}.console-container{padding:0 15px}.console-sidebar{border-right:1px solid #DDD}.console-sidebar .nav{margin-right:4px}.console-sidebar .nav li{border-bottom:1px solid #DDD;padding:4px 0px;position:relative}.console-sidebar .nav li a{color:#333;padding:6px 16px;border-left:2px solid #FFF}.console-sidebar .nav li a:hover{background-color:#FFF;border-left:2px solid #F90}.console-sidebar .nav li a span[class^="icon-"]{position:absolute;left:0px;top:8px;color:#999;font-size:14px}.console-sidebar .nav li.active a{color:#fff;border-left:2px solid #F90;background-color:#313844}.console-sidebar .nav .nav{margin-right:0px}.console-sidebar .nav .nav li{border-bottom:0px}.console-sidebar .nav .nav li a{text-indent:12px;background:#FFF;border-left-color:#FFF;color:#333}.console-sidebar .nav .nav li a:hover{background-color:#FFF;border-left:2px solid #F90}.console-sidebar .nav .nav li.active a{color:#fff;border-left:2px solid #F90;background-color:#313844}.console-instance-head{padding:3px 0px;border-bottom:1px solid #DDD}.console-instance-head h3.instance-id{display:inline-block;margin-right:8px;vertical-align:middle}.console-instance-head .pull-right{padding:16px 0px 10px}.dropdown-menu{font-size:12px;border-radius:0px;padding:0px;box-shadow:2px 2px 8px rgba(0,0,0,0.2)}.dropdown-menu li a{padding:7px 16px}.dropdown-menu .divider{margin:0px 0px}.console-chart{width:100%}.tooltip{word-break:break-all}.popover .popover-inner{padding:8px}.popover .popover-inner .popover-content{padding:0px}.console-not-service{margin-top:80px}.console-not-service .console-not-service-icon{text-align:right;padding-top:8px}.console-not-service .console-not-service-title{font-size:20px}.console-not-service .console-not-service-text{font-size:12px;color:#666}.console-not-service .console-not-service-link{border-top:1px solid #EEE;margin-top:16px;padding-top:16px}.console-step{height:24px;position:relative;margin-left:0px;margin-right:0px}.console-step .step{font-size:14px;height:24px;line-height:24px;color:#FFF;background:#cacaca;z-index:1;text-align:center}.console-step .step:before{content:'';display:block;position:absolute;left:-12px;z-index:8;top:0px;border-top:12px solid #cacaca;border-left:12px solid transparent !important;border-bottom:12px solid #cacaca}.console-step .step:after{content:'';display:block;width:16px;height:24px;position:absolute;right:0px;z-index:9;top:0px;border-top:12px solid transparent !important;border-left:12px solid #cacaca;border-bottom:12px solid transparent !important;background-color:#FFF}.console-step .step-first:before{display:none}.console-step .step-end:after{display:none}.console-step .step-pass{background-color:#99dcf3}.console-step .step-pass:after{border-color:#99dcf3}.console-step .step-pass:before{border-color:#99dcf3}.console-step .step-active{background-color:#00a0c7}.console-step .step-active:after{border-color:#00a0c7}.console-step .step-active:before{border-color:#00a0c7} diff --git a/pigx-register/src/main/resources/static/console-fe/public/css/font-awesome.css b/pigx-register/src/main/resources/static/console-fe/public/css/font-awesome.css new file mode 100755 index 000000000..09f8a2e58 --- /dev/null +++ b/pigx-register/src/main/resources/static/console-fe/public/css/font-awesome.css @@ -0,0 +1,2099 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * 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. + */ + +/*! + * Font Awesome 4.5.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ +/* FONT PATH + * -------------------------- */ +@font-face { + font-family: 'FontAwesome'; + src: url('../fonts/fontawesome-webfont.eot?v=4.5.0'); + src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.5.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.5.0') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.5.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.5.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.5.0#fontawesomeregular') format('svg'); + font-weight: normal; + font-style: normal; +} +.fa { + display: inline-block; + font: normal normal normal 14px/1 FontAwesome; + font-size: inherit; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +/* makes the font 33% larger relative to the icon container */ +.fa-lg { + font-size: 1.33333333em; + line-height: 0.75em; + vertical-align: -15%; +} +.fa-2x { + font-size: 2em; +} +.fa-3x { + font-size: 3em; +} +.fa-4x { + font-size: 4em; +} +.fa-5x { + font-size: 5em; +} +.fa-fw { + width: 1.28571429em; + text-align: center; +} +.fa-ul { + padding-left: 0; + margin-left: 2.14285714em; + list-style-type: none; +} +.fa-ul > li { + position: relative; +} +.fa-li { + position: absolute; + left: -2.14285714em; + width: 2.14285714em; + top: 0.14285714em; + text-align: center; +} +.fa-li.fa-lg { + left: -1.85714286em; +} +.fa-border { + padding: .2em .25em .15em; + border: solid 0.08em #eeeeee; + border-radius: .1em; +} +.fa-pull-left { + float: left; +} +.fa-pull-right { + float: right; +} +.fa.fa-pull-left { + margin-right: .3em; +} +.fa.fa-pull-right { + margin-left: .3em; +} +/* Deprecated as of 4.4.0 */ +.pull-right { + float: right; +} +.pull-left { + float: left; +} +.fa.pull-left { + margin-right: .3em; +} +.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(359deg); + transform: rotate(359deg); + } +} +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +.fa-rotate-90 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); +} +.fa-rotate-180 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); + -webkit-transform: rotate(180deg); + -ms-transform: rotate(180deg); + transform: rotate(180deg); +} +.fa-rotate-270 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); + -webkit-transform: rotate(270deg); + -ms-transform: rotate(270deg); + transform: rotate(270deg); +} +.fa-flip-horizontal { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1); + -webkit-transform: scale(-1, 1); + -ms-transform: scale(-1, 1); + transform: scale(-1, 1); +} +.fa-flip-vertical { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1); + -webkit-transform: scale(1, -1); + -ms-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 { + filter: none; +} +.fa-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; +} +.fa-stack-1x, +.fa-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center; +} +.fa-stack-1x { + line-height: inherit; +} +.fa-stack-2x { + font-size: 2em; +} +.fa-inverse { + color: #ffffff; +} +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ +.fa-glass:before { + content: "\f000"; +} +.fa-music:before { + content: "\f001"; +} +.fa-search:before { + content: "\f002"; +} +.fa-envelope-o:before { + content: "\f003"; +} +.fa-heart:before { + content: "\f004"; +} +.fa-star:before { + content: "\f005"; +} +.fa-star-o:before { + content: "\f006"; +} +.fa-user:before { + content: "\f007"; +} +.fa-film:before { + content: "\f008"; +} +.fa-th-large:before { + content: "\f009"; +} +.fa-th:before { + content: "\f00a"; +} +.fa-th-list:before { + content: "\f00b"; +} +.fa-check:before { + content: "\f00c"; +} +.fa-remove:before, +.fa-close:before, +.fa-times:before { + content: "\f00d"; +} +.fa-search-plus:before { + content: "\f00e"; +} +.fa-search-minus:before { + content: "\f010"; +} +.fa-power-off:before { + content: "\f011"; +} +.fa-signal:before { + content: "\f012"; +} +.fa-gear:before, +.fa-cog:before { + content: "\f013"; +} +.fa-trash-o:before { + content: "\f014"; +} +.fa-home:before { + content: "\f015"; +} +.fa-file-o:before { + content: "\f016"; +} +.fa-clock-o:before { + content: "\f017"; +} +.fa-road:before { + content: "\f018"; +} +.fa-download:before { + content: "\f019"; +} +.fa-arrow-circle-o-down:before { + content: "\f01a"; +} +.fa-arrow-circle-o-up:before { + content: "\f01b"; +} +.fa-inbox:before { + content: "\f01c"; +} +.fa-play-circle-o:before { + content: "\f01d"; +} +.fa-rotate-right:before, +.fa-repeat:before { + content: "\f01e"; +} +.fa-refresh:before { + content: "\f021"; +} +.fa-list-alt:before { + content: "\f022"; +} +.fa-lock:before { + content: "\f023"; +} +.fa-flag:before { + content: "\f024"; +} +.fa-headphones:before { + content: "\f025"; +} +.fa-volume-off:before { + content: "\f026"; +} +.fa-volume-down:before { + content: "\f027"; +} +.fa-volume-up:before { + content: "\f028"; +} +.fa-qrcode:before { + content: "\f029"; +} +.fa-barcode:before { + content: "\f02a"; +} +.fa-tag:before { + content: "\f02b"; +} +.fa-tags:before { + content: "\f02c"; +} +.fa-book:before { + content: "\f02d"; +} +.fa-bookmark:before { + content: "\f02e"; +} +.fa-print:before { + content: "\f02f"; +} +.fa-camera:before { + content: "\f030"; +} +.fa-font:before { + content: "\f031"; +} +.fa-bold:before { + content: "\f032"; +} +.fa-italic:before { + content: "\f033"; +} +.fa-text-height:before { + content: "\f034"; +} +.fa-text-width:before { + content: "\f035"; +} +.fa-align-left:before { + content: "\f036"; +} +.fa-align-center:before { + content: "\f037"; +} +.fa-align-right:before { + content: "\f038"; +} +.fa-align-justify:before { + content: "\f039"; +} +.fa-list:before { + content: "\f03a"; +} +.fa-dedent:before, +.fa-outdent:before { + content: "\f03b"; +} +.fa-indent:before { + content: "\f03c"; +} +.fa-video-camera:before { + content: "\f03d"; +} +.fa-photo:before, +.fa-image:before, +.fa-picture-o:before { + content: "\f03e"; +} +.fa-pencil:before { + content: "\f040"; +} +.fa-map-marker:before { + content: "\f041"; +} +.fa-adjust:before { + content: "\f042"; +} +.fa-tint:before { + content: "\f043"; +} +.fa-edit:before, +.fa-pencil-square-o:before { + content: "\f044"; +} +.fa-share-square-o:before { + content: "\f045"; +} +.fa-check-square-o:before { + content: "\f046"; +} +.fa-arrows:before { + content: "\f047"; +} +.fa-step-backward:before { + content: "\f048"; +} +.fa-fast-backward:before { + content: "\f049"; +} +.fa-backward:before { + content: "\f04a"; +} +.fa-play:before { + content: "\f04b"; +} +.fa-pause:before { + content: "\f04c"; +} +.fa-stop:before { + content: "\f04d"; +} +.fa-forward:before { + content: "\f04e"; +} +.fa-fast-forward:before { + content: "\f050"; +} +.fa-step-forward:before { + content: "\f051"; +} +.fa-eject:before { + content: "\f052"; +} +.fa-chevron-left:before { + content: "\f053"; +} +.fa-chevron-right:before { + content: "\f054"; +} +.fa-plus-circle:before { + content: "\f055"; +} +.fa-minus-circle:before { + content: "\f056"; +} +.fa-times-circle:before { + content: "\f057"; +} +.fa-check-circle:before { + content: "\f058"; +} +.fa-question-circle:before { + content: "\f059"; +} +.fa-info-circle:before { + content: "\f05a"; +} +.fa-crosshairs:before { + content: "\f05b"; +} +.fa-times-circle-o:before { + content: "\f05c"; +} +.fa-check-circle-o:before { + content: "\f05d"; +} +.fa-ban:before { + content: "\f05e"; +} +.fa-arrow-left:before { + content: "\f060"; +} +.fa-arrow-right:before { + content: "\f061"; +} +.fa-arrow-up:before { + content: "\f062"; +} +.fa-arrow-down:before { + content: "\f063"; +} +.fa-mail-forward:before, +.fa-share:before { + content: "\f064"; +} +.fa-expand:before { + content: "\f065"; +} +.fa-compress:before { + content: "\f066"; +} +.fa-plus:before { + content: "\f067"; +} +.fa-minus:before { + content: "\f068"; +} +.fa-asterisk:before { + content: "\f069"; +} +.fa-exclamation-circle:before { + content: "\f06a"; +} +.fa-gift:before { + content: "\f06b"; +} +.fa-leaf:before { + content: "\f06c"; +} +.fa-fire:before { + content: "\f06d"; +} +.fa-eye:before { + content: "\f06e"; +} +.fa-eye-slash:before { + content: "\f070"; +} +.fa-warning:before, +.fa-exclamation-triangle:before { + content: "\f071"; +} +.fa-plane:before { + content: "\f072"; +} +.fa-calendar:before { + content: "\f073"; +} +.fa-random:before { + content: "\f074"; +} +.fa-comment:before { + content: "\f075"; +} +.fa-magnet:before { + content: "\f076"; +} +.fa-chevron-up:before { + content: "\f077"; +} +.fa-chevron-down:before { + content: "\f078"; +} +.fa-retweet:before { + content: "\f079"; +} +.fa-shopping-cart:before { + content: "\f07a"; +} +.fa-folder:before { + content: "\f07b"; +} +.fa-folder-open:before { + content: "\f07c"; +} +.fa-arrows-v:before { + content: "\f07d"; +} +.fa-arrows-h:before { + content: "\f07e"; +} +.fa-bar-chart-o:before, +.fa-bar-chart:before { + content: "\f080"; +} +.fa-twitter-square:before { + content: "\f081"; +} +.fa-facebook-square:before { + content: "\f082"; +} +.fa-camera-retro:before { + content: "\f083"; +} +.fa-key:before { + content: "\f084"; +} +.fa-gears:before, +.fa-cogs:before { + content: "\f085"; +} +.fa-comments:before { + content: "\f086"; +} +.fa-thumbs-o-up:before { + content: "\f087"; +} +.fa-thumbs-o-down:before { + content: "\f088"; +} +.fa-star-half:before { + content: "\f089"; +} +.fa-heart-o:before { + content: "\f08a"; +} +.fa-sign-out:before { + content: "\f08b"; +} +.fa-linkedin-square:before { + content: "\f08c"; +} +.fa-thumb-tack:before { + content: "\f08d"; +} +.fa-external-link:before { + content: "\f08e"; +} +.fa-sign-in:before { + content: "\f090"; +} +.fa-trophy:before { + content: "\f091"; +} +.fa-github-square:before { + content: "\f092"; +} +.fa-upload:before { + content: "\f093"; +} +.fa-lemon-o:before { + content: "\f094"; +} +.fa-phone:before { + content: "\f095"; +} +.fa-square-o:before { + content: "\f096"; +} +.fa-bookmark-o:before { + content: "\f097"; +} +.fa-phone-square:before { + content: "\f098"; +} +.fa-twitter:before { + content: "\f099"; +} +.fa-facebook-f:before, +.fa-facebook:before { + content: "\f09a"; +} +.fa-github:before { + content: "\f09b"; +} +.fa-unlock:before { + content: "\f09c"; +} +.fa-credit-card:before { + content: "\f09d"; +} +.fa-feed:before, +.fa-rss:before { + content: "\f09e"; +} +.fa-hdd-o:before { + content: "\f0a0"; +} +.fa-bullhorn:before { + content: "\f0a1"; +} +.fa-bell:before { + content: "\f0f3"; +} +.fa-certificate:before { + content: "\f0a3"; +} +.fa-hand-o-right:before { + content: "\f0a4"; +} +.fa-hand-o-left:before { + content: "\f0a5"; +} +.fa-hand-o-up:before { + content: "\f0a6"; +} +.fa-hand-o-down:before { + content: "\f0a7"; +} +.fa-arrow-circle-left:before { + content: "\f0a8"; +} +.fa-arrow-circle-right:before { + content: "\f0a9"; +} +.fa-arrow-circle-up:before { + content: "\f0aa"; +} +.fa-arrow-circle-down:before { + content: "\f0ab"; +} +.fa-globe:before { + content: "\f0ac"; +} +.fa-wrench:before { + content: "\f0ad"; +} +.fa-tasks:before { + content: "\f0ae"; +} +.fa-filter:before { + content: "\f0b0"; +} +.fa-briefcase:before { + content: "\f0b1"; +} +.fa-arrows-alt:before { + content: "\f0b2"; +} +.fa-group:before, +.fa-users:before { + content: "\f0c0"; +} +.fa-chain:before, +.fa-link:before { + content: "\f0c1"; +} +.fa-cloud:before { + content: "\f0c2"; +} +.fa-flask:before { + content: "\f0c3"; +} +.fa-cut:before, +.fa-scissors:before { + content: "\f0c4"; +} +.fa-copy:before, +.fa-files-o:before { + content: "\f0c5"; +} +.fa-paperclip:before { + content: "\f0c6"; +} +.fa-save:before, +.fa-floppy-o:before { + content: "\f0c7"; +} +.fa-square:before { + content: "\f0c8"; +} +.fa-navicon:before, +.fa-reorder:before, +.fa-bars:before { + content: "\f0c9"; +} +.fa-list-ul:before { + content: "\f0ca"; +} +.fa-list-ol:before { + content: "\f0cb"; +} +.fa-strikethrough:before { + content: "\f0cc"; +} +.fa-underline:before { + content: "\f0cd"; +} +.fa-table:before { + content: "\f0ce"; +} +.fa-magic:before { + content: "\f0d0"; +} +.fa-truck:before { + content: "\f0d1"; +} +.fa-pinterest:before { + content: "\f0d2"; +} +.fa-pinterest-square:before { + content: "\f0d3"; +} +.fa-google-plus-square:before { + content: "\f0d4"; +} +.fa-google-plus:before { + content: "\f0d5"; +} +.fa-money:before { + content: "\f0d6"; +} +.fa-caret-down:before { + content: "\f0d7"; +} +.fa-caret-up:before { + content: "\f0d8"; +} +.fa-caret-left:before { + content: "\f0d9"; +} +.fa-caret-right:before { + content: "\f0da"; +} +.fa-columns:before { + content: "\f0db"; +} +.fa-unsorted:before, +.fa-sort:before { + content: "\f0dc"; +} +.fa-sort-down:before, +.fa-sort-desc:before { + content: "\f0dd"; +} +.fa-sort-up:before, +.fa-sort-asc:before { + content: "\f0de"; +} +.fa-envelope:before { + content: "\f0e0"; +} +.fa-linkedin:before { + content: "\f0e1"; +} +.fa-rotate-left:before, +.fa-undo:before { + content: "\f0e2"; +} +.fa-legal:before, +.fa-gavel:before { + content: "\f0e3"; +} +.fa-dashboard:before, +.fa-tachometer:before { + content: "\f0e4"; +} +.fa-comment-o:before { + content: "\f0e5"; +} +.fa-comments-o:before { + content: "\f0e6"; +} +.fa-flash:before, +.fa-bolt:before { + content: "\f0e7"; +} +.fa-sitemap:before { + content: "\f0e8"; +} +.fa-umbrella:before { + content: "\f0e9"; +} +.fa-paste:before, +.fa-clipboard:before { + content: "\f0ea"; +} +.fa-lightbulb-o:before { + content: "\f0eb"; +} +.fa-exchange:before { + content: "\f0ec"; +} +.fa-cloud-download:before { + content: "\f0ed"; +} +.fa-cloud-upload:before { + content: "\f0ee"; +} +.fa-user-md:before { + content: "\f0f0"; +} +.fa-stethoscope:before { + content: "\f0f1"; +} +.fa-suitcase:before { + content: "\f0f2"; +} +.fa-bell-o:before { + content: "\f0a2"; +} +.fa-coffee:before { + content: "\f0f4"; +} +.fa-cutlery:before { + content: "\f0f5"; +} +.fa-file-text-o:before { + content: "\f0f6"; +} +.fa-building-o:before { + content: "\f0f7"; +} +.fa-hospital-o:before { + content: "\f0f8"; +} +.fa-ambulance:before { + content: "\f0f9"; +} +.fa-medkit:before { + content: "\f0fa"; +} +.fa-fighter-jet:before { + content: "\f0fb"; +} +.fa-beer:before { + content: "\f0fc"; +} +.fa-h-square:before { + content: "\f0fd"; +} +.fa-plus-square:before { + content: "\f0fe"; +} +.fa-angle-double-left:before { + content: "\f100"; +} +.fa-angle-double-right:before { + content: "\f101"; +} +.fa-angle-double-up:before { + content: "\f102"; +} +.fa-angle-double-down:before { + content: "\f103"; +} +.fa-angle-left:before { + content: "\f104"; +} +.fa-angle-right:before { + content: "\f105"; +} +.fa-angle-up:before { + content: "\f106"; +} +.fa-angle-down:before { + content: "\f107"; +} +.fa-desktop:before { + content: "\f108"; +} +.fa-laptop:before { + content: "\f109"; +} +.fa-tablet:before { + content: "\f10a"; +} +.fa-mobile-phone:before, +.fa-mobile:before { + content: "\f10b"; +} +.fa-circle-o:before { + content: "\f10c"; +} +.fa-quote-left:before { + content: "\f10d"; +} +.fa-quote-right:before { + content: "\f10e"; +} +.fa-spinner:before { + content: "\f110"; +} +.fa-circle:before { + content: "\f111"; +} +.fa-mail-reply:before, +.fa-reply:before { + content: "\f112"; +} +.fa-github-alt:before { + content: "\f113"; +} +.fa-folder-o:before { + content: "\f114"; +} +.fa-folder-open-o:before { + content: "\f115"; +} +.fa-smile-o:before { + content: "\f118"; +} +.fa-frown-o:before { + content: "\f119"; +} +.fa-meh-o:before { + content: "\f11a"; +} +.fa-gamepad:before { + content: "\f11b"; +} +.fa-keyboard-o:before { + content: "\f11c"; +} +.fa-flag-o:before { + content: "\f11d"; +} +.fa-flag-checkered:before { + content: "\f11e"; +} +.fa-terminal:before { + content: "\f120"; +} +.fa-code:before { + content: "\f121"; +} +.fa-mail-reply-all:before, +.fa-reply-all:before { + content: "\f122"; +} +.fa-star-half-empty:before, +.fa-star-half-full:before, +.fa-star-half-o:before { + content: "\f123"; +} +.fa-location-arrow:before { + content: "\f124"; +} +.fa-crop:before { + content: "\f125"; +} +.fa-code-fork:before { + content: "\f126"; +} +.fa-unlink:before, +.fa-chain-broken:before { + content: "\f127"; +} +.fa-question:before { + content: "\f128"; +} +.fa-info:before { + content: "\f129"; +} +.fa-exclamation:before { + content: "\f12a"; +} +.fa-superscript:before { + content: "\f12b"; +} +.fa-subscript:before { + content: "\f12c"; +} +.fa-eraser:before { + content: "\f12d"; +} +.fa-puzzle-piece:before { + content: "\f12e"; +} +.fa-microphone:before { + content: "\f130"; +} +.fa-microphone-slash:before { + content: "\f131"; +} +.fa-shield:before { + content: "\f132"; +} +.fa-calendar-o:before { + content: "\f133"; +} +.fa-fire-extinguisher:before { + content: "\f134"; +} +.fa-rocket:before { + content: "\f135"; +} +.fa-maxcdn:before { + content: "\f136"; +} +.fa-chevron-circle-left:before { + content: "\f137"; +} +.fa-chevron-circle-right:before { + content: "\f138"; +} +.fa-chevron-circle-up:before { + content: "\f139"; +} +.fa-chevron-circle-down:before { + content: "\f13a"; +} +.fa-html5:before { + content: "\f13b"; +} +.fa-css3:before { + content: "\f13c"; +} +.fa-anchor:before { + content: "\f13d"; +} +.fa-unlock-alt:before { + content: "\f13e"; +} +.fa-bullseye:before { + content: "\f140"; +} +.fa-ellipsis-h:before { + content: "\f141"; +} +.fa-ellipsis-v:before { + content: "\f142"; +} +.fa-rss-square:before { + content: "\f143"; +} +.fa-play-circle:before { + content: "\f144"; +} +.fa-ticket:before { + content: "\f145"; +} +.fa-minus-square:before { + content: "\f146"; +} +.fa-minus-square-o:before { + content: "\f147"; +} +.fa-level-up:before { + content: "\f148"; +} +.fa-level-down:before { + content: "\f149"; +} +.fa-check-square:before { + content: "\f14a"; +} +.fa-pencil-square:before { + content: "\f14b"; +} +.fa-external-link-square:before { + content: "\f14c"; +} +.fa-share-square:before { + content: "\f14d"; +} +.fa-compass:before { + content: "\f14e"; +} +.fa-toggle-down:before, +.fa-caret-square-o-down:before { + content: "\f150"; +} +.fa-toggle-up:before, +.fa-caret-square-o-up:before { + content: "\f151"; +} +.fa-toggle-right:before, +.fa-caret-square-o-right:before { + content: "\f152"; +} +.fa-euro:before, +.fa-eur:before { + content: "\f153"; +} +.fa-gbp:before { + content: "\f154"; +} +.fa-dollar:before, +.fa-usd:before { + content: "\f155"; +} +.fa-rupee:before, +.fa-inr:before { + content: "\f156"; +} +.fa-cny:before, +.fa-rmb:before, +.fa-yen:before, +.fa-jpy:before { + content: "\f157"; +} +.fa-ruble:before, +.fa-rouble:before, +.fa-rub:before { + content: "\f158"; +} +.fa-won:before, +.fa-krw:before { + content: "\f159"; +} +.fa-bitcoin:before, +.fa-btc:before { + content: "\f15a"; +} +.fa-file:before { + content: "\f15b"; +} +.fa-file-text:before { + content: "\f15c"; +} +.fa-sort-alpha-asc:before { + content: "\f15d"; +} +.fa-sort-alpha-desc:before { + content: "\f15e"; +} +.fa-sort-amount-asc:before { + content: "\f160"; +} +.fa-sort-amount-desc:before { + content: "\f161"; +} +.fa-sort-numeric-asc:before { + content: "\f162"; +} +.fa-sort-numeric-desc:before { + content: "\f163"; +} +.fa-thumbs-up:before { + content: "\f164"; +} +.fa-thumbs-down:before { + content: "\f165"; +} +.fa-youtube-square:before { + content: "\f166"; +} +.fa-youtube:before { + content: "\f167"; +} +.fa-xing:before { + content: "\f168"; +} +.fa-xing-square:before { + content: "\f169"; +} +.fa-youtube-play:before { + content: "\f16a"; +} +.fa-dropbox:before { + content: "\f16b"; +} +.fa-stack-overflow:before { + content: "\f16c"; +} +.fa-instagram:before { + content: "\f16d"; +} +.fa-flickr:before { + content: "\f16e"; +} +.fa-adn:before { + content: "\f170"; +} +.fa-bitbucket:before { + content: "\f171"; +} +.fa-bitbucket-square:before { + content: "\f172"; +} +.fa-tumblr:before { + content: "\f173"; +} +.fa-tumblr-square:before { + content: "\f174"; +} +.fa-long-arrow-down:before { + content: "\f175"; +} +.fa-long-arrow-up:before { + content: "\f176"; +} +.fa-long-arrow-left:before { + content: "\f177"; +} +.fa-long-arrow-right:before { + content: "\f178"; +} +.fa-apple:before { + content: "\f179"; +} +.fa-windows:before { + content: "\f17a"; +} +.fa-android:before { + content: "\f17b"; +} +.fa-linux:before { + content: "\f17c"; +} +.fa-dribbble:before { + content: "\f17d"; +} +.fa-skype:before { + content: "\f17e"; +} +.fa-foursquare:before { + content: "\f180"; +} +.fa-trello:before { + content: "\f181"; +} +.fa-female:before { + content: "\f182"; +} +.fa-male:before { + content: "\f183"; +} +.fa-gittip:before, +.fa-gratipay:before { + content: "\f184"; +} +.fa-sun-o:before { + content: "\f185"; +} +.fa-moon-o:before { + content: "\f186"; +} +.fa-archive:before { + content: "\f187"; +} +.fa-bug:before { + content: "\f188"; +} +.fa-vk:before { + content: "\f189"; +} +.fa-weibo:before { + content: "\f18a"; +} +.fa-renren:before { + content: "\f18b"; +} +.fa-pagelines:before { + content: "\f18c"; +} +.fa-stack-exchange:before { + content: "\f18d"; +} +.fa-arrow-circle-o-right:before { + content: "\f18e"; +} +.fa-arrow-circle-o-left:before { + content: "\f190"; +} +.fa-toggle-left:before, +.fa-caret-square-o-left:before { + content: "\f191"; +} +.fa-dot-circle-o:before { + content: "\f192"; +} +.fa-wheelchair:before { + content: "\f193"; +} +.fa-vimeo-square:before { + content: "\f194"; +} +.fa-turkish-lira:before, +.fa-try:before { + content: "\f195"; +} +.fa-plus-square-o:before { + content: "\f196"; +} +.fa-space-shuttle:before { + content: "\f197"; +} +.fa-slack:before { + content: "\f198"; +} +.fa-envelope-square:before { + content: "\f199"; +} +.fa-wordpress:before { + content: "\f19a"; +} +.fa-openid:before { + content: "\f19b"; +} +.fa-institution:before, +.fa-bank:before, +.fa-university:before { + content: "\f19c"; +} +.fa-mortar-board:before, +.fa-graduation-cap:before { + content: "\f19d"; +} +.fa-yahoo:before { + content: "\f19e"; +} +.fa-google:before { + content: "\f1a0"; +} +.fa-reddit:before { + content: "\f1a1"; +} +.fa-reddit-square:before { + content: "\f1a2"; +} +.fa-stumbleupon-circle:before { + content: "\f1a3"; +} +.fa-stumbleupon:before { + content: "\f1a4"; +} +.fa-delicious:before { + content: "\f1a5"; +} +.fa-digg:before { + content: "\f1a6"; +} +.fa-pied-piper:before { + content: "\f1a7"; +} +.fa-pied-piper-alt:before { + content: "\f1a8"; +} +.fa-drupal:before { + content: "\f1a9"; +} +.fa-joomla:before { + content: "\f1aa"; +} +.fa-language:before { + content: "\f1ab"; +} +.fa-fax:before { + content: "\f1ac"; +} +.fa-building:before { + content: "\f1ad"; +} +.fa-child:before { + content: "\f1ae"; +} +.fa-paw:before { + content: "\f1b0"; +} +.fa-spoon:before { + content: "\f1b1"; +} +.fa-cube:before { + content: "\f1b2"; +} +.fa-cubes:before { + content: "\f1b3"; +} +.fa-behance:before { + content: "\f1b4"; +} +.fa-behance-square:before { + content: "\f1b5"; +} +.fa-steam:before { + content: "\f1b6"; +} +.fa-steam-square:before { + content: "\f1b7"; +} +.fa-recycle:before { + content: "\f1b8"; +} +.fa-automobile:before, +.fa-car:before { + content: "\f1b9"; +} +.fa-cab:before, +.fa-taxi:before { + content: "\f1ba"; +} +.fa-tree:before { + content: "\f1bb"; +} +.fa-spotify:before { + content: "\f1bc"; +} +.fa-deviantart:before { + content: "\f1bd"; +} +.fa-soundcloud:before { + content: "\f1be"; +} +.fa-database:before { + content: "\f1c0"; +} +.fa-file-pdf-o:before { + content: "\f1c1"; +} +.fa-file-word-o:before { + content: "\f1c2"; +} +.fa-file-excel-o:before { + content: "\f1c3"; +} +.fa-file-powerpoint-o:before { + content: "\f1c4"; +} +.fa-file-photo-o:before, +.fa-file-picture-o:before, +.fa-file-image-o:before { + content: "\f1c5"; +} +.fa-file-zip-o:before, +.fa-file-archive-o:before { + content: "\f1c6"; +} +.fa-file-sound-o:before, +.fa-file-audio-o:before { + content: "\f1c7"; +} +.fa-file-movie-o:before, +.fa-file-video-o:before { + content: "\f1c8"; +} +.fa-file-code-o:before { + content: "\f1c9"; +} +.fa-vine:before { + content: "\f1ca"; +} +.fa-codepen:before { + content: "\f1cb"; +} +.fa-jsfiddle:before { + content: "\f1cc"; +} +.fa-life-bouy:before, +.fa-life-buoy:before, +.fa-life-saver:before, +.fa-support:before, +.fa-life-ring:before { + content: "\f1cd"; +} +.fa-circle-o-notch:before { + content: "\f1ce"; +} +.fa-ra:before, +.fa-rebel:before { + content: "\f1d0"; +} +.fa-ge:before, +.fa-empire:before { + content: "\f1d1"; +} +.fa-git-square:before { + content: "\f1d2"; +} +.fa-git:before { + content: "\f1d3"; +} +.fa-y-combinator-square:before, +.fa-yc-square:before, +.fa-hacker-news:before { + content: "\f1d4"; +} +.fa-tencent-weibo:before { + content: "\f1d5"; +} +.fa-qq:before { + content: "\f1d6"; +} +.fa-wechat:before, +.fa-weixin:before { + content: "\f1d7"; +} +.fa-send:before, +.fa-paper-plane:before { + content: "\f1d8"; +} +.fa-send-o:before, +.fa-paper-plane-o:before { + content: "\f1d9"; +} +.fa-history:before { + content: "\f1da"; +} +.fa-circle-thin:before { + content: "\f1db"; +} +.fa-header:before { + content: "\f1dc"; +} +.fa-paragraph:before { + content: "\f1dd"; +} +.fa-sliders:before { + content: "\f1de"; +} +.fa-share-alt:before { + content: "\f1e0"; +} +.fa-share-alt-square:before { + content: "\f1e1"; +} +.fa-bomb:before { + content: "\f1e2"; +} +.fa-soccer-ball-o:before, +.fa-futbol-o:before { + content: "\f1e3"; +} +.fa-tty:before { + content: "\f1e4"; +} +.fa-binoculars:before { + content: "\f1e5"; +} +.fa-plug:before { + content: "\f1e6"; +} +.fa-slideshare:before { + content: "\f1e7"; +} +.fa-twitch:before { + content: "\f1e8"; +} +.fa-yelp:before { + content: "\f1e9"; +} +.fa-newspaper-o:before { + content: "\f1ea"; +} +.fa-wifi:before { + content: "\f1eb"; +} +.fa-calculator:before { + content: "\f1ec"; +} +.fa-paypal:before { + content: "\f1ed"; +} +.fa-google-wallet:before { + content: "\f1ee"; +} +.fa-cc-visa:before { + content: "\f1f0"; +} +.fa-cc-mastercard:before { + content: "\f1f1"; +} +.fa-cc-discover:before { + content: "\f1f2"; +} +.fa-cc-amex:before { + content: "\f1f3"; +} +.fa-cc-paypal:before { + content: "\f1f4"; +} +.fa-cc-stripe:before { + content: "\f1f5"; +} +.fa-bell-slash:before { + content: "\f1f6"; +} +.fa-bell-slash-o:before { + content: "\f1f7"; +} +.fa-trash:before { + content: "\f1f8"; +} +.fa-copyright:before { + content: "\f1f9"; +} +.fa-at:before { + content: "\f1fa"; +} +.fa-eyedropper:before { + content: "\f1fb"; +} +.fa-paint-brush:before { + content: "\f1fc"; +} +.fa-birthday-cake:before { + content: "\f1fd"; +} +.fa-area-chart:before { + content: "\f1fe"; +} +.fa-pie-chart:before { + content: "\f200"; +} +.fa-line-chart:before { + content: "\f201"; +} +.fa-lastfm:before { + content: "\f202"; +} +.fa-lastfm-square:before { + content: "\f203"; +} +.fa-toggle-off:before { + content: "\f204"; +} +.fa-toggle-on:before { + content: "\f205"; +} +.fa-bicycle:before { + content: "\f206"; +} +.fa-bus:before { + content: "\f207"; +} +.fa-ioxhost:before { + content: "\f208"; +} +.fa-angellist:before { + content: "\f209"; +} +.fa-cc:before { + content: "\f20a"; +} +.fa-shekel:before, +.fa-sheqel:before, +.fa-ils:before { + content: "\f20b"; +} +.fa-meanpath:before { + content: "\f20c"; +} +.fa-buysellads:before { + content: "\f20d"; +} +.fa-connectdevelop:before { + content: "\f20e"; +} +.fa-dashcube:before { + content: "\f210"; +} +.fa-forumbee:before { + content: "\f211"; +} +.fa-leanpub:before { + content: "\f212"; +} +.fa-sellsy:before { + content: "\f213"; +} +.fa-shirtsinbulk:before { + content: "\f214"; +} +.fa-simplybuilt:before { + content: "\f215"; +} +.fa-skyatlas:before { + content: "\f216"; +} +.fa-cart-plus:before { + content: "\f217"; +} +.fa-cart-arrow-down:before { + content: "\f218"; +} +.fa-diamond:before { + content: "\f219"; +} +.fa-ship:before { + content: "\f21a"; +} +.fa-user-secret:before { + content: "\f21b"; +} +.fa-motorcycle:before { + content: "\f21c"; +} +.fa-street-view:before { + content: "\f21d"; +} +.fa-heartbeat:before { + content: "\f21e"; +} +.fa-venus:before { + content: "\f221"; +} +.fa-mars:before { + content: "\f222"; +} +.fa-mercury:before { + content: "\f223"; +} +.fa-intersex:before, +.fa-transgender:before { + content: "\f224"; +} +.fa-transgender-alt:before { + content: "\f225"; +} +.fa-venus-double:before { + content: "\f226"; +} +.fa-mars-double:before { + content: "\f227"; +} +.fa-venus-mars:before { + content: "\f228"; +} +.fa-mars-stroke:before { + content: "\f229"; +} +.fa-mars-stroke-v:before { + content: "\f22a"; +} +.fa-mars-stroke-h:before { + content: "\f22b"; +} +.fa-neuter:before { + content: "\f22c"; +} +.fa-genderless:before { + content: "\f22d"; +} +.fa-facebook-official:before { + content: "\f230"; +} +.fa-pinterest-p:before { + content: "\f231"; +} +.fa-whatsapp:before { + content: "\f232"; +} +.fa-server:before { + content: "\f233"; +} +.fa-user-plus:before { + content: "\f234"; +} +.fa-user-times:before { + content: "\f235"; +} +.fa-hotel:before, +.fa-bed:before { + content: "\f236"; +} +.fa-viacoin:before { + content: "\f237"; +} +.fa-train:before { + content: "\f238"; +} +.fa-subway:before { + content: "\f239"; +} +.fa-medium:before { + content: "\f23a"; +} +.fa-yc:before, +.fa-y-combinator:before { + content: "\f23b"; +} +.fa-optin-monster:before { + content: "\f23c"; +} +.fa-opencart:before { + content: "\f23d"; +} +.fa-expeditedssl:before { + content: "\f23e"; +} +.fa-battery-4:before, +.fa-battery-full:before { + content: "\f240"; +} +.fa-battery-3:before, +.fa-battery-three-quarters:before { + content: "\f241"; +} +.fa-battery-2:before, +.fa-battery-half:before { + content: "\f242"; +} +.fa-battery-1:before, +.fa-battery-quarter:before { + content: "\f243"; +} +.fa-battery-0:before, +.fa-battery-empty:before { + content: "\f244"; +} +.fa-mouse-pointer:before { + content: "\f245"; +} +.fa-i-cursor:before { + content: "\f246"; +} +.fa-object-group:before { + content: "\f247"; +} +.fa-object-ungroup:before { + content: "\f248"; +} +.fa-sticky-note:before { + content: "\f249"; +} +.fa-sticky-note-o:before { + content: "\f24a"; +} +.fa-cc-jcb:before { + content: "\f24b"; +} +.fa-cc-diners-club:before { + content: "\f24c"; +} +.fa-clone:before { + content: "\f24d"; +} +.fa-balance-scale:before { + content: "\f24e"; +} +.fa-hourglass-o:before { + content: "\f250"; +} +.fa-hourglass-1:before, +.fa-hourglass-start:before { + content: "\f251"; +} +.fa-hourglass-2:before, +.fa-hourglass-half:before { + content: "\f252"; +} +.fa-hourglass-3:before, +.fa-hourglass-end:before { + content: "\f253"; +} +.fa-hourglass:before { + content: "\f254"; +} +.fa-hand-grab-o:before, +.fa-hand-rock-o:before { + content: "\f255"; +} +.fa-hand-stop-o:before, +.fa-hand-paper-o:before { + content: "\f256"; +} +.fa-hand-scissors-o:before { + content: "\f257"; +} +.fa-hand-lizard-o:before { + content: "\f258"; +} +.fa-hand-spock-o:before { + content: "\f259"; +} +.fa-hand-pointer-o:before { + content: "\f25a"; +} +.fa-hand-peace-o:before { + content: "\f25b"; +} +.fa-trademark:before { + content: "\f25c"; +} +.fa-registered:before { + content: "\f25d"; +} +.fa-creative-commons:before { + content: "\f25e"; +} +.fa-gg:before { + content: "\f260"; +} +.fa-gg-circle:before { + content: "\f261"; +} +.fa-tripadvisor:before { + content: "\f262"; +} +.fa-odnoklassniki:before { + content: "\f263"; +} +.fa-odnoklassniki-square:before { + content: "\f264"; +} +.fa-get-pocket:before { + content: "\f265"; +} +.fa-wikipedia-w:before { + content: "\f266"; +} +.fa-safari:before { + content: "\f267"; +} +.fa-chrome:before { + content: "\f268"; +} +.fa-firefox:before { + content: "\f269"; +} +.fa-opera:before { + content: "\f26a"; +} +.fa-internet-explorer:before { + content: "\f26b"; +} +.fa-tv:before, +.fa-television:before { + content: "\f26c"; +} +.fa-contao:before { + content: "\f26d"; +} +.fa-500px:before { + content: "\f26e"; +} +.fa-amazon:before { + content: "\f270"; +} +.fa-calendar-plus-o:before { + content: "\f271"; +} +.fa-calendar-minus-o:before { + content: "\f272"; +} +.fa-calendar-times-o:before { + content: "\f273"; +} +.fa-calendar-check-o:before { + content: "\f274"; +} +.fa-industry:before { + content: "\f275"; +} +.fa-map-pin:before { + content: "\f276"; +} +.fa-map-signs:before { + content: "\f277"; +} +.fa-map-o:before { + content: "\f278"; +} +.fa-map:before { + content: "\f279"; +} +.fa-commenting:before { + content: "\f27a"; +} +.fa-commenting-o:before { + content: "\f27b"; +} +.fa-houzz:before { + content: "\f27c"; +} +.fa-vimeo:before { + content: "\f27d"; +} +.fa-black-tie:before { + content: "\f27e"; +} +.fa-fonticons:before { + content: "\f280"; +} +.fa-reddit-alien:before { + content: "\f281"; +} +.fa-edge:before { + content: "\f282"; +} +.fa-credit-card-alt:before { + content: "\f283"; +} +.fa-codiepie:before { + content: "\f284"; +} +.fa-modx:before { + content: "\f285"; +} +.fa-fort-awesome:before { + content: "\f286"; +} +.fa-usb:before { + content: "\f287"; +} +.fa-product-hunt:before { + content: "\f288"; +} +.fa-mixcloud:before { + content: "\f289"; +} +.fa-scribd:before { + content: "\f28a"; +} +.fa-pause-circle:before { + content: "\f28b"; +} +.fa-pause-circle-o:before { + content: "\f28c"; +} +.fa-stop-circle:before { + content: "\f28d"; +} +.fa-stop-circle-o:before { + content: "\f28e"; +} +.fa-shopping-bag:before { + content: "\f290"; +} +.fa-shopping-basket:before { + content: "\f291"; +} +.fa-hashtag:before { + content: "\f292"; +} +.fa-bluetooth:before { + content: "\f293"; +} +.fa-bluetooth-b:before { + content: "\f294"; +} +.fa-percent:before { + content: "\f295"; +} diff --git a/pigx-register/src/main/resources/static/console-fe/public/css/fonts/aliyun-console-font.eot b/pigx-register/src/main/resources/static/console-fe/public/css/fonts/aliyun-console-font.eot new file mode 100755 index 0000000000000000000000000000000000000000..df84394b2613c6c099896d3a1f8d61b87921c14b GIT binary patch literal 169748 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 a6S;J+@i~6l;51PP^6Y@g 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%0AB8*?* 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 literal 0 HcmV?d00001 diff --git a/pigx-register/src/main/resources/static/console-fe/public/css/fonts/aliyun-console-font.ttf b/pigx-register/src/main/resources/static/console-fe/public/css/fonts/aliyun-console-font.ttf new file mode 100755 index 0000000000000000000000000000000000000000..a765a05c2c8757614c8741c080d1c1284cbde957 GIT binary patch literal 169536 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�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 C4vr}R literal 0 HcmV?d00001 diff --git a/pigx-register/src/main/resources/static/console-fe/public/css/fonts/aliyun-console-font.woff b/pigx-register/src/main/resources/static/console-fe/public/css/fonts/aliyun-console-font.woff new file mode 100755 index 0000000000000000000000000000000000000000..34fc56827c2ac5d2db4fe6069670a4fd43dd4565 GIT binary patch literal 169612 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 F{|ADEbC3W4 literal 0 HcmV?d00001 diff --git a/pigx-register/src/main/resources/static/console-fe/public/css/fonts/font_515771_emcns5054x3whfr.woff b/pigx-register/src/main/resources/static/console-fe/public/css/fonts/font_515771_emcns5054x3whfr.woff new file mode 100755 index 0000000000000000000000000000000000000000..9487bb68114af130a338c4294890caf6c1df2240 GIT binary patch literal 5504 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 literal 0 HcmV?d00001 diff --git a/pigx-register/src/main/resources/static/console-fe/public/css/fonts/roboto-bold.ttf b/pigx-register/src/main/resources/static/console-fe/public/css/fonts/roboto-bold.ttf new file mode 100755 index 0000000000000000000000000000000000000000..cbe70c8ef592aedac22d1f2c63b6cf263ce69508 GIT binary patch literal 48448 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 literal 0 HcmV?d00001 diff --git a/pigx-register/src/main/resources/static/console-fe/public/css/fonts/roboto-bold.woff2 b/pigx-register/src/main/resources/static/console-fe/public/css/fonts/roboto-bold.woff2 new file mode 100755 index 0000000000000000000000000000000000000000..9fd172f9dc8ab4b9a2781692aea4c05c8b0aaad9 GIT binary patch literal 20248 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

I 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 H7193!@H(om literal 0 HcmV?d00001 diff --git a/pigx-register/src/main/resources/static/console-fe/public/css/fonts/roboto-regular.woff b/pigx-register/src/main/resources/static/console-fe/public/css/fonts/roboto-regular.woff new file mode 100755 index 0000000000000000000000000000000000000000..b41d9054d402714e646fbab58290884754544919 GIT binary patch literal 26296 zcmY&{1Z;kiyi6|)X0{~E(KRglu08Aa1tBfI|Ktm4zK->QKsr*1U zH@4#1z)J5&haUa0i}}GBNI*Eiz}XQG0Dx8fvElp=urvsz#MhcBI zB_?_fKfdsyKQ<8m55G+;-G0UZFAD%jO9BAVfedJCB&J4sh5&$8=8p}-5164Jj}=UR z$RBR@N5}mE5u6qniK&&N>koJH)4mG;08*Y_A#Gx5WAJ0AYx>jg#1B?kcGa1!^jv@X z)o1+i!}|}w5I{B7dR9h1oZ^qo$d9jU9n0;8t&M{t0ATnNJD|ItHm}!Io4Rf7jedNM zfB*R9{@~oYAaBpbNdITd#*nhw_Q~oc$|NE9Ex$VUx;1nU3f{OQy`*L4G3 zLtWin5Pd4J-@5v`db)zM53U`Z zhx2vi3?)VAI;=jTp!?b@5zpyev`OK9V?E}oy8=J21D%@$L3nYs6TY2!z6rjz;oZFz zkys&=GRVbO_#NQ;IU=F)*S|ulzyppVu5kf2D+*^?9f+Pjy%Y2jEPRuSdw+$KOlS5i ziEg!Sx9$zG)#g`nucS#HLnTVo=GoY~P0onAN(acJZm#v}fF@DhRB{#qsDwjS<%tqi z3hWOS<>>>sSFCfi16_s#PgRm{V{;Z`d^P%5ei8{fE zWHMtb_}W8^Q+`OdohIH>v*rwhXOF^fYdd*9A6_Hr@UGGcsr84OWEGlHo@ zybV@CxCFw&AS-M_($pvX_YG-w2oY)#rp*z%s^dtTcJ+riN`sZEPwP2S+rRif;b6ar#$w!$=f%0J@I+8d#u1Lt){WRmd zUxzf3VtM&nl2%1mTk6JLfvWd8st(8&+~esQH+3IM9&a?kR`MhBbfU+d#PE%&{7W6B z?x;%F`Da>+oe~xv2`lFE0_I|(N&omMCYs|I4ha#1j4n>iCyRMN*T(6WGkuR*5hzBx z3PrQ~KJPl;B)G0I|96Iid88w>R7vN0P{sNf)_qkE32dnm8~?DO>mVZ1N_?GYM!a6w z!(}6x{_dHR4G6#OlT@cuxkg*;nXCq9tp=gqNOX=WDF&G@<|?ms8i4eKAMj{YYY6tX7|~UzN~?V} zE9gCKU*X}hl+YyA5c@i_UCmp z-y$Mj-QV2R^!Bu&j~k!#rEO@A8K3o~U1(rYFsK;SOq+LQV~{R{r#)}ooky(0 z&IeOo4q-r#X6m!dwGw5D__scnVmdAn%$c;Ekf-+($_ z;=+R!dERh%UYGpEOC#2NOXswLY=AMIK<}Djx$|c+#J%f%Wa&Awq9~HHyP_y?gm5He zNC`$$M%y}#RCTLXb7jvl6qbx~gQd0Bk9Ay!LPc+w=bfLI-S?1~x4Q;2up0C_y^2o~uDAt~y~` z7fQ%fkREouoG0`1vQfV`n0A(j^Khmt>w=Pl3K|`;3XD!&x`;jz*yyzHjj%6?q95@$3k@>zb*xSPrECnb$8$Ily<&+lT+Lle3$3r{KhF8~J2hP}LQ@V9Ix?~4+07D?T`;)x#z?N_zjGlsMhIz(xbT@z_ z3p8=`@!mbEalB!?Xe}fFk|ML?e=#xsnqc+wOY#eHLaCqw0V&`NH0~aa9UkoM1@!;E z@%20R0R-rC#g;+rcf7xMFtF0nej4i;yo~h54s%C@@%j1Laf?O^1v$~j%IoR^14=nz zd;d4qy1K@`y69lSV82~~59$10DPc%`8*u`FV~4;Ee+ERqNcUj^V_d1rKI|ysC&4Gk zC(b9$C&nkmr_(2nudNrAAAgp!L;3w3AO&2eqO01A2C6iZiW$@DqF81~F3rdR03P^~^2uX?2;guCt6;zbeSxP z5K)oY>75;29bBB;?4KWBA6}l`?wcE18(Ny$8d#Xv7+IO&!K3}lO2kOXNkC7|PQpyh zjZYVr*HutqGCuh#fkLCzZ8=oVRIyUMQR{tBOtsN$z0+oJo$d9G9?Ka4xQ ze?fy~%q4P|1CF?C$l%eXIQ-NbOTOklpn~5&aPK+L8W|TJ7TF>?8uN(Wlxc z;NSe0_Vj6K3sZ~tsd8}pYj7=9Z+_I!GVJ(L7HzN8mELsc+#&Jgg{8Z zf?_+`9Q!KdeHBFm;4|pUn0fya_j}`{tY$QY0~K&*asSS5It#7nMCGn0 zUFfM(|L;Q#2mti`4S;uD@A3lIMKW5y=~QUGHa3x9=328P_XBl?#CJpzsv`^!4JQDe zmy0bX=n{n&6_HB^KAANBgT%M1sE8zc4TrhhpefzOv602={E~CxWx|~Cd-1*J`a8+c z#Ds<6T4B3{XU3LuCFI~mZ(b_1H?7S+$rgDl-6WEf_?h?L-`LBdD8VE&)a-~?V@UC{Rkn-rP z{xWU_?>H8MKxP+=CCINd9Y-t7&1Q`jjdsVlU?%&A?fXF191^eLu*{^6K!sK)q42@b zq=s;#a570GjUayMAyAGK;^ZMg4$=X)zN&OlwaI>I^;5AW>G9SlYr-P=Ap2DlU(n)hEoUz7!?YCMUa%s%L@1(y3lx8%(JbKCA;tk8^QL`Q(co$5(d_24l!i zXc{iB?H)#kTyqUuEnZ<7P*DVYGHzHlo0rqA{Q?wSs;HK(hANiWKjB{dGrp2fZE(Ma zuR;I0?AFZx)9GVkh&ne!Ul|*|UOYzInH;+3r(vPNJG4fZOGwH}(AeJRDN+HO9n?U7 z2;Lvt3*|N0nP8w_=b#emcCG96agk-mT;Xl1FHzCb0tB02lSqBv{f<%28= zW~hABJI}HHY{zCfP2D3>gvL~mi_wKvn#LvIIvj1m8L06^6VRqLISDkn1ZPxVLQTP= zD4#ARBxKZfA;;hVP%xv%GBQ#jbOsQ{*_t!ort!ZDDIqCsiH#8OMx}s?;(KO_@JN0A zMqtt3AZ*Cle7c#;g0}9ytIx1eXWOOzdPTVHHat`awA^v_2G8vND9(7-=9ax!Hd&6& zx~I-*vf8MuxbD6m?p}exboMd`a@DwY*l>CFG8}mdO5v$D*toE`>OLQ)s6lsE@riAA z$@y0P;9Uo5r8p+oB%n?YmM4TpNVU<|m%r2nR&)|nENhdFg=qUrDB&w$zh%yr+plLM zi)FnOp$asn7ABbh4MU(vab!Q4o}}{+tnx2hjJ#}>tC5m)O|`No4ii%qhHX*~n2uD9 zGW)1g=2)EiYH%H*E&LIFFWQYH6n+*tA-4mb;spWNQ+epx;p4Az_ul8>ZyaVO{T@nl9h*c7_(~irwGX67MRTi(SuD272(@gzT+4rIa)x zV$~6L`J#%!_mY|{VfKfJ3JHtdA(eL#aCa$n>+G$|mQ?*TjE@I~(-R0o0tgmP%y__Z zg^rVWNTQn$7jecMV?bGVK&(t;*(8e)f7wslxf{CaLvyd{_8E#4*3OPp3Pz)bI( zdagSSK9Xi)Ez&yw2A;P_b$8o}J27kZB!IKd35Qq6Gw5=xhql>Xa(^Aex}Z#by&t~! zWL0sog?UPeJIKW55nZm|dNB!MzCVJmyINf%+g?h3k>tVuLqkQ~=cOt@lq!>bQJ@P0 zf{hnSawVs`(N>E8jQ|A_zhX%`v^{ArZ|OEE%zxR)^J%xvZ8S`wzkFtQ2zHr9X8~sR z-5q6Ux&uo<9k^$1-Ihvdy?3GMQ_ePpkfe%%M22+)AC6Jl-7Y;;g5n z3*;N_>=T#1=m`;5MSb&L-26~va`1Q|+k+;hG1Z(NU(d;R<(lChEhy$m*DF?4gd)vF zeO20Fpe91!0LMSVEGVT>`yy)fjrW1nS|pA*@^cL)LLFCId+yoy_rKsw{{ljMA%hqL zm1;G>MFU-5FjFJhvr;G?OG~xo5XOggNrD36TpQ&SSRU5)-{2OI)~h8P_49IZ3Q`B{kux$@4Du^^}@2 z2Q>hc45^wWigRlKWx_jOL0@pnT537q{98OPS2#FHMRrtSUu@^Q<4SkB&d;KTfuW!E zJJ){*%a^M+>Np=Ra1$z)@SuX5^#;;a4L1ZURXFZ9fCzN69EOFi&r6ElyU!4uIZ?{> zFNZGV=}j3HU=czY$xpeK0hx4EP>pG9N%Bpu&4jqOFlq3&?N{Hrj`pYeyIjT;t__x8 zHztejUSLoR2<5dCKq2 zhukkg4|i)md?g>}TBtnVjdD%++y{S+%yegz(cRD)$Z~nHscLr!wDn`^^OOW}whpcsHaP5yFZZ7_QLn%Gd7V4NFhR-EJLk4Zw2m}LvEQ9nidCDXlv;R+QC zr^E844?q3Gxu#r$1zoANO>^q>v|IsWe>k#4xZ~i|o#Zs&(dP`HSGL5g(1Jc*4-8$7 zl(Y#hmhU_0rg(*Mt?={OLU$|^&G2X1lJ?G{qr&B+{o6BPa=)Hm15>9npaW832}&)I zlqMjEWz&q~mT_495P!yHfXHAeNda=4-sUBhTU0bz4>#db4LJW6ypNDSLT&|&o~J!d zD}26=c6r7UPvI}MT0Ct=_W8e>wALeW(x3K3);SX48UV%(jp_Gxe1!oa2KoMDFb%W6 z9S&V*VH_X;=G?!Q;0DI`te*188 zNpLva5nl2Xp6et%pD8abN}&N9JD^<0U>zC!CXMTV1rguDi=!kGV!4(t&g#);1db~8 zQ`kKUePPIHFnnC(2u6XBalk$8p_2>v>ki25<$Dhb7wc&!rDNy^@%13r%7vy_OVq`| ztI9f!0(P10{tSMfR7BvT;|0!*2kaR6%LAFsm!9fK5^+;rL8l)%c%PHU*H! zA$w~}(0y*R!!DIkXVD6+DAJhLhPHhhuSDNe6>>SW_0>WY(v2mSHTqnNVL3$Ddx~rU zan9Cut=8be@TDHl!x0=L;ZSrfZm;z&q)PHCm?F_z*5Hl`#4yX<^G)2*VfVnT4xB<} z6+U!eK|c`2#+dGM%q*`IT%toV)KYq_JH$sN0y|?i5_{~g43>l@jb>Udo)8YoP7>vM zkBF&jEhWh5Kesb`sKX^tDcIb+q0KrP&6(RBJFhuGdc8howa+9DbDV`L$x17`cqRqj z<$a%u0VkyQIUp}IT$Ss7-}Zns=aw@)_N;JX7}%jeBp+q!H=k^*+^QwmjVYo6s?xWH z-M}&FXY6{CT-G4p=5s!GL@nmmE@8AX+*hLZ@4@6bmBm}^>hvX_$xyuoFlP)UC8qKO z*R|x7=r6tJX}OiEw8q-+%?**5R8DhQ1M&z4xfc>MFG-G~Q%zzQ$Y)gJ46-XxN{z$2 zA$sF-B?(yZR(`5Kn2FlR<^XMe!QWarL1rLmh==`pC#`0e7CF0(D30RM+XWn zxQeuF2JvA%SA~r(4R{+hB<~ZdX$>rTzbuuhA$s}_r)$0eLZZ`D^E`b+A9>)v;|b4e zLNcY51e!tCdB12;1^2X3g1NNhs#cAPI@K?gq^t;fb->6%1BGIAflsSFe7IbB&3I|| zj-PD%JmXk0I0?F;cTu5U`2SdcWDiE9W*dI{O1>SF+HY8g9LUUhVN;-L*BQ349QmON zYkto|NuU3pCkuFLZBs8+_Af@03?rE)agLos=No{Z_k;Z{82VZHfY)xFbbzdI`0B z-JN4{+0nz_F=CN*_j^kLoh37_m0h=&gF7V_EY%N7qr?J|Gv!Y*t>Fa&{nQ6y%&m^_ z)x$yb_hpn=$yms<1^7i6i^Ax(jM^ zC{eBQ9(%rbF!|FeVAl%H@kcV|T8#m5sQZIU=0jH@exn4)k+fPhD_FED1qOxGo`T|H zSr!>cya|dn9HD-r@jk;xc{I?aed-{qDMfo*aJLhiolO?U`40x4rRW4{hZQp&i<BsK=LhXBqfH^U`4S_bq&eixJM`Y`1x+h0QHAN|*R}%P`MIm-hSX zPQ-Vy*Ux#F-kyR*-@pC#9=N;mWD76dC2)}B*p4sYdudo(x#;?rGMP3vP>@ul~>w5HV3VIRt zPKJ;I?lY9vUaI^|nJhKBpEagjGC+9}6qaD+rq6Tx!bFk~oFagpUK)resgd}ORB)P2 zw#>`!hWKs|x&Y_8bm@K`S^Z#}$CRh?_=HQ8npmL6HN?>D+dA{1>&ZySWZpyT<0Ou- zIqnV=?wikSMIi;vn1qft2XFN+N)XBT-uBTzX)P}oFgKY1I^%#Lnbd8oVno|x|=j(XSO z{B*benW$-&?MX=v7N6pV}C2m z>%MQg?$+Cyk9Bq`QafCRO%eJ+7JcoJn6X|N#at{(QDxA-ey-oq0Uyj|$C+(rHmUuJ z((sElM)gAR%31oh#b>s%SAv3R0Eh&QCiYS@}SSB6o1F3o_tb>Kn-F8Z?wf@vWeLcam{kukdfc_^Ju%b$6>!;f8_E9A?5Qwhm` zPEWT68y(9~cJ3ROTlZfRoE~c+ZLT74P+yJ+qZ6z-S}bZhnO>|emo7O(4;OoyYQip4 zGGtA1URRQ5a@w?gog%q&2)vo!uzvqK{qLzYP5+BS` zra?=wfVs&MvI$sjc&$B7C-p82woOxVQUv7qfj*O+Q1g<<+Kx$siYI~hG|5?|u zc6S=*;R>C}X{!01a}p{ta^l=u!vDg2SyFBc=4r|p%X}fZ|Of8PzjmOql zHq8-dD%r{QX%zS%1K;8B4*j-0dT5h?+~`;V?tv?=W2&v;hh#%F$5{Y^$oE6yM7_!9 zlGn^*l`cbPCd32>N2feFhOThCnZ_&zVsZd;Ma`!o<`8^#1OzZecb*mhP0!W?q1TGl z`7?Lh^)w_9Q{&coJPMDCu;Rg_!{uqaVIaX=P2$qyo$@rGW6>xwmb?}t<#WsBbCpNo={TWeO%vWn& za;{Bv3v`#A88HhU0kG6xNyAS5?3P$EQ#Zx6a3=ZnFt=7h1046PZjqH7INv95v6_T~ zk0x}ai?D~!bWj5_mf*tJ(&!DBu5D;QlfI(TfC35*%!cZ+A|SZsIMN=UaN#@FmVLGh zf1AG_d!Jh>-v-3lNl0azMWG=|E!UBSqan}Vx9vV3A>LbJAU@^4W-{Qeuj$_2W72Yr z9VnIu5HYUdUfhp(Y=Re@XVIFB6MkVazhoWOE(P$J)wOTBOJ_XT-{l+nE5MaNTOK4s z+5m_0=|%Vv3r4ZX{u+f;bORD7T$SYCg7ZvP;-|+U-Hy+U(Oz`EnBx|OH6?YCV2VNp z&qnDsom_WNb%h@6_PAJe_~uu41XEv>>(VN`_Lc|)v+Qf;>zZn05l_A!&S=u(avfDF2pALxzLzJ6v$op(X7$q@Dq^{~AI(;nz5&Z zg^HU;=P#W-ujW10@Aw8+8XnymMTcXNmue*rKI2)Yhh5tcU4T|;FCMd2z$?-wwXr@6 z*aB$6FVMq)4b{lC&>PTRFu(+>DVJ;PW(n1XB}UzG$}P-v_6Hqbp$C0jf_XUA9$aHW zcHs@5eC>U&_ZQl?duMoO4RS*d@=OfEvBC_?K<$_$>;oQTDMToNTL zGzZy1>&R&}U2GH^Ie&`Xvh5=3cf_j&k)u~l?OV&etEPoz zL<{4`xH>^3qaBOJNuHE0mFI=8Er8r2i@_ky`_OM-K{#TeDaRBs_IWtak=uYq?*=oWb4bdpT0h-SFUTvAkmD!aexK?#7Uz57}xR zLWUqwn|o#aiq_JgM%l+_0NEC%%5TgR6_VP-Y?eiYXW^C)_vr}OvGWGq;@8cwz+je62Qb3G*|IJzT*{s(I z>V|E1J-F2wBky-)Sh<<61;Z{ogIkric|nMovF4ONi??R^zrZ5(w5r3VIz(JLsyLWS z2xSL=mGdE5vO-yWT%Ps!Tklt$6GxT7*UQJw+4AI;gV(p#{mPB>icFy+iH<$l1^ehuOzYVS{jS8Gf?)z4*WI3`8;-%qlMa47OYbhsO<&Cz{K%DUs@Pr+d42A>j^`8V_K%A_}}O-v=Aj@1M;q zkxM+)ws=H2wlcoB0kl$vQ#~x)DxMpC6i%$ix4#@?z0%w@aYVwQtg>K}j74?&nr?x{ zM!?4e<0O=It4=4~*jyf~;~d-eCnq^8(C5jKTU|QUbBfcAs z)xI8q5n#Vt)_S2xRP_{jK~F$AF(@)~Pb4GzG{wi*Bjm-FPVz;U&1XIClPmWw`nz4d+zs(W*Im7w z4u0Y~w;9}3yH$+fxb9WFrMq?5pw${|V{qT2%D0-{wdKV4usjskQLIp6ebAb{$E+V@ zjG~@P=T1Qoe8KMeq;*t|Dd$EWE*im96vbsR0tgr;=K9HX6e}nhXo*bf1;Y;AfHo4v zChzjw%|u2Y`LWUIo|4^!@C3BgtEM7!#(P|MS~;qtIRGaSeq>j`9k}OW9_Oz{=@PUW znEA}{f61j36V=Ux$Ve_~^B47`%KsMmtJe?(6;T?~eJ8S)frGttICH(j*X?eaVTf@0 zsABTI4R~Q|k_+E#GJ2XCH41|Sh~U7?+Jh67lSVo^wPWfsEvhw(wkmwInz?RX!ujgZ zR+_lb_M|3Z?W(&U3AI0#FLa-xu+5ek5L1@Pzqhox_}q>;2sHhvKmDw~YGus@-{pUS zpB;z`ZTt6-+o)@5E31xofi>X^$xL`GZv?7^va%&q&0YmdX!E6};hgiJcHosTdbw_N z+jN*gwvI^Burg3%v8N53Qn3SlohMQVXnR>eic{Ai^>SuL{kFzm{RdK3iCeG%Hmw+0 zw~LY|(KMGX#+!=oU61~3$Z(r*R`|s*KW!$OZ#gb1PCo876tw3SeTC^MVHnT^+*-s( zB=@DiX37chBBlXV^La=(r^o?gm2x69*<_f}{&usnsnfm7-&)zsql$3ZgO|)?b#m=Q z?YTa8iZX%S24^)S^p0qi=I#49*ctjH3VR2kYW0aRTc41+ph20`*ol0XJB9)F$^khS z)obFF7Vwx?Dr8v#W;zuscdq|~F|U?Yh{+}!o?5#XpYRl5>{)y0rSG#_aCB|Xvt*;u z_)>Nmabk0#keM+}Is4@~+_tw9!AJSGWZUNy{yHb0Ih0wxah}P@R^S1PLAi-B5B!lJ zWj2DWwYhdYU{ONvY;HD^jFUp+VWJ!aM7$i_;HKIZjP-W^(0>ROw8XWKM?0zk70+U(JgrIyh{s!}Sf;nxAnr zXUvmp?)SY^4lH-nCu)f9u8V8jhZi7)7dekMR3}st+s2-wG{H<9ZPCIH5w*G$LXA_v zSiAWZPW4$i{8pwK48_pkAEC5vapW-W<@6PeURE@9x^MI=)c5VKP#f2#=NJC(L_;c) zQ~MN)-Eh5az8z|wLt~Db`RiIn?>jD+nX6w(pTnD;Zr2hW z@Tv9-^;`ih1fI+HJ9nRj{IwLmclHDnf~5x%R?rTsr8YGU5G9qJMo{ZiH&zQgVHcvfp-Gi#|;SaZ^RRbVBDY=vd5bH1~Es^^K%$W=m zT5?#!Ufry&3iSC7IQZGj<@=lVSj*t5Pj;0t9zC5SS7j5#7=;KB1RUg8lAR4ojf=bJ zv=_MUHI&_m6FZQ;YR&I6K7Bs+H(0rBs8lYQBlI~gSiwCe9vjn&suj z^~(ddu7TGw#$?6n#AF%DS6Pq}8@4uoX7za8n^Sretz$NRJl_hG zxnC9PW-9lqO2_ZhtSmI`6f(b11pXddD^iZTPON5(j!8l`@6ytnS_sQlZa@W4H7Jh^@^Krqn$2v4(#kzjrZe!BOu^j z?vn3y&x3F|T+j17x=|jD-?2E1(FrreC8v?OzqQH*URpv9i~L7g9I3CA@fZh+L=vGc)I4K_Ti+x@zR~?!e(w1?gH4I=O#Jv&!?Y z2DLPk1c1GD26JLAVU4dVicKG;`nzW06G#g>zF~o{x@K%Tzamt^aCh0YeD<#=zU&^_ zVmM?mIQdZ`N-%9WS%wX zx6S41s;Y)fciljZUjMe;DI%o0@q+Ht z&g`>+=3f6F72@do%fMob`9tYQq923y*vtNeXFSvm>^|!)*o~L}re@a@p+c{IQfZh; zF->!0TBcDrRvsjjP3v;9UOlaBfTG!3EhrHdtb7qVD7T!yH8H9cXipXX*$mU$3KDKZ zO(nDP@zDTxGB498qaoUWa}>lBOaSjJF3ig$pF?aijxq}Ty5;A}#5<4cULGAGPF=kD zrIdur7pR$|w$`R!%ZuZQdNlliW_os&ixYeqz*C8BqM9I%hn50DsPx#7n z=1oQv1;x*_xX^SHYrws5lb(4^WcV)SZZRc`R`G?Y>_)!@ifD^EK^nuH1^ieOiikNF zPQRK-_=-$a7AIxlgWW}dK6-cdevuikOx4)F?c7yHb|FNwwH`f6Ms!b|-IdaxXirDij~Bv&VeB+o z_uIFE5gZ+^9^*R@3lz?$!HN(Ts;m~+JENA`o!~_K#*N9ttxLJ4D(FR3p z#0g-`y0=sfXFFa43qhxdRK=**j|b3H32uZb;7H@S%7EYV2=jey>dcU#TxHqAw)5A4$VAZKJnzf8eKzJ`7Z9j~VKr~gW1kZ^p zUE_x4ZmJwBwjj^f=?~hRZD+Tt40r9=DG%&lYUd>!EXvtro*wGMo)$0spO&=TwfvEz zxBB#z*8%1Aeah7bp)Fb|5`QZ|%hTPzTy-(HsK`hvkFf}jZ+dxzyX@=`>|@b#rC^7I zhN$f&y4tu#0&{2xZ?DQ}7eV{nUApVcMaweEb$UMi77kFp6gjpq1; zdCHVq5ixOG-lpYl61DPAWAZnqzS8BTYN_I{lXVsRrVW?I(=|_4jdU3eUTC>{ zr@U~UAST2T*)<%Ck#LTUwj~INr+nK=LJm1JW%ha;ZH9BYD=1r`^|5R(|B(zmnyHee zG;AXw(DamM@Hjnbv7?7&P8q)J(4{9~zo1l=-Li{O)WAC-?%7GR`6OPWzh;>cKjU<3 z7k}Gsi&7f9L}E;5aC`zbZ|12l8%nYX+B%%$E3IVAb9`8hug9t?uG;PT8tvdI|M@%{ zXh`pW9kkq^0JWrP;MOwQuJ1BYEeOLVu6hFf(A zOPxDRC2K(&*GTQ0(LQ>(-c6Dgx1gu8T?PB~Z_>dF9xDf9KTm4Xi*PU>w(IWso<47D z$KU=vm3B+fpxXS)3FIA@a8QdYbQAoLqDR!qilc+2Pt&;}fiquh#xNT229(qQ9}n4Y z-8Uts>7g74tDLy4CbA`^5JVu~Lro49JX5toulKAe>MdJZdUCyyzXd6L@?F{^b!hG9 zbwj=d&W3l;?(nX06)3q187Dq|kHCsrHi#@_&v(@XJL11}3eG24{%BeUQX8OR@*+Nd zv&6gRyr=57{f-sgWF+#7aoyx1D4X{o+8x}Y3G2~#o$g!~V6BLN$m4HcU#MP|XmFee zPzmHH;$UuRZf7CbE1u$0b*f}TuGEtpaRPls6(?=PEH91RoL~Q1?F?#Vww(3OeGh0P ztR8XZOas8++LqQ#KK?JmLCx z6Z;*;PDi~BOR)=X>?A*Ud5t}5*P?*AC>9ZEh@Uh34UOnAu|zDq36#g{EiVU$>4kTu zwlX}UI3M9Ed3`S9?BLkVMWNCI-Jbymj7u{<1ads>PclcjMKz=q>I-S=9 z3PNpGi!M7J&m~_AICwI2$gPgUYeh02VZ+C~0>ptX$wI?_1viR1<7Hq#UW!Epu44ZY zBxJ^70zdVH$OVg-(NiSq0^mXEL*rYhDEK$BG`VHu5g~t_$;KwawFHrG5No5o`&65&$8D)Y5~6&`Y+QfpVl!g&svq-gjr9+a40((%s?-J zU!jdm+f}jwy_VzoZ^GAKArg2?PdE9xy1qjVW!@9HEaDHVpY`mb#j1}B+7-b>DdqAN&{`bd?tIm9k~ z7iMFU1-EU445ue9;@zehyX*m-z4Syzo56@=eA?LDS;08~zQc(Vv`xTW7$<8X6Uvg) z8EBSmk$9@EB|6ws5Cm+UdJt5&URD)Mjjjf>d$$;w!aBBlPO=<}9>g~-HX1z%e6TlX z7CYB)T&@HjUuBb$Ab!zPstT)N_^e$x8VOTtv&_nT zB-%}#UQk?3m6Mv=23{kcXi3{ncqS|>r8xg3LcL|BldKk(QPWZBTz!EOi)NLSR#*Ri zMP|K_SI1slw~^ZzX-bkD&4mWB=sy1@MSP_`+M#l?}JXDf3&?0n) z-Y<|Yt2VIzR1+|5ZAxlpkaaR+*j%D%i$F(gnvA%F6vLaOU4SH^EiTy7tdM(kF7xCgtQfJ=04-RemV^VjXIYs-lF^}KW?0&Y^ z?q_M`eiwED+A&$uq7(2=v_O*E0ZAWbjTrZo;ht{Jd*MChrhED-SdRjc^=iVzJu3l9 zf2i2p9MEOokNxqnnpMM+V3p1}h)w&+wsU8rPwz>j_cv*9|6Jgt87=RhXWSobUsQy( zS?&N1Vv`tSSx&`rnNycbbwbR?90+8iTpG*IqdFi)?0g^}{V^Xf5A7-?d2AL%Kvpfe z)yd${z(0@t6ljY3H;3)^2L^{a4GHJ8={#-fttDNDw8<)|PHhJ0y^Flno=e+0M$Ped zclK!Cm`ULkb$H*^@tuV+h>Ktxt(J_4YR9bQ>=1_RY=0-q0Nd;3a3mfv)~%E z5H1~{^iU`nu~a*{P`>mQaOyQiNykYr&S2rG%K)r#dZbE+&NP8Vtj@g&ob-|&wlZKd zkEZD?>ed0qM;hipr+LA8mX*CH~&)q%Ap=E7h#g!mH!ItR}Z=J9v>lNo~Bz+BJIb zY#FzdWl%tMA}w0$npMgw^!9OM6ouYDi{0TRdf=pGH!TjM$aBk{URHKH`0Ht2bUaevfwY)j~gG7Y}p&VTvi?`v;w z`YT;qHaG9rSBKj$Goq$gF;i&N_Fa6bwGJ!RY07Te)`&G>8E#hYhrtxp<)!&;HHAvs z6mT$9e+DaLOoHfw6hJc7e`=8qNPzfY^Sl6m{xfiPrvoow?x+}iL^QV&2_*3p?dQcb zgc-}0h(IwbpaCLBB^%X53-*Jb+k+FW=&Oc%9wNsMXWCHEq$EIG({ z#JDQT$iKs{uD~mp_b%0IVQt1-RV(djPZYgI1>VeDSHYk=#w}7Ay(0&k2z}-ZyMu84 zUAX>@KySRhAES$jJD?BljbI=FjCiAkJ}E(?XV;w=UvxLHk|>(1anhW>kX&|~(21pt zFsBbX*nvTqGb%2~G~J*NR{(tY2GtGO+&y})s$0-!ilhS<63!)nUy{XwjTwynTr{kR zvNSy$byGLcodvF&i@I(ujF`EZ#>eC{a-Pqf=!LFK9sv-Py?RS)aR^zj;Biv3-99GRQesw<-u`O?l@MflJV1#WlL12$ zs*3H9Dz{n&@7l6=ZJU6uhS#zxFo7k1R>)OBP2dWQ=j2sYSN{$Kw7O+}4I6D+*+#zu zH7)m+$nax&U#D{iZd7X+Dy~o}B5DXEcNxgVa0~3Hg&@QW-D)WumcwCr6J8?lT3U#G z>;5bk#Y(6cuu@w7JF(J2HUAn$`ZZV8zljWCTyqu95pE!NOn6;>KVUnmjvkq7vSm;%~XckVv59fR^GFC(|jKBxa*N2k1pN+ z!kv8Su%`fzu|ZP+rB(d4{)oTnPoCYUeR3CK@P>7tA0W57C(Gx7V)+$S>>;M{(S|L;M{Oz^!$On~JDS{{L_-C}LZ5 zt3QrHwYAkqCMrjb^~kWE%+}YF)!KTpo7NM!IBpEF*?dtSGC|qusyxkPBVC*6UAndc zZuo_(!w`RdL`}6~P|)Z`)0c{Qjx;xAVN7)d-89T?0DxSbh0U&R6CJ&ifz^jWBlFb~ zkP9|?bBJDRzO`G0Y(b0Nj5ajwAqQSSTePZW7rB!*L4!AJ(k)(WB#-ho2OU~@VKcb^ z)Ng7i=b0OaN8|FppodZVi1?#e9 z`F7d`l!iuds*9!r^no;CHZLM+5XMvWL|*aUWG()Q_7h22vT4(N?Hj2^`)tIE55D-h zcAUJndh)c@1pBIh-Zx4=fVL zlfeqw>1k#($G%{!U<|ea2`{Gli&0n=$Z9T@-PkY`qNZf&71ilzP5QBTF>1!bY6^}K zEcg4c+Klxe>a84Dm&StX>15#>_3Dv_`#m?{)#!E6!Zz*aMeZGc#r~TX4!`*?V(&M< zdUn%{S1%3UzHDB`)r*8I0!@$G(hSA4nN6%RPcFKyE{ zffL2&QOf?8+T+m!{;d}IdMdVmtxujmsN2B|H=og2`yIe5Pr^;v#co$}7}jFwG;yQa1FhKhU49ewEt48EjCl{DPJ^8~4|n0dZpp>@s1!R! z)FM#yox{Ju)I{le0Y}&7mS7~Vz}=F!eQu=+zY})Td8Sp=J!sHvf7aj(C{GlSIKH+=U?ak{37@yT=o0Nqeqky6iGw_FG8Bt%mN7} zs4-VJNiIT_Cz(~!*p?DQ=+=~vp)@gdr7|}R{`Cj{ozzu20GG2QP1lN8TRlnBqg6=^ z9(gRnc0?puF4va(3N2-^YW7ieMXa116($h~t17D_xI?n?%i6j-U|D%NICQ^0%|z`A zn<`q`ro6iPzY*P@){;WMCCmG^$P)dkSQpZpr;P;e>hs^428*3(B|~?vo{N@XG%XZS z%fTwj4%3=Q#UDXRC|$#`P8lUB&N3w&Q9DU&susg}8KAn%t=RQJ-jo(x&_0QW0Zo~S=Nq)&d&qY2US5>|zfAxF79+##x^ z6HTmnF2FFWT@Fw*>vJ`Fl7K0cm-G-8R?1u$WPft?C+~eYX84FjvG4Xx+|!}Q?h(ho zh<7sYUbXUp@}3*tKhMqU_0gkGJ-=_{U6*g{@X7s)_!{0lck0Adq|JtB28^6G<~q+( z^@je}-qiTT#61VD%9%Gs9dP?IE3Ufj%F4g-V;Xa3t=NS&@vYi5`urAZVc-OpSfQTJ zx^Qxf(zYU&qvx~QCHGMWftO2JKC86lM3-{vhUodM%$$P4VrpTO%1TkS8Zcs)nK^*C zg5pw|*D7qD*Sh%Vmlk=gi%)_fHzZ}XTAd0L-_<;)C9rubV1Hp9RuH4p%_pwpg1eBx zCaz?d646|=!!zi_l}z1Pz@V)S&FoYx9jcR@-auNqKCSupj$WZ95x+8i1&zy3FFJxn zd{_H49%Exzn!%L~aNYG=lVtKQGD#++Pm)21a&l=z#3D!Ca$fa+HBJT%!(SaKvxQoP z7nv(V4jBHO0oP{$R}NQ%F~#O^6#!hh3@#v@l2)PD(o)cJDQI~*XeBzyROCS=Pp$_L z)6%nY7}aXsaz-YNnk9f#(2VWBqFh89C67z9oDsBLS>gOkN>>X5c|H=y)XGlBMM zS~gWPwN9^uQDr5MMG=*@zzJ>I(E&sFaDil0rDwxYaobjOzp?-MBMRRlVTF*U*$M*r}T02JRwQS6FM)RC#;6e*S22zSo`$cC2YzJ z&(*-MGW~ib7haF%36m~~rRGgp!W!iGrS;;A$lHl)o_`B|1*K1E+@zzC!9zXBS0vJe z&I{9oY)B1GU2B#uY|of2TrVConCe_7eMpXQ{vh0|TA$71=dMng&V%!su&v7*)@SrI z&luXvjJmb|E@OBpquPh{K0T+~lM#yz?vc7Dh{ba=@EI^B2S~3n>};f6tU=h(r8HQA zQ+ixN;@KZLSUJaHCaL<9K63Q=Xa({<(PVSEy%{*}S4s7#GEGUB1}VN25hs8sPEX8Y zb$e)Er%MK2HXe}?C@MA=SK)XjZ0p1+Cdm)V=uV0$@6H(a#>~g3R4hJq#lhLNo&Uaj zf8T9C-T&t~bKjd%|J1|NALH{D-n#5@a%{yHGshoVyz;I`Zf(D@a^cLO6ScTDe(=Ws zESve^+{K4Kj@?$(t?vsMx1@8MPH-|;$}PUg^coBYWq^BDlo5no>z5Lt?Zh}6r4$`A z53?&h6{x!Lh|ReH^9nb8EQdK`7y!4H(p-U)l@sb?Z`2@WQaq*Atq#BuT6MBojKvw= zic8gURF3#Y%j^h8`~AKZb3lisa9%E#>!VM62^g|I+mx7c%-kK?XOBZ(=P`7=Jp*qQH&4jgfZ*|g7UTc$ng8HPN zTFFUu&u&!CNnGbu*Q(=Ug)7hhR za`mNRU>ReHRKzQ}fLM<+jXht+BT;O(g5c(Xj#jW-%Vbo|MG!62Ce&fq#0(sjt&4vZUt!UhT4L(T-YIADe+83aGq=3=riM!JY-g#Rn9=H&9aum`Al{` zvm%zo_6I(qF|!!VAW(t1WgRHUxpYEUadm4z|4Q(o6%5R7WrtjLQFOG}De+4ZSV231 z;bo^z-*()rBno>`vKL3x08J()2u_r8gW9$3bhHfo?qs^xwy`1xX{ND4Z3EK20_Ry^ zN2e!1pPW?dl(J|QX|6{tDMRt<#cKJ&HWxuovg^e4GAd7oKK@mPK7)H=1Z9-Ta_U6p;+=yBBAxilK*7CoxT zTHU0-&})(@;*(R7Ca>NBQ#@$e=_O-syJFg~L(@(#9X{ZS=|f+yyOUhsz3+nU&vojx z=&76dtWCcxEM58fTJ7kDGYdkiUR_1nzc_~9m3u1wX8OBz?&w(d>}H&O1oF?#`MCZU zoqpuM$n+x=h62YPQDv5ET^=tJD;FPxgn~PH7}8`+O*S8hB$exPXaDDG!)E1Lm+bNB z^WVL{x;9K!HXGD*3H5H8uTFI7PK~j?&tQG&+{lZpPw^&3!d|$B2Nb2OJKddJ-TdX~!SuT^Uet<~b0!_qYBTlN!TFNun;|u_Bn&(6*l%1Ch zv=4)28M)Q1f_*^(G#UQUEz+MY@UXl^=96bLpmdvMOwtr6Ut$WB|9^1`6dTXvscvN& z6y{7XmnG)qDP;ZdsEVEz@)K&bdqFd({y4tn@*fO7m#))OOE7; zfKt*#K=~pQ0aw+He=#u-aQ!+u5YRj=eri^069EMs*G$(1x#u~i;4+zl%MCXnKfgk8 zpQ2jL&+6=e4z)R=U@6mEZSaX@D0%<)2!k_&@d=pevdZHGSiz%a=F#RcItfVEkm)(B zov8)sE?~(E2>E_QpZ+u^25)6WBQUlTQG!KXpixfE1&UrMYHkfA6hR1N-Ab| z`7nfF7ZT-i`qSR9N&+8&WeZ1BvN3d+Vx@Cp;J|4uqg8a+f1vtsW2VT+qiRYf;3T_R z%|l-`hq6LP4^GT!DhUqamP{VEXdb@s%;VE`3YCev;3I#S@c5ZUb%*wjzkAfEXI|v_ z_N4r2Vqfjm>x2C@#J1(e)=d>V58ThnQ=GndD;1)q8?7tKMBDlLLR5_ECt zTvK~QZ3Az^;aEF&4#M0HRdXeUnWo>}bhd>%1!F8|z@y3N0)Fp=&y~bF%^U>PEvptB zYF+M$+P$=g(k1I6xFCnc2jMIDa8ae5M-77csI)Q08tXC8pi-?H1}OCUblJSf=!zj&V5{P@#6eRch!L9 zwE4{Z`-cvjc;>77b{-iuWA?bAca0}){#EH&QY*k-;kl?B#QIOK&sbH|=|<_=a;1l&v_m|V>t6`(rYy8W13=Wzk!H&uPS z-?ALMss2N}ttGP)Zin~=kF$0yTp4{HwiJo+dONz6wrfkYH5)5(^@kd>N-m?up6NaD zjV48h{q2W^cG5A}KRwxOHSjKcmK2a8f@C~yB^F@51DmB5b1?s*`8YLWh+0brVOndR z@~bU9PT(ij_-2dRSC-{fO2Lum%7Pw#@Nz)*UCxlb{!|*4BTgE>u?f%X0FO#zM z@82P2kqOdI?AhR4MNDjZHaJH|Fw-$&79@mdG;9O&oBekTxq8H4LCl&s?B$+)A6zjH zu2mrt(u>me_dRFaOCR3pBIb(0LM<86PrPF0(xo$pzSIq_71F*TmB5w%^)t&ugM|9K z`ki=a`TaxhKFVTN!^JFqFNIO&E}>j!jp%?X&ag2TNuME(Q9)TBHmrk<<7g!uK4uiL z>nMmA2g4~YX0^ab0yDUVt|H;5QQXiqSSl1bq64Kk*cuX#KBYaW${>Mj_2>!1l^ zZW}z7KUs9sxY2_PZyGa}>XVh{e-`WM^X0wZ)m^4P)mFx-b2zTSks1ysJ#9WGIdqE5 zl;UnMp5~CwdS;qE;kK}qqm}xzZujV~Ynwmxwq1)?z`-c)G2Tz-6a+asf`N%V8++D? zMSs4ovDfGvq*3|+Bv10(qk-HSUTA(Dg%9hOYPt@gPw8cI5C&c_|A5UW7R_LLgm8{* zo<5V1JH%<$H z>EQ`SLuvRfgq z+n;^*Su08V$H=+9QDe65HIXT7u$`zpIdPcpfyqB=f0KC6^!d{XA?Z1fhhBXijt`y4 z-<(78h>6)>_XzXEeEN(iA2(H>8f0}uA~=u3M+sw0*}-S3TU>HD9HxG$31~+ZN$XFK zLdLQrntU-33hW$nG1Y_aYl;tN7wAKCD}(fT2}H)xwy1PNf_x8|zG4um8oO-i*jpAw z7D;`syH4v(4r#r4mo|+oi2p!lYY&rI+Dyt57--5D0V!N1i%#RD7f`0j$BD73RL$xy zx@PDg2W7m#xsMrMz#J3y(`QDc<3vt0N0n3-?^aU+k!FvMz#8t1-}C4Q#mi!>>AHWM zials{6YHC?TF@Z-UC))k&YGNEZ#+M4XU>dqlSjP&em&oPpRjJpVD)IX^&RfL_cr=? ziN=vMt3scDA^ZhkN#(||=az#GU@otl!QlyG^1`G)e!$PBZ93@$Js%zU;qw3-exLD_ z<-~+dR+6gPd~_f$r#cB6(UP=!v>YW^GpxVqu^8mw-n&U*-SmDhv*%(=dM4KG?B!Bl z--&zmCu2~(!Eq)Jth*TOrR`j_h~`^LjLH8g*`*Oi2Q@boMoK8@5!$ef_FvlyrHH~& z$mmg2h>I`6#TUBOd_w0(q79uDjt1%cy3b}%<5HF|`FzMkSWFe#Fgh?Yl_@GXkS})G1OMY4iqwB~~23?!e zmg1;{ThB#{X)Yo^V(@8>j-R{&hM&wP{FGKG#S}k93_rz1h=XFpPZ16HA%5_&_1WQQ zK9y+sdGJ|2>*WYISz}MA$iPopK2YA5z)JeBW2F_Q2sVFS3Ry@FH1P=HBpD$s`9DQb&y5fqFiW*C(fr8Z4A8u^dXB5Mo>gEW(zAf1Y`7DZ8w1sbUcwdl_# z+DHTiMVrBhBuNZu6A07yri?*+@Z-Dp+%EpTM+g!7bg2c6pCRsYSi@ z0<{uBrShR#KgK!z3>oGSQltSzDu|^z8|iu;E*UrG^L_*AA!XzsSx34_E7?Jglf&v8 z+SEg2nJH|Qowz28(Pjp*-IWNxwT!h#5Vn%hXr&`8ep1T42Tj&>gmoGQrI>Zc7+;UD z{fTFcTb1z3WK8SW`vVDMm-HdWN5avohO7uc>nf1t|CYVCxnIJ^h z^SprhHOxuI0jYyeGEt_V!p&H@>_JeC;-ZQ~Uzy+3QQWj6=wLrVX@WPF=Z8=CP!p+L zNRYi~H^W$AeZ^|?g>N3hBI-Wg$y49aOI=`p7-NL3>U$y@Aa zk5zUSyru;q(}ybY;EXeSJDX?SIIYKVR&r3GBgiKkbt3|D0^Q~VHtRVEvHnTMn@ouG zqKdwj*h$!JFTpYPRN%~gHeAKgNym$r4{_+U=m@>&qmGe}RzA|FeVB=?fhV@67xBcr zxQl!8i0^jhJ`4736ve!t5Ampp=o>YGtJHVox!geWe;;NNKp|)0b-akj@j}kyileRo zYFw$PaC$ON5H ze}eyqfSEv)z#l<9!8pMl!5xC0rD+NJbHSxDJOxkP!7@;#L#l|QOy)a=yC z)HbMnP|r}mrs1KnPSZ-WLGy@~kXD=4I;~sUT-ssUdvr{6Cg{A=4bpw2m!a3C&!X?8 zKS}?AL4ZMz!41PO!zV^X#zMwdOy-#;nTeS#F&8keG5=vP%i@s58%rh20?T(+MOG)Q zWvm-)cxi@{IPJ-BfTfV8CU}t`8WZB7 zCG=uU`m&{srK`JJ2p;S=@PiOP2e&zAk>AWtOH16zJo9_rpP7}kZZ>3Ozj;}3 zXU;`OIhV9H<0Z~@yr#5__EFC~8=@{e7w~-bT%6+)Ys!zbrEi{>$hh|WSg-WM^RmkN z>v=^__0Mxz&rR9$6MZmyo>z5ZzI(pWn)&1TRuwbN{i)T$rsrR9E$81wZ4_Ql>Tx^H z;-DU#jfbryXh!W`Jjy0IRIJasQlf#*)K{iJd#Y%c73eMA82eBW+B=QZQ3xGi8FJQV zS*g<^&WKtU$S#qgCT^cPYf5xX4cj54N8ZKCm$R-_qU%Jp*%><^$JTDKGitP`8|j=g z(I;%NdJpCd7qmrB2R`S{eRtoKiUTT*-0ZfeozmXLPI-*4gJtCI)FoyNcU_E~rSIP4 zfY)mgmurhTTUh>obNgZ$nfuydUAh%g=e|}*e8Sv2Og>*T#d6G_IMk8etAX71HJf^xSs`a1wz7&gef^rdUymuq^tBV_(?{qjHKw&2`hsPEFTppw z101b=Jpg#xZO}JtQ*jW-@$V&$ojASsLhtb2vzlRSFwoj?-XAtb@UKxhHct3XI> zAld?mUIhXMK=dYxfPtAV24Dpz{m&DWg9F7|0+7GlZeI@lZ|$m6!};I3pOzC`L1ev5aFp6PU;(CNqVpOk+AT zn8_?=Gl#j%V?I?9#Zfl0i5u+aBb(XH4i0dfV`61H@7cgUu}L($B!;cr=7ZQd$O(S& zliwWS6c4z^X%?`MJ)vJcqK5lChQCO z#njWlAsSgi69JkDvXo^k=QArac5-$mo zC`pnmDUvE_k}esNDOsH70++eM9WHW-yKLd4WOI{Sk|Vk7lsw6o0x6UttGB+T$*0?b z4Sr42DwIZ8x29CNN97)e(xohG(+CYJb)}(nD4j}|vRGN7ELHy7=MJl@y}E9%^?QSX zn(C@%UpO+%urAY584NVGH!ichP16&;Bc!2pD4l-+FIJ%&004N}J)R zHe)Dl3)LFK!484zts%fv4NNb9tNO<7k^Uk^@Qp_g5l=jl&+O_U5Xs!5j}W6DC`f;s zVJk0@cC6VUQ)IRb93azKV6N&Xk^7E>roch|3M`Su^iKU1>003Y} BAgurZ literal 0 HcmV?d00001 diff --git a/pigx-register/src/main/resources/static/console-fe/public/css/fonts/roboto-regular.woff2 b/pigx-register/src/main/resources/static/console-fe/public/css/fonts/roboto-regular.woff2 new file mode 100755 index 0000000000000000000000000000000000000000..74b5d0e8007cef4d21d8d859f76165da988d84a8 GIT binary patch literal 19988 zcmV(^K-Ir@Pew8T0RR9108SJD6951J0J}s008OL-0ssI200000000000000000000 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 \ No newline at end of file diff --git a/pigx-register/src/main/resources/static/console-fe/public/img/black_dot.png b/pigx-register/src/main/resources/static/console-fe/public/img/black_dot.png new file mode 100755 index 0000000000000000000000000000000000000000..1b64e7dff794db8d1a9744d940d72c7f66d3ddac GIT binary patch literal 114 zcmeAS@N?(olHy`uVBq!ia0vp^G9b*z3?w}c`(6i9Ea{HEjtmSN`?>!lvI6;R0X`wF zCT3Q81}5%N4AwvqaZeY=5RU7~KmPy!&(3zKgZbML!6mbJ7@h~Gem(Un^)yfkgQu&X J%Q~loCIFL(AJzZ> literal 0 HcmV?d00001 diff --git a/pigx-register/src/main/resources/static/console-fe/public/img/nacos.png b/pigx-register/src/main/resources/static/console-fe/public/img/nacos.png new file mode 100755 index 0000000000000000000000000000000000000000..9d9fba8ab1684415d478938ac43d4af18f347053 GIT binary patch literal 3588 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 KMNUMnLSTZUI)07- literal 0 HcmV?d00001 diff --git a/pigx-register/src/main/resources/static/console-fe/public/index.html b/pigx-register/src/main/resources/static/console-fe/public/index.html new file mode 100755 index 000000000..5d4dbe01b --- /dev/null +++ b/pigx-register/src/main/resources/static/console-fe/public/index.html @@ -0,0 +1,54 @@ + + + + + + + + + + Nacos + + + + + + + + + + + + +

+
+
+ + + + + + + + + + + + + + + + + + diff --git a/pigx-register/src/main/resources/static/console-fe/public/js/codemirror.addone.fullscreen.js b/pigx-register/src/main/resources/static/console-fe/public/js/codemirror.addone.fullscreen.js new file mode 100755 index 000000000..32afce68c --- /dev/null +++ b/pigx-register/src/main/resources/static/console-fe/public/js/codemirror.addone.fullscreen.js @@ -0,0 +1,51 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * 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(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineOption("fullScreen", false, function(cm, val, old) { + if (old == CodeMirror.Init) old = false; + if (!old == !val) return; + if (val) setFullscreen(cm); + else setNormal(cm); + }); + + function setFullscreen(cm) { + var wrap = cm.getWrapperElement(); + cm.state.fullScreenRestore = {scrollTop: window.pageYOffset, scrollLeft: window.pageXOffset, + width: wrap.style.width, height: wrap.style.height}; + wrap.style.width = ""; + wrap.style.height = "auto"; + wrap.className += " CodeMirror-fullscreen"; + document.documentElement.style.overflow = "hidden"; + cm.refresh(); + } + + function setNormal(cm) { + var wrap = cm.getWrapperElement(); + wrap.className = wrap.className.replace(/\s*CodeMirror-fullscreen\b/, ""); + document.documentElement.style.overflow = ""; + var info = cm.state.fullScreenRestore; + wrap.style.width = info.width; wrap.style.height = info.height; + window.scrollTo(info.scrollLeft, info.scrollTop); + cm.refresh(); + } +}); \ No newline at end of file diff --git a/pigx-register/src/main/resources/static/console-fe/public/js/codemirror.addone.json-lint.js b/pigx-register/src/main/resources/static/console-fe/public/js/codemirror.addone.json-lint.js new file mode 100755 index 000000000..684673ef6 --- /dev/null +++ b/pigx-register/src/main/resources/static/console-fe/public/js/codemirror.addone.json-lint.js @@ -0,0 +1,41 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * 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. + */ + +// Depends on jsonlint.js from https://github.com/zaach/jsonlint + +// declare global: jsonlint + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.registerHelper("lint", "json", function(text) { + var found = []; + jsonlint.parseError = function(str, hash) { + var loc = hash.loc; + found.push({from: CodeMirror.Pos(loc.first_line - 1, loc.first_column), + to: CodeMirror.Pos(loc.last_line - 1, loc.last_column), + message: str}); + }; + try { jsonlint.parse(text); } + catch(e) {} + return found; +}); + +}); \ No newline at end of file diff --git a/pigx-register/src/main/resources/static/console-fe/public/js/codemirror.addone.lint.js b/pigx-register/src/main/resources/static/console-fe/public/js/codemirror.addone.lint.js new file mode 100755 index 000000000..d7363bfe4 --- /dev/null +++ b/pigx-register/src/main/resources/static/console-fe/public/js/codemirror.addone.lint.js @@ -0,0 +1,248 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * 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(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + var GUTTER_ID = "CodeMirror-lint-markers"; + + function showTooltip(e, content) { + var tt = document.createElement("div"); + tt.className = "CodeMirror-lint-tooltip"; + tt.appendChild(content.cloneNode(true)); + document.body.appendChild(tt); + + function position(e) { + if (!tt.parentNode) return CodeMirror.off(document, "mousemove", position); + tt.style.top = Math.max(0, e.clientY - tt.offsetHeight - 5) + "px"; + tt.style.left = (e.clientX + 5) + "px"; + } + CodeMirror.on(document, "mousemove", position); + position(e); + if (tt.style.opacity != null) tt.style.opacity = 1; + return tt; + } + function rm(elt) { + if (elt.parentNode) elt.parentNode.removeChild(elt); + } + function hideTooltip(tt) { + if (!tt.parentNode) return; + if (tt.style.opacity == null) rm(tt); + tt.style.opacity = 0; + setTimeout(function() { rm(tt); }, 600); + } + + function showTooltipFor(e, content, node) { + var tooltip = showTooltip(e, content); + function hide() { + CodeMirror.off(node, "mouseout", hide); + if (tooltip) { hideTooltip(tooltip); tooltip = null; } + } + var poll = setInterval(function() { + if (tooltip) for (var n = node;; n = n.parentNode) { + if (n && n.nodeType == 11) n = n.host; + if (n == document.body) return; + if (!n) { hide(); break; } + } + if (!tooltip) return clearInterval(poll); + }, 400); + CodeMirror.on(node, "mouseout", hide); + } + + function LintState(cm, options, hasGutter) { + this.marked = []; + this.options = options; + this.timeout = null; + this.hasGutter = hasGutter; + this.onMouseOver = function(e) { onMouseOver(cm, e); }; + this.waitingFor = 0 + } + + function parseOptions(_cm, options) { + if (options instanceof Function) return {getAnnotations: options}; + if (!options || options === true) options = {}; + return options; + } + + function clearMarks(cm) { + var state = cm.state.lint; + if (state.hasGutter) cm.clearGutter(GUTTER_ID); + for (var i = 0; i < state.marked.length; ++i) + state.marked[i].clear(); + state.marked.length = 0; + } + + function makeMarker(labels, severity, multiple, tooltips) { + var marker = document.createElement("div"), inner = marker; + marker.className = "CodeMirror-lint-marker-" + severity; + if (multiple) { + inner = marker.appendChild(document.createElement("div")); + inner.className = "CodeMirror-lint-marker-multiple"; + } + + if (tooltips != false) CodeMirror.on(inner, "mouseover", function(e) { + showTooltipFor(e, labels, inner); + }); + + return marker; + } + + function getMaxSeverity(a, b) { + if (a == "error") return a; + else return b; + } + + function groupByLine(annotations) { + var lines = []; + for (var i = 0; i < annotations.length; ++i) { + var ann = annotations[i], line = ann.from.line; + (lines[line] || (lines[line] = [])).push(ann); + } + return lines; + } + + function annotationTooltip(ann) { + var severity = ann.severity; + if (!severity) severity = "error"; + var tip = document.createElement("div"); + tip.className = "CodeMirror-lint-message-" + severity; + tip.appendChild(document.createTextNode(ann.message)); + return tip; + } + + function lintAsync(cm, getAnnotations, passOptions) { + var state = cm.state.lint + var id = ++state.waitingFor + function abort() { + id = -1 + cm.off("change", abort) + } + cm.on("change", abort) + getAnnotations(cm.getValue(), function(annotations, arg2) { + cm.off("change", abort) + if (state.waitingFor != id) return + if (arg2 && annotations instanceof CodeMirror) annotations = arg2 + updateLinting(cm, annotations) + }, passOptions, cm); + } + + function startLinting(cm) { + var state = cm.state.lint, options = state.options; + var passOptions = options.options || options; // Support deprecated passing of `options` property in options + var getAnnotations = options.getAnnotations || cm.getHelper(CodeMirror.Pos(0, 0), "lint"); + if (!getAnnotations) return; + if (options.async || getAnnotations.async) { + lintAsync(cm, getAnnotations, passOptions) + } else { + updateLinting(cm, getAnnotations(cm.getValue(), passOptions, cm)); + } + } + + function updateLinting(cm, annotationsNotSorted) { + clearMarks(cm); + var state = cm.state.lint, options = state.options; + + var annotations = groupByLine(annotationsNotSorted); + + for (var line = 0; line < annotations.length; ++line) { + var anns = annotations[line]; + if (!anns) continue; + + var maxSeverity = null; + var tipLabel = state.hasGutter && document.createDocumentFragment(); + + for (var i = 0; i < anns.length; ++i) { + var ann = anns[i]; + var severity = ann.severity; + if (!severity) severity = "error"; + maxSeverity = getMaxSeverity(maxSeverity, severity); + + if (options.formatAnnotation) ann = options.formatAnnotation(ann); + if (state.hasGutter) tipLabel.appendChild(annotationTooltip(ann)); + + if (ann.to) state.marked.push(cm.markText(ann.from, ann.to, { + className: "CodeMirror-lint-mark-" + severity, + __annotation: ann + })); + } + + if (state.hasGutter) + cm.setGutterMarker(line, GUTTER_ID, makeMarker(tipLabel, maxSeverity, anns.length > 1, + state.options.tooltips)); + } + if (options.onUpdateLinting) options.onUpdateLinting(annotationsNotSorted, annotations, cm); + } + + function onChange(cm) { + var state = cm.state.lint; + if (!state) return; + clearTimeout(state.timeout); + state.timeout = setTimeout(function(){startLinting(cm);}, state.options.delay || 500); + } + + function popupTooltips(annotations, e) { + var target = e.target || e.srcElement; + var tooltip = document.createDocumentFragment(); + for (var i = 0; i < annotations.length; i++) { + var ann = annotations[i]; + tooltip.appendChild(annotationTooltip(ann)); + } + showTooltipFor(e, tooltip, target); + } + + function onMouseOver(cm, e) { + var target = e.target || e.srcElement; + if (!/\bCodeMirror-lint-mark-/.test(target.className)) return; + var box = target.getBoundingClientRect(), x = (box.left + box.right) / 2, y = (box.top + box.bottom) / 2; + var spans = cm.findMarksAt(cm.coordsChar({left: x, top: y}, "client")); + + var annotations = []; + for (var i = 0; i < spans.length; ++i) { + annotations.push(spans[i].__annotation); + } + if (annotations.length) popupTooltips(annotations, e); + } + + CodeMirror.defineOption("lint", false, function(cm, val, old) { + if (old && old != CodeMirror.Init) { + clearMarks(cm); + if (cm.state.lint.options.lintOnChange !== false) + cm.off("change", onChange); + CodeMirror.off(cm.getWrapperElement(), "mouseover", cm.state.lint.onMouseOver); + clearTimeout(cm.state.lint.timeout); + delete cm.state.lint; + } + + if (val) { + var gutters = cm.getOption("gutters"), hasLintGutter = false; + for (var i = 0; i < gutters.length; ++i) if (gutters[i] == GUTTER_ID) hasLintGutter = true; + var state = cm.state.lint = new LintState(cm, parseOptions(cm, val), hasLintGutter); + if (state.options.lintOnChange !== false) + cm.on("change", onChange); + if (state.options.tooltips != false) + CodeMirror.on(cm.getWrapperElement(), "mouseover", state.onMouseOver); + + startLinting(cm); + } + }); + + CodeMirror.defineExtension("performLint", function() { + if (this.state.lint) startLinting(this); + }); +}); \ No newline at end of file diff --git a/pigx-register/src/main/resources/static/console-fe/public/js/codemirror.js b/pigx-register/src/main/resources/static/console-fe/public/js/codemirror.js new file mode 100755 index 000000000..00872a7c2 --- /dev/null +++ b/pigx-register/src/main/resources/static/console-fe/public/js/codemirror.js @@ -0,0 +1,9512 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * 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. + */ + +// This is CodeMirror (http://codemirror.net), a code editor +// implemented in JavaScript on top of the browser's DOM. +// +// You can find some technical background for some of the code below +// at http://marijnhaverbeke.nl/blog/#cm-internals . + +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global.CodeMirror = factory()); +}(this, (function () { 'use strict'; + +// Kludges for bugs and behavior differences that can't be feature +// detected are enabled based on userAgent etc sniffing. +var userAgent = navigator.userAgent; +var platform = navigator.platform; + +var gecko = /gecko\/\d/i.test(userAgent); +var ie_upto10 = /MSIE \d/.test(userAgent); +var ie_11up = /Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(userAgent); +var edge = /Edge\/(\d+)/.exec(userAgent); +var ie = ie_upto10 || ie_11up || edge; +var ie_version = ie && (ie_upto10 ? document.documentMode || 6 : +(edge || ie_11up)[1]); +var webkit = !edge && /WebKit\//.test(userAgent); +var qtwebkit = webkit && /Qt\/\d+\.\d+/.test(userAgent); +var chrome = !edge && /Chrome\//.test(userAgent); +var presto = /Opera\//.test(userAgent); +var safari = /Apple Computer/.test(navigator.vendor); +var mac_geMountainLion = /Mac OS X 1\d\D([8-9]|\d\d)\D/.test(userAgent); +var phantom = /PhantomJS/.test(userAgent); + +var ios = !edge && /AppleWebKit/.test(userAgent) && /Mobile\/\w+/.test(userAgent); +var android = /Android/.test(userAgent); +// This is woefully incomplete. Suggestions for alternative methods welcome. +var mobile = ios || android || /webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(userAgent); +var mac = ios || /Mac/.test(platform); +var chromeOS = /\bCrOS\b/.test(userAgent); +var windows = /win/i.test(platform); + +var presto_version = presto && userAgent.match(/Version\/(\d*\.\d*)/); +if (presto_version) { presto_version = Number(presto_version[1]); } +if (presto_version && presto_version >= 15) { presto = false; webkit = true; } +// Some browsers use the wrong event properties to signal cmd/ctrl on OS X +var flipCtrlCmd = mac && (qtwebkit || presto && (presto_version == null || presto_version < 12.11)); +var captureRightClick = gecko || (ie && ie_version >= 9); + +function classTest(cls) { return new RegExp("(^|\\s)" + cls + "(?:$|\\s)\\s*") } + +var rmClass = function(node, cls) { + var current = node.className; + var match = classTest(cls).exec(current); + if (match) { + var after = current.slice(match.index + match[0].length); + node.className = current.slice(0, match.index) + (after ? match[1] + after : ""); + } +}; + +function removeChildren(e) { + for (var count = e.childNodes.length; count > 0; --count) + { e.removeChild(e.firstChild); } + return e +} + +function removeChildrenAndAdd(parent, e) { + return removeChildren(parent).appendChild(e) +} + +function elt(tag, content, className, style) { + var e = document.createElement(tag); + if (className) { e.className = className; } + if (style) { e.style.cssText = style; } + if (typeof content == "string") { e.appendChild(document.createTextNode(content)); } + else if (content) { for (var i = 0; i < content.length; ++i) { e.appendChild(content[i]); } } + return e +} +// wrapper for elt, which removes the elt from the accessibility tree +function eltP(tag, content, className, style) { + var e = elt(tag, content, className, style); + e.setAttribute("role", "presentation"); + return e +} + +var range; +if (document.createRange) { range = function(node, start, end, endNode) { + var r = document.createRange(); + r.setEnd(endNode || node, end); + r.setStart(node, start); + return r +}; } +else { range = function(node, start, end) { + var r = document.body.createTextRange(); + try { r.moveToElementText(node.parentNode); } + catch(e) { return r } + r.collapse(true); + r.moveEnd("character", end); + r.moveStart("character", start); + return r +}; } + +function contains(parent, child) { + if (child.nodeType == 3) // Android browser always returns false when child is a textnode + { child = child.parentNode; } + if (parent.contains) + { return parent.contains(child) } + do { + if (child.nodeType == 11) { child = child.host; } + if (child == parent) { return true } + } while (child = child.parentNode) +} + +function activeElt() { + // IE and Edge may throw an "Unspecified Error" when accessing document.activeElement. + // IE < 10 will throw when accessed while the page is loading or in an iframe. + // IE > 9 and Edge will throw when accessed in an iframe if document.body is unavailable. + var activeElement; + try { + activeElement = document.activeElement; + } catch(e) { + activeElement = document.body || null; + } + while (activeElement && activeElement.shadowRoot && activeElement.shadowRoot.activeElement) + { activeElement = activeElement.shadowRoot.activeElement; } + return activeElement +} + +function addClass(node, cls) { + var current = node.className; + if (!classTest(cls).test(current)) { node.className += (current ? " " : "") + cls; } +} +function joinClasses(a, b) { + var as = a.split(" "); + for (var i = 0; i < as.length; i++) + { if (as[i] && !classTest(as[i]).test(b)) { b += " " + as[i]; } } + return b +} + +var selectInput = function(node) { node.select(); }; +if (ios) // Mobile Safari apparently has a bug where select() is broken. + { selectInput = function(node) { node.selectionStart = 0; node.selectionEnd = node.value.length; }; } +else if (ie) // Suppress mysterious IE10 errors + { selectInput = function(node) { try { node.select(); } catch(_e) {} }; } + +function bind(f) { + var args = Array.prototype.slice.call(arguments, 1); + return function(){return f.apply(null, args)} +} + +function copyObj(obj, target, overwrite) { + if (!target) { target = {}; } + for (var prop in obj) + { if (obj.hasOwnProperty(prop) && (overwrite !== false || !target.hasOwnProperty(prop))) + { target[prop] = obj[prop]; } } + return target +} + +// Counts the column offset in a string, taking tabs into account. +// Used mostly to find indentation. +function countColumn(string, end, tabSize, startIndex, startValue) { + if (end == null) { + end = string.search(/[^\s\u00a0]/); + if (end == -1) { end = string.length; } + } + for (var i = startIndex || 0, n = startValue || 0;;) { + var nextTab = string.indexOf("\t", i); + if (nextTab < 0 || nextTab >= end) + { return n + (end - i) } + n += nextTab - i; + n += tabSize - (n % tabSize); + i = nextTab + 1; + } +} + +var Delayed = function() {this.id = null;}; +Delayed.prototype.set = function (ms, f) { + clearTimeout(this.id); + this.id = setTimeout(f, ms); +}; + +function indexOf(array, elt) { + for (var i = 0; i < array.length; ++i) + { if (array[i] == elt) { return i } } + return -1 +} + +// Number of pixels added to scroller and sizer to hide scrollbar +var scrollerGap = 30; + +// Returned or thrown by various protocols to signal 'I'm not +// handling this'. +var Pass = {toString: function(){return "CodeMirror.Pass"}}; + +// Reused option objects for setSelection & friends +var sel_dontScroll = {scroll: false}; +var sel_mouse = {origin: "*mouse"}; +var sel_move = {origin: "+move"}; + +// The inverse of countColumn -- find the offset that corresponds to +// a particular column. +function findColumn(string, goal, tabSize) { + for (var pos = 0, col = 0;;) { + var nextTab = string.indexOf("\t", pos); + if (nextTab == -1) { nextTab = string.length; } + var skipped = nextTab - pos; + if (nextTab == string.length || col + skipped >= goal) + { return pos + Math.min(skipped, goal - col) } + col += nextTab - pos; + col += tabSize - (col % tabSize); + pos = nextTab + 1; + if (col >= goal) { return pos } + } +} + +var spaceStrs = [""]; +function spaceStr(n) { + while (spaceStrs.length <= n) + { spaceStrs.push(lst(spaceStrs) + " "); } + return spaceStrs[n] +} + +function lst(arr) { return arr[arr.length-1] } + +function map(array, f) { + var out = []; + for (var i = 0; i < array.length; i++) { out[i] = f(array[i], i); } + return out +} + +function insertSorted(array, value, score) { + var pos = 0, priority = score(value); + while (pos < array.length && score(array[pos]) <= priority) { pos++; } + array.splice(pos, 0, value); +} + +function nothing() {} + +function createObj(base, props) { + var inst; + if (Object.create) { + inst = Object.create(base); + } else { + nothing.prototype = base; + inst = new nothing(); + } + if (props) { copyObj(props, inst); } + return inst +} + +var nonASCIISingleCaseWordChar = /[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/; +function isWordCharBasic(ch) { + return /\w/.test(ch) || ch > "\x80" && + (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch)) +} +function isWordChar(ch, helper) { + if (!helper) { return isWordCharBasic(ch) } + if (helper.source.indexOf("\\w") > -1 && isWordCharBasic(ch)) { return true } + return helper.test(ch) +} + +function isEmpty(obj) { + for (var n in obj) { if (obj.hasOwnProperty(n) && obj[n]) { return false } } + return true +} + +// Extending unicode characters. A series of a non-extending char + +// any number of extending chars is treated as a single unit as far +// as editing and measuring is concerned. This is not fully correct, +// since some scripts/fonts/browsers also treat other configurations +// of code points as a group. +var extendingChars = /[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/; +function isExtendingChar(ch) { return ch.charCodeAt(0) >= 768 && extendingChars.test(ch) } + +// Returns a number from the range [`0`; `str.length`] unless `pos` is outside that range. +function skipExtendingChars(str, pos, dir) { + while ((dir < 0 ? pos > 0 : pos < str.length) && isExtendingChar(str.charAt(pos))) { pos += dir; } + return pos +} + +// Returns the value from the range [`from`; `to`] that satisfies +// `pred` and is closest to `from`. Assumes that at least `to` satisfies `pred`. +function findFirst(pred, from, to) { + for (;;) { + if (Math.abs(from - to) <= 1) { return pred(from) ? from : to } + var mid = Math.floor((from + to) / 2); + if (pred(mid)) { to = mid; } + else { from = mid; } + } +} + +// The display handles the DOM integration, both for input reading +// and content drawing. It holds references to DOM nodes and +// display-related state. + +function Display(place, doc, input) { + var d = this; + this.input = input; + + // Covers bottom-right square when both scrollbars are present. + d.scrollbarFiller = elt("div", null, "CodeMirror-scrollbar-filler"); + d.scrollbarFiller.setAttribute("cm-not-content", "true"); + // Covers bottom of gutter when coverGutterNextToScrollbar is on + // and h scrollbar is present. + d.gutterFiller = elt("div", null, "CodeMirror-gutter-filler"); + d.gutterFiller.setAttribute("cm-not-content", "true"); + // Will contain the actual code, positioned to cover the viewport. + d.lineDiv = eltP("div", null, "CodeMirror-code"); + // Elements are added to these to represent selection and cursors. + d.selectionDiv = elt("div", null, null, "position: relative; z-index: 1"); + d.cursorDiv = elt("div", null, "CodeMirror-cursors"); + // A visibility: hidden element used to find the size of things. + d.measure = elt("div", null, "CodeMirror-measure"); + // When lines outside of the viewport are measured, they are drawn in this. + d.lineMeasure = elt("div", null, "CodeMirror-measure"); + // Wraps everything that needs to exist inside the vertically-padded coordinate system + d.lineSpace = eltP("div", [d.measure, d.lineMeasure, d.selectionDiv, d.cursorDiv, d.lineDiv], + null, "position: relative; outline: none"); + var lines = eltP("div", [d.lineSpace], "CodeMirror-lines"); + // Moved around its parent to cover visible view. + d.mover = elt("div", [lines], null, "position: relative"); + // Set to the height of the document, allowing scrolling. + d.sizer = elt("div", [d.mover], "CodeMirror-sizer"); + d.sizerWidth = null; + // Behavior of elts with overflow: auto and padding is + // inconsistent across browsers. This is used to ensure the + // scrollable area is big enough. + d.heightForcer = elt("div", null, null, "position: absolute; height: " + scrollerGap + "px; width: 1px;"); + // Will contain the gutters, if any. + d.gutters = elt("div", null, "CodeMirror-gutters"); + d.lineGutter = null; + // Actual scrollable element. + d.scroller = elt("div", [d.sizer, d.heightForcer, d.gutters], "CodeMirror-scroll"); + d.scroller.setAttribute("tabIndex", "-1"); + // The element in which the editor lives. + d.wrapper = elt("div", [d.scrollbarFiller, d.gutterFiller, d.scroller], "CodeMirror"); + + // Work around IE7 z-index bug (not perfect, hence IE7 not really being supported) + if (ie && ie_version < 8) { d.gutters.style.zIndex = -1; d.scroller.style.paddingRight = 0; } + if (!webkit && !(gecko && mobile)) { d.scroller.draggable = true; } + + if (place) { + if (place.appendChild) { place.appendChild(d.wrapper); } + else { place(d.wrapper); } + } + + // Current rendered range (may be bigger than the view window). + d.viewFrom = d.viewTo = doc.first; + d.reportedViewFrom = d.reportedViewTo = doc.first; + // Information about the rendered lines. + d.view = []; + d.renderedView = null; + // Holds info about a single rendered line when it was rendered + // for measurement, while not in view. + d.externalMeasured = null; + // Empty space (in pixels) above the view + d.viewOffset = 0; + d.lastWrapHeight = d.lastWrapWidth = 0; + d.updateLineNumbers = null; + + d.nativeBarWidth = d.barHeight = d.barWidth = 0; + d.scrollbarsClipped = false; + + // Used to only resize the line number gutter when necessary (when + // the amount of lines crosses a boundary that makes its width change) + d.lineNumWidth = d.lineNumInnerWidth = d.lineNumChars = null; + // Set to true when a non-horizontal-scrolling line widget is + // added. As an optimization, line widget aligning is skipped when + // this is false. + d.alignWidgets = false; + + d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null; + + // Tracks the maximum line length so that the horizontal scrollbar + // can be kept static when scrolling. + d.maxLine = null; + d.maxLineLength = 0; + d.maxLineChanged = false; + + // Used for measuring wheel scrolling granularity + d.wheelDX = d.wheelDY = d.wheelStartX = d.wheelStartY = null; + + // True when shift is held down. + d.shift = false; + + // Used to track whether anything happened since the context menu + // was opened. + d.selForContextMenu = null; + + d.activeTouch = null; + + input.init(d); +} + +// Find the line object corresponding to the given line number. +function getLine(doc, n) { + n -= doc.first; + if (n < 0 || n >= doc.size) { throw new Error("There is no line " + (n + doc.first) + " in the document.") } + var chunk = doc; + while (!chunk.lines) { + for (var i = 0;; ++i) { + var child = chunk.children[i], sz = child.chunkSize(); + if (n < sz) { chunk = child; break } + n -= sz; + } + } + return chunk.lines[n] +} + +// Get the part of a document between two positions, as an array of +// strings. +function getBetween(doc, start, end) { + var out = [], n = start.line; + doc.iter(start.line, end.line + 1, function (line) { + var text = line.text; + if (n == end.line) { text = text.slice(0, end.ch); } + if (n == start.line) { text = text.slice(start.ch); } + out.push(text); + ++n; + }); + return out +} +// Get the lines between from and to, as array of strings. +function getLines(doc, from, to) { + var out = []; + doc.iter(from, to, function (line) { out.push(line.text); }); // iter aborts when callback returns truthy value + return out +} + +// Update the height of a line, propagating the height change +// upwards to parent nodes. +function updateLineHeight(line, height) { + var diff = height - line.height; + if (diff) { for (var n = line; n; n = n.parent) { n.height += diff; } } +} + +// Given a line object, find its line number by walking up through +// its parent links. +function lineNo(line) { + if (line.parent == null) { return null } + var cur = line.parent, no = indexOf(cur.lines, line); + for (var chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) { + for (var i = 0;; ++i) { + if (chunk.children[i] == cur) { break } + no += chunk.children[i].chunkSize(); + } + } + return no + cur.first +} + +// Find the line at the given vertical position, using the height +// information in the document tree. +function lineAtHeight(chunk, h) { + var n = chunk.first; + outer: do { + for (var i$1 = 0; i$1 < chunk.children.length; ++i$1) { + var child = chunk.children[i$1], ch = child.height; + if (h < ch) { chunk = child; continue outer } + h -= ch; + n += child.chunkSize(); + } + return n + } while (!chunk.lines) + var i = 0; + for (; i < chunk.lines.length; ++i) { + var line = chunk.lines[i], lh = line.height; + if (h < lh) { break } + h -= lh; + } + return n + i +} + +function isLine(doc, l) {return l >= doc.first && l < doc.first + doc.size} + +function lineNumberFor(options, i) { + return String(options.lineNumberFormatter(i + options.firstLineNumber)) +} + +// A Pos instance represents a position within the text. +function Pos(line, ch, sticky) { + if ( sticky === void 0 ) sticky = null; + + if (!(this instanceof Pos)) { return new Pos(line, ch, sticky) } + this.line = line; + this.ch = ch; + this.sticky = sticky; +} + +// Compare two positions, return 0 if they are the same, a negative +// number when a is less, and a positive number otherwise. +function cmp(a, b) { return a.line - b.line || a.ch - b.ch } + +function equalCursorPos(a, b) { return a.sticky == b.sticky && cmp(a, b) == 0 } + +function copyPos(x) {return Pos(x.line, x.ch)} +function maxPos(a, b) { return cmp(a, b) < 0 ? b : a } +function minPos(a, b) { return cmp(a, b) < 0 ? a : b } + +// Most of the external API clips given positions to make sure they +// actually exist within the document. +function clipLine(doc, n) {return Math.max(doc.first, Math.min(n, doc.first + doc.size - 1))} +function clipPos(doc, pos) { + if (pos.line < doc.first) { return Pos(doc.first, 0) } + var last = doc.first + doc.size - 1; + if (pos.line > last) { return Pos(last, getLine(doc, last).text.length) } + return clipToLen(pos, getLine(doc, pos.line).text.length) +} +function clipToLen(pos, linelen) { + var ch = pos.ch; + if (ch == null || ch > linelen) { return Pos(pos.line, linelen) } + else if (ch < 0) { return Pos(pos.line, 0) } + else { return pos } +} +function clipPosArray(doc, array) { + var out = []; + for (var i = 0; i < array.length; i++) { out[i] = clipPos(doc, array[i]); } + return out +} + +// Optimize some code when these features are not used. +var sawReadOnlySpans = false; +var sawCollapsedSpans = false; + +function seeReadOnlySpans() { + sawReadOnlySpans = true; +} + +function seeCollapsedSpans() { + sawCollapsedSpans = true; +} + +// TEXTMARKER SPANS + +function MarkedSpan(marker, from, to) { + this.marker = marker; + this.from = from; this.to = to; +} + +// Search an array of spans for a span matching the given marker. +function getMarkedSpanFor(spans, marker) { + if (spans) { for (var i = 0; i < spans.length; ++i) { + var span = spans[i]; + if (span.marker == marker) { return span } + } } +} +// Remove a span from an array, returning undefined if no spans are +// left (we don't store arrays for lines without spans). +function removeMarkedSpan(spans, span) { + var r; + for (var i = 0; i < spans.length; ++i) + { if (spans[i] != span) { (r || (r = [])).push(spans[i]); } } + return r +} +// Add a span to a line. +function addMarkedSpan(line, span) { + line.markedSpans = line.markedSpans ? line.markedSpans.concat([span]) : [span]; + span.marker.attachLine(line); +} + +// Used for the algorithm that adjusts markers for a change in the +// document. These functions cut an array of spans at a given +// character position, returning an array of remaining chunks (or +// undefined if nothing remains). +function markedSpansBefore(old, startCh, isInsert) { + var nw; + if (old) { for (var i = 0; i < old.length; ++i) { + var span = old[i], marker = span.marker; + var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= startCh : span.from < startCh); + if (startsBefore || span.from == startCh && marker.type == "bookmark" && (!isInsert || !span.marker.insertLeft)) { + var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= startCh : span.to > startCh);(nw || (nw = [])).push(new MarkedSpan(marker, span.from, endsAfter ? null : span.to)); + } + } } + return nw +} +function markedSpansAfter(old, endCh, isInsert) { + var nw; + if (old) { for (var i = 0; i < old.length; ++i) { + var span = old[i], marker = span.marker; + var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= endCh : span.to > endCh); + if (endsAfter || span.from == endCh && marker.type == "bookmark" && (!isInsert || span.marker.insertLeft)) { + var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= endCh : span.from < endCh);(nw || (nw = [])).push(new MarkedSpan(marker, startsBefore ? null : span.from - endCh, + span.to == null ? null : span.to - endCh)); + } + } } + return nw +} + +// Given a change object, compute the new set of marker spans that +// cover the line in which the change took place. Removes spans +// entirely within the change, reconnects spans belonging to the +// same marker that appear on both sides of the change, and cuts off +// spans partially within the change. Returns an array of span +// arrays with one element for each line in (after) the change. +function stretchSpansOverChange(doc, change) { + if (change.full) { return null } + var oldFirst = isLine(doc, change.from.line) && getLine(doc, change.from.line).markedSpans; + var oldLast = isLine(doc, change.to.line) && getLine(doc, change.to.line).markedSpans; + if (!oldFirst && !oldLast) { return null } + + var startCh = change.from.ch, endCh = change.to.ch, isInsert = cmp(change.from, change.to) == 0; + // Get the spans that 'stick out' on both sides + var first = markedSpansBefore(oldFirst, startCh, isInsert); + var last = markedSpansAfter(oldLast, endCh, isInsert); + + // Next, merge those two ends + var sameLine = change.text.length == 1, offset = lst(change.text).length + (sameLine ? startCh : 0); + if (first) { + // Fix up .to properties of first + for (var i = 0; i < first.length; ++i) { + var span = first[i]; + if (span.to == null) { + var found = getMarkedSpanFor(last, span.marker); + if (!found) { span.to = startCh; } + else if (sameLine) { span.to = found.to == null ? null : found.to + offset; } + } + } + } + if (last) { + // Fix up .from in last (or move them into first in case of sameLine) + for (var i$1 = 0; i$1 < last.length; ++i$1) { + var span$1 = last[i$1]; + if (span$1.to != null) { span$1.to += offset; } + if (span$1.from == null) { + var found$1 = getMarkedSpanFor(first, span$1.marker); + if (!found$1) { + span$1.from = offset; + if (sameLine) { (first || (first = [])).push(span$1); } + } + } else { + span$1.from += offset; + if (sameLine) { (first || (first = [])).push(span$1); } + } + } + } + // Make sure we didn't create any zero-length spans + if (first) { first = clearEmptySpans(first); } + if (last && last != first) { last = clearEmptySpans(last); } + + var newMarkers = [first]; + if (!sameLine) { + // Fill gap with whole-line-spans + var gap = change.text.length - 2, gapMarkers; + if (gap > 0 && first) + { for (var i$2 = 0; i$2 < first.length; ++i$2) + { if (first[i$2].to == null) + { (gapMarkers || (gapMarkers = [])).push(new MarkedSpan(first[i$2].marker, null, null)); } } } + for (var i$3 = 0; i$3 < gap; ++i$3) + { newMarkers.push(gapMarkers); } + newMarkers.push(last); + } + return newMarkers +} + +// Remove spans that are empty and don't have a clearWhenEmpty +// option of false. +function clearEmptySpans(spans) { + for (var i = 0; i < spans.length; ++i) { + var span = spans[i]; + if (span.from != null && span.from == span.to && span.marker.clearWhenEmpty !== false) + { spans.splice(i--, 1); } + } + if (!spans.length) { return null } + return spans +} + +// Used to 'clip' out readOnly ranges when making a change. +function removeReadOnlyRanges(doc, from, to) { + var markers = null; + doc.iter(from.line, to.line + 1, function (line) { + if (line.markedSpans) { for (var i = 0; i < line.markedSpans.length; ++i) { + var mark = line.markedSpans[i].marker; + if (mark.readOnly && (!markers || indexOf(markers, mark) == -1)) + { (markers || (markers = [])).push(mark); } + } } + }); + if (!markers) { return null } + var parts = [{from: from, to: to}]; + for (var i = 0; i < markers.length; ++i) { + var mk = markers[i], m = mk.find(0); + for (var j = 0; j < parts.length; ++j) { + var p = parts[j]; + if (cmp(p.to, m.from) < 0 || cmp(p.from, m.to) > 0) { continue } + var newParts = [j, 1], dfrom = cmp(p.from, m.from), dto = cmp(p.to, m.to); + if (dfrom < 0 || !mk.inclusiveLeft && !dfrom) + { newParts.push({from: p.from, to: m.from}); } + if (dto > 0 || !mk.inclusiveRight && !dto) + { newParts.push({from: m.to, to: p.to}); } + parts.splice.apply(parts, newParts); + j += newParts.length - 3; + } + } + return parts +} + +// Connect or disconnect spans from a line. +function detachMarkedSpans(line) { + var spans = line.markedSpans; + if (!spans) { return } + for (var i = 0; i < spans.length; ++i) + { spans[i].marker.detachLine(line); } + line.markedSpans = null; +} +function attachMarkedSpans(line, spans) { + if (!spans) { return } + for (var i = 0; i < spans.length; ++i) + { spans[i].marker.attachLine(line); } + line.markedSpans = spans; +} + +// Helpers used when computing which overlapping collapsed span +// counts as the larger one. +function extraLeft(marker) { return marker.inclusiveLeft ? -1 : 0 } +function extraRight(marker) { return marker.inclusiveRight ? 1 : 0 } + +// Returns a number indicating which of two overlapping collapsed +// spans is larger (and thus includes the other). Falls back to +// comparing ids when the spans cover exactly the same range. +function compareCollapsedMarkers(a, b) { + var lenDiff = a.lines.length - b.lines.length; + if (lenDiff != 0) { return lenDiff } + var aPos = a.find(), bPos = b.find(); + var fromCmp = cmp(aPos.from, bPos.from) || extraLeft(a) - extraLeft(b); + if (fromCmp) { return -fromCmp } + var toCmp = cmp(aPos.to, bPos.to) || extraRight(a) - extraRight(b); + if (toCmp) { return toCmp } + return b.id - a.id +} + +// Find out whether a line ends or starts in a collapsed span. If +// so, return the marker for that span. +function collapsedSpanAtSide(line, start) { + var sps = sawCollapsedSpans && line.markedSpans, found; + if (sps) { for (var sp = (void 0), i = 0; i < sps.length; ++i) { + sp = sps[i]; + if (sp.marker.collapsed && (start ? sp.from : sp.to) == null && + (!found || compareCollapsedMarkers(found, sp.marker) < 0)) + { found = sp.marker; } + } } + return found +} +function collapsedSpanAtStart(line) { return collapsedSpanAtSide(line, true) } +function collapsedSpanAtEnd(line) { return collapsedSpanAtSide(line, false) } + +// Test whether there exists a collapsed span that partially +// overlaps (covers the start or end, but not both) of a new span. +// Such overlap is not allowed. +function conflictingCollapsedRange(doc, lineNo$$1, from, to, marker) { + var line = getLine(doc, lineNo$$1); + var sps = sawCollapsedSpans && line.markedSpans; + if (sps) { for (var i = 0; i < sps.length; ++i) { + var sp = sps[i]; + if (!sp.marker.collapsed) { continue } + var found = sp.marker.find(0); + var fromCmp = cmp(found.from, from) || extraLeft(sp.marker) - extraLeft(marker); + var toCmp = cmp(found.to, to) || extraRight(sp.marker) - extraRight(marker); + if (fromCmp >= 0 && toCmp <= 0 || fromCmp <= 0 && toCmp >= 0) { continue } + if (fromCmp <= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.to, from) >= 0 : cmp(found.to, from) > 0) || + fromCmp >= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.from, to) <= 0 : cmp(found.from, to) < 0)) + { return true } + } } +} + +// A visual line is a line as drawn on the screen. Folding, for +// example, can cause multiple logical lines to appear on the same +// visual line. This finds the start of the visual line that the +// given line is part of (usually that is the line itself). +function visualLine(line) { + var merged; + while (merged = collapsedSpanAtStart(line)) + { line = merged.find(-1, true).line; } + return line +} + +function visualLineEnd(line) { + var merged; + while (merged = collapsedSpanAtEnd(line)) + { line = merged.find(1, true).line; } + return line +} + +// Returns an array of logical lines that continue the visual line +// started by the argument, or undefined if there are no such lines. +function visualLineContinued(line) { + var merged, lines; + while (merged = collapsedSpanAtEnd(line)) { + line = merged.find(1, true).line + ;(lines || (lines = [])).push(line); + } + return lines +} + +// Get the line number of the start of the visual line that the +// given line number is part of. +function visualLineNo(doc, lineN) { + var line = getLine(doc, lineN), vis = visualLine(line); + if (line == vis) { return lineN } + return lineNo(vis) +} + +// Get the line number of the start of the next visual line after +// the given line. +function visualLineEndNo(doc, lineN) { + if (lineN > doc.lastLine()) { return lineN } + var line = getLine(doc, lineN), merged; + if (!lineIsHidden(doc, line)) { return lineN } + while (merged = collapsedSpanAtEnd(line)) + { line = merged.find(1, true).line; } + return lineNo(line) + 1 +} + +// Compute whether a line is hidden. Lines count as hidden when they +// are part of a visual line that starts with another line, or when +// they are entirely covered by collapsed, non-widget span. +function lineIsHidden(doc, line) { + var sps = sawCollapsedSpans && line.markedSpans; + if (sps) { for (var sp = (void 0), i = 0; i < sps.length; ++i) { + sp = sps[i]; + if (!sp.marker.collapsed) { continue } + if (sp.from == null) { return true } + if (sp.marker.widgetNode) { continue } + if (sp.from == 0 && sp.marker.inclusiveLeft && lineIsHiddenInner(doc, line, sp)) + { return true } + } } +} +function lineIsHiddenInner(doc, line, span) { + if (span.to == null) { + var end = span.marker.find(1, true); + return lineIsHiddenInner(doc, end.line, getMarkedSpanFor(end.line.markedSpans, span.marker)) + } + if (span.marker.inclusiveRight && span.to == line.text.length) + { return true } + for (var sp = (void 0), i = 0; i < line.markedSpans.length; ++i) { + sp = line.markedSpans[i]; + if (sp.marker.collapsed && !sp.marker.widgetNode && sp.from == span.to && + (sp.to == null || sp.to != span.from) && + (sp.marker.inclusiveLeft || span.marker.inclusiveRight) && + lineIsHiddenInner(doc, line, sp)) { return true } + } +} + +// Find the height above the given line. +function heightAtLine(lineObj) { + lineObj = visualLine(lineObj); + + var h = 0, chunk = lineObj.parent; + for (var i = 0; i < chunk.lines.length; ++i) { + var line = chunk.lines[i]; + if (line == lineObj) { break } + else { h += line.height; } + } + for (var p = chunk.parent; p; chunk = p, p = chunk.parent) { + for (var i$1 = 0; i$1 < p.children.length; ++i$1) { + var cur = p.children[i$1]; + if (cur == chunk) { break } + else { h += cur.height; } + } + } + return h +} + +// Compute the character length of a line, taking into account +// collapsed ranges (see markText) that might hide parts, and join +// other lines onto it. +function lineLength(line) { + if (line.height == 0) { return 0 } + var len = line.text.length, merged, cur = line; + while (merged = collapsedSpanAtStart(cur)) { + var found = merged.find(0, true); + cur = found.from.line; + len += found.from.ch - found.to.ch; + } + cur = line; + while (merged = collapsedSpanAtEnd(cur)) { + var found$1 = merged.find(0, true); + len -= cur.text.length - found$1.from.ch; + cur = found$1.to.line; + len += cur.text.length - found$1.to.ch; + } + return len +} + +// Find the longest line in the document. +function findMaxLine(cm) { + var d = cm.display, doc = cm.doc; + d.maxLine = getLine(doc, doc.first); + d.maxLineLength = lineLength(d.maxLine); + d.maxLineChanged = true; + doc.iter(function (line) { + var len = lineLength(line); + if (len > d.maxLineLength) { + d.maxLineLength = len; + d.maxLine = line; + } + }); +} + +// BIDI HELPERS + +function iterateBidiSections(order, from, to, f) { + if (!order) { return f(from, to, "ltr") } + var found = false; + for (var i = 0; i < order.length; ++i) { + var part = order[i]; + if (part.from < to && part.to > from || from == to && part.to == from) { + f(Math.max(part.from, from), Math.min(part.to, to), part.level == 1 ? "rtl" : "ltr"); + found = true; + } + } + if (!found) { f(from, to, "ltr"); } +} + +var bidiOther = null; +function getBidiPartAt(order, ch, sticky) { + var found; + bidiOther = null; + for (var i = 0; i < order.length; ++i) { + var cur = order[i]; + if (cur.from < ch && cur.to > ch) { return i } + if (cur.to == ch) { + if (cur.from != cur.to && sticky == "before") { found = i; } + else { bidiOther = i; } + } + if (cur.from == ch) { + if (cur.from != cur.to && sticky != "before") { found = i; } + else { bidiOther = i; } + } + } + return found != null ? found : bidiOther +} + +// Bidirectional ordering algorithm +// See http://unicode.org/reports/tr9/tr9-13.html for the algorithm +// that this (partially) implements. + +// One-char codes used for character types: +// L (L): Left-to-Right +// R (R): Right-to-Left +// r (AL): Right-to-Left Arabic +// 1 (EN): European Number +// + (ES): European Number Separator +// % (ET): European Number Terminator +// n (AN): Arabic Number +// , (CS): Common Number Separator +// m (NSM): Non-Spacing Mark +// b (BN): Boundary Neutral +// s (B): Paragraph Separator +// t (S): Segment Separator +// w (WS): Whitespace +// N (ON): Other Neutrals + +// Returns null if characters are ordered as they appear +// (left-to-right), or an array of sections ({from, to, level} +// objects) in the order in which they occur visually. +var bidiOrdering = (function() { + // Character types for codepoints 0 to 0xff + var lowTypes = "bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN"; + // Character types for codepoints 0x600 to 0x6f9 + var arabicTypes = "nnnnnnNNr%%r,rNNmmmmmmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmnNmmmmmmrrmmNmmmmrr1111111111"; + function charType(code) { + if (code <= 0xf7) { return lowTypes.charAt(code) } + else if (0x590 <= code && code <= 0x5f4) { return "R" } + else if (0x600 <= code && code <= 0x6f9) { return arabicTypes.charAt(code - 0x600) } + else if (0x6ee <= code && code <= 0x8ac) { return "r" } + else if (0x2000 <= code && code <= 0x200b) { return "w" } + else if (code == 0x200c) { return "b" } + else { return "L" } + } + + var bidiRE = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/; + var isNeutral = /[stwN]/, isStrong = /[LRr]/, countsAsLeft = /[Lb1n]/, countsAsNum = /[1n]/; + + function BidiSpan(level, from, to) { + this.level = level; + this.from = from; this.to = to; + } + + return function(str, direction) { + var outerType = direction == "ltr" ? "L" : "R"; + + if (str.length == 0 || direction == "ltr" && !bidiRE.test(str)) { return false } + var len = str.length, types = []; + for (var i = 0; i < len; ++i) + { types.push(charType(str.charCodeAt(i))); } + + // W1. Examine each non-spacing mark (NSM) in the level run, and + // change the type of the NSM to the type of the previous + // character. If the NSM is at the start of the level run, it will + // get the type of sor. + for (var i$1 = 0, prev = outerType; i$1 < len; ++i$1) { + var type = types[i$1]; + if (type == "m") { types[i$1] = prev; } + else { prev = type; } + } + + // W2. Search backwards from each instance of a European number + // until the first strong type (R, L, AL, or sor) is found. If an + // AL is found, change the type of the European number to Arabic + // number. + // W3. Change all ALs to R. + for (var i$2 = 0, cur = outerType; i$2 < len; ++i$2) { + var type$1 = types[i$2]; + if (type$1 == "1" && cur == "r") { types[i$2] = "n"; } + else if (isStrong.test(type$1)) { cur = type$1; if (type$1 == "r") { types[i$2] = "R"; } } + } + + // W4. A single European separator between two European numbers + // changes to a European number. A single common separator between + // two numbers of the same type changes to that type. + for (var i$3 = 1, prev$1 = types[0]; i$3 < len - 1; ++i$3) { + var type$2 = types[i$3]; + if (type$2 == "+" && prev$1 == "1" && types[i$3+1] == "1") { types[i$3] = "1"; } + else if (type$2 == "," && prev$1 == types[i$3+1] && + (prev$1 == "1" || prev$1 == "n")) { types[i$3] = prev$1; } + prev$1 = type$2; + } + + // W5. A sequence of European terminators adjacent to European + // numbers changes to all European numbers. + // W6. Otherwise, separators and terminators change to Other + // Neutral. + for (var i$4 = 0; i$4 < len; ++i$4) { + var type$3 = types[i$4]; + if (type$3 == ",") { types[i$4] = "N"; } + else if (type$3 == "%") { + var end = (void 0); + for (end = i$4 + 1; end < len && types[end] == "%"; ++end) {} + var replace = (i$4 && types[i$4-1] == "!") || (end < len && types[end] == "1") ? "1" : "N"; + for (var j = i$4; j < end; ++j) { types[j] = replace; } + i$4 = end - 1; + } + } + + // W7. Search backwards from each instance of a European number + // until the first strong type (R, L, or sor) is found. If an L is + // found, then change the type of the European number to L. + for (var i$5 = 0, cur$1 = outerType; i$5 < len; ++i$5) { + var type$4 = types[i$5]; + if (cur$1 == "L" && type$4 == "1") { types[i$5] = "L"; } + else if (isStrong.test(type$4)) { cur$1 = type$4; } + } + + // N1. A sequence of neutrals takes the direction of the + // surrounding strong text if the text on both sides has the same + // direction. European and Arabic numbers act as if they were R in + // terms of their influence on neutrals. Start-of-level-run (sor) + // and end-of-level-run (eor) are used at level run boundaries. + // N2. Any remaining neutrals take the embedding direction. + for (var i$6 = 0; i$6 < len; ++i$6) { + if (isNeutral.test(types[i$6])) { + var end$1 = (void 0); + for (end$1 = i$6 + 1; end$1 < len && isNeutral.test(types[end$1]); ++end$1) {} + var before = (i$6 ? types[i$6-1] : outerType) == "L"; + var after = (end$1 < len ? types[end$1] : outerType) == "L"; + var replace$1 = before == after ? (before ? "L" : "R") : outerType; + for (var j$1 = i$6; j$1 < end$1; ++j$1) { types[j$1] = replace$1; } + i$6 = end$1 - 1; + } + } + + // Here we depart from the documented algorithm, in order to avoid + // building up an actual levels array. Since there are only three + // levels (0, 1, 2) in an implementation that doesn't take + // explicit embedding into account, we can build up the order on + // the fly, without following the level-based algorithm. + var order = [], m; + for (var i$7 = 0; i$7 < len;) { + if (countsAsLeft.test(types[i$7])) { + var start = i$7; + for (++i$7; i$7 < len && countsAsLeft.test(types[i$7]); ++i$7) {} + order.push(new BidiSpan(0, start, i$7)); + } else { + var pos = i$7, at = order.length; + for (++i$7; i$7 < len && types[i$7] != "L"; ++i$7) {} + for (var j$2 = pos; j$2 < i$7;) { + if (countsAsNum.test(types[j$2])) { + if (pos < j$2) { order.splice(at, 0, new BidiSpan(1, pos, j$2)); } + var nstart = j$2; + for (++j$2; j$2 < i$7 && countsAsNum.test(types[j$2]); ++j$2) {} + order.splice(at, 0, new BidiSpan(2, nstart, j$2)); + pos = j$2; + } else { ++j$2; } + } + if (pos < i$7) { order.splice(at, 0, new BidiSpan(1, pos, i$7)); } + } + } + if (order[0].level == 1 && (m = str.match(/^\s+/))) { + order[0].from = m[0].length; + order.unshift(new BidiSpan(0, 0, m[0].length)); + } + if (lst(order).level == 1 && (m = str.match(/\s+$/))) { + lst(order).to -= m[0].length; + order.push(new BidiSpan(0, len - m[0].length, len)); + } + + return direction == "rtl" ? order.reverse() : order + } +})(); + +// Get the bidi ordering for the given line (and cache it). Returns +// false for lines that are fully left-to-right, and an array of +// BidiSpan objects otherwise. +function getOrder(line, direction) { + var order = line.order; + if (order == null) { order = line.order = bidiOrdering(line.text, direction); } + return order +} + +function moveCharLogically(line, ch, dir) { + var target = skipExtendingChars(line.text, ch + dir, dir); + return target < 0 || target > line.text.length ? null : target +} + +function moveLogically(line, start, dir) { + var ch = moveCharLogically(line, start.ch, dir); + return ch == null ? null : new Pos(start.line, ch, dir < 0 ? "after" : "before") +} + +function endOfLine(visually, cm, lineObj, lineNo, dir) { + if (visually) { + var order = getOrder(lineObj, cm.doc.direction); + if (order) { + var part = dir < 0 ? lst(order) : order[0]; + var moveInStorageOrder = (dir < 0) == (part.level == 1); + var sticky = moveInStorageOrder ? "after" : "before"; + var ch; + // With a wrapped rtl chunk (possibly spanning multiple bidi parts), + // it could be that the last bidi part is not on the last visual line, + // since visual lines contain content order-consecutive chunks. + // Thus, in rtl, we are looking for the first (content-order) character + // in the rtl chunk that is on the last line (that is, the same line + // as the last (content-order) character). + if (part.level > 0) { + var prep = prepareMeasureForLine(cm, lineObj); + ch = dir < 0 ? lineObj.text.length - 1 : 0; + var targetTop = measureCharPrepared(cm, prep, ch).top; + ch = findFirst(function (ch) { return measureCharPrepared(cm, prep, ch).top == targetTop; }, (dir < 0) == (part.level == 1) ? part.from : part.to - 1, ch); + if (sticky == "before") { ch = moveCharLogically(lineObj, ch, 1); } + } else { ch = dir < 0 ? part.to : part.from; } + return new Pos(lineNo, ch, sticky) + } + } + return new Pos(lineNo, dir < 0 ? lineObj.text.length : 0, dir < 0 ? "before" : "after") +} + +function moveVisually(cm, line, start, dir) { + var bidi = getOrder(line, cm.doc.direction); + if (!bidi) { return moveLogically(line, start, dir) } + if (start.ch >= line.text.length) { + start.ch = line.text.length; + start.sticky = "before"; + } else if (start.ch <= 0) { + start.ch = 0; + start.sticky = "after"; + } + var partPos = getBidiPartAt(bidi, start.ch, start.sticky), part = bidi[partPos]; + if (cm.doc.direction == "ltr" && part.level % 2 == 0 && (dir > 0 ? part.to > start.ch : part.from < start.ch)) { + // Case 1: We move within an ltr part in an ltr editor. Even with wrapped lines, + // nothing interesting happens. + return moveLogically(line, start, dir) + } + + var mv = function (pos, dir) { return moveCharLogically(line, pos instanceof Pos ? pos.ch : pos, dir); }; + var prep; + var getWrappedLineExtent = function (ch) { + if (!cm.options.lineWrapping) { return {begin: 0, end: line.text.length} } + prep = prep || prepareMeasureForLine(cm, line); + return wrappedLineExtentChar(cm, line, prep, ch) + }; + var wrappedLineExtent = getWrappedLineExtent(start.sticky == "before" ? mv(start, -1) : start.ch); + + if (cm.doc.direction == "rtl" || part.level == 1) { + var moveInStorageOrder = (part.level == 1) == (dir < 0); + var ch = mv(start, moveInStorageOrder ? 1 : -1); + if (ch != null && (!moveInStorageOrder ? ch >= part.from && ch >= wrappedLineExtent.begin : ch <= part.to && ch <= wrappedLineExtent.end)) { + // Case 2: We move within an rtl part or in an rtl editor on the same visual line + var sticky = moveInStorageOrder ? "before" : "after"; + return new Pos(start.line, ch, sticky) + } + } + + // Case 3: Could not move within this bidi part in this visual line, so leave + // the current bidi part + + var searchInVisualLine = function (partPos, dir, wrappedLineExtent) { + var getRes = function (ch, moveInStorageOrder) { return moveInStorageOrder + ? new Pos(start.line, mv(ch, 1), "before") + : new Pos(start.line, ch, "after"); }; + + for (; partPos >= 0 && partPos < bidi.length; partPos += dir) { + var part = bidi[partPos]; + var moveInStorageOrder = (dir > 0) == (part.level != 1); + var ch = moveInStorageOrder ? wrappedLineExtent.begin : mv(wrappedLineExtent.end, -1); + if (part.from <= ch && ch < part.to) { return getRes(ch, moveInStorageOrder) } + ch = moveInStorageOrder ? part.from : mv(part.to, -1); + if (wrappedLineExtent.begin <= ch && ch < wrappedLineExtent.end) { return getRes(ch, moveInStorageOrder) } + } + }; + + // Case 3a: Look for other bidi parts on the same visual line + var res = searchInVisualLine(partPos + dir, dir, wrappedLineExtent); + if (res) { return res } + + // Case 3b: Look for other bidi parts on the next visual line + var nextCh = dir > 0 ? wrappedLineExtent.end : mv(wrappedLineExtent.begin, -1); + if (nextCh != null && !(dir > 0 && nextCh == line.text.length)) { + res = searchInVisualLine(dir > 0 ? 0 : bidi.length - 1, dir, getWrappedLineExtent(nextCh)); + if (res) { return res } + } + + // Case 4: Nowhere to move + return null +} + +// EVENT HANDLING + +// Lightweight event framework. on/off also work on DOM nodes, +// registering native DOM handlers. + +var noHandlers = []; + +var on = function(emitter, type, f) { + if (emitter.addEventListener) { + emitter.addEventListener(type, f, false); + } else if (emitter.attachEvent) { + emitter.attachEvent("on" + type, f); + } else { + var map$$1 = emitter._handlers || (emitter._handlers = {}); + map$$1[type] = (map$$1[type] || noHandlers).concat(f); + } +}; + +function getHandlers(emitter, type) { + return emitter._handlers && emitter._handlers[type] || noHandlers +} + +function off(emitter, type, f) { + if (emitter.removeEventListener) { + emitter.removeEventListener(type, f, false); + } else if (emitter.detachEvent) { + emitter.detachEvent("on" + type, f); + } else { + var map$$1 = emitter._handlers, arr = map$$1 && map$$1[type]; + if (arr) { + var index = indexOf(arr, f); + if (index > -1) + { map$$1[type] = arr.slice(0, index).concat(arr.slice(index + 1)); } + } + } +} + +function signal(emitter, type /*, values...*/) { + var handlers = getHandlers(emitter, type); + if (!handlers.length) { return } + var args = Array.prototype.slice.call(arguments, 2); + for (var i = 0; i < handlers.length; ++i) { handlers[i].apply(null, args); } +} + +// The DOM events that CodeMirror handles can be overridden by +// registering a (non-DOM) handler on the editor for the event name, +// and preventDefault-ing the event in that handler. +function signalDOMEvent(cm, e, override) { + if (typeof e == "string") + { e = {type: e, preventDefault: function() { this.defaultPrevented = true; }}; } + signal(cm, override || e.type, cm, e); + return e_defaultPrevented(e) || e.codemirrorIgnore +} + +function signalCursorActivity(cm) { + var arr = cm._handlers && cm._handlers.cursorActivity; + if (!arr) { return } + var set = cm.curOp.cursorActivityHandlers || (cm.curOp.cursorActivityHandlers = []); + for (var i = 0; i < arr.length; ++i) { if (indexOf(set, arr[i]) == -1) + { set.push(arr[i]); } } +} + +function hasHandler(emitter, type) { + return getHandlers(emitter, type).length > 0 +} + +// Add on and off methods to a constructor's prototype, to make +// registering events on such objects more convenient. +function eventMixin(ctor) { + ctor.prototype.on = function(type, f) {on(this, type, f);}; + ctor.prototype.off = function(type, f) {off(this, type, f);}; +} + +// Due to the fact that we still support jurassic IE versions, some +// compatibility wrappers are needed. + +function e_preventDefault(e) { + if (e.preventDefault) { e.preventDefault(); } + else { e.returnValue = false; } +} +function e_stopPropagation(e) { + if (e.stopPropagation) { e.stopPropagation(); } + else { e.cancelBubble = true; } +} +function e_defaultPrevented(e) { + return e.defaultPrevented != null ? e.defaultPrevented : e.returnValue == false +} +function e_stop(e) {e_preventDefault(e); e_stopPropagation(e);} + +function e_target(e) {return e.target || e.srcElement} +function e_button(e) { + var b = e.which; + if (b == null) { + if (e.button & 1) { b = 1; } + else if (e.button & 2) { b = 3; } + else if (e.button & 4) { b = 2; } + } + if (mac && e.ctrlKey && b == 1) { b = 3; } + return b +} + +// Detect drag-and-drop +var dragAndDrop = function() { + // There is *some* kind of drag-and-drop support in IE6-8, but I + // couldn't get it to work yet. + if (ie && ie_version < 9) { return false } + var div = elt('div'); + return "draggable" in div || "dragDrop" in div +}(); + +var zwspSupported; +function zeroWidthElement(measure) { + if (zwspSupported == null) { + var test = elt("span", "\u200b"); + removeChildrenAndAdd(measure, elt("span", [test, document.createTextNode("x")])); + if (measure.firstChild.offsetHeight != 0) + { zwspSupported = test.offsetWidth <= 1 && test.offsetHeight > 2 && !(ie && ie_version < 8); } + } + var node = zwspSupported ? elt("span", "\u200b") : + elt("span", "\u00a0", null, "display: inline-block; width: 1px; margin-right: -1px"); + node.setAttribute("cm-text", ""); + return node +} + +// Feature-detect IE's crummy client rect reporting for bidi text +var badBidiRects; +function hasBadBidiRects(measure) { + if (badBidiRects != null) { return badBidiRects } + var txt = removeChildrenAndAdd(measure, document.createTextNode("A\u062eA")); + var r0 = range(txt, 0, 1).getBoundingClientRect(); + var r1 = range(txt, 1, 2).getBoundingClientRect(); + removeChildren(measure); + if (!r0 || r0.left == r0.right) { return false } // Safari returns null in some cases (#2780) + return badBidiRects = (r1.right - r0.right < 3) +} + +// See if "".split is the broken IE version, if so, provide an +// alternative way to split lines. +var splitLinesAuto = "\n\nb".split(/\n/).length != 3 ? function (string) { + var pos = 0, result = [], l = string.length; + while (pos <= l) { + var nl = string.indexOf("\n", pos); + if (nl == -1) { nl = string.length; } + var line = string.slice(pos, string.charAt(nl - 1) == "\r" ? nl - 1 : nl); + var rt = line.indexOf("\r"); + if (rt != -1) { + result.push(line.slice(0, rt)); + pos += rt + 1; + } else { + result.push(line); + pos = nl + 1; + } + } + return result +} : function (string) { return string.split(/\r\n?|\n/); }; + +var hasSelection = window.getSelection ? function (te) { + try { return te.selectionStart != te.selectionEnd } + catch(e) { return false } +} : function (te) { + var range$$1; + try {range$$1 = te.ownerDocument.selection.createRange();} + catch(e) {} + if (!range$$1 || range$$1.parentElement() != te) { return false } + return range$$1.compareEndPoints("StartToEnd", range$$1) != 0 +}; + +var hasCopyEvent = (function () { + var e = elt("div"); + if ("oncopy" in e) { return true } + e.setAttribute("oncopy", "return;"); + return typeof e.oncopy == "function" +})(); + +var badZoomedRects = null; +function hasBadZoomedRects(measure) { + if (badZoomedRects != null) { return badZoomedRects } + var node = removeChildrenAndAdd(measure, elt("span", "x")); + var normal = node.getBoundingClientRect(); + var fromRange = range(node, 0, 1).getBoundingClientRect(); + return badZoomedRects = Math.abs(normal.left - fromRange.left) > 1 +} + +// Known modes, by name and by MIME +var modes = {}; +var mimeModes = {}; + +// Extra arguments are stored as the mode's dependencies, which is +// used by (legacy) mechanisms like loadmode.js to automatically +// load a mode. (Preferred mechanism is the require/define calls.) +function defineMode(name, mode) { + if (arguments.length > 2) + { mode.dependencies = Array.prototype.slice.call(arguments, 2); } + modes[name] = mode; +} + +function defineMIME(mime, spec) { + mimeModes[mime] = spec; +} + +// Given a MIME type, a {name, ...options} config object, or a name +// string, return a mode config object. +function resolveMode(spec) { + if (typeof spec == "string" && mimeModes.hasOwnProperty(spec)) { + spec = mimeModes[spec]; + } else if (spec && typeof spec.name == "string" && mimeModes.hasOwnProperty(spec.name)) { + var found = mimeModes[spec.name]; + if (typeof found == "string") { found = {name: found}; } + spec = createObj(found, spec); + spec.name = found.name; + } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+xml$/.test(spec)) { + return resolveMode("application/xml") + } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+json$/.test(spec)) { + return resolveMode("application/json") + } + if (typeof spec == "string") { return {name: spec} } + else { return spec || {name: "null"} } +} + +// Given a mode spec (anything that resolveMode accepts), find and +// initialize an actual mode object. +function getMode(options, spec) { + spec = resolveMode(spec); + var mfactory = modes[spec.name]; + if (!mfactory) { return getMode(options, "text/plain") } + var modeObj = mfactory(options, spec); + if (modeExtensions.hasOwnProperty(spec.name)) { + var exts = modeExtensions[spec.name]; + for (var prop in exts) { + if (!exts.hasOwnProperty(prop)) { continue } + if (modeObj.hasOwnProperty(prop)) { modeObj["_" + prop] = modeObj[prop]; } + modeObj[prop] = exts[prop]; + } + } + modeObj.name = spec.name; + if (spec.helperType) { modeObj.helperType = spec.helperType; } + if (spec.modeProps) { for (var prop$1 in spec.modeProps) + { modeObj[prop$1] = spec.modeProps[prop$1]; } } + + return modeObj +} + +// This can be used to attach properties to mode objects from +// outside the actual mode definition. +var modeExtensions = {}; +function extendMode(mode, properties) { + var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {}); + copyObj(properties, exts); +} + +function copyState(mode, state) { + if (state === true) { return state } + if (mode.copyState) { return mode.copyState(state) } + var nstate = {}; + for (var n in state) { + var val = state[n]; + if (val instanceof Array) { val = val.concat([]); } + nstate[n] = val; + } + return nstate +} + +// Given a mode and a state (for that mode), find the inner mode and +// state at the position that the state refers to. +function innerMode(mode, state) { + var info; + while (mode.innerMode) { + info = mode.innerMode(state); + if (!info || info.mode == mode) { break } + state = info.state; + mode = info.mode; + } + return info || {mode: mode, state: state} +} + +function startState(mode, a1, a2) { + return mode.startState ? mode.startState(a1, a2) : true +} + +// STRING STREAM + +// Fed to the mode parsers, provides helper functions to make +// parsers more succinct. + +var StringStream = function(string, tabSize, lineOracle) { + this.pos = this.start = 0; + this.string = string; + this.tabSize = tabSize || 8; + this.lastColumnPos = this.lastColumnValue = 0; + this.lineStart = 0; + this.lineOracle = lineOracle; +}; + +StringStream.prototype.eol = function () {return this.pos >= this.string.length}; +StringStream.prototype.sol = function () {return this.pos == this.lineStart}; +StringStream.prototype.peek = function () {return this.string.charAt(this.pos) || undefined}; +StringStream.prototype.next = function () { + if (this.pos < this.string.length) + { return this.string.charAt(this.pos++) } +}; +StringStream.prototype.eat = function (match) { + var ch = this.string.charAt(this.pos); + var ok; + if (typeof match == "string") { ok = ch == match; } + else { ok = ch && (match.test ? match.test(ch) : match(ch)); } + if (ok) {++this.pos; return ch} +}; +StringStream.prototype.eatWhile = function (match) { + var start = this.pos; + while (this.eat(match)){} + return this.pos > start +}; +StringStream.prototype.eatSpace = function () { + var this$1 = this; + + var start = this.pos; + while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) { ++this$1.pos; } + return this.pos > start +}; +StringStream.prototype.skipToEnd = function () {this.pos = this.string.length;}; +StringStream.prototype.skipTo = function (ch) { + var found = this.string.indexOf(ch, this.pos); + if (found > -1) {this.pos = found; return true} +}; +StringStream.prototype.backUp = function (n) {this.pos -= n;}; +StringStream.prototype.column = function () { + if (this.lastColumnPos < this.start) { + this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue); + this.lastColumnPos = this.start; + } + return this.lastColumnValue - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0) +}; +StringStream.prototype.indentation = function () { + return countColumn(this.string, null, this.tabSize) - + (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0) +}; +StringStream.prototype.match = function (pattern, consume, caseInsensitive) { + if (typeof pattern == "string") { + var cased = function (str) { return caseInsensitive ? str.toLowerCase() : str; }; + var substr = this.string.substr(this.pos, pattern.length); + if (cased(substr) == cased(pattern)) { + if (consume !== false) { this.pos += pattern.length; } + return true + } + } else { + var match = this.string.slice(this.pos).match(pattern); + if (match && match.index > 0) { return null } + if (match && consume !== false) { this.pos += match[0].length; } + return match + } +}; +StringStream.prototype.current = function (){return this.string.slice(this.start, this.pos)}; +StringStream.prototype.hideFirstChars = function (n, inner) { + this.lineStart += n; + try { return inner() } + finally { this.lineStart -= n; } +}; +StringStream.prototype.lookAhead = function (n) { + var oracle = this.lineOracle; + return oracle && oracle.lookAhead(n) +}; + +var SavedContext = function(state, lookAhead) { + this.state = state; + this.lookAhead = lookAhead; +}; + +var Context = function(doc, state, line, lookAhead) { + this.state = state; + this.doc = doc; + this.line = line; + this.maxLookAhead = lookAhead || 0; +}; + +Context.prototype.lookAhead = function (n) { + var line = this.doc.getLine(this.line + n); + if (line != null && n > this.maxLookAhead) { this.maxLookAhead = n; } + return line +}; + +Context.prototype.nextLine = function () { + this.line++; + if (this.maxLookAhead > 0) { this.maxLookAhead--; } +}; + +Context.fromSaved = function (doc, saved, line) { + if (saved instanceof SavedContext) + { return new Context(doc, copyState(doc.mode, saved.state), line, saved.lookAhead) } + else + { return new Context(doc, copyState(doc.mode, saved), line) } +}; + +Context.prototype.save = function (copy) { + var state = copy !== false ? copyState(this.doc.mode, this.state) : this.state; + return this.maxLookAhead > 0 ? new SavedContext(state, this.maxLookAhead) : state +}; + + +// Compute a style array (an array starting with a mode generation +// -- for invalidation -- followed by pairs of end positions and +// style strings), which is used to highlight the tokens on the +// line. +function highlightLine(cm, line, context, forceToEnd) { + // A styles array always starts with a number identifying the + // mode/overlays that it is based on (for easy invalidation). + var st = [cm.state.modeGen], lineClasses = {}; + // Compute the base array of styles + runMode(cm, line.text, cm.doc.mode, context, function (end, style) { return st.push(end, style); }, + lineClasses, forceToEnd); + var state = context.state; + + // Run overlays, adjust style array. + var loop = function ( o ) { + var overlay = cm.state.overlays[o], i = 1, at = 0; + context.state = true; + runMode(cm, line.text, overlay.mode, context, function (end, style) { + var start = i; + // Ensure there's a token end at the current position, and that i points at it + while (at < end) { + var i_end = st[i]; + if (i_end > end) + { st.splice(i, 1, end, st[i+1], i_end); } + i += 2; + at = Math.min(end, i_end); + } + if (!style) { return } + if (overlay.opaque) { + st.splice(start, i - start, end, "overlay " + style); + i = start + 2; + } else { + for (; start < i; start += 2) { + var cur = st[start+1]; + st[start+1] = (cur ? cur + " " : "") + "overlay " + style; + } + } + }, lineClasses); + }; + + for (var o = 0; o < cm.state.overlays.length; ++o) loop( o ); + context.state = state; + + return {styles: st, classes: lineClasses.bgClass || lineClasses.textClass ? lineClasses : null} +} + +function getLineStyles(cm, line, updateFrontier) { + if (!line.styles || line.styles[0] != cm.state.modeGen) { + var context = getContextBefore(cm, lineNo(line)); + var resetState = line.text.length > cm.options.maxHighlightLength && copyState(cm.doc.mode, context.state); + var result = highlightLine(cm, line, context); + if (resetState) { context.state = resetState; } + line.stateAfter = context.save(!resetState); + line.styles = result.styles; + if (result.classes) { line.styleClasses = result.classes; } + else if (line.styleClasses) { line.styleClasses = null; } + if (updateFrontier === cm.doc.highlightFrontier) + { cm.doc.modeFrontier = Math.max(cm.doc.modeFrontier, ++cm.doc.highlightFrontier); } + } + return line.styles +} + +function getContextBefore(cm, n, precise) { + var doc = cm.doc, display = cm.display; + if (!doc.mode.startState) { return new Context(doc, true, n) } + var start = findStartLine(cm, n, precise); + var saved = start > doc.first && getLine(doc, start - 1).stateAfter; + var context = saved ? Context.fromSaved(doc, saved, start) : new Context(doc, startState(doc.mode), start); + + doc.iter(start, n, function (line) { + processLine(cm, line.text, context); + var pos = context.line; + line.stateAfter = pos == n - 1 || pos % 5 == 0 || pos >= display.viewFrom && pos < display.viewTo ? context.save() : null; + context.nextLine(); + }); + if (precise) { doc.modeFrontier = context.line; } + return context +} + +// Lightweight form of highlight -- proceed over this line and +// update state, but don't save a style array. Used for lines that +// aren't currently visible. +function processLine(cm, text, context, startAt) { + var mode = cm.doc.mode; + var stream = new StringStream(text, cm.options.tabSize, context); + stream.start = stream.pos = startAt || 0; + if (text == "") { callBlankLine(mode, context.state); } + while (!stream.eol()) { + readToken(mode, stream, context.state); + stream.start = stream.pos; + } +} + +function callBlankLine(mode, state) { + if (mode.blankLine) { return mode.blankLine(state) } + if (!mode.innerMode) { return } + var inner = innerMode(mode, state); + if (inner.mode.blankLine) { return inner.mode.blankLine(inner.state) } +} + +function readToken(mode, stream, state, inner) { + for (var i = 0; i < 10; i++) { + if (inner) { inner[0] = innerMode(mode, state).mode; } + var style = mode.token(stream, state); + if (stream.pos > stream.start) { return style } + } + throw new Error("Mode " + mode.name + " failed to advance stream.") +} + +var Token = function(stream, type, state) { + this.start = stream.start; this.end = stream.pos; + this.string = stream.current(); + this.type = type || null; + this.state = state; +}; + +// Utility for getTokenAt and getLineTokens +function takeToken(cm, pos, precise, asArray) { + var doc = cm.doc, mode = doc.mode, style; + pos = clipPos(doc, pos); + var line = getLine(doc, pos.line), context = getContextBefore(cm, pos.line, precise); + var stream = new StringStream(line.text, cm.options.tabSize, context), tokens; + if (asArray) { tokens = []; } + while ((asArray || stream.pos < pos.ch) && !stream.eol()) { + stream.start = stream.pos; + style = readToken(mode, stream, context.state); + if (asArray) { tokens.push(new Token(stream, style, copyState(doc.mode, context.state))); } + } + return asArray ? tokens : new Token(stream, style, context.state) +} + +function extractLineClasses(type, output) { + if (type) { for (;;) { + var lineClass = type.match(/(?:^|\s+)line-(background-)?(\S+)/); + if (!lineClass) { break } + type = type.slice(0, lineClass.index) + type.slice(lineClass.index + lineClass[0].length); + var prop = lineClass[1] ? "bgClass" : "textClass"; + if (output[prop] == null) + { output[prop] = lineClass[2]; } + else if (!(new RegExp("(?:^|\s)" + lineClass[2] + "(?:$|\s)")).test(output[prop])) + { output[prop] += " " + lineClass[2]; } + } } + return type +} + +// Run the given mode's parser over a line, calling f for each token. +function runMode(cm, text, mode, context, f, lineClasses, forceToEnd) { + var flattenSpans = mode.flattenSpans; + if (flattenSpans == null) { flattenSpans = cm.options.flattenSpans; } + var curStart = 0, curStyle = null; + var stream = new StringStream(text, cm.options.tabSize, context), style; + var inner = cm.options.addModeClass && [null]; + if (text == "") { extractLineClasses(callBlankLine(mode, context.state), lineClasses); } + while (!stream.eol()) { + if (stream.pos > cm.options.maxHighlightLength) { + flattenSpans = false; + if (forceToEnd) { processLine(cm, text, context, stream.pos); } + stream.pos = text.length; + style = null; + } else { + style = extractLineClasses(readToken(mode, stream, context.state, inner), lineClasses); + } + if (inner) { + var mName = inner[0].name; + if (mName) { style = "m-" + (style ? mName + " " + style : mName); } + } + if (!flattenSpans || curStyle != style) { + while (curStart < stream.start) { + curStart = Math.min(stream.start, curStart + 5000); + f(curStart, curStyle); + } + curStyle = style; + } + stream.start = stream.pos; + } + while (curStart < stream.pos) { + // Webkit seems to refuse to render text nodes longer than 57444 + // characters, and returns inaccurate measurements in nodes + // starting around 5000 chars. + var pos = Math.min(stream.pos, curStart + 5000); + f(pos, curStyle); + curStart = pos; + } +} + +// Finds the line to start with when starting a parse. Tries to +// find a line with a stateAfter, so that it can start with a +// valid state. If that fails, it returns the line with the +// smallest indentation, which tends to need the least context to +// parse correctly. +function findStartLine(cm, n, precise) { + var minindent, minline, doc = cm.doc; + var lim = precise ? -1 : n - (cm.doc.mode.innerMode ? 1000 : 100); + for (var search = n; search > lim; --search) { + if (search <= doc.first) { return doc.first } + var line = getLine(doc, search - 1), after = line.stateAfter; + if (after && (!precise || search + (after instanceof SavedContext ? after.lookAhead : 0) <= doc.modeFrontier)) + { return search } + var indented = countColumn(line.text, null, cm.options.tabSize); + if (minline == null || minindent > indented) { + minline = search - 1; + minindent = indented; + } + } + return minline +} + +function retreatFrontier(doc, n) { + doc.modeFrontier = Math.min(doc.modeFrontier, n); + if (doc.highlightFrontier < n - 10) { return } + var start = doc.first; + for (var line = n - 1; line > start; line--) { + var saved = getLine(doc, line).stateAfter; + // change is on 3 + // state on line 1 looked ahead 2 -- so saw 3 + // test 1 + 2 < 3 should cover this + if (saved && (!(saved instanceof SavedContext) || line + saved.lookAhead < n)) { + start = line + 1; + break + } + } + doc.highlightFrontier = Math.min(doc.highlightFrontier, start); +} + +// LINE DATA STRUCTURE + +// Line objects. These hold state related to a line, including +// highlighting info (the styles array). +var Line = function(text, markedSpans, estimateHeight) { + this.text = text; + attachMarkedSpans(this, markedSpans); + this.height = estimateHeight ? estimateHeight(this) : 1; +}; + +Line.prototype.lineNo = function () { return lineNo(this) }; +eventMixin(Line); + +// Change the content (text, markers) of a line. Automatically +// invalidates cached information and tries to re-estimate the +// line's height. +function updateLine(line, text, markedSpans, estimateHeight) { + line.text = text; + if (line.stateAfter) { line.stateAfter = null; } + if (line.styles) { line.styles = null; } + if (line.order != null) { line.order = null; } + detachMarkedSpans(line); + attachMarkedSpans(line, markedSpans); + var estHeight = estimateHeight ? estimateHeight(line) : 1; + if (estHeight != line.height) { updateLineHeight(line, estHeight); } +} + +// Detach a line from the document tree and its markers. +function cleanUpLine(line) { + line.parent = null; + detachMarkedSpans(line); +} + +// Convert a style as returned by a mode (either null, or a string +// containing one or more styles) to a CSS style. This is cached, +// and also looks for line-wide styles. +var styleToClassCache = {}; +var styleToClassCacheWithMode = {}; +function interpretTokenStyle(style, options) { + if (!style || /^\s*$/.test(style)) { return null } + var cache = options.addModeClass ? styleToClassCacheWithMode : styleToClassCache; + return cache[style] || + (cache[style] = style.replace(/\S+/g, "cm-$&")) +} + +// Render the DOM representation of the text of a line. Also builds +// up a 'line map', which points at the DOM nodes that represent +// specific stretches of text, and is used by the measuring code. +// The returned object contains the DOM node, this map, and +// information about line-wide styles that were set by the mode. +function buildLineContent(cm, lineView) { + // The padding-right forces the element to have a 'border', which + // is needed on Webkit to be able to get line-level bounding + // rectangles for it (in measureChar). + var content = eltP("span", null, null, webkit ? "padding-right: .1px" : null); + var builder = {pre: eltP("pre", [content], "CodeMirror-line"), content: content, + col: 0, pos: 0, cm: cm, + trailingSpace: false, + splitSpaces: (ie || webkit) && cm.getOption("lineWrapping")}; + lineView.measure = {}; + + // Iterate over the logical lines that make up this visual line. + for (var i = 0; i <= (lineView.rest ? lineView.rest.length : 0); i++) { + var line = i ? lineView.rest[i - 1] : lineView.line, order = (void 0); + builder.pos = 0; + builder.addToken = buildToken; + // Optionally wire in some hacks into the token-rendering + // algorithm, to deal with browser quirks. + if (hasBadBidiRects(cm.display.measure) && (order = getOrder(line, cm.doc.direction))) + { builder.addToken = buildTokenBadBidi(builder.addToken, order); } + builder.map = []; + var allowFrontierUpdate = lineView != cm.display.externalMeasured && lineNo(line); + insertLineContent(line, builder, getLineStyles(cm, line, allowFrontierUpdate)); + if (line.styleClasses) { + if (line.styleClasses.bgClass) + { builder.bgClass = joinClasses(line.styleClasses.bgClass, builder.bgClass || ""); } + if (line.styleClasses.textClass) + { builder.textClass = joinClasses(line.styleClasses.textClass, builder.textClass || ""); } + } + + // Ensure at least a single node is present, for measuring. + if (builder.map.length == 0) + { builder.map.push(0, 0, builder.content.appendChild(zeroWidthElement(cm.display.measure))); } + + // Store the map and a cache object for the current logical line + if (i == 0) { + lineView.measure.map = builder.map; + lineView.measure.cache = {}; + } else { + (lineView.measure.maps || (lineView.measure.maps = [])).push(builder.map) + ;(lineView.measure.caches || (lineView.measure.caches = [])).push({}); + } + } + + // See issue #2901 + if (webkit) { + var last = builder.content.lastChild; + if (/\bcm-tab\b/.test(last.className) || (last.querySelector && last.querySelector(".cm-tab"))) + { builder.content.className = "cm-tab-wrap-hack"; } + } + + signal(cm, "renderLine", cm, lineView.line, builder.pre); + if (builder.pre.className) + { builder.textClass = joinClasses(builder.pre.className, builder.textClass || ""); } + + return builder +} + +function defaultSpecialCharPlaceholder(ch) { + var token = elt("span", "\u2022", "cm-invalidchar"); + token.title = "\\u" + ch.charCodeAt(0).toString(16); + token.setAttribute("aria-label", token.title); + return token +} + +// Build up the DOM representation for a single token, and add it to +// the line map. Takes care to render special characters separately. +function buildToken(builder, text, style, startStyle, endStyle, title, css) { + if (!text) { return } + var displayText = builder.splitSpaces ? splitSpaces(text, builder.trailingSpace) : text; + var special = builder.cm.state.specialChars, mustWrap = false; + var content; + if (!special.test(text)) { + builder.col += text.length; + content = document.createTextNode(displayText); + builder.map.push(builder.pos, builder.pos + text.length, content); + if (ie && ie_version < 9) { mustWrap = true; } + builder.pos += text.length; + } else { + content = document.createDocumentFragment(); + var pos = 0; + while (true) { + special.lastIndex = pos; + var m = special.exec(text); + var skipped = m ? m.index - pos : text.length - pos; + if (skipped) { + var txt = document.createTextNode(displayText.slice(pos, pos + skipped)); + if (ie && ie_version < 9) { content.appendChild(elt("span", [txt])); } + else { content.appendChild(txt); } + builder.map.push(builder.pos, builder.pos + skipped, txt); + builder.col += skipped; + builder.pos += skipped; + } + if (!m) { break } + pos += skipped + 1; + var txt$1 = (void 0); + if (m[0] == "\t") { + var tabSize = builder.cm.options.tabSize, tabWidth = tabSize - builder.col % tabSize; + txt$1 = content.appendChild(elt("span", spaceStr(tabWidth), "cm-tab")); + txt$1.setAttribute("role", "presentation"); + txt$1.setAttribute("cm-text", "\t"); + builder.col += tabWidth; + } else if (m[0] == "\r" || m[0] == "\n") { + txt$1 = content.appendChild(elt("span", m[0] == "\r" ? "\u240d" : "\u2424", "cm-invalidchar")); + txt$1.setAttribute("cm-text", m[0]); + builder.col += 1; + } else { + txt$1 = builder.cm.options.specialCharPlaceholder(m[0]); + txt$1.setAttribute("cm-text", m[0]); + if (ie && ie_version < 9) { content.appendChild(elt("span", [txt$1])); } + else { content.appendChild(txt$1); } + builder.col += 1; + } + builder.map.push(builder.pos, builder.pos + 1, txt$1); + builder.pos++; + } + } + builder.trailingSpace = displayText.charCodeAt(text.length - 1) == 32; + if (style || startStyle || endStyle || mustWrap || css) { + var fullStyle = style || ""; + if (startStyle) { fullStyle += startStyle; } + if (endStyle) { fullStyle += endStyle; } + var token = elt("span", [content], fullStyle, css); + if (title) { token.title = title; } + return builder.content.appendChild(token) + } + builder.content.appendChild(content); +} + +function splitSpaces(text, trailingBefore) { + if (text.length > 1 && !/ /.test(text)) { return text } + var spaceBefore = trailingBefore, result = ""; + for (var i = 0; i < text.length; i++) { + var ch = text.charAt(i); + if (ch == " " && spaceBefore && (i == text.length - 1 || text.charCodeAt(i + 1) == 32)) + { ch = "\u00a0"; } + result += ch; + spaceBefore = ch == " "; + } + return result +} + +// Work around nonsense dimensions being reported for stretches of +// right-to-left text. +function buildTokenBadBidi(inner, order) { + return function (builder, text, style, startStyle, endStyle, title, css) { + style = style ? style + " cm-force-border" : "cm-force-border"; + var start = builder.pos, end = start + text.length; + for (;;) { + // Find the part that overlaps with the start of this text + var part = (void 0); + for (var i = 0; i < order.length; i++) { + part = order[i]; + if (part.to > start && part.from <= start) { break } + } + if (part.to >= end) { return inner(builder, text, style, startStyle, endStyle, title, css) } + inner(builder, text.slice(0, part.to - start), style, startStyle, null, title, css); + startStyle = null; + text = text.slice(part.to - start); + start = part.to; + } + } +} + +function buildCollapsedSpan(builder, size, marker, ignoreWidget) { + var widget = !ignoreWidget && marker.widgetNode; + if (widget) { builder.map.push(builder.pos, builder.pos + size, widget); } + if (!ignoreWidget && builder.cm.display.input.needsContentAttribute) { + if (!widget) + { widget = builder.content.appendChild(document.createElement("span")); } + widget.setAttribute("cm-marker", marker.id); + } + if (widget) { + builder.cm.display.input.setUneditable(widget); + builder.content.appendChild(widget); + } + builder.pos += size; + builder.trailingSpace = false; +} + +// Outputs a number of spans to make up a line, taking highlighting +// and marked text into account. +function insertLineContent(line, builder, styles) { + var spans = line.markedSpans, allText = line.text, at = 0; + if (!spans) { + for (var i$1 = 1; i$1 < styles.length; i$1+=2) + { builder.addToken(builder, allText.slice(at, at = styles[i$1]), interpretTokenStyle(styles[i$1+1], builder.cm.options)); } + return + } + + var len = allText.length, pos = 0, i = 1, text = "", style, css; + var nextChange = 0, spanStyle, spanEndStyle, spanStartStyle, title, collapsed; + for (;;) { + if (nextChange == pos) { // Update current marker set + spanStyle = spanEndStyle = spanStartStyle = title = css = ""; + collapsed = null; nextChange = Infinity; + var foundBookmarks = [], endStyles = (void 0); + for (var j = 0; j < spans.length; ++j) { + var sp = spans[j], m = sp.marker; + if (m.type == "bookmark" && sp.from == pos && m.widgetNode) { + foundBookmarks.push(m); + } else if (sp.from <= pos && (sp.to == null || sp.to > pos || m.collapsed && sp.to == pos && sp.from == pos)) { + if (sp.to != null && sp.to != pos && nextChange > sp.to) { + nextChange = sp.to; + spanEndStyle = ""; + } + if (m.className) { spanStyle += " " + m.className; } + if (m.css) { css = (css ? css + ";" : "") + m.css; } + if (m.startStyle && sp.from == pos) { spanStartStyle += " " + m.startStyle; } + if (m.endStyle && sp.to == nextChange) { (endStyles || (endStyles = [])).push(m.endStyle, sp.to); } + if (m.title && !title) { title = m.title; } + if (m.collapsed && (!collapsed || compareCollapsedMarkers(collapsed.marker, m) < 0)) + { collapsed = sp; } + } else if (sp.from > pos && nextChange > sp.from) { + nextChange = sp.from; + } + } + if (endStyles) { for (var j$1 = 0; j$1 < endStyles.length; j$1 += 2) + { if (endStyles[j$1 + 1] == nextChange) { spanEndStyle += " " + endStyles[j$1]; } } } + + if (!collapsed || collapsed.from == pos) { for (var j$2 = 0; j$2 < foundBookmarks.length; ++j$2) + { buildCollapsedSpan(builder, 0, foundBookmarks[j$2]); } } + if (collapsed && (collapsed.from || 0) == pos) { + buildCollapsedSpan(builder, (collapsed.to == null ? len + 1 : collapsed.to) - pos, + collapsed.marker, collapsed.from == null); + if (collapsed.to == null) { return } + if (collapsed.to == pos) { collapsed = false; } + } + } + if (pos >= len) { break } + + var upto = Math.min(len, nextChange); + while (true) { + if (text) { + var end = pos + text.length; + if (!collapsed) { + var tokenText = end > upto ? text.slice(0, upto - pos) : text; + builder.addToken(builder, tokenText, style ? style + spanStyle : spanStyle, + spanStartStyle, pos + tokenText.length == nextChange ? spanEndStyle : "", title, css); + } + if (end >= upto) {text = text.slice(upto - pos); pos = upto; break} + pos = end; + spanStartStyle = ""; + } + text = allText.slice(at, at = styles[i++]); + style = interpretTokenStyle(styles[i++], builder.cm.options); + } + } +} + + +// These objects are used to represent the visible (currently drawn) +// part of the document. A LineView may correspond to multiple +// logical lines, if those are connected by collapsed ranges. +function LineView(doc, line, lineN) { + // The starting line + this.line = line; + // Continuing lines, if any + this.rest = visualLineContinued(line); + // Number of logical lines in this visual line + this.size = this.rest ? lineNo(lst(this.rest)) - lineN + 1 : 1; + this.node = this.text = null; + this.hidden = lineIsHidden(doc, line); +} + +// Create a range of LineView objects for the given lines. +function buildViewArray(cm, from, to) { + var array = [], nextPos; + for (var pos = from; pos < to; pos = nextPos) { + var view = new LineView(cm.doc, getLine(cm.doc, pos), pos); + nextPos = pos + view.size; + array.push(view); + } + return array +} + +var operationGroup = null; + +function pushOperation(op) { + if (operationGroup) { + operationGroup.ops.push(op); + } else { + op.ownsGroup = operationGroup = { + ops: [op], + delayedCallbacks: [] + }; + } +} + +function fireCallbacksForOps(group) { + // Calls delayed callbacks and cursorActivity handlers until no + // new ones appear + var callbacks = group.delayedCallbacks, i = 0; + do { + for (; i < callbacks.length; i++) + { callbacks[i].call(null); } + for (var j = 0; j < group.ops.length; j++) { + var op = group.ops[j]; + if (op.cursorActivityHandlers) + { while (op.cursorActivityCalled < op.cursorActivityHandlers.length) + { op.cursorActivityHandlers[op.cursorActivityCalled++].call(null, op.cm); } } + } + } while (i < callbacks.length) +} + +function finishOperation(op, endCb) { + var group = op.ownsGroup; + if (!group) { return } + + try { fireCallbacksForOps(group); } + finally { + operationGroup = null; + endCb(group); + } +} + +var orphanDelayedCallbacks = null; + +// Often, we want to signal events at a point where we are in the +// middle of some work, but don't want the handler to start calling +// other methods on the editor, which might be in an inconsistent +// state or simply not expect any other events to happen. +// signalLater looks whether there are any handlers, and schedules +// them to be executed when the last operation ends, or, if no +// operation is active, when a timeout fires. +function signalLater(emitter, type /*, values...*/) { + var arr = getHandlers(emitter, type); + if (!arr.length) { return } + var args = Array.prototype.slice.call(arguments, 2), list; + if (operationGroup) { + list = operationGroup.delayedCallbacks; + } else if (orphanDelayedCallbacks) { + list = orphanDelayedCallbacks; + } else { + list = orphanDelayedCallbacks = []; + setTimeout(fireOrphanDelayed, 0); + } + var loop = function ( i ) { + list.push(function () { return arr[i].apply(null, args); }); + }; + + for (var i = 0; i < arr.length; ++i) + loop( i ); +} + +function fireOrphanDelayed() { + var delayed = orphanDelayedCallbacks; + orphanDelayedCallbacks = null; + for (var i = 0; i < delayed.length; ++i) { delayed[i](); } +} + +// When an aspect of a line changes, a string is added to +// lineView.changes. This updates the relevant part of the line's +// DOM structure. +function updateLineForChanges(cm, lineView, lineN, dims) { + for (var j = 0; j < lineView.changes.length; j++) { + var type = lineView.changes[j]; + if (type == "text") { updateLineText(cm, lineView); } + else if (type == "gutter") { updateLineGutter(cm, lineView, lineN, dims); } + else if (type == "class") { updateLineClasses(cm, lineView); } + else if (type == "widget") { updateLineWidgets(cm, lineView, dims); } + } + lineView.changes = null; +} + +// Lines with gutter elements, widgets or a background class need to +// be wrapped, and have the extra elements added to the wrapper div +function ensureLineWrapped(lineView) { + if (lineView.node == lineView.text) { + lineView.node = elt("div", null, null, "position: relative"); + if (lineView.text.parentNode) + { lineView.text.parentNode.replaceChild(lineView.node, lineView.text); } + lineView.node.appendChild(lineView.text); + if (ie && ie_version < 8) { lineView.node.style.zIndex = 2; } + } + return lineView.node +} + +function updateLineBackground(cm, lineView) { + var cls = lineView.bgClass ? lineView.bgClass + " " + (lineView.line.bgClass || "") : lineView.line.bgClass; + if (cls) { cls += " CodeMirror-linebackground"; } + if (lineView.background) { + if (cls) { lineView.background.className = cls; } + else { lineView.background.parentNode.removeChild(lineView.background); lineView.background = null; } + } else if (cls) { + var wrap = ensureLineWrapped(lineView); + lineView.background = wrap.insertBefore(elt("div", null, cls), wrap.firstChild); + cm.display.input.setUneditable(lineView.background); + } +} + +// Wrapper around buildLineContent which will reuse the structure +// in display.externalMeasured when possible. +function getLineContent(cm, lineView) { + var ext = cm.display.externalMeasured; + if (ext && ext.line == lineView.line) { + cm.display.externalMeasured = null; + lineView.measure = ext.measure; + return ext.built + } + return buildLineContent(cm, lineView) +} + +// Redraw the line's text. Interacts with the background and text +// classes because the mode may output tokens that influence these +// classes. +function updateLineText(cm, lineView) { + var cls = lineView.text.className; + var built = getLineContent(cm, lineView); + if (lineView.text == lineView.node) { lineView.node = built.pre; } + lineView.text.parentNode.replaceChild(built.pre, lineView.text); + lineView.text = built.pre; + if (built.bgClass != lineView.bgClass || built.textClass != lineView.textClass) { + lineView.bgClass = built.bgClass; + lineView.textClass = built.textClass; + updateLineClasses(cm, lineView); + } else if (cls) { + lineView.text.className = cls; + } +} + +function updateLineClasses(cm, lineView) { + updateLineBackground(cm, lineView); + if (lineView.line.wrapClass) + { ensureLineWrapped(lineView).className = lineView.line.wrapClass; } + else if (lineView.node != lineView.text) + { lineView.node.className = ""; } + var textClass = lineView.textClass ? lineView.textClass + " " + (lineView.line.textClass || "") : lineView.line.textClass; + lineView.text.className = textClass || ""; +} + +function updateLineGutter(cm, lineView, lineN, dims) { + if (lineView.gutter) { + lineView.node.removeChild(lineView.gutter); + lineView.gutter = null; + } + if (lineView.gutterBackground) { + lineView.node.removeChild(lineView.gutterBackground); + lineView.gutterBackground = null; + } + if (lineView.line.gutterClass) { + var wrap = ensureLineWrapped(lineView); + lineView.gutterBackground = elt("div", null, "CodeMirror-gutter-background " + lineView.line.gutterClass, + ("left: " + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px; width: " + (dims.gutterTotalWidth) + "px")); + cm.display.input.setUneditable(lineView.gutterBackground); + wrap.insertBefore(lineView.gutterBackground, lineView.text); + } + var markers = lineView.line.gutterMarkers; + if (cm.options.lineNumbers || markers) { + var wrap$1 = ensureLineWrapped(lineView); + var gutterWrap = lineView.gutter = elt("div", null, "CodeMirror-gutter-wrapper", ("left: " + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px")); + cm.display.input.setUneditable(gutterWrap); + wrap$1.insertBefore(gutterWrap, lineView.text); + if (lineView.line.gutterClass) + { gutterWrap.className += " " + lineView.line.gutterClass; } + if (cm.options.lineNumbers && (!markers || !markers["CodeMirror-linenumbers"])) + { lineView.lineNumber = gutterWrap.appendChild( + elt("div", lineNumberFor(cm.options, lineN), + "CodeMirror-linenumber CodeMirror-gutter-elt", + ("left: " + (dims.gutterLeft["CodeMirror-linenumbers"]) + "px; width: " + (cm.display.lineNumInnerWidth) + "px"))); } + if (markers) { for (var k = 0; k < cm.options.gutters.length; ++k) { + var id = cm.options.gutters[k], found = markers.hasOwnProperty(id) && markers[id]; + if (found) + { gutterWrap.appendChild(elt("div", [found], "CodeMirror-gutter-elt", + ("left: " + (dims.gutterLeft[id]) + "px; width: " + (dims.gutterWidth[id]) + "px"))); } + } } + } +} + +function updateLineWidgets(cm, lineView, dims) { + if (lineView.alignable) { lineView.alignable = null; } + for (var node = lineView.node.firstChild, next = (void 0); node; node = next) { + next = node.nextSibling; + if (node.className == "CodeMirror-linewidget") + { lineView.node.removeChild(node); } + } + insertLineWidgets(cm, lineView, dims); +} + +// Build a line's DOM representation from scratch +function buildLineElement(cm, lineView, lineN, dims) { + var built = getLineContent(cm, lineView); + lineView.text = lineView.node = built.pre; + if (built.bgClass) { lineView.bgClass = built.bgClass; } + if (built.textClass) { lineView.textClass = built.textClass; } + + updateLineClasses(cm, lineView); + updateLineGutter(cm, lineView, lineN, dims); + insertLineWidgets(cm, lineView, dims); + return lineView.node +} + +// A lineView may contain multiple logical lines (when merged by +// collapsed spans). The widgets for all of them need to be drawn. +function insertLineWidgets(cm, lineView, dims) { + insertLineWidgetsFor(cm, lineView.line, lineView, dims, true); + if (lineView.rest) { for (var i = 0; i < lineView.rest.length; i++) + { insertLineWidgetsFor(cm, lineView.rest[i], lineView, dims, false); } } +} + +function insertLineWidgetsFor(cm, line, lineView, dims, allowAbove) { + if (!line.widgets) { return } + var wrap = ensureLineWrapped(lineView); + for (var i = 0, ws = line.widgets; i < ws.length; ++i) { + var widget = ws[i], node = elt("div", [widget.node], "CodeMirror-linewidget"); + if (!widget.handleMouseEvents) { node.setAttribute("cm-ignore-events", "true"); } + positionLineWidget(widget, node, lineView, dims); + cm.display.input.setUneditable(node); + if (allowAbove && widget.above) + { wrap.insertBefore(node, lineView.gutter || lineView.text); } + else + { wrap.appendChild(node); } + signalLater(widget, "redraw"); + } +} + +function positionLineWidget(widget, node, lineView, dims) { + if (widget.noHScroll) { + (lineView.alignable || (lineView.alignable = [])).push(node); + var width = dims.wrapperWidth; + node.style.left = dims.fixedPos + "px"; + if (!widget.coverGutter) { + width -= dims.gutterTotalWidth; + node.style.paddingLeft = dims.gutterTotalWidth + "px"; + } + node.style.width = width + "px"; + } + if (widget.coverGutter) { + node.style.zIndex = 5; + node.style.position = "relative"; + if (!widget.noHScroll) { node.style.marginLeft = -dims.gutterTotalWidth + "px"; } + } +} + +function widgetHeight(widget) { + if (widget.height != null) { return widget.height } + var cm = widget.doc.cm; + if (!cm) { return 0 } + if (!contains(document.body, widget.node)) { + var parentStyle = "position: relative;"; + if (widget.coverGutter) + { parentStyle += "margin-left: -" + cm.display.gutters.offsetWidth + "px;"; } + if (widget.noHScroll) + { parentStyle += "width: " + cm.display.wrapper.clientWidth + "px;"; } + removeChildrenAndAdd(cm.display.measure, elt("div", [widget.node], null, parentStyle)); + } + return widget.height = widget.node.parentNode.offsetHeight +} + +// Return true when the given mouse event happened in a widget +function eventInWidget(display, e) { + for (var n = e_target(e); n != display.wrapper; n = n.parentNode) { + if (!n || (n.nodeType == 1 && n.getAttribute("cm-ignore-events") == "true") || + (n.parentNode == display.sizer && n != display.mover)) + { return true } + } +} + +// POSITION MEASUREMENT + +function paddingTop(display) {return display.lineSpace.offsetTop} +function paddingVert(display) {return display.mover.offsetHeight - display.lineSpace.offsetHeight} +function paddingH(display) { + if (display.cachedPaddingH) { return display.cachedPaddingH } + var e = removeChildrenAndAdd(display.measure, elt("pre", "x")); + var style = window.getComputedStyle ? window.getComputedStyle(e) : e.currentStyle; + var data = {left: parseInt(style.paddingLeft), right: parseInt(style.paddingRight)}; + if (!isNaN(data.left) && !isNaN(data.right)) { display.cachedPaddingH = data; } + return data +} + +function scrollGap(cm) { return scrollerGap - cm.display.nativeBarWidth } +function displayWidth(cm) { + return cm.display.scroller.clientWidth - scrollGap(cm) - cm.display.barWidth +} +function displayHeight(cm) { + return cm.display.scroller.clientHeight - scrollGap(cm) - cm.display.barHeight +} + +// Ensure the lineView.wrapping.heights array is populated. This is +// an array of bottom offsets for the lines that make up a drawn +// line. When lineWrapping is on, there might be more than one +// height. +function ensureLineHeights(cm, lineView, rect) { + var wrapping = cm.options.lineWrapping; + var curWidth = wrapping && displayWidth(cm); + if (!lineView.measure.heights || wrapping && lineView.measure.width != curWidth) { + var heights = lineView.measure.heights = []; + if (wrapping) { + lineView.measure.width = curWidth; + var rects = lineView.text.firstChild.getClientRects(); + for (var i = 0; i < rects.length - 1; i++) { + var cur = rects[i], next = rects[i + 1]; + if (Math.abs(cur.bottom - next.bottom) > 2) + { heights.push((cur.bottom + next.top) / 2 - rect.top); } + } + } + heights.push(rect.bottom - rect.top); + } +} + +// Find a line map (mapping character offsets to text nodes) and a +// measurement cache for the given line number. (A line view might +// contain multiple lines when collapsed ranges are present.) +function mapFromLineView(lineView, line, lineN) { + if (lineView.line == line) + { return {map: lineView.measure.map, cache: lineView.measure.cache} } + for (var i = 0; i < lineView.rest.length; i++) + { if (lineView.rest[i] == line) + { return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i]} } } + for (var i$1 = 0; i$1 < lineView.rest.length; i$1++) + { if (lineNo(lineView.rest[i$1]) > lineN) + { return {map: lineView.measure.maps[i$1], cache: lineView.measure.caches[i$1], before: true} } } +} + +// Render a line into the hidden node display.externalMeasured. Used +// when measurement is needed for a line that's not in the viewport. +function updateExternalMeasurement(cm, line) { + line = visualLine(line); + var lineN = lineNo(line); + var view = cm.display.externalMeasured = new LineView(cm.doc, line, lineN); + view.lineN = lineN; + var built = view.built = buildLineContent(cm, view); + view.text = built.pre; + removeChildrenAndAdd(cm.display.lineMeasure, built.pre); + return view +} + +// Get a {top, bottom, left, right} box (in line-local coordinates) +// for a given character. +function measureChar(cm, line, ch, bias) { + return measureCharPrepared(cm, prepareMeasureForLine(cm, line), ch, bias) +} + +// Find a line view that corresponds to the given line number. +function findViewForLine(cm, lineN) { + if (lineN >= cm.display.viewFrom && lineN < cm.display.viewTo) + { return cm.display.view[findViewIndex(cm, lineN)] } + var ext = cm.display.externalMeasured; + if (ext && lineN >= ext.lineN && lineN < ext.lineN + ext.size) + { return ext } +} + +// Measurement can be split in two steps, the set-up work that +// applies to the whole line, and the measurement of the actual +// character. Functions like coordsChar, that need to do a lot of +// measurements in a row, can thus ensure that the set-up work is +// only done once. +function prepareMeasureForLine(cm, line) { + var lineN = lineNo(line); + var view = findViewForLine(cm, lineN); + if (view && !view.text) { + view = null; + } else if (view && view.changes) { + updateLineForChanges(cm, view, lineN, getDimensions(cm)); + cm.curOp.forceUpdate = true; + } + if (!view) + { view = updateExternalMeasurement(cm, line); } + + var info = mapFromLineView(view, line, lineN); + return { + line: line, view: view, rect: null, + map: info.map, cache: info.cache, before: info.before, + hasHeights: false + } +} + +// Given a prepared measurement object, measures the position of an +// actual character (or fetches it from the cache). +function measureCharPrepared(cm, prepared, ch, bias, varHeight) { + if (prepared.before) { ch = -1; } + var key = ch + (bias || ""), found; + if (prepared.cache.hasOwnProperty(key)) { + found = prepared.cache[key]; + } else { + if (!prepared.rect) + { prepared.rect = prepared.view.text.getBoundingClientRect(); } + if (!prepared.hasHeights) { + ensureLineHeights(cm, prepared.view, prepared.rect); + prepared.hasHeights = true; + } + found = measureCharInner(cm, prepared, ch, bias); + if (!found.bogus) { prepared.cache[key] = found; } + } + return {left: found.left, right: found.right, + top: varHeight ? found.rtop : found.top, + bottom: varHeight ? found.rbottom : found.bottom} +} + +var nullRect = {left: 0, right: 0, top: 0, bottom: 0}; + +function nodeAndOffsetInLineMap(map$$1, ch, bias) { + var node, start, end, collapse, mStart, mEnd; + // First, search the line map for the text node corresponding to, + // or closest to, the target character. + for (var i = 0; i < map$$1.length; i += 3) { + mStart = map$$1[i]; + mEnd = map$$1[i + 1]; + if (ch < mStart) { + start = 0; end = 1; + collapse = "left"; + } else if (ch < mEnd) { + start = ch - mStart; + end = start + 1; + } else if (i == map$$1.length - 3 || ch == mEnd && map$$1[i + 3] > ch) { + end = mEnd - mStart; + start = end - 1; + if (ch >= mEnd) { collapse = "right"; } + } + if (start != null) { + node = map$$1[i + 2]; + if (mStart == mEnd && bias == (node.insertLeft ? "left" : "right")) + { collapse = bias; } + if (bias == "left" && start == 0) + { while (i && map$$1[i - 2] == map$$1[i - 3] && map$$1[i - 1].insertLeft) { + node = map$$1[(i -= 3) + 2]; + collapse = "left"; + } } + if (bias == "right" && start == mEnd - mStart) + { while (i < map$$1.length - 3 && map$$1[i + 3] == map$$1[i + 4] && !map$$1[i + 5].insertLeft) { + node = map$$1[(i += 3) + 2]; + collapse = "right"; + } } + break + } + } + return {node: node, start: start, end: end, collapse: collapse, coverStart: mStart, coverEnd: mEnd} +} + +function getUsefulRect(rects, bias) { + var rect = nullRect; + if (bias == "left") { for (var i = 0; i < rects.length; i++) { + if ((rect = rects[i]).left != rect.right) { break } + } } else { for (var i$1 = rects.length - 1; i$1 >= 0; i$1--) { + if ((rect = rects[i$1]).left != rect.right) { break } + } } + return rect +} + +function measureCharInner(cm, prepared, ch, bias) { + var place = nodeAndOffsetInLineMap(prepared.map, ch, bias); + var node = place.node, start = place.start, end = place.end, collapse = place.collapse; + + var rect; + if (node.nodeType == 3) { // If it is a text node, use a range to retrieve the coordinates. + for (var i$1 = 0; i$1 < 4; i$1++) { // Retry a maximum of 4 times when nonsense rectangles are returned + while (start && isExtendingChar(prepared.line.text.charAt(place.coverStart + start))) { --start; } + while (place.coverStart + end < place.coverEnd && isExtendingChar(prepared.line.text.charAt(place.coverStart + end))) { ++end; } + if (ie && ie_version < 9 && start == 0 && end == place.coverEnd - place.coverStart) + { rect = node.parentNode.getBoundingClientRect(); } + else + { rect = getUsefulRect(range(node, start, end).getClientRects(), bias); } + if (rect.left || rect.right || start == 0) { break } + end = start; + start = start - 1; + collapse = "right"; + } + if (ie && ie_version < 11) { rect = maybeUpdateRectForZooming(cm.display.measure, rect); } + } else { // If it is a widget, simply get the box for the whole widget. + if (start > 0) { collapse = bias = "right"; } + var rects; + if (cm.options.lineWrapping && (rects = node.getClientRects()).length > 1) + { rect = rects[bias == "right" ? rects.length - 1 : 0]; } + else + { rect = node.getBoundingClientRect(); } + } + if (ie && ie_version < 9 && !start && (!rect || !rect.left && !rect.right)) { + var rSpan = node.parentNode.getClientRects()[0]; + if (rSpan) + { rect = {left: rSpan.left, right: rSpan.left + charWidth(cm.display), top: rSpan.top, bottom: rSpan.bottom}; } + else + { rect = nullRect; } + } + + var rtop = rect.top - prepared.rect.top, rbot = rect.bottom - prepared.rect.top; + var mid = (rtop + rbot) / 2; + var heights = prepared.view.measure.heights; + var i = 0; + for (; i < heights.length - 1; i++) + { if (mid < heights[i]) { break } } + var top = i ? heights[i - 1] : 0, bot = heights[i]; + var result = {left: (collapse == "right" ? rect.right : rect.left) - prepared.rect.left, + right: (collapse == "left" ? rect.left : rect.right) - prepared.rect.left, + top: top, bottom: bot}; + if (!rect.left && !rect.right) { result.bogus = true; } + if (!cm.options.singleCursorHeightPerLine) { result.rtop = rtop; result.rbottom = rbot; } + + return result +} + +// Work around problem with bounding client rects on ranges being +// returned incorrectly when zoomed on IE10 and below. +function maybeUpdateRectForZooming(measure, rect) { + if (!window.screen || screen.logicalXDPI == null || + screen.logicalXDPI == screen.deviceXDPI || !hasBadZoomedRects(measure)) + { return rect } + var scaleX = screen.logicalXDPI / screen.deviceXDPI; + var scaleY = screen.logicalYDPI / screen.deviceYDPI; + return {left: rect.left * scaleX, right: rect.right * scaleX, + top: rect.top * scaleY, bottom: rect.bottom * scaleY} +} + +function clearLineMeasurementCacheFor(lineView) { + if (lineView.measure) { + lineView.measure.cache = {}; + lineView.measure.heights = null; + if (lineView.rest) { for (var i = 0; i < lineView.rest.length; i++) + { lineView.measure.caches[i] = {}; } } + } +} + +function clearLineMeasurementCache(cm) { + cm.display.externalMeasure = null; + removeChildren(cm.display.lineMeasure); + for (var i = 0; i < cm.display.view.length; i++) + { clearLineMeasurementCacheFor(cm.display.view[i]); } +} + +function clearCaches(cm) { + clearLineMeasurementCache(cm); + cm.display.cachedCharWidth = cm.display.cachedTextHeight = cm.display.cachedPaddingH = null; + if (!cm.options.lineWrapping) { cm.display.maxLineChanged = true; } + cm.display.lineNumChars = null; +} + +function pageScrollX() { + // Work around https://bugs.chromium.org/p/chromium/issues/detail?id=489206 + // which causes page_Offset and bounding client rects to use + // different reference viewports and invalidate our calculations. + if (chrome && android) { return -(document.body.getBoundingClientRect().left - parseInt(getComputedStyle(document.body).marginLeft)) } + return window.pageXOffset || (document.documentElement || document.body).scrollLeft +} +function pageScrollY() { + if (chrome && android) { return -(document.body.getBoundingClientRect().top - parseInt(getComputedStyle(document.body).marginTop)) } + return window.pageYOffset || (document.documentElement || document.body).scrollTop +} + +// Converts a {top, bottom, left, right} box from line-local +// coordinates into another coordinate system. Context may be one of +// "line", "div" (display.lineDiv), "local"./null (editor), "window", +// or "page". +function intoCoordSystem(cm, lineObj, rect, context, includeWidgets) { + if (!includeWidgets && lineObj.widgets) { for (var i = 0; i < lineObj.widgets.length; ++i) { if (lineObj.widgets[i].above) { + var size = widgetHeight(lineObj.widgets[i]); + rect.top += size; rect.bottom += size; + } } } + if (context == "line") { return rect } + if (!context) { context = "local"; } + var yOff = heightAtLine(lineObj); + if (context == "local") { yOff += paddingTop(cm.display); } + else { yOff -= cm.display.viewOffset; } + if (context == "page" || context == "window") { + var lOff = cm.display.lineSpace.getBoundingClientRect(); + yOff += lOff.top + (context == "window" ? 0 : pageScrollY()); + var xOff = lOff.left + (context == "window" ? 0 : pageScrollX()); + rect.left += xOff; rect.right += xOff; + } + rect.top += yOff; rect.bottom += yOff; + return rect +} + +// Coverts a box from "div" coords to another coordinate system. +// Context may be "window", "page", "div", or "local"./null. +function fromCoordSystem(cm, coords, context) { + if (context == "div") { return coords } + var left = coords.left, top = coords.top; + // First move into "page" coordinate system + if (context == "page") { + left -= pageScrollX(); + top -= pageScrollY(); + } else if (context == "local" || !context) { + var localBox = cm.display.sizer.getBoundingClientRect(); + left += localBox.left; + top += localBox.top; + } + + var lineSpaceBox = cm.display.lineSpace.getBoundingClientRect(); + return {left: left - lineSpaceBox.left, top: top - lineSpaceBox.top} +} + +function charCoords(cm, pos, context, lineObj, bias) { + if (!lineObj) { lineObj = getLine(cm.doc, pos.line); } + return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch, bias), context) +} + +// Returns a box for a given cursor position, which may have an +// 'other' property containing the position of the secondary cursor +// on a bidi boundary. +// A cursor Pos(line, char, "before") is on the same visual line as `char - 1` +// and after `char - 1` in writing order of `char - 1` +// A cursor Pos(line, char, "after") is on the same visual line as `char` +// and before `char` in writing order of `char` +// Examples (upper-case letters are RTL, lower-case are LTR): +// Pos(0, 1, ...) +// before after +// ab a|b a|b +// aB a|B aB| +// Ab |Ab A|b +// AB B|A B|A +// Every position after the last character on a line is considered to stick +// to the last character on the line. +function cursorCoords(cm, pos, context, lineObj, preparedMeasure, varHeight) { + lineObj = lineObj || getLine(cm.doc, pos.line); + if (!preparedMeasure) { preparedMeasure = prepareMeasureForLine(cm, lineObj); } + function get(ch, right) { + var m = measureCharPrepared(cm, preparedMeasure, ch, right ? "right" : "left", varHeight); + if (right) { m.left = m.right; } else { m.right = m.left; } + return intoCoordSystem(cm, lineObj, m, context) + } + var order = getOrder(lineObj, cm.doc.direction), ch = pos.ch, sticky = pos.sticky; + if (ch >= lineObj.text.length) { + ch = lineObj.text.length; + sticky = "before"; + } else if (ch <= 0) { + ch = 0; + sticky = "after"; + } + if (!order) { return get(sticky == "before" ? ch - 1 : ch, sticky == "before") } + + function getBidi(ch, partPos, invert) { + var part = order[partPos], right = (part.level % 2) != 0; + return get(invert ? ch - 1 : ch, right != invert) + } + var partPos = getBidiPartAt(order, ch, sticky); + var other = bidiOther; + var val = getBidi(ch, partPos, sticky == "before"); + if (other != null) { val.other = getBidi(ch, other, sticky != "before"); } + return val +} + +// Used to cheaply estimate the coordinates for a position. Used for +// intermediate scroll updates. +function estimateCoords(cm, pos) { + var left = 0; + pos = clipPos(cm.doc, pos); + if (!cm.options.lineWrapping) { left = charWidth(cm.display) * pos.ch; } + var lineObj = getLine(cm.doc, pos.line); + var top = heightAtLine(lineObj) + paddingTop(cm.display); + return {left: left, right: left, top: top, bottom: top + lineObj.height} +} + +// Positions returned by coordsChar contain some extra information. +// xRel is the relative x position of the input coordinates compared +// to the found position (so xRel > 0 means the coordinates are to +// the right of the character position, for example). When outside +// is true, that means the coordinates lie outside the line's +// vertical range. +function PosWithInfo(line, ch, sticky, outside, xRel) { + var pos = Pos(line, ch, sticky); + pos.xRel = xRel; + if (outside) { pos.outside = true; } + return pos +} + +// Compute the character position closest to the given coordinates. +// Input must be lineSpace-local ("div" coordinate system). +function coordsChar(cm, x, y) { + var doc = cm.doc; + y += cm.display.viewOffset; + if (y < 0) { return PosWithInfo(doc.first, 0, null, true, -1) } + var lineN = lineAtHeight(doc, y), last = doc.first + doc.size - 1; + if (lineN > last) + { return PosWithInfo(doc.first + doc.size - 1, getLine(doc, last).text.length, null, true, 1) } + if (x < 0) { x = 0; } + + var lineObj = getLine(doc, lineN); + for (;;) { + var found = coordsCharInner(cm, lineObj, lineN, x, y); + var merged = collapsedSpanAtEnd(lineObj); + var mergedPos = merged && merged.find(0, true); + if (merged && (found.ch > mergedPos.from.ch || found.ch == mergedPos.from.ch && found.xRel > 0)) + { lineN = lineNo(lineObj = mergedPos.to.line); } + else + { return found } + } +} + +function wrappedLineExtent(cm, lineObj, preparedMeasure, y) { + var measure = function (ch) { return intoCoordSystem(cm, lineObj, measureCharPrepared(cm, preparedMeasure, ch), "line"); }; + var end = lineObj.text.length; + var begin = findFirst(function (ch) { return measure(ch - 1).bottom <= y; }, end, 0); + end = findFirst(function (ch) { return measure(ch).top > y; }, begin, end); + return {begin: begin, end: end} +} + +function wrappedLineExtentChar(cm, lineObj, preparedMeasure, target) { + var targetTop = intoCoordSystem(cm, lineObj, measureCharPrepared(cm, preparedMeasure, target), "line").top; + return wrappedLineExtent(cm, lineObj, preparedMeasure, targetTop) +} + +function coordsCharInner(cm, lineObj, lineNo$$1, x, y) { + y -= heightAtLine(lineObj); + var begin = 0, end = lineObj.text.length; + var preparedMeasure = prepareMeasureForLine(cm, lineObj); + var pos; + var order = getOrder(lineObj, cm.doc.direction); + if (order) { + if (cm.options.lineWrapping) { + var assign; + ((assign = wrappedLineExtent(cm, lineObj, preparedMeasure, y), begin = assign.begin, end = assign.end, assign)); + } + pos = new Pos(lineNo$$1, Math.floor(begin + (end - begin) / 2)); + var beginLeft = cursorCoords(cm, pos, "line", lineObj, preparedMeasure).left; + var dir = beginLeft < x ? 1 : -1; + var prevDiff, diff = beginLeft - x, prevPos; + var steps = Math.ceil((end - begin) / 4); + outer: do { + prevDiff = diff; + prevPos = pos; + var i = 0; + for (; i < steps; ++i) { + var prevPos$1 = pos; + pos = moveVisually(cm, lineObj, pos, dir); + if (pos == null || pos.ch < begin || end <= (pos.sticky == "before" ? pos.ch - 1 : pos.ch)) { + pos = prevPos$1; + break outer + } + } + diff = cursorCoords(cm, pos, "line", lineObj, preparedMeasure).left - x; + if (steps > 1) { + var diff_change_per_step = Math.abs(diff - prevDiff) / steps; + steps = Math.min(steps, Math.ceil(Math.abs(diff) / diff_change_per_step)); + dir = diff < 0 ? 1 : -1; + } + } while (diff != 0 && (steps > 1 || ((dir < 0) != (diff < 0) && (Math.abs(diff) <= Math.abs(prevDiff))))) + if (Math.abs(diff) > Math.abs(prevDiff)) { + if ((diff < 0) == (prevDiff < 0)) { throw new Error("Broke out of infinite loop in coordsCharInner") } + pos = prevPos; + } + } else { + var ch = findFirst(function (ch) { + var box = intoCoordSystem(cm, lineObj, measureCharPrepared(cm, preparedMeasure, ch), "line"); + if (box.top > y) { + // For the cursor stickiness + end = Math.min(ch, end); + return true + } + else if (box.bottom <= y) { return false } + else if (box.left > x) { return true } + else if (box.right < x) { return false } + else { return (x - box.left < box.right - x) } + }, begin, end); + ch = skipExtendingChars(lineObj.text, ch, 1); + pos = new Pos(lineNo$$1, ch, ch == end ? "before" : "after"); + } + var coords = cursorCoords(cm, pos, "line", lineObj, preparedMeasure); + if (y < coords.top || coords.bottom < y) { pos.outside = true; } + pos.xRel = x < coords.left ? -1 : (x > coords.right ? 1 : 0); + return pos +} + +var measureText; +// Compute the default text height. +function textHeight(display) { + if (display.cachedTextHeight != null) { return display.cachedTextHeight } + if (measureText == null) { + measureText = elt("pre"); + // Measure a bunch of lines, for browsers that compute + // fractional heights. + for (var i = 0; i < 49; ++i) { + measureText.appendChild(document.createTextNode("x")); + measureText.appendChild(elt("br")); + } + measureText.appendChild(document.createTextNode("x")); + } + removeChildrenAndAdd(display.measure, measureText); + var height = measureText.offsetHeight / 50; + if (height > 3) { display.cachedTextHeight = height; } + removeChildren(display.measure); + return height || 1 +} + +// Compute the default character width. +function charWidth(display) { + if (display.cachedCharWidth != null) { return display.cachedCharWidth } + var anchor = elt("span", "xxxxxxxxxx"); + var pre = elt("pre", [anchor]); + removeChildrenAndAdd(display.measure, pre); + var rect = anchor.getBoundingClientRect(), width = (rect.right - rect.left) / 10; + if (width > 2) { display.cachedCharWidth = width; } + return width || 10 +} + +// Do a bulk-read of the DOM positions and sizes needed to draw the +// view, so that we don't interleave reading and writing to the DOM. +function getDimensions(cm) { + var d = cm.display, left = {}, width = {}; + var gutterLeft = d.gutters.clientLeft; + for (var n = d.gutters.firstChild, i = 0; n; n = n.nextSibling, ++i) { + left[cm.options.gutters[i]] = n.offsetLeft + n.clientLeft + gutterLeft; + width[cm.options.gutters[i]] = n.clientWidth; + } + return {fixedPos: compensateForHScroll(d), + gutterTotalWidth: d.gutters.offsetWidth, + gutterLeft: left, + gutterWidth: width, + wrapperWidth: d.wrapper.clientWidth} +} + +// Computes display.scroller.scrollLeft + display.gutters.offsetWidth, +// but using getBoundingClientRect to get a sub-pixel-accurate +// result. +function compensateForHScroll(display) { + return display.scroller.getBoundingClientRect().left - display.sizer.getBoundingClientRect().left +} + +// Returns a function that estimates the height of a line, to use as +// first approximation until the line becomes visible (and is thus +// properly measurable). +function estimateHeight(cm) { + var th = textHeight(cm.display), wrapping = cm.options.lineWrapping; + var perLine = wrapping && Math.max(5, cm.display.scroller.clientWidth / charWidth(cm.display) - 3); + return function (line) { + if (lineIsHidden(cm.doc, line)) { return 0 } + + var widgetsHeight = 0; + if (line.widgets) { for (var i = 0; i < line.widgets.length; i++) { + if (line.widgets[i].height) { widgetsHeight += line.widgets[i].height; } + } } + + if (wrapping) + { return widgetsHeight + (Math.ceil(line.text.length / perLine) || 1) * th } + else + { return widgetsHeight + th } + } +} + +function estimateLineHeights(cm) { + var doc = cm.doc, est = estimateHeight(cm); + doc.iter(function (line) { + var estHeight = est(line); + if (estHeight != line.height) { updateLineHeight(line, estHeight); } + }); +} + +// Given a mouse event, find the corresponding position. If liberal +// is false, it checks whether a gutter or scrollbar was clicked, +// and returns null if it was. forRect is used by rectangular +// selections, and tries to estimate a character position even for +// coordinates beyond the right of the text. +function posFromMouse(cm, e, liberal, forRect) { + var display = cm.display; + if (!liberal && e_target(e).getAttribute("cm-not-content") == "true") { return null } + + var x, y, space = display.lineSpace.getBoundingClientRect(); + // Fails unpredictably on IE[67] when mouse is dragged around quickly. + try { x = e.clientX - space.left; y = e.clientY - space.top; } + catch (e) { return null } + var coords = coordsChar(cm, x, y), line; + if (forRect && coords.xRel == 1 && (line = getLine(cm.doc, coords.line).text).length == coords.ch) { + var colDiff = countColumn(line, line.length, cm.options.tabSize) - line.length; + coords = Pos(coords.line, Math.max(0, Math.round((x - paddingH(cm.display).left) / charWidth(cm.display)) - colDiff)); + } + return coords +} + +// Find the view element corresponding to a given line. Return null +// when the line isn't visible. +function findViewIndex(cm, n) { + if (n >= cm.display.viewTo) { return null } + n -= cm.display.viewFrom; + if (n < 0) { return null } + var view = cm.display.view; + for (var i = 0; i < view.length; i++) { + n -= view[i].size; + if (n < 0) { return i } + } +} + +function updateSelection(cm) { + cm.display.input.showSelection(cm.display.input.prepareSelection()); +} + +function prepareSelection(cm, primary) { + var doc = cm.doc, result = {}; + var curFragment = result.cursors = document.createDocumentFragment(); + var selFragment = result.selection = document.createDocumentFragment(); + + for (var i = 0; i < doc.sel.ranges.length; i++) { + if (primary === false && i == doc.sel.primIndex) { continue } + var range$$1 = doc.sel.ranges[i]; + if (range$$1.from().line >= cm.display.viewTo || range$$1.to().line < cm.display.viewFrom) { continue } + var collapsed = range$$1.empty(); + if (collapsed || cm.options.showCursorWhenSelecting) + { drawSelectionCursor(cm, range$$1.head, curFragment); } + if (!collapsed) + { drawSelectionRange(cm, range$$1, selFragment); } + } + return result +} + +// Draws a cursor for the given range +function drawSelectionCursor(cm, head, output) { + var pos = cursorCoords(cm, head, "div", null, null, !cm.options.singleCursorHeightPerLine); + + var cursor = output.appendChild(elt("div", "\u00a0", "CodeMirror-cursor")); + cursor.style.left = pos.left + "px"; + cursor.style.top = pos.top + "px"; + cursor.style.height = Math.max(0, pos.bottom - pos.top) * cm.options.cursorHeight + "px"; + + if (pos.other) { + // Secondary cursor, shown when on a 'jump' in bi-directional text + var otherCursor = output.appendChild(elt("div", "\u00a0", "CodeMirror-cursor CodeMirror-secondarycursor")); + otherCursor.style.display = ""; + otherCursor.style.left = pos.other.left + "px"; + otherCursor.style.top = pos.other.top + "px"; + otherCursor.style.height = (pos.other.bottom - pos.other.top) * .85 + "px"; + } +} + +// Draws the given range as a highlighted selection +function drawSelectionRange(cm, range$$1, output) { + var display = cm.display, doc = cm.doc; + var fragment = document.createDocumentFragment(); + var padding = paddingH(cm.display), leftSide = padding.left; + var rightSide = Math.max(display.sizerWidth, displayWidth(cm) - display.sizer.offsetLeft) - padding.right; + + function add(left, top, width, bottom) { + if (top < 0) { top = 0; } + top = Math.round(top); + bottom = Math.round(bottom); + fragment.appendChild(elt("div", null, "CodeMirror-selected", ("position: absolute; left: " + left + "px;\n top: " + top + "px; width: " + (width == null ? rightSide - left : width) + "px;\n height: " + (bottom - top) + "px"))); + } + + function drawForLine(line, fromArg, toArg) { + var lineObj = getLine(doc, line); + var lineLen = lineObj.text.length; + var start, end; + function coords(ch, bias) { + return charCoords(cm, Pos(line, ch), "div", lineObj, bias) + } + + iterateBidiSections(getOrder(lineObj, doc.direction), fromArg || 0, toArg == null ? lineLen : toArg, function (from, to, dir) { + var leftPos = coords(from, "left"), rightPos, left, right; + if (from == to) { + rightPos = leftPos; + left = right = leftPos.left; + } else { + rightPos = coords(to - 1, "right"); + if (dir == "rtl") { var tmp = leftPos; leftPos = rightPos; rightPos = tmp; } + left = leftPos.left; + right = rightPos.right; + } + if (fromArg == null && from == 0) { left = leftSide; } + if (rightPos.top - leftPos.top > 3) { // Different lines, draw top part + add(left, leftPos.top, null, leftPos.bottom); + left = leftSide; + if (leftPos.bottom < rightPos.top) { add(left, leftPos.bottom, null, rightPos.top); } + } + if (toArg == null && to == lineLen) { right = rightSide; } + if (!start || leftPos.top < start.top || leftPos.top == start.top && leftPos.left < start.left) + { start = leftPos; } + if (!end || rightPos.bottom > end.bottom || rightPos.bottom == end.bottom && rightPos.right > end.right) + { end = rightPos; } + if (left < leftSide + 1) { left = leftSide; } + add(left, rightPos.top, right - left, rightPos.bottom); + }); + return {start: start, end: end} + } + + var sFrom = range$$1.from(), sTo = range$$1.to(); + if (sFrom.line == sTo.line) { + drawForLine(sFrom.line, sFrom.ch, sTo.ch); + } else { + var fromLine = getLine(doc, sFrom.line), toLine = getLine(doc, sTo.line); + var singleVLine = visualLine(fromLine) == visualLine(toLine); + var leftEnd = drawForLine(sFrom.line, sFrom.ch, singleVLine ? fromLine.text.length + 1 : null).end; + var rightStart = drawForLine(sTo.line, singleVLine ? 0 : null, sTo.ch).start; + if (singleVLine) { + if (leftEnd.top < rightStart.top - 2) { + add(leftEnd.right, leftEnd.top, null, leftEnd.bottom); + add(leftSide, rightStart.top, rightStart.left, rightStart.bottom); + } else { + add(leftEnd.right, leftEnd.top, rightStart.left - leftEnd.right, leftEnd.bottom); + } + } + if (leftEnd.bottom < rightStart.top) + { add(leftSide, leftEnd.bottom, null, rightStart.top); } + } + + output.appendChild(fragment); +} + +// Cursor-blinking +function restartBlink(cm) { + if (!cm.state.focused) { return } + var display = cm.display; + clearInterval(display.blinker); + var on = true; + display.cursorDiv.style.visibility = ""; + if (cm.options.cursorBlinkRate > 0) + { display.blinker = setInterval(function () { return display.cursorDiv.style.visibility = (on = !on) ? "" : "hidden"; }, + cm.options.cursorBlinkRate); } + else if (cm.options.cursorBlinkRate < 0) + { display.cursorDiv.style.visibility = "hidden"; } +} + +function ensureFocus(cm) { + if (!cm.state.focused) { cm.display.input.focus(); onFocus(cm); } +} + +function delayBlurEvent(cm) { + cm.state.delayingBlurEvent = true; + setTimeout(function () { if (cm.state.delayingBlurEvent) { + cm.state.delayingBlurEvent = false; + onBlur(cm); + } }, 100); +} + +function onFocus(cm, e) { + if (cm.state.delayingBlurEvent) { cm.state.delayingBlurEvent = false; } + + if (cm.options.readOnly == "nocursor") { return } + if (!cm.state.focused) { + signal(cm, "focus", cm, e); + cm.state.focused = true; + addClass(cm.display.wrapper, "CodeMirror-focused"); + // This test prevents this from firing when a context + // menu is closed (since the input reset would kill the + // select-all detection hack) + if (!cm.curOp && cm.display.selForContextMenu != cm.doc.sel) { + cm.display.input.reset(); + if (webkit) { setTimeout(function () { return cm.display.input.reset(true); }, 20); } // Issue #1730 + } + cm.display.input.receivedFocus(); + } + restartBlink(cm); +} +function onBlur(cm, e) { + if (cm.state.delayingBlurEvent) { return } + + if (cm.state.focused) { + signal(cm, "blur", cm, e); + cm.state.focused = false; + rmClass(cm.display.wrapper, "CodeMirror-focused"); + } + clearInterval(cm.display.blinker); + setTimeout(function () { if (!cm.state.focused) { cm.display.shift = false; } }, 150); +} + +// Read the actual heights of the rendered lines, and update their +// stored heights to match. +function updateHeightsInViewport(cm) { + var display = cm.display; + var prevBottom = display.lineDiv.offsetTop; + for (var i = 0; i < display.view.length; i++) { + var cur = display.view[i], height = (void 0); + if (cur.hidden) { continue } + if (ie && ie_version < 8) { + var bot = cur.node.offsetTop + cur.node.offsetHeight; + height = bot - prevBottom; + prevBottom = bot; + } else { + var box = cur.node.getBoundingClientRect(); + height = box.bottom - box.top; + } + var diff = cur.line.height - height; + if (height < 2) { height = textHeight(display); } + if (diff > .005 || diff < -.005) { + updateLineHeight(cur.line, height); + updateWidgetHeight(cur.line); + if (cur.rest) { for (var j = 0; j < cur.rest.length; j++) + { updateWidgetHeight(cur.rest[j]); } } + } + } +} + +// Read and store the height of line widgets associated with the +// given line. +function updateWidgetHeight(line) { + if (line.widgets) { for (var i = 0; i < line.widgets.length; ++i) + { line.widgets[i].height = line.widgets[i].node.parentNode.offsetHeight; } } +} + +// Compute the lines that are visible in a given viewport (defaults +// the the current scroll position). viewport may contain top, +// height, and ensure (see op.scrollToPos) properties. +function visibleLines(display, doc, viewport) { + var top = viewport && viewport.top != null ? Math.max(0, viewport.top) : display.scroller.scrollTop; + top = Math.floor(top - paddingTop(display)); + var bottom = viewport && viewport.bottom != null ? viewport.bottom : top + display.wrapper.clientHeight; + + var from = lineAtHeight(doc, top), to = lineAtHeight(doc, bottom); + // Ensure is a {from: {line, ch}, to: {line, ch}} object, and + // forces those lines into the viewport (if possible). + if (viewport && viewport.ensure) { + var ensureFrom = viewport.ensure.from.line, ensureTo = viewport.ensure.to.line; + if (ensureFrom < from) { + from = ensureFrom; + to = lineAtHeight(doc, heightAtLine(getLine(doc, ensureFrom)) + display.wrapper.clientHeight); + } else if (Math.min(ensureTo, doc.lastLine()) >= to) { + from = lineAtHeight(doc, heightAtLine(getLine(doc, ensureTo)) - display.wrapper.clientHeight); + to = ensureTo; + } + } + return {from: from, to: Math.max(to, from + 1)} +} + +// Re-align line numbers and gutter marks to compensate for +// horizontal scrolling. +function alignHorizontally(cm) { + var display = cm.display, view = display.view; + if (!display.alignWidgets && (!display.gutters.firstChild || !cm.options.fixedGutter)) { return } + var comp = compensateForHScroll(display) - display.scroller.scrollLeft + cm.doc.scrollLeft; + var gutterW = display.gutters.offsetWidth, left = comp + "px"; + for (var i = 0; i < view.length; i++) { if (!view[i].hidden) { + if (cm.options.fixedGutter) { + if (view[i].gutter) + { view[i].gutter.style.left = left; } + if (view[i].gutterBackground) + { view[i].gutterBackground.style.left = left; } + } + var align = view[i].alignable; + if (align) { for (var j = 0; j < align.length; j++) + { align[j].style.left = left; } } + } } + if (cm.options.fixedGutter) + { display.gutters.style.left = (comp + gutterW) + "px"; } +} + +// Used to ensure that the line number gutter is still the right +// size for the current document size. Returns true when an update +// is needed. +function maybeUpdateLineNumberWidth(cm) { + if (!cm.options.lineNumbers) { return false } + var doc = cm.doc, last = lineNumberFor(cm.options, doc.first + doc.size - 1), display = cm.display; + if (last.length != display.lineNumChars) { + var test = display.measure.appendChild(elt("div", [elt("div", last)], + "CodeMirror-linenumber CodeMirror-gutter-elt")); + var innerW = test.firstChild.offsetWidth, padding = test.offsetWidth - innerW; + display.lineGutter.style.width = ""; + display.lineNumInnerWidth = Math.max(innerW, display.lineGutter.offsetWidth - padding) + 1; + display.lineNumWidth = display.lineNumInnerWidth + padding; + display.lineNumChars = display.lineNumInnerWidth ? last.length : -1; + display.lineGutter.style.width = display.lineNumWidth + "px"; + updateGutterSpace(cm); + return true + } + return false +} + +// SCROLLING THINGS INTO VIEW + +// If an editor sits on the top or bottom of the window, partially +// scrolled out of view, this ensures that the cursor is visible. +function maybeScrollWindow(cm, rect) { + if (signalDOMEvent(cm, "scrollCursorIntoView")) { return } + + var display = cm.display, box = display.sizer.getBoundingClientRect(), doScroll = null; + if (rect.top + box.top < 0) { doScroll = true; } + else if (rect.bottom + box.top > (window.innerHeight || document.documentElement.clientHeight)) { doScroll = false; } + if (doScroll != null && !phantom) { + var scrollNode = elt("div", "\u200b", null, ("position: absolute;\n top: " + (rect.top - display.viewOffset - paddingTop(cm.display)) + "px;\n height: " + (rect.bottom - rect.top + scrollGap(cm) + display.barHeight) + "px;\n left: " + (rect.left) + "px; width: " + (Math.max(2, rect.right - rect.left)) + "px;")); + cm.display.lineSpace.appendChild(scrollNode); + scrollNode.scrollIntoView(doScroll); + cm.display.lineSpace.removeChild(scrollNode); + } +} + +// Scroll a given position into view (immediately), verifying that +// it actually became visible (as line heights are accurately +// measured, the position of something may 'drift' during drawing). +function scrollPosIntoView(cm, pos, end, margin) { + if (margin == null) { margin = 0; } + var rect; + if (!cm.options.lineWrapping && pos == end) { + // Set pos and end to the cursor positions around the character pos sticks to + // If pos.sticky == "before", that is around pos.ch - 1, otherwise around pos.ch + // If pos == Pos(_, 0, "before"), pos and end are unchanged + pos = pos.ch ? Pos(pos.line, pos.sticky == "before" ? pos.ch - 1 : pos.ch, "after") : pos; + end = pos.sticky == "before" ? Pos(pos.line, pos.ch + 1, "before") : pos; + } + for (var limit = 0; limit < 5; limit++) { + var changed = false; + var coords = cursorCoords(cm, pos); + var endCoords = !end || end == pos ? coords : cursorCoords(cm, end); + rect = {left: Math.min(coords.left, endCoords.left), + top: Math.min(coords.top, endCoords.top) - margin, + right: Math.max(coords.left, endCoords.left), + bottom: Math.max(coords.bottom, endCoords.bottom) + margin}; + var scrollPos = calculateScrollPos(cm, rect); + var startTop = cm.doc.scrollTop, startLeft = cm.doc.scrollLeft; + if (scrollPos.scrollTop != null) { + updateScrollTop(cm, scrollPos.scrollTop); + if (Math.abs(cm.doc.scrollTop - startTop) > 1) { changed = true; } + } + if (scrollPos.scrollLeft != null) { + setScrollLeft(cm, scrollPos.scrollLeft); + if (Math.abs(cm.doc.scrollLeft - startLeft) > 1) { changed = true; } + } + if (!changed) { break } + } + return rect +} + +// Scroll a given set of coordinates into view (immediately). +function scrollIntoView(cm, rect) { + var scrollPos = calculateScrollPos(cm, rect); + if (scrollPos.scrollTop != null) { updateScrollTop(cm, scrollPos.scrollTop); } + if (scrollPos.scrollLeft != null) { setScrollLeft(cm, scrollPos.scrollLeft); } +} + +// Calculate a new scroll position needed to scroll the given +// rectangle into view. Returns an object with scrollTop and +// scrollLeft properties. When these are undefined, the +// vertical/horizontal position does not need to be adjusted. +function calculateScrollPos(cm, rect) { + var display = cm.display, snapMargin = textHeight(cm.display); + if (rect.top < 0) { rect.top = 0; } + var screentop = cm.curOp && cm.curOp.scrollTop != null ? cm.curOp.scrollTop : display.scroller.scrollTop; + var screen = displayHeight(cm), result = {}; + if (rect.bottom - rect.top > screen) { rect.bottom = rect.top + screen; } + var docBottom = cm.doc.height + paddingVert(display); + var atTop = rect.top < snapMargin, atBottom = rect.bottom > docBottom - snapMargin; + if (rect.top < screentop) { + result.scrollTop = atTop ? 0 : rect.top; + } else if (rect.bottom > screentop + screen) { + var newTop = Math.min(rect.top, (atBottom ? docBottom : rect.bottom) - screen); + if (newTop != screentop) { result.scrollTop = newTop; } + } + + var screenleft = cm.curOp && cm.curOp.scrollLeft != null ? cm.curOp.scrollLeft : display.scroller.scrollLeft; + var screenw = displayWidth(cm) - (cm.options.fixedGutter ? display.gutters.offsetWidth : 0); + var tooWide = rect.right - rect.left > screenw; + if (tooWide) { rect.right = rect.left + screenw; } + if (rect.left < 10) + { result.scrollLeft = 0; } + else if (rect.left < screenleft) + { result.scrollLeft = Math.max(0, rect.left - (tooWide ? 0 : 10)); } + else if (rect.right > screenw + screenleft - 3) + { result.scrollLeft = rect.right + (tooWide ? 0 : 10) - screenw; } + return result +} + +// Store a relative adjustment to the scroll position in the current +// operation (to be applied when the operation finishes). +function addToScrollTop(cm, top) { + if (top == null) { return } + resolveScrollToPos(cm); + cm.curOp.scrollTop = (cm.curOp.scrollTop == null ? cm.doc.scrollTop : cm.curOp.scrollTop) + top; +} + +// Make sure that at the end of the operation the current cursor is +// shown. +function ensureCursorVisible(cm) { + resolveScrollToPos(cm); + var cur = cm.getCursor(); + cm.curOp.scrollToPos = {from: cur, to: cur, margin: cm.options.cursorScrollMargin}; +} + +function scrollToCoords(cm, x, y) { + if (x != null || y != null) { resolveScrollToPos(cm); } + if (x != null) { cm.curOp.scrollLeft = x; } + if (y != null) { cm.curOp.scrollTop = y; } +} + +function scrollToRange(cm, range$$1) { + resolveScrollToPos(cm); + cm.curOp.scrollToPos = range$$1; +} + +// When an operation has its scrollToPos property set, and another +// scroll action is applied before the end of the operation, this +// 'simulates' scrolling that position into view in a cheap way, so +// that the effect of intermediate scroll commands is not ignored. +function resolveScrollToPos(cm) { + var range$$1 = cm.curOp.scrollToPos; + if (range$$1) { + cm.curOp.scrollToPos = null; + var from = estimateCoords(cm, range$$1.from), to = estimateCoords(cm, range$$1.to); + scrollToCoordsRange(cm, from, to, range$$1.margin); + } +} + +function scrollToCoordsRange(cm, from, to, margin) { + var sPos = calculateScrollPos(cm, { + left: Math.min(from.left, to.left), + top: Math.min(from.top, to.top) - margin, + right: Math.max(from.right, to.right), + bottom: Math.max(from.bottom, to.bottom) + margin + }); + scrollToCoords(cm, sPos.scrollLeft, sPos.scrollTop); +} + +// Sync the scrollable area and scrollbars, ensure the viewport +// covers the visible area. +function updateScrollTop(cm, val) { + if (Math.abs(cm.doc.scrollTop - val) < 2) { return } + if (!gecko) { updateDisplaySimple(cm, {top: val}); } + setScrollTop(cm, val, true); + if (gecko) { updateDisplaySimple(cm); } + startWorker(cm, 100); +} + +function setScrollTop(cm, val, forceScroll) { + val = Math.min(cm.display.scroller.scrollHeight - cm.display.scroller.clientHeight, val); + if (cm.display.scroller.scrollTop == val && !forceScroll) { return } + cm.doc.scrollTop = val; + cm.display.scrollbars.setScrollTop(val); + if (cm.display.scroller.scrollTop != val) { cm.display.scroller.scrollTop = val; } +} + +// Sync scroller and scrollbar, ensure the gutter elements are +// aligned. +function setScrollLeft(cm, val, isScroller, forceScroll) { + val = Math.min(val, cm.display.scroller.scrollWidth - cm.display.scroller.clientWidth); + if ((isScroller ? val == cm.doc.scrollLeft : Math.abs(cm.doc.scrollLeft - val) < 2) && !forceScroll) { return } + cm.doc.scrollLeft = val; + alignHorizontally(cm); + if (cm.display.scroller.scrollLeft != val) { cm.display.scroller.scrollLeft = val; } + cm.display.scrollbars.setScrollLeft(val); +} + +// SCROLLBARS + +// Prepare DOM reads needed to update the scrollbars. Done in one +// shot to minimize update/measure roundtrips. +function measureForScrollbars(cm) { + var d = cm.display, gutterW = d.gutters.offsetWidth; + var docH = Math.round(cm.doc.height + paddingVert(cm.display)); + return { + clientHeight: d.scroller.clientHeight, + viewHeight: d.wrapper.clientHeight, + scrollWidth: d.scroller.scrollWidth, clientWidth: d.scroller.clientWidth, + viewWidth: d.wrapper.clientWidth, + barLeft: cm.options.fixedGutter ? gutterW : 0, + docHeight: docH, + scrollHeight: docH + scrollGap(cm) + d.barHeight, + nativeBarWidth: d.nativeBarWidth, + gutterWidth: gutterW + } +} + +var NativeScrollbars = function(place, scroll, cm) { + this.cm = cm; + var vert = this.vert = elt("div", [elt("div", null, null, "min-width: 1px")], "CodeMirror-vscrollbar"); + var horiz = this.horiz = elt("div", [elt("div", null, null, "height: 100%; min-height: 1px")], "CodeMirror-hscrollbar"); + place(vert); place(horiz); + + on(vert, "scroll", function () { + if (vert.clientHeight) { scroll(vert.scrollTop, "vertical"); } + }); + on(horiz, "scroll", function () { + if (horiz.clientWidth) { scroll(horiz.scrollLeft, "horizontal"); } + }); + + this.checkedZeroWidth = false; + // Need to set a minimum width to see the scrollbar on IE7 (but must not set it on IE8). + if (ie && ie_version < 8) { this.horiz.style.minHeight = this.vert.style.minWidth = "18px"; } +}; + +NativeScrollbars.prototype.update = function (measure) { + var needsH = measure.scrollWidth > measure.clientWidth + 1; + var needsV = measure.scrollHeight > measure.clientHeight + 1; + var sWidth = measure.nativeBarWidth; + + if (needsV) { + this.vert.style.display = "block"; + this.vert.style.bottom = needsH ? sWidth + "px" : "0"; + var totalHeight = measure.viewHeight - (needsH ? sWidth : 0); + // A bug in IE8 can cause this value to be negative, so guard it. + this.vert.firstChild.style.height = + Math.max(0, measure.scrollHeight - measure.clientHeight + totalHeight) + "px"; + } else { + this.vert.style.display = ""; + this.vert.firstChild.style.height = "0"; + } + + if (needsH) { + this.horiz.style.display = "block"; + this.horiz.style.right = needsV ? sWidth + "px" : "0"; + this.horiz.style.left = measure.barLeft + "px"; + var totalWidth = measure.viewWidth - measure.barLeft - (needsV ? sWidth : 0); + this.horiz.firstChild.style.width = + Math.max(0, measure.scrollWidth - measure.clientWidth + totalWidth) + "px"; + } else { + this.horiz.style.display = ""; + this.horiz.firstChild.style.width = "0"; + } + + if (!this.checkedZeroWidth && measure.clientHeight > 0) { + if (sWidth == 0) { this.zeroWidthHack(); } + this.checkedZeroWidth = true; + } + + return {right: needsV ? sWidth : 0, bottom: needsH ? sWidth : 0} +}; + +NativeScrollbars.prototype.setScrollLeft = function (pos) { + if (this.horiz.scrollLeft != pos) { this.horiz.scrollLeft = pos; } + if (this.disableHoriz) { this.enableZeroWidthBar(this.horiz, this.disableHoriz, "horiz"); } +}; + +NativeScrollbars.prototype.setScrollTop = function (pos) { + if (this.vert.scrollTop != pos) { this.vert.scrollTop = pos; } + if (this.disableVert) { this.enableZeroWidthBar(this.vert, this.disableVert, "vert"); } +}; + +NativeScrollbars.prototype.zeroWidthHack = function () { + var w = mac && !mac_geMountainLion ? "12px" : "18px"; + this.horiz.style.height = this.vert.style.width = w; + this.horiz.style.pointerEvents = this.vert.style.pointerEvents = "none"; + this.disableHoriz = new Delayed; + this.disableVert = new Delayed; +}; + +NativeScrollbars.prototype.enableZeroWidthBar = function (bar, delay, type) { + bar.style.pointerEvents = "auto"; + function maybeDisable() { + // To find out whether the scrollbar is still visible, we + // check whether the element under the pixel in the bottom + // right corner of the scrollbar box is the scrollbar box + // itself (when the bar is still visible) or its filler child + // (when the bar is hidden). If it is still visible, we keep + // it enabled, if it's hidden, we disable pointer events. + var box = bar.getBoundingClientRect(); + var elt$$1 = type == "vert" ? document.elementFromPoint(box.right - 1, (box.top + box.bottom) / 2) + : document.elementFromPoint((box.right + box.left) / 2, box.bottom - 1); + if (elt$$1 != bar) { bar.style.pointerEvents = "none"; } + else { delay.set(1000, maybeDisable); } + } + delay.set(1000, maybeDisable); +}; + +NativeScrollbars.prototype.clear = function () { + var parent = this.horiz.parentNode; + parent.removeChild(this.horiz); + parent.removeChild(this.vert); +}; + +var NullScrollbars = function () {}; + +NullScrollbars.prototype.update = function () { return {bottom: 0, right: 0} }; +NullScrollbars.prototype.setScrollLeft = function () {}; +NullScrollbars.prototype.setScrollTop = function () {}; +NullScrollbars.prototype.clear = function () {}; + +function updateScrollbars(cm, measure) { + if (!measure) { measure = measureForScrollbars(cm); } + var startWidth = cm.display.barWidth, startHeight = cm.display.barHeight; + updateScrollbarsInner(cm, measure); + for (var i = 0; i < 4 && startWidth != cm.display.barWidth || startHeight != cm.display.barHeight; i++) { + if (startWidth != cm.display.barWidth && cm.options.lineWrapping) + { updateHeightsInViewport(cm); } + updateScrollbarsInner(cm, measureForScrollbars(cm)); + startWidth = cm.display.barWidth; startHeight = cm.display.barHeight; + } +} + +// Re-synchronize the fake scrollbars with the actual size of the +// content. +function updateScrollbarsInner(cm, measure) { + var d = cm.display; + var sizes = d.scrollbars.update(measure); + + d.sizer.style.paddingRight = (d.barWidth = sizes.right) + "px"; + d.sizer.style.paddingBottom = (d.barHeight = sizes.bottom) + "px"; + d.heightForcer.style.borderBottom = sizes.bottom + "px solid transparent"; + + if (sizes.right && sizes.bottom) { + d.scrollbarFiller.style.display = "block"; + d.scrollbarFiller.style.height = sizes.bottom + "px"; + d.scrollbarFiller.style.width = sizes.right + "px"; + } else { d.scrollbarFiller.style.display = ""; } + if (sizes.bottom && cm.options.coverGutterNextToScrollbar && cm.options.fixedGutter) { + d.gutterFiller.style.display = "block"; + d.gutterFiller.style.height = sizes.bottom + "px"; + d.gutterFiller.style.width = measure.gutterWidth + "px"; + } else { d.gutterFiller.style.display = ""; } +} + +var scrollbarModel = {"native": NativeScrollbars, "null": NullScrollbars}; + +function initScrollbars(cm) { + if (cm.display.scrollbars) { + cm.display.scrollbars.clear(); + if (cm.display.scrollbars.addClass) + { rmClass(cm.display.wrapper, cm.display.scrollbars.addClass); } + } + + cm.display.scrollbars = new scrollbarModel[cm.options.scrollbarStyle](function (node) { + cm.display.wrapper.insertBefore(node, cm.display.scrollbarFiller); + // Prevent clicks in the scrollbars from killing focus + on(node, "mousedown", function () { + if (cm.state.focused) { setTimeout(function () { return cm.display.input.focus(); }, 0); } + }); + node.setAttribute("cm-not-content", "true"); + }, function (pos, axis) { + if (axis == "horizontal") { setScrollLeft(cm, pos); } + else { updateScrollTop(cm, pos); } + }, cm); + if (cm.display.scrollbars.addClass) + { addClass(cm.display.wrapper, cm.display.scrollbars.addClass); } +} + +// Operations are used to wrap a series of changes to the editor +// state in such a way that each change won't have to update the +// cursor and display (which would be awkward, slow, and +// error-prone). Instead, display updates are batched and then all +// combined and executed at once. + +var nextOpId = 0; +// Start a new operation. +function startOperation(cm) { + cm.curOp = { + cm: cm, + viewChanged: false, // Flag that indicates that lines might need to be redrawn + startHeight: cm.doc.height, // Used to detect need to update scrollbar + forceUpdate: false, // Used to force a redraw + updateInput: null, // Whether to reset the input textarea + typing: false, // Whether this reset should be careful to leave existing text (for compositing) + changeObjs: null, // Accumulated changes, for firing change events + cursorActivityHandlers: null, // Set of handlers to fire cursorActivity on + cursorActivityCalled: 0, // Tracks which cursorActivity handlers have been called already + selectionChanged: false, // Whether the selection needs to be redrawn + updateMaxLine: false, // Set when the widest line needs to be determined anew + scrollLeft: null, scrollTop: null, // Intermediate scroll position, not pushed to DOM yet + scrollToPos: null, // Used to scroll to a specific position + focus: false, + id: ++nextOpId // Unique ID + }; + pushOperation(cm.curOp); +} + +// Finish an operation, updating the display and signalling delayed events +function endOperation(cm) { + var op = cm.curOp; + finishOperation(op, function (group) { + for (var i = 0; i < group.ops.length; i++) + { group.ops[i].cm.curOp = null; } + endOperations(group); + }); +} + +// The DOM updates done when an operation finishes are batched so +// that the minimum number of relayouts are required. +function endOperations(group) { + var ops = group.ops; + for (var i = 0; i < ops.length; i++) // Read DOM + { endOperation_R1(ops[i]); } + for (var i$1 = 0; i$1 < ops.length; i$1++) // Write DOM (maybe) + { endOperation_W1(ops[i$1]); } + for (var i$2 = 0; i$2 < ops.length; i$2++) // Read DOM + { endOperation_R2(ops[i$2]); } + for (var i$3 = 0; i$3 < ops.length; i$3++) // Write DOM (maybe) + { endOperation_W2(ops[i$3]); } + for (var i$4 = 0; i$4 < ops.length; i$4++) // Read DOM + { endOperation_finish(ops[i$4]); } +} + +function endOperation_R1(op) { + var cm = op.cm, display = cm.display; + maybeClipScrollbars(cm); + if (op.updateMaxLine) { findMaxLine(cm); } + + op.mustUpdate = op.viewChanged || op.forceUpdate || op.scrollTop != null || + op.scrollToPos && (op.scrollToPos.from.line < display.viewFrom || + op.scrollToPos.to.line >= display.viewTo) || + display.maxLineChanged && cm.options.lineWrapping; + op.update = op.mustUpdate && + new DisplayUpdate(cm, op.mustUpdate && {top: op.scrollTop, ensure: op.scrollToPos}, op.forceUpdate); +} + +function endOperation_W1(op) { + op.updatedDisplay = op.mustUpdate && updateDisplayIfNeeded(op.cm, op.update); +} + +function endOperation_R2(op) { + var cm = op.cm, display = cm.display; + if (op.updatedDisplay) { updateHeightsInViewport(cm); } + + op.barMeasure = measureForScrollbars(cm); + + // If the max line changed since it was last measured, measure it, + // and ensure the document's width matches it. + // updateDisplay_W2 will use these properties to do the actual resizing + if (display.maxLineChanged && !cm.options.lineWrapping) { + op.adjustWidthTo = measureChar(cm, display.maxLine, display.maxLine.text.length).left + 3; + cm.display.sizerWidth = op.adjustWidthTo; + op.barMeasure.scrollWidth = + Math.max(display.scroller.clientWidth, display.sizer.offsetLeft + op.adjustWidthTo + scrollGap(cm) + cm.display.barWidth); + op.maxScrollLeft = Math.max(0, display.sizer.offsetLeft + op.adjustWidthTo - displayWidth(cm)); + } + + if (op.updatedDisplay || op.selectionChanged) + { op.preparedSelection = display.input.prepareSelection(op.focus); } +} + +function endOperation_W2(op) { + var cm = op.cm; + + if (op.adjustWidthTo != null) { + cm.display.sizer.style.minWidth = op.adjustWidthTo + "px"; + if (op.maxScrollLeft < cm.doc.scrollLeft) + { setScrollLeft(cm, Math.min(cm.display.scroller.scrollLeft, op.maxScrollLeft), true); } + cm.display.maxLineChanged = false; + } + + var takeFocus = op.focus && op.focus == activeElt() && (!document.hasFocus || document.hasFocus()); + if (op.preparedSelection) + { cm.display.input.showSelection(op.preparedSelection, takeFocus); } + if (op.updatedDisplay || op.startHeight != cm.doc.height) + { updateScrollbars(cm, op.barMeasure); } + if (op.updatedDisplay) + { setDocumentHeight(cm, op.barMeasure); } + + if (op.selectionChanged) { restartBlink(cm); } + + if (cm.state.focused && op.updateInput) + { cm.display.input.reset(op.typing); } + if (takeFocus) { ensureFocus(op.cm); } +} + +function endOperation_finish(op) { + var cm = op.cm, display = cm.display, doc = cm.doc; + + if (op.updatedDisplay) { postUpdateDisplay(cm, op.update); } + + // Abort mouse wheel delta measurement, when scrolling explicitly + if (display.wheelStartX != null && (op.scrollTop != null || op.scrollLeft != null || op.scrollToPos)) + { display.wheelStartX = display.wheelStartY = null; } + + // Propagate the scroll position to the actual DOM scroller + if (op.scrollTop != null) { setScrollTop(cm, op.scrollTop, op.forceScroll); } + + if (op.scrollLeft != null) { setScrollLeft(cm, op.scrollLeft, true, true); } + // If we need to scroll a specific position into view, do so. + if (op.scrollToPos) { + var rect = scrollPosIntoView(cm, clipPos(doc, op.scrollToPos.from), + clipPos(doc, op.scrollToPos.to), op.scrollToPos.margin); + maybeScrollWindow(cm, rect); + } + + // Fire events for markers that are hidden/unidden by editing or + // undoing + var hidden = op.maybeHiddenMarkers, unhidden = op.maybeUnhiddenMarkers; + if (hidden) { for (var i = 0; i < hidden.length; ++i) + { if (!hidden[i].lines.length) { signal(hidden[i], "hide"); } } } + if (unhidden) { for (var i$1 = 0; i$1 < unhidden.length; ++i$1) + { if (unhidden[i$1].lines.length) { signal(unhidden[i$1], "unhide"); } } } + + if (display.wrapper.offsetHeight) + { doc.scrollTop = cm.display.scroller.scrollTop; } + + // Fire change events, and delayed event handlers + if (op.changeObjs) + { signal(cm, "changes", cm, op.changeObjs); } + if (op.update) + { op.update.finish(); } +} + +// Run the given function in an operation +function runInOp(cm, f) { + if (cm.curOp) { return f() } + startOperation(cm); + try { return f() } + finally { endOperation(cm); } +} +// Wraps a function in an operation. Returns the wrapped function. +function operation(cm, f) { + return function() { + if (cm.curOp) { return f.apply(cm, arguments) } + startOperation(cm); + try { return f.apply(cm, arguments) } + finally { endOperation(cm); } + } +} +// Used to add methods to editor and doc instances, wrapping them in +// operations. +function methodOp(f) { + return function() { + if (this.curOp) { return f.apply(this, arguments) } + startOperation(this); + try { return f.apply(this, arguments) } + finally { endOperation(this); } + } +} +function docMethodOp(f) { + return function() { + var cm = this.cm; + if (!cm || cm.curOp) { return f.apply(this, arguments) } + startOperation(cm); + try { return f.apply(this, arguments) } + finally { endOperation(cm); } + } +} + +// Updates the display.view data structure for a given change to the +// document. From and to are in pre-change coordinates. Lendiff is +// the amount of lines added or subtracted by the change. This is +// used for changes that span multiple lines, or change the way +// lines are divided into visual lines. regLineChange (below) +// registers single-line changes. +function regChange(cm, from, to, lendiff) { + if (from == null) { from = cm.doc.first; } + if (to == null) { to = cm.doc.first + cm.doc.size; } + if (!lendiff) { lendiff = 0; } + + var display = cm.display; + if (lendiff && to < display.viewTo && + (display.updateLineNumbers == null || display.updateLineNumbers > from)) + { display.updateLineNumbers = from; } + + cm.curOp.viewChanged = true; + + if (from >= display.viewTo) { // Change after + if (sawCollapsedSpans && visualLineNo(cm.doc, from) < display.viewTo) + { resetView(cm); } + } else if (to <= display.viewFrom) { // Change before + if (sawCollapsedSpans && visualLineEndNo(cm.doc, to + lendiff) > display.viewFrom) { + resetView(cm); + } else { + display.viewFrom += lendiff; + display.viewTo += lendiff; + } + } else if (from <= display.viewFrom && to >= display.viewTo) { // Full overlap + resetView(cm); + } else if (from <= display.viewFrom) { // Top overlap + var cut = viewCuttingPoint(cm, to, to + lendiff, 1); + if (cut) { + display.view = display.view.slice(cut.index); + display.viewFrom = cut.lineN; + display.viewTo += lendiff; + } else { + resetView(cm); + } + } else if (to >= display.viewTo) { // Bottom overlap + var cut$1 = viewCuttingPoint(cm, from, from, -1); + if (cut$1) { + display.view = display.view.slice(0, cut$1.index); + display.viewTo = cut$1.lineN; + } else { + resetView(cm); + } + } else { // Gap in the middle + var cutTop = viewCuttingPoint(cm, from, from, -1); + var cutBot = viewCuttingPoint(cm, to, to + lendiff, 1); + if (cutTop && cutBot) { + display.view = display.view.slice(0, cutTop.index) + .concat(buildViewArray(cm, cutTop.lineN, cutBot.lineN)) + .concat(display.view.slice(cutBot.index)); + display.viewTo += lendiff; + } else { + resetView(cm); + } + } + + var ext = display.externalMeasured; + if (ext) { + if (to < ext.lineN) + { ext.lineN += lendiff; } + else if (from < ext.lineN + ext.size) + { display.externalMeasured = null; } + } +} + +// Register a change to a single line. Type must be one of "text", +// "gutter", "class", "widget" +function regLineChange(cm, line, type) { + cm.curOp.viewChanged = true; + var display = cm.display, ext = cm.display.externalMeasured; + if (ext && line >= ext.lineN && line < ext.lineN + ext.size) + { display.externalMeasured = null; } + + if (line < display.viewFrom || line >= display.viewTo) { return } + var lineView = display.view[findViewIndex(cm, line)]; + if (lineView.node == null) { return } + var arr = lineView.changes || (lineView.changes = []); + if (indexOf(arr, type) == -1) { arr.push(type); } +} + +// Clear the view. +function resetView(cm) { + cm.display.viewFrom = cm.display.viewTo = cm.doc.first; + cm.display.view = []; + cm.display.viewOffset = 0; +} + +function viewCuttingPoint(cm, oldN, newN, dir) { + var index = findViewIndex(cm, oldN), diff, view = cm.display.view; + if (!sawCollapsedSpans || newN == cm.doc.first + cm.doc.size) + { return {index: index, lineN: newN} } + var n = cm.display.viewFrom; + for (var i = 0; i < index; i++) + { n += view[i].size; } + if (n != oldN) { + if (dir > 0) { + if (index == view.length - 1) { return null } + diff = (n + view[index].size) - oldN; + index++; + } else { + diff = n - oldN; + } + oldN += diff; newN += diff; + } + while (visualLineNo(cm.doc, newN) != newN) { + if (index == (dir < 0 ? 0 : view.length - 1)) { return null } + newN += dir * view[index - (dir < 0 ? 1 : 0)].size; + index += dir; + } + return {index: index, lineN: newN} +} + +// Force the view to cover a given range, adding empty view element +// or clipping off existing ones as needed. +function adjustView(cm, from, to) { + var display = cm.display, view = display.view; + if (view.length == 0 || from >= display.viewTo || to <= display.viewFrom) { + display.view = buildViewArray(cm, from, to); + display.viewFrom = from; + } else { + if (display.viewFrom > from) + { display.view = buildViewArray(cm, from, display.viewFrom).concat(display.view); } + else if (display.viewFrom < from) + { display.view = display.view.slice(findViewIndex(cm, from)); } + display.viewFrom = from; + if (display.viewTo < to) + { display.view = display.view.concat(buildViewArray(cm, display.viewTo, to)); } + else if (display.viewTo > to) + { display.view = display.view.slice(0, findViewIndex(cm, to)); } + } + display.viewTo = to; +} + +// Count the number of lines in the view whose DOM representation is +// out of date (or nonexistent). +function countDirtyView(cm) { + var view = cm.display.view, dirty = 0; + for (var i = 0; i < view.length; i++) { + var lineView = view[i]; + if (!lineView.hidden && (!lineView.node || lineView.changes)) { ++dirty; } + } + return dirty +} + +// HIGHLIGHT WORKER + +function startWorker(cm, time) { + if (cm.doc.highlightFrontier < cm.display.viewTo) + { cm.state.highlight.set(time, bind(highlightWorker, cm)); } +} + +function highlightWorker(cm) { + var doc = cm.doc; + if (doc.highlightFrontier >= cm.display.viewTo) { return } + var end = +new Date + cm.options.workTime; + var context = getContextBefore(cm, doc.highlightFrontier); + var changedLines = []; + + doc.iter(context.line, Math.min(doc.first + doc.size, cm.display.viewTo + 500), function (line) { + if (context.line >= cm.display.viewFrom) { // Visible + var oldStyles = line.styles; + var resetState = line.text.length > cm.options.maxHighlightLength ? copyState(doc.mode, context.state) : null; + var highlighted = highlightLine(cm, line, context, true); + if (resetState) { context.state = resetState; } + line.styles = highlighted.styles; + var oldCls = line.styleClasses, newCls = highlighted.classes; + if (newCls) { line.styleClasses = newCls; } + else if (oldCls) { line.styleClasses = null; } + var ischange = !oldStyles || oldStyles.length != line.styles.length || + oldCls != newCls && (!oldCls || !newCls || oldCls.bgClass != newCls.bgClass || oldCls.textClass != newCls.textClass); + for (var i = 0; !ischange && i < oldStyles.length; ++i) { ischange = oldStyles[i] != line.styles[i]; } + if (ischange) { changedLines.push(context.line); } + line.stateAfter = context.save(); + context.nextLine(); + } else { + if (line.text.length <= cm.options.maxHighlightLength) + { processLine(cm, line.text, context); } + line.stateAfter = context.line % 5 == 0 ? context.save() : null; + context.nextLine(); + } + if (+new Date > end) { + startWorker(cm, cm.options.workDelay); + return true + } + }); + doc.highlightFrontier = context.line; + doc.modeFrontier = Math.max(doc.modeFrontier, context.line); + if (changedLines.length) { runInOp(cm, function () { + for (var i = 0; i < changedLines.length; i++) + { regLineChange(cm, changedLines[i], "text"); } + }); } +} + +// DISPLAY DRAWING + +var DisplayUpdate = function(cm, viewport, force) { + var display = cm.display; + + this.viewport = viewport; + // Store some values that we'll need later (but don't want to force a relayout for) + this.visible = visibleLines(display, cm.doc, viewport); + this.editorIsHidden = !display.wrapper.offsetWidth; + this.wrapperHeight = display.wrapper.clientHeight; + this.wrapperWidth = display.wrapper.clientWidth; + this.oldDisplayWidth = displayWidth(cm); + this.force = force; + this.dims = getDimensions(cm); + this.events = []; +}; + +DisplayUpdate.prototype.signal = function (emitter, type) { + if (hasHandler(emitter, type)) + { this.events.push(arguments); } +}; +DisplayUpdate.prototype.finish = function () { + var this$1 = this; + + for (var i = 0; i < this.events.length; i++) + { signal.apply(null, this$1.events[i]); } +}; + +function maybeClipScrollbars(cm) { + var display = cm.display; + if (!display.scrollbarsClipped && display.scroller.offsetWidth) { + display.nativeBarWidth = display.scroller.offsetWidth - display.scroller.clientWidth; + display.heightForcer.style.height = scrollGap(cm) + "px"; + display.sizer.style.marginBottom = -display.nativeBarWidth + "px"; + display.sizer.style.borderRightWidth = scrollGap(cm) + "px"; + display.scrollbarsClipped = true; + } +} + +function selectionSnapshot(cm) { + if (cm.hasFocus()) { return null } + var active = activeElt(); + if (!active || !contains(cm.display.lineDiv, active)) { return null } + var result = {activeElt: active}; + if (window.getSelection) { + var sel = window.getSelection(); + if (sel.anchorNode && sel.extend && contains(cm.display.lineDiv, sel.anchorNode)) { + result.anchorNode = sel.anchorNode; + result.anchorOffset = sel.anchorOffset; + result.focusNode = sel.focusNode; + result.focusOffset = sel.focusOffset; + } + } + return result +} + +function restoreSelection(snapshot) { + if (!snapshot || !snapshot.activeElt || snapshot.activeElt == activeElt()) { return } + snapshot.activeElt.focus(); + if (snapshot.anchorNode && contains(document.body, snapshot.anchorNode) && contains(document.body, snapshot.focusNode)) { + var sel = window.getSelection(), range$$1 = document.createRange(); + range$$1.setEnd(snapshot.anchorNode, snapshot.anchorOffset); + range$$1.collapse(false); + sel.removeAllRanges(); + sel.addRange(range$$1); + sel.extend(snapshot.focusNode, snapshot.focusOffset); + } +} + +// Does the actual updating of the line display. Bails out +// (returning false) when there is nothing to be done and forced is +// false. +function updateDisplayIfNeeded(cm, update) { + var display = cm.display, doc = cm.doc; + + if (update.editorIsHidden) { + resetView(cm); + return false + } + + // Bail out if the visible area is already rendered and nothing changed. + if (!update.force && + update.visible.from >= display.viewFrom && update.visible.to <= display.viewTo && + (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo) && + display.renderedView == display.view && countDirtyView(cm) == 0) + { return false } + + if (maybeUpdateLineNumberWidth(cm)) { + resetView(cm); + update.dims = getDimensions(cm); + } + + // Compute a suitable new viewport (from & to) + var end = doc.first + doc.size; + var from = Math.max(update.visible.from - cm.options.viewportMargin, doc.first); + var to = Math.min(end, update.visible.to + cm.options.viewportMargin); + if (display.viewFrom < from && from - display.viewFrom < 20) { from = Math.max(doc.first, display.viewFrom); } + if (display.viewTo > to && display.viewTo - to < 20) { to = Math.min(end, display.viewTo); } + if (sawCollapsedSpans) { + from = visualLineNo(cm.doc, from); + to = visualLineEndNo(cm.doc, to); + } + + var different = from != display.viewFrom || to != display.viewTo || + display.lastWrapHeight != update.wrapperHeight || display.lastWrapWidth != update.wrapperWidth; + adjustView(cm, from, to); + + display.viewOffset = heightAtLine(getLine(cm.doc, display.viewFrom)); + // Position the mover div to align with the current scroll position + cm.display.mover.style.top = display.viewOffset + "px"; + + var toUpdate = countDirtyView(cm); + if (!different && toUpdate == 0 && !update.force && display.renderedView == display.view && + (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo)) + { return false } + + // For big changes, we hide the enclosing element during the + // update, since that speeds up the operations on most browsers. + var selSnapshot = selectionSnapshot(cm); + if (toUpdate > 4) { display.lineDiv.style.display = "none"; } + patchDisplay(cm, display.updateLineNumbers, update.dims); + if (toUpdate > 4) { display.lineDiv.style.display = ""; } + display.renderedView = display.view; + // There might have been a widget with a focused element that got + // hidden or updated, if so re-focus it. + restoreSelection(selSnapshot); + + // Prevent selection and cursors from interfering with the scroll + // width and height. + removeChildren(display.cursorDiv); + removeChildren(display.selectionDiv); + display.gutters.style.height = display.sizer.style.minHeight = 0; + + if (different) { + display.lastWrapHeight = update.wrapperHeight; + display.lastWrapWidth = update.wrapperWidth; + startWorker(cm, 400); + } + + display.updateLineNumbers = null; + + return true +} + +function postUpdateDisplay(cm, update) { + var viewport = update.viewport; + + for (var first = true;; first = false) { + if (!first || !cm.options.lineWrapping || update.oldDisplayWidth == displayWidth(cm)) { + // Clip forced viewport to actual scrollable area. + if (viewport && viewport.top != null) + { viewport = {top: Math.min(cm.doc.height + paddingVert(cm.display) - displayHeight(cm), viewport.top)}; } + // Updated line heights might result in the drawn area not + // actually covering the viewport. Keep looping until it does. + update.visible = visibleLines(cm.display, cm.doc, viewport); + if (update.visible.from >= cm.display.viewFrom && update.visible.to <= cm.display.viewTo) + { break } + } + if (!updateDisplayIfNeeded(cm, update)) { break } + updateHeightsInViewport(cm); + var barMeasure = measureForScrollbars(cm); + updateSelection(cm); + updateScrollbars(cm, barMeasure); + setDocumentHeight(cm, barMeasure); + update.force = false; + } + + update.signal(cm, "update", cm); + if (cm.display.viewFrom != cm.display.reportedViewFrom || cm.display.viewTo != cm.display.reportedViewTo) { + update.signal(cm, "viewportChange", cm, cm.display.viewFrom, cm.display.viewTo); + cm.display.reportedViewFrom = cm.display.viewFrom; cm.display.reportedViewTo = cm.display.viewTo; + } +} + +function updateDisplaySimple(cm, viewport) { + var update = new DisplayUpdate(cm, viewport); + if (updateDisplayIfNeeded(cm, update)) { + updateHeightsInViewport(cm); + postUpdateDisplay(cm, update); + var barMeasure = measureForScrollbars(cm); + updateSelection(cm); + updateScrollbars(cm, barMeasure); + setDocumentHeight(cm, barMeasure); + update.finish(); + } +} + +// Sync the actual display DOM structure with display.view, removing +// nodes for lines that are no longer in view, and creating the ones +// that are not there yet, and updating the ones that are out of +// date. +function patchDisplay(cm, updateNumbersFrom, dims) { + var display = cm.display, lineNumbers = cm.options.lineNumbers; + var container = display.lineDiv, cur = container.firstChild; + + function rm(node) { + var next = node.nextSibling; + // Works around a throw-scroll bug in OS X Webkit + if (webkit && mac && cm.display.currentWheelTarget == node) + { node.style.display = "none"; } + else + { node.parentNode.removeChild(node); } + return next + } + + var view = display.view, lineN = display.viewFrom; + // Loop over the elements in the view, syncing cur (the DOM nodes + // in display.lineDiv) with the view as we go. + for (var i = 0; i < view.length; i++) { + var lineView = view[i]; + if (lineView.hidden) { + } else if (!lineView.node || lineView.node.parentNode != container) { // Not drawn yet + var node = buildLineElement(cm, lineView, lineN, dims); + container.insertBefore(node, cur); + } else { // Already drawn + while (cur != lineView.node) { cur = rm(cur); } + var updateNumber = lineNumbers && updateNumbersFrom != null && + updateNumbersFrom <= lineN && lineView.lineNumber; + if (lineView.changes) { + if (indexOf(lineView.changes, "gutter") > -1) { updateNumber = false; } + updateLineForChanges(cm, lineView, lineN, dims); + } + if (updateNumber) { + removeChildren(lineView.lineNumber); + lineView.lineNumber.appendChild(document.createTextNode(lineNumberFor(cm.options, lineN))); + } + cur = lineView.node.nextSibling; + } + lineN += lineView.size; + } + while (cur) { cur = rm(cur); } +} + +function updateGutterSpace(cm) { + var width = cm.display.gutters.offsetWidth; + cm.display.sizer.style.marginLeft = width + "px"; +} + +function setDocumentHeight(cm, measure) { + cm.display.sizer.style.minHeight = measure.docHeight + "px"; + cm.display.heightForcer.style.top = measure.docHeight + "px"; + cm.display.gutters.style.height = (measure.docHeight + cm.display.barHeight + scrollGap(cm)) + "px"; +} + +// Rebuild the gutter elements, ensure the margin to the left of the +// code matches their width. +function updateGutters(cm) { + var gutters = cm.display.gutters, specs = cm.options.gutters; + removeChildren(gutters); + var i = 0; + for (; i < specs.length; ++i) { + var gutterClass = specs[i]; + var gElt = gutters.appendChild(elt("div", null, "CodeMirror-gutter " + gutterClass)); + if (gutterClass == "CodeMirror-linenumbers") { + cm.display.lineGutter = gElt; + gElt.style.width = (cm.display.lineNumWidth || 1) + "px"; + } + } + gutters.style.display = i ? "" : "none"; + updateGutterSpace(cm); +} + +// Make sure the gutters options contains the element +// "CodeMirror-linenumbers" when the lineNumbers option is true. +function setGuttersForLineNumbers(options) { + var found = indexOf(options.gutters, "CodeMirror-linenumbers"); + if (found == -1 && options.lineNumbers) { + options.gutters = options.gutters.concat(["CodeMirror-linenumbers"]); + } else if (found > -1 && !options.lineNumbers) { + options.gutters = options.gutters.slice(0); + options.gutters.splice(found, 1); + } +} + +// Since the delta values reported on mouse wheel events are +// unstandardized between browsers and even browser versions, and +// generally horribly unpredictable, this code starts by measuring +// the scroll effect that the first few mouse wheel events have, +// and, from that, detects the way it can convert deltas to pixel +// offsets afterwards. +// +// The reason we want to know the amount a wheel event will scroll +// is that it gives us a chance to update the display before the +// actual scrolling happens, reducing flickering. + +var wheelSamples = 0; +var wheelPixelsPerUnit = null; +// Fill in a browser-detected starting value on browsers where we +// know one. These don't have to be accurate -- the result of them +// being wrong would just be a slight flicker on the first wheel +// scroll (if it is large enough). +if (ie) { wheelPixelsPerUnit = -.53; } +else if (gecko) { wheelPixelsPerUnit = 15; } +else if (chrome) { wheelPixelsPerUnit = -.7; } +else if (safari) { wheelPixelsPerUnit = -1/3; } + +function wheelEventDelta(e) { + var dx = e.wheelDeltaX, dy = e.wheelDeltaY; + if (dx == null && e.detail && e.axis == e.HORIZONTAL_AXIS) { dx = e.detail; } + if (dy == null && e.detail && e.axis == e.VERTICAL_AXIS) { dy = e.detail; } + else if (dy == null) { dy = e.wheelDelta; } + return {x: dx, y: dy} +} +function wheelEventPixels(e) { + var delta = wheelEventDelta(e); + delta.x *= wheelPixelsPerUnit; + delta.y *= wheelPixelsPerUnit; + return delta +} + +function onScrollWheel(cm, e) { + var delta = wheelEventDelta(e), dx = delta.x, dy = delta.y; + + var display = cm.display, scroll = display.scroller; + // Quit if there's nothing to scroll here + var canScrollX = scroll.scrollWidth > scroll.clientWidth; + var canScrollY = scroll.scrollHeight > scroll.clientHeight; + if (!(dx && canScrollX || dy && canScrollY)) { return } + + // Webkit browsers on OS X abort momentum scrolls when the target + // of the scroll event is removed from the scrollable element. + // This hack (see related code in patchDisplay) makes sure the + // element is kept around. + if (dy && mac && webkit) { + outer: for (var cur = e.target, view = display.view; cur != scroll; cur = cur.parentNode) { + for (var i = 0; i < view.length; i++) { + if (view[i].node == cur) { + cm.display.currentWheelTarget = cur; + break outer + } + } + } + } + + // On some browsers, horizontal scrolling will cause redraws to + // happen before the gutter has been realigned, causing it to + // wriggle around in a most unseemly way. When we have an + // estimated pixels/delta value, we just handle horizontal + // scrolling entirely here. It'll be slightly off from native, but + // better than glitching out. + if (dx && !gecko && !presto && wheelPixelsPerUnit != null) { + if (dy && canScrollY) + { updateScrollTop(cm, Math.max(0, scroll.scrollTop + dy * wheelPixelsPerUnit)); } + setScrollLeft(cm, Math.max(0, scroll.scrollLeft + dx * wheelPixelsPerUnit)); + // Only prevent default scrolling if vertical scrolling is + // actually possible. Otherwise, it causes vertical scroll + // jitter on OSX trackpads when deltaX is small and deltaY + // is large (issue #3579) + if (!dy || (dy && canScrollY)) + { e_preventDefault(e); } + display.wheelStartX = null; // Abort measurement, if in progress + return + } + + // 'Project' the visible viewport to cover the area that is being + // scrolled into view (if we know enough to estimate it). + if (dy && wheelPixelsPerUnit != null) { + var pixels = dy * wheelPixelsPerUnit; + var top = cm.doc.scrollTop, bot = top + display.wrapper.clientHeight; + if (pixels < 0) { top = Math.max(0, top + pixels - 50); } + else { bot = Math.min(cm.doc.height, bot + pixels + 50); } + updateDisplaySimple(cm, {top: top, bottom: bot}); + } + + if (wheelSamples < 20) { + if (display.wheelStartX == null) { + display.wheelStartX = scroll.scrollLeft; display.wheelStartY = scroll.scrollTop; + display.wheelDX = dx; display.wheelDY = dy; + setTimeout(function () { + if (display.wheelStartX == null) { return } + var movedX = scroll.scrollLeft - display.wheelStartX; + var movedY = scroll.scrollTop - display.wheelStartY; + var sample = (movedY && display.wheelDY && movedY / display.wheelDY) || + (movedX && display.wheelDX && movedX / display.wheelDX); + display.wheelStartX = display.wheelStartY = null; + if (!sample) { return } + wheelPixelsPerUnit = (wheelPixelsPerUnit * wheelSamples + sample) / (wheelSamples + 1); + ++wheelSamples; + }, 200); + } else { + display.wheelDX += dx; display.wheelDY += dy; + } + } +} + +// Selection objects are immutable. A new one is created every time +// the selection changes. A selection is one or more non-overlapping +// (and non-touching) ranges, sorted, and an integer that indicates +// which one is the primary selection (the one that's scrolled into +// view, that getCursor returns, etc). +var Selection = function(ranges, primIndex) { + this.ranges = ranges; + this.primIndex = primIndex; +}; + +Selection.prototype.primary = function () { return this.ranges[this.primIndex] }; + +Selection.prototype.equals = function (other) { + var this$1 = this; + + if (other == this) { return true } + if (other.primIndex != this.primIndex || other.ranges.length != this.ranges.length) { return false } + for (var i = 0; i < this.ranges.length; i++) { + var here = this$1.ranges[i], there = other.ranges[i]; + if (!equalCursorPos(here.anchor, there.anchor) || !equalCursorPos(here.head, there.head)) { return false } + } + return true +}; + +Selection.prototype.deepCopy = function () { + var this$1 = this; + + var out = []; + for (var i = 0; i < this.ranges.length; i++) + { out[i] = new Range(copyPos(this$1.ranges[i].anchor), copyPos(this$1.ranges[i].head)); } + return new Selection(out, this.primIndex) +}; + +Selection.prototype.somethingSelected = function () { + var this$1 = this; + + for (var i = 0; i < this.ranges.length; i++) + { if (!this$1.ranges[i].empty()) { return true } } + return false +}; + +Selection.prototype.contains = function (pos, end) { + var this$1 = this; + + if (!end) { end = pos; } + for (var i = 0; i < this.ranges.length; i++) { + var range = this$1.ranges[i]; + if (cmp(end, range.from()) >= 0 && cmp(pos, range.to()) <= 0) + { return i } + } + return -1 +}; + +var Range = function(anchor, head) { + this.anchor = anchor; this.head = head; +}; + +Range.prototype.from = function () { return minPos(this.anchor, this.head) }; +Range.prototype.to = function () { return maxPos(this.anchor, this.head) }; +Range.prototype.empty = function () { return this.head.line == this.anchor.line && this.head.ch == this.anchor.ch }; + +// Take an unsorted, potentially overlapping set of ranges, and +// build a selection out of it. 'Consumes' ranges array (modifying +// it). +function normalizeSelection(ranges, primIndex) { + var prim = ranges[primIndex]; + ranges.sort(function (a, b) { return cmp(a.from(), b.from()); }); + primIndex = indexOf(ranges, prim); + for (var i = 1; i < ranges.length; i++) { + var cur = ranges[i], prev = ranges[i - 1]; + if (cmp(prev.to(), cur.from()) >= 0) { + var from = minPos(prev.from(), cur.from()), to = maxPos(prev.to(), cur.to()); + var inv = prev.empty() ? cur.from() == cur.head : prev.from() == prev.head; + if (i <= primIndex) { --primIndex; } + ranges.splice(--i, 2, new Range(inv ? to : from, inv ? from : to)); + } + } + return new Selection(ranges, primIndex) +} + +function simpleSelection(anchor, head) { + return new Selection([new Range(anchor, head || anchor)], 0) +} + +// Compute the position of the end of a change (its 'to' property +// refers to the pre-change end). +function changeEnd(change) { + if (!change.text) { return change.to } + return Pos(change.from.line + change.text.length - 1, + lst(change.text).length + (change.text.length == 1 ? change.from.ch : 0)) +} + +// Adjust a position to refer to the post-change position of the +// same text, or the end of the change if the change covers it. +function adjustForChange(pos, change) { + if (cmp(pos, change.from) < 0) { return pos } + if (cmp(pos, change.to) <= 0) { return changeEnd(change) } + + var line = pos.line + change.text.length - (change.to.line - change.from.line) - 1, ch = pos.ch; + if (pos.line == change.to.line) { ch += changeEnd(change).ch - change.to.ch; } + return Pos(line, ch) +} + +function computeSelAfterChange(doc, change) { + var out = []; + for (var i = 0; i < doc.sel.ranges.length; i++) { + var range = doc.sel.ranges[i]; + out.push(new Range(adjustForChange(range.anchor, change), + adjustForChange(range.head, change))); + } + return normalizeSelection(out, doc.sel.primIndex) +} + +function offsetPos(pos, old, nw) { + if (pos.line == old.line) + { return Pos(nw.line, pos.ch - old.ch + nw.ch) } + else + { return Pos(nw.line + (pos.line - old.line), pos.ch) } +} + +// Used by replaceSelections to allow moving the selection to the +// start or around the replaced test. Hint may be "start" or "around". +function computeReplacedSel(doc, changes, hint) { + var out = []; + var oldPrev = Pos(doc.first, 0), newPrev = oldPrev; + for (var i = 0; i < changes.length; i++) { + var change = changes[i]; + var from = offsetPos(change.from, oldPrev, newPrev); + var to = offsetPos(changeEnd(change), oldPrev, newPrev); + oldPrev = change.to; + newPrev = to; + if (hint == "around") { + var range = doc.sel.ranges[i], inv = cmp(range.head, range.anchor) < 0; + out[i] = new Range(inv ? to : from, inv ? from : to); + } else { + out[i] = new Range(from, from); + } + } + return new Selection(out, doc.sel.primIndex) +} + +// Used to get the editor into a consistent state again when options change. + +function loadMode(cm) { + cm.doc.mode = getMode(cm.options, cm.doc.modeOption); + resetModeState(cm); +} + +function resetModeState(cm) { + cm.doc.iter(function (line) { + if (line.stateAfter) { line.stateAfter = null; } + if (line.styles) { line.styles = null; } + }); + cm.doc.modeFrontier = cm.doc.highlightFrontier = cm.doc.first; + startWorker(cm, 100); + cm.state.modeGen++; + if (cm.curOp) { regChange(cm); } +} + +// DOCUMENT DATA STRUCTURE + +// By default, updates that start and end at the beginning of a line +// are treated specially, in order to make the association of line +// widgets and marker elements with the text behave more intuitive. +function isWholeLineUpdate(doc, change) { + return change.from.ch == 0 && change.to.ch == 0 && lst(change.text) == "" && + (!doc.cm || doc.cm.options.wholeLineUpdateBefore) +} + +// Perform a change on the document data structure. +function updateDoc(doc, change, markedSpans, estimateHeight$$1) { + function spansFor(n) {return markedSpans ? markedSpans[n] : null} + function update(line, text, spans) { + updateLine(line, text, spans, estimateHeight$$1); + signalLater(line, "change", line, change); + } + function linesFor(start, end) { + var result = []; + for (var i = start; i < end; ++i) + { result.push(new Line(text[i], spansFor(i), estimateHeight$$1)); } + return result + } + + var from = change.from, to = change.to, text = change.text; + var firstLine = getLine(doc, from.line), lastLine = getLine(doc, to.line); + var lastText = lst(text), lastSpans = spansFor(text.length - 1), nlines = to.line - from.line; + + // Adjust the line structure + if (change.full) { + doc.insert(0, linesFor(0, text.length)); + doc.remove(text.length, doc.size - text.length); + } else if (isWholeLineUpdate(doc, change)) { + // This is a whole-line replace. Treated specially to make + // sure line objects move the way they are supposed to. + var added = linesFor(0, text.length - 1); + update(lastLine, lastLine.text, lastSpans); + if (nlines) { doc.remove(from.line, nlines); } + if (added.length) { doc.insert(from.line, added); } + } else if (firstLine == lastLine) { + if (text.length == 1) { + update(firstLine, firstLine.text.slice(0, from.ch) + lastText + firstLine.text.slice(to.ch), lastSpans); + } else { + var added$1 = linesFor(1, text.length - 1); + added$1.push(new Line(lastText + firstLine.text.slice(to.ch), lastSpans, estimateHeight$$1)); + update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0)); + doc.insert(from.line + 1, added$1); + } + } else if (text.length == 1) { + update(firstLine, firstLine.text.slice(0, from.ch) + text[0] + lastLine.text.slice(to.ch), spansFor(0)); + doc.remove(from.line + 1, nlines); + } else { + update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0)); + update(lastLine, lastText + lastLine.text.slice(to.ch), lastSpans); + var added$2 = linesFor(1, text.length - 1); + if (nlines > 1) { doc.remove(from.line + 1, nlines - 1); } + doc.insert(from.line + 1, added$2); + } + + signalLater(doc, "change", doc, change); +} + +// Call f for all linked documents. +function linkedDocs(doc, f, sharedHistOnly) { + function propagate(doc, skip, sharedHist) { + if (doc.linked) { for (var i = 0; i < doc.linked.length; ++i) { + var rel = doc.linked[i]; + if (rel.doc == skip) { continue } + var shared = sharedHist && rel.sharedHist; + if (sharedHistOnly && !shared) { continue } + f(rel.doc, shared); + propagate(rel.doc, doc, shared); + } } + } + propagate(doc, null, true); +} + +// Attach a document to an editor. +function attachDoc(cm, doc) { + if (doc.cm) { throw new Error("This document is already in use.") } + cm.doc = doc; + doc.cm = cm; + estimateLineHeights(cm); + loadMode(cm); + setDirectionClass(cm); + if (!cm.options.lineWrapping) { findMaxLine(cm); } + cm.options.mode = doc.modeOption; + regChange(cm); +} + +function setDirectionClass(cm) { + (cm.doc.direction == "rtl" ? addClass : rmClass)(cm.display.lineDiv, "CodeMirror-rtl"); +} + +function directionChanged(cm) { + runInOp(cm, function () { + setDirectionClass(cm); + regChange(cm); + }); +} + +function History(startGen) { + // Arrays of change events and selections. Doing something adds an + // event to done and clears undo. Undoing moves events from done + // to undone, redoing moves them in the other direction. + this.done = []; this.undone = []; + this.undoDepth = Infinity; + // Used to track when changes can be merged into a single undo + // event + this.lastModTime = this.lastSelTime = 0; + this.lastOp = this.lastSelOp = null; + this.lastOrigin = this.lastSelOrigin = null; + // Used by the isClean() method + this.generation = this.maxGeneration = startGen || 1; +} + +// Create a history change event from an updateDoc-style change +// object. +function historyChangeFromChange(doc, change) { + var histChange = {from: copyPos(change.from), to: changeEnd(change), text: getBetween(doc, change.from, change.to)}; + attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1); + linkedDocs(doc, function (doc) { return attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1); }, true); + return histChange +} + +// Pop all selection events off the end of a history array. Stop at +// a change event. +function clearSelectionEvents(array) { + while (array.length) { + var last = lst(array); + if (last.ranges) { array.pop(); } + else { break } + } +} + +// Find the top change event in the history. Pop off selection +// events that are in the way. +function lastChangeEvent(hist, force) { + if (force) { + clearSelectionEvents(hist.done); + return lst(hist.done) + } else if (hist.done.length && !lst(hist.done).ranges) { + return lst(hist.done) + } else if (hist.done.length > 1 && !hist.done[hist.done.length - 2].ranges) { + hist.done.pop(); + return lst(hist.done) + } +} + +// Register a change in the history. Merges changes that are within +// a single operation, or are close together with an origin that +// allows merging (starting with "+") into a single event. +function addChangeToHistory(doc, change, selAfter, opId) { + var hist = doc.history; + hist.undone.length = 0; + var time = +new Date, cur; + var last; + + if ((hist.lastOp == opId || + hist.lastOrigin == change.origin && change.origin && + ((change.origin.charAt(0) == "+" && doc.cm && hist.lastModTime > time - doc.cm.options.historyEventDelay) || + change.origin.charAt(0) == "*")) && + (cur = lastChangeEvent(hist, hist.lastOp == opId))) { + // Merge this change into the last event + last = lst(cur.changes); + if (cmp(change.from, change.to) == 0 && cmp(change.from, last.to) == 0) { + // Optimized case for simple insertion -- don't want to add + // new changesets for every character typed + last.to = changeEnd(change); + } else { + // Add new sub-event + cur.changes.push(historyChangeFromChange(doc, change)); + } + } else { + // Can not be merged, start a new event. + var before = lst(hist.done); + if (!before || !before.ranges) + { pushSelectionToHistory(doc.sel, hist.done); } + cur = {changes: [historyChangeFromChange(doc, change)], + generation: hist.generation}; + hist.done.push(cur); + while (hist.done.length > hist.undoDepth) { + hist.done.shift(); + if (!hist.done[0].ranges) { hist.done.shift(); } + } + } + hist.done.push(selAfter); + hist.generation = ++hist.maxGeneration; + hist.lastModTime = hist.lastSelTime = time; + hist.lastOp = hist.lastSelOp = opId; + hist.lastOrigin = hist.lastSelOrigin = change.origin; + + if (!last) { signal(doc, "historyAdded"); } +} + +function selectionEventCanBeMerged(doc, origin, prev, sel) { + var ch = origin.charAt(0); + return ch == "*" || + ch == "+" && + prev.ranges.length == sel.ranges.length && + prev.somethingSelected() == sel.somethingSelected() && + new Date - doc.history.lastSelTime <= (doc.cm ? doc.cm.options.historyEventDelay : 500) +} + +// Called whenever the selection changes, sets the new selection as +// the pending selection in the history, and pushes the old pending +// selection into the 'done' array when it was significantly +// different (in number of selected ranges, emptiness, or time). +function addSelectionToHistory(doc, sel, opId, options) { + var hist = doc.history, origin = options && options.origin; + + // A new event is started when the previous origin does not match + // the current, or the origins don't allow matching. Origins + // starting with * are always merged, those starting with + are + // merged when similar and close together in time. + if (opId == hist.lastSelOp || + (origin && hist.lastSelOrigin == origin && + (hist.lastModTime == hist.lastSelTime && hist.lastOrigin == origin || + selectionEventCanBeMerged(doc, origin, lst(hist.done), sel)))) + { hist.done[hist.done.length - 1] = sel; } + else + { pushSelectionToHistory(sel, hist.done); } + + hist.lastSelTime = +new Date; + hist.lastSelOrigin = origin; + hist.lastSelOp = opId; + if (options && options.clearRedo !== false) + { clearSelectionEvents(hist.undone); } +} + +function pushSelectionToHistory(sel, dest) { + var top = lst(dest); + if (!(top && top.ranges && top.equals(sel))) + { dest.push(sel); } +} + +// Used to store marked span information in the history. +function attachLocalSpans(doc, change, from, to) { + var existing = change["spans_" + doc.id], n = 0; + doc.iter(Math.max(doc.first, from), Math.min(doc.first + doc.size, to), function (line) { + if (line.markedSpans) + { (existing || (existing = change["spans_" + doc.id] = {}))[n] = line.markedSpans; } + ++n; + }); +} + +// When un/re-doing restores text containing marked spans, those +// that have been explicitly cleared should not be restored. +function removeClearedSpans(spans) { + if (!spans) { return null } + var out; + for (var i = 0; i < spans.length; ++i) { + if (spans[i].marker.explicitlyCleared) { if (!out) { out = spans.slice(0, i); } } + else if (out) { out.push(spans[i]); } + } + return !out ? spans : out.length ? out : null +} + +// Retrieve and filter the old marked spans stored in a change event. +function getOldSpans(doc, change) { + var found = change["spans_" + doc.id]; + if (!found) { return null } + var nw = []; + for (var i = 0; i < change.text.length; ++i) + { nw.push(removeClearedSpans(found[i])); } + return nw +} + +// Used for un/re-doing changes from the history. Combines the +// result of computing the existing spans with the set of spans that +// existed in the history (so that deleting around a span and then +// undoing brings back the span). +function mergeOldSpans(doc, change) { + var old = getOldSpans(doc, change); + var stretched = stretchSpansOverChange(doc, change); + if (!old) { return stretched } + if (!stretched) { return old } + + for (var i = 0; i < old.length; ++i) { + var oldCur = old[i], stretchCur = stretched[i]; + if (oldCur && stretchCur) { + spans: for (var j = 0; j < stretchCur.length; ++j) { + var span = stretchCur[j]; + for (var k = 0; k < oldCur.length; ++k) + { if (oldCur[k].marker == span.marker) { continue spans } } + oldCur.push(span); + } + } else if (stretchCur) { + old[i] = stretchCur; + } + } + return old +} + +// Used both to provide a JSON-safe object in .getHistory, and, when +// detaching a document, to split the history in two +function copyHistoryArray(events, newGroup, instantiateSel) { + var copy = []; + for (var i = 0; i < events.length; ++i) { + var event = events[i]; + if (event.ranges) { + copy.push(instantiateSel ? Selection.prototype.deepCopy.call(event) : event); + continue + } + var changes = event.changes, newChanges = []; + copy.push({changes: newChanges}); + for (var j = 0; j < changes.length; ++j) { + var change = changes[j], m = (void 0); + newChanges.push({from: change.from, to: change.to, text: change.text}); + if (newGroup) { for (var prop in change) { if (m = prop.match(/^spans_(\d+)$/)) { + if (indexOf(newGroup, Number(m[1])) > -1) { + lst(newChanges)[prop] = change[prop]; + delete change[prop]; + } + } } } + } + } + return copy +} + +// The 'scroll' parameter given to many of these indicated whether +// the new cursor position should be scrolled into view after +// modifying the selection. + +// If shift is held or the extend flag is set, extends a range to +// include a given position (and optionally a second position). +// Otherwise, simply returns the range between the given positions. +// Used for cursor motion and such. +function extendRange(range, head, other, extend) { + if (extend) { + var anchor = range.anchor; + if (other) { + var posBefore = cmp(head, anchor) < 0; + if (posBefore != (cmp(other, anchor) < 0)) { + anchor = head; + head = other; + } else if (posBefore != (cmp(head, other) < 0)) { + head = other; + } + } + return new Range(anchor, head) + } else { + return new Range(other || head, head) + } +} + +// Extend the primary selection range, discard the rest. +function extendSelection(doc, head, other, options, extend) { + if (extend == null) { extend = doc.cm && (doc.cm.display.shift || doc.extend); } + setSelection(doc, new Selection([extendRange(doc.sel.primary(), head, other, extend)], 0), options); +} + +// Extend all selections (pos is an array of selections with length +// equal the number of selections) +function extendSelections(doc, heads, options) { + var out = []; + var extend = doc.cm && (doc.cm.display.shift || doc.extend); + for (var i = 0; i < doc.sel.ranges.length; i++) + { out[i] = extendRange(doc.sel.ranges[i], heads[i], null, extend); } + var newSel = normalizeSelection(out, doc.sel.primIndex); + setSelection(doc, newSel, options); +} + +// Updates a single range in the selection. +function replaceOneSelection(doc, i, range, options) { + var ranges = doc.sel.ranges.slice(0); + ranges[i] = range; + setSelection(doc, normalizeSelection(ranges, doc.sel.primIndex), options); +} + +// Reset the selection to a single range. +function setSimpleSelection(doc, anchor, head, options) { + setSelection(doc, simpleSelection(anchor, head), options); +} + +// Give beforeSelectionChange handlers a change to influence a +// selection update. +function filterSelectionChange(doc, sel, options) { + var obj = { + ranges: sel.ranges, + update: function(ranges) { + var this$1 = this; + + this.ranges = []; + for (var i = 0; i < ranges.length; i++) + { this$1.ranges[i] = new Range(clipPos(doc, ranges[i].anchor), + clipPos(doc, ranges[i].head)); } + }, + origin: options && options.origin + }; + signal(doc, "beforeSelectionChange", doc, obj); + if (doc.cm) { signal(doc.cm, "beforeSelectionChange", doc.cm, obj); } + if (obj.ranges != sel.ranges) { return normalizeSelection(obj.ranges, obj.ranges.length - 1) } + else { return sel } +} + +function setSelectionReplaceHistory(doc, sel, options) { + var done = doc.history.done, last = lst(done); + if (last && last.ranges) { + done[done.length - 1] = sel; + setSelectionNoUndo(doc, sel, options); + } else { + setSelection(doc, sel, options); + } +} + +// Set a new selection. +function setSelection(doc, sel, options) { + setSelectionNoUndo(doc, sel, options); + addSelectionToHistory(doc, doc.sel, doc.cm ? doc.cm.curOp.id : NaN, options); +} + +function setSelectionNoUndo(doc, sel, options) { + if (hasHandler(doc, "beforeSelectionChange") || doc.cm && hasHandler(doc.cm, "beforeSelectionChange")) + { sel = filterSelectionChange(doc, sel, options); } + + var bias = options && options.bias || + (cmp(sel.primary().head, doc.sel.primary().head) < 0 ? -1 : 1); + setSelectionInner(doc, skipAtomicInSelection(doc, sel, bias, true)); + + if (!(options && options.scroll === false) && doc.cm) + { ensureCursorVisible(doc.cm); } +} + +function setSelectionInner(doc, sel) { + if (sel.equals(doc.sel)) { return } + + doc.sel = sel; + + if (doc.cm) { + doc.cm.curOp.updateInput = doc.cm.curOp.selectionChanged = true; + signalCursorActivity(doc.cm); + } + signalLater(doc, "cursorActivity", doc); +} + +// Verify that the selection does not partially select any atomic +// marked ranges. +function reCheckSelection(doc) { + setSelectionInner(doc, skipAtomicInSelection(doc, doc.sel, null, false)); +} + +// Return a selection that does not partially select any atomic +// ranges. +function skipAtomicInSelection(doc, sel, bias, mayClear) { + var out; + for (var i = 0; i < sel.ranges.length; i++) { + var range = sel.ranges[i]; + var old = sel.ranges.length == doc.sel.ranges.length && doc.sel.ranges[i]; + var newAnchor = skipAtomic(doc, range.anchor, old && old.anchor, bias, mayClear); + var newHead = skipAtomic(doc, range.head, old && old.head, bias, mayClear); + if (out || newAnchor != range.anchor || newHead != range.head) { + if (!out) { out = sel.ranges.slice(0, i); } + out[i] = new Range(newAnchor, newHead); + } + } + return out ? normalizeSelection(out, sel.primIndex) : sel +} + +function skipAtomicInner(doc, pos, oldPos, dir, mayClear) { + var line = getLine(doc, pos.line); + if (line.markedSpans) { for (var i = 0; i < line.markedSpans.length; ++i) { + var sp = line.markedSpans[i], m = sp.marker; + if ((sp.from == null || (m.inclusiveLeft ? sp.from <= pos.ch : sp.from < pos.ch)) && + (sp.to == null || (m.inclusiveRight ? sp.to >= pos.ch : sp.to > pos.ch))) { + if (mayClear) { + signal(m, "beforeCursorEnter"); + if (m.explicitlyCleared) { + if (!line.markedSpans) { break } + else {--i; continue} + } + } + if (!m.atomic) { continue } + + if (oldPos) { + var near = m.find(dir < 0 ? 1 : -1), diff = (void 0); + if (dir < 0 ? m.inclusiveRight : m.inclusiveLeft) + { near = movePos(doc, near, -dir, near && near.line == pos.line ? line : null); } + if (near && near.line == pos.line && (diff = cmp(near, oldPos)) && (dir < 0 ? diff < 0 : diff > 0)) + { return skipAtomicInner(doc, near, pos, dir, mayClear) } + } + + var far = m.find(dir < 0 ? -1 : 1); + if (dir < 0 ? m.inclusiveLeft : m.inclusiveRight) + { far = movePos(doc, far, dir, far.line == pos.line ? line : null); } + return far ? skipAtomicInner(doc, far, pos, dir, mayClear) : null + } + } } + return pos +} + +// Ensure a given position is not inside an atomic range. +function skipAtomic(doc, pos, oldPos, bias, mayClear) { + var dir = bias || 1; + var found = skipAtomicInner(doc, pos, oldPos, dir, mayClear) || + (!mayClear && skipAtomicInner(doc, pos, oldPos, dir, true)) || + skipAtomicInner(doc, pos, oldPos, -dir, mayClear) || + (!mayClear && skipAtomicInner(doc, pos, oldPos, -dir, true)); + if (!found) { + doc.cantEdit = true; + return Pos(doc.first, 0) + } + return found +} + +function movePos(doc, pos, dir, line) { + if (dir < 0 && pos.ch == 0) { + if (pos.line > doc.first) { return clipPos(doc, Pos(pos.line - 1)) } + else { return null } + } else if (dir > 0 && pos.ch == (line || getLine(doc, pos.line)).text.length) { + if (pos.line < doc.first + doc.size - 1) { return Pos(pos.line + 1, 0) } + else { return null } + } else { + return new Pos(pos.line, pos.ch + dir) + } +} + +function selectAll(cm) { + cm.setSelection(Pos(cm.firstLine(), 0), Pos(cm.lastLine()), sel_dontScroll); +} + +// UPDATING + +// Allow "beforeChange" event handlers to influence a change +function filterChange(doc, change, update) { + var obj = { + canceled: false, + from: change.from, + to: change.to, + text: change.text, + origin: change.origin, + cancel: function () { return obj.canceled = true; } + }; + if (update) { obj.update = function (from, to, text, origin) { + if (from) { obj.from = clipPos(doc, from); } + if (to) { obj.to = clipPos(doc, to); } + if (text) { obj.text = text; } + if (origin !== undefined) { obj.origin = origin; } + }; } + signal(doc, "beforeChange", doc, obj); + if (doc.cm) { signal(doc.cm, "beforeChange", doc.cm, obj); } + + if (obj.canceled) { return null } + return {from: obj.from, to: obj.to, text: obj.text, origin: obj.origin} +} + +// Apply a change to a document, and add it to the document's +// history, and propagating it to all linked documents. +function makeChange(doc, change, ignoreReadOnly) { + if (doc.cm) { + if (!doc.cm.curOp) { return operation(doc.cm, makeChange)(doc, change, ignoreReadOnly) } + if (doc.cm.state.suppressEdits) { return } + } + + if (hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange")) { + change = filterChange(doc, change, true); + if (!change) { return } + } + + // Possibly split or suppress the update based on the presence + // of read-only spans in its range. + var split = sawReadOnlySpans && !ignoreReadOnly && removeReadOnlyRanges(doc, change.from, change.to); + if (split) { + for (var i = split.length - 1; i >= 0; --i) + { makeChangeInner(doc, {from: split[i].from, to: split[i].to, text: i ? [""] : change.text}); } + } else { + makeChangeInner(doc, change); + } +} + +function makeChangeInner(doc, change) { + if (change.text.length == 1 && change.text[0] == "" && cmp(change.from, change.to) == 0) { return } + var selAfter = computeSelAfterChange(doc, change); + addChangeToHistory(doc, change, selAfter, doc.cm ? doc.cm.curOp.id : NaN); + + makeChangeSingleDoc(doc, change, selAfter, stretchSpansOverChange(doc, change)); + var rebased = []; + + linkedDocs(doc, function (doc, sharedHist) { + if (!sharedHist && indexOf(rebased, doc.history) == -1) { + rebaseHist(doc.history, change); + rebased.push(doc.history); + } + makeChangeSingleDoc(doc, change, null, stretchSpansOverChange(doc, change)); + }); +} + +// Revert a change stored in a document's history. +function makeChangeFromHistory(doc, type, allowSelectionOnly) { + if (doc.cm && doc.cm.state.suppressEdits && !allowSelectionOnly) { return } + + var hist = doc.history, event, selAfter = doc.sel; + var source = type == "undo" ? hist.done : hist.undone, dest = type == "undo" ? hist.undone : hist.done; + + // Verify that there is a useable event (so that ctrl-z won't + // needlessly clear selection events) + var i = 0; + for (; i < source.length; i++) { + event = source[i]; + if (allowSelectionOnly ? event.ranges && !event.equals(doc.sel) : !event.ranges) + { break } + } + if (i == source.length) { return } + hist.lastOrigin = hist.lastSelOrigin = null; + + for (;;) { + event = source.pop(); + if (event.ranges) { + pushSelectionToHistory(event, dest); + if (allowSelectionOnly && !event.equals(doc.sel)) { + setSelection(doc, event, {clearRedo: false}); + return + } + selAfter = event; + } + else { break } + } + + // Build up a reverse change object to add to the opposite history + // stack (redo when undoing, and vice versa). + var antiChanges = []; + pushSelectionToHistory(selAfter, dest); + dest.push({changes: antiChanges, generation: hist.generation}); + hist.generation = event.generation || ++hist.maxGeneration; + + var filter = hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange"); + + var loop = function ( i ) { + var change = event.changes[i]; + change.origin = type; + if (filter && !filterChange(doc, change, false)) { + source.length = 0; + return {} + } + + antiChanges.push(historyChangeFromChange(doc, change)); + + var after = i ? computeSelAfterChange(doc, change) : lst(source); + makeChangeSingleDoc(doc, change, after, mergeOldSpans(doc, change)); + if (!i && doc.cm) { doc.cm.scrollIntoView({from: change.from, to: changeEnd(change)}); } + var rebased = []; + + // Propagate to the linked documents + linkedDocs(doc, function (doc, sharedHist) { + if (!sharedHist && indexOf(rebased, doc.history) == -1) { + rebaseHist(doc.history, change); + rebased.push(doc.history); + } + makeChangeSingleDoc(doc, change, null, mergeOldSpans(doc, change)); + }); + }; + + for (var i$1 = event.changes.length - 1; i$1 >= 0; --i$1) { + var returned = loop( i$1 ); + + if ( returned ) return returned.v; + } +} + +// Sub-views need their line numbers shifted when text is added +// above or below them in the parent document. +function shiftDoc(doc, distance) { + if (distance == 0) { return } + doc.first += distance; + doc.sel = new Selection(map(doc.sel.ranges, function (range) { return new Range( + Pos(range.anchor.line + distance, range.anchor.ch), + Pos(range.head.line + distance, range.head.ch) + ); }), doc.sel.primIndex); + if (doc.cm) { + regChange(doc.cm, doc.first, doc.first - distance, distance); + for (var d = doc.cm.display, l = d.viewFrom; l < d.viewTo; l++) + { regLineChange(doc.cm, l, "gutter"); } + } +} + +// More lower-level change function, handling only a single document +// (not linked ones). +function makeChangeSingleDoc(doc, change, selAfter, spans) { + if (doc.cm && !doc.cm.curOp) + { return operation(doc.cm, makeChangeSingleDoc)(doc, change, selAfter, spans) } + + if (change.to.line < doc.first) { + shiftDoc(doc, change.text.length - 1 - (change.to.line - change.from.line)); + return + } + if (change.from.line > doc.lastLine()) { return } + + // Clip the change to the size of this doc + if (change.from.line < doc.first) { + var shift = change.text.length - 1 - (doc.first - change.from.line); + shiftDoc(doc, shift); + change = {from: Pos(doc.first, 0), to: Pos(change.to.line + shift, change.to.ch), + text: [lst(change.text)], origin: change.origin}; + } + var last = doc.lastLine(); + if (change.to.line > last) { + change = {from: change.from, to: Pos(last, getLine(doc, last).text.length), + text: [change.text[0]], origin: change.origin}; + } + + change.removed = getBetween(doc, change.from, change.to); + + if (!selAfter) { selAfter = computeSelAfterChange(doc, change); } + if (doc.cm) { makeChangeSingleDocInEditor(doc.cm, change, spans); } + else { updateDoc(doc, change, spans); } + setSelectionNoUndo(doc, selAfter, sel_dontScroll); +} + +// Handle the interaction of a change to a document with the editor +// that this document is part of. +function makeChangeSingleDocInEditor(cm, change, spans) { + var doc = cm.doc, display = cm.display, from = change.from, to = change.to; + + var recomputeMaxLength = false, checkWidthStart = from.line; + if (!cm.options.lineWrapping) { + checkWidthStart = lineNo(visualLine(getLine(doc, from.line))); + doc.iter(checkWidthStart, to.line + 1, function (line) { + if (line == display.maxLine) { + recomputeMaxLength = true; + return true + } + }); + } + + if (doc.sel.contains(change.from, change.to) > -1) + { signalCursorActivity(cm); } + + updateDoc(doc, change, spans, estimateHeight(cm)); + + if (!cm.options.lineWrapping) { + doc.iter(checkWidthStart, from.line + change.text.length, function (line) { + var len = lineLength(line); + if (len > display.maxLineLength) { + display.maxLine = line; + display.maxLineLength = len; + display.maxLineChanged = true; + recomputeMaxLength = false; + } + }); + if (recomputeMaxLength) { cm.curOp.updateMaxLine = true; } + } + + retreatFrontier(doc, from.line); + startWorker(cm, 400); + + var lendiff = change.text.length - (to.line - from.line) - 1; + // Remember that these lines changed, for updating the display + if (change.full) + { regChange(cm); } + else if (from.line == to.line && change.text.length == 1 && !isWholeLineUpdate(cm.doc, change)) + { regLineChange(cm, from.line, "text"); } + else + { regChange(cm, from.line, to.line + 1, lendiff); } + + var changesHandler = hasHandler(cm, "changes"), changeHandler = hasHandler(cm, "change"); + if (changeHandler || changesHandler) { + var obj = { + from: from, to: to, + text: change.text, + removed: change.removed, + origin: change.origin + }; + if (changeHandler) { signalLater(cm, "change", cm, obj); } + if (changesHandler) { (cm.curOp.changeObjs || (cm.curOp.changeObjs = [])).push(obj); } + } + cm.display.selForContextMenu = null; +} + +function replaceRange(doc, code, from, to, origin) { + if (!to) { to = from; } + if (cmp(to, from) < 0) { var tmp = to; to = from; from = tmp; } + if (typeof code == "string") { code = doc.splitLines(code); } + makeChange(doc, {from: from, to: to, text: code, origin: origin}); +} + +// Rebasing/resetting history to deal with externally-sourced changes + +function rebaseHistSelSingle(pos, from, to, diff) { + if (to < pos.line) { + pos.line += diff; + } else if (from < pos.line) { + pos.line = from; + pos.ch = 0; + } +} + +// Tries to rebase an array of history events given a change in the +// document. If the change touches the same lines as the event, the +// event, and everything 'behind' it, is discarded. If the change is +// before the event, the event's positions are updated. Uses a +// copy-on-write scheme for the positions, to avoid having to +// reallocate them all on every rebase, but also avoid problems with +// shared position objects being unsafely updated. +function rebaseHistArray(array, from, to, diff) { + for (var i = 0; i < array.length; ++i) { + var sub = array[i], ok = true; + if (sub.ranges) { + if (!sub.copied) { sub = array[i] = sub.deepCopy(); sub.copied = true; } + for (var j = 0; j < sub.ranges.length; j++) { + rebaseHistSelSingle(sub.ranges[j].anchor, from, to, diff); + rebaseHistSelSingle(sub.ranges[j].head, from, to, diff); + } + continue + } + for (var j$1 = 0; j$1 < sub.changes.length; ++j$1) { + var cur = sub.changes[j$1]; + if (to < cur.from.line) { + cur.from = Pos(cur.from.line + diff, cur.from.ch); + cur.to = Pos(cur.to.line + diff, cur.to.ch); + } else if (from <= cur.to.line) { + ok = false; + break + } + } + if (!ok) { + array.splice(0, i + 1); + i = 0; + } + } +} + +function rebaseHist(hist, change) { + var from = change.from.line, to = change.to.line, diff = change.text.length - (to - from) - 1; + rebaseHistArray(hist.done, from, to, diff); + rebaseHistArray(hist.undone, from, to, diff); +} + +// Utility for applying a change to a line by handle or number, +// returning the number and optionally registering the line as +// changed. +function changeLine(doc, handle, changeType, op) { + var no = handle, line = handle; + if (typeof handle == "number") { line = getLine(doc, clipLine(doc, handle)); } + else { no = lineNo(handle); } + if (no == null) { return null } + if (op(line, no) && doc.cm) { regLineChange(doc.cm, no, changeType); } + return line +} + +// The document is represented as a BTree consisting of leaves, with +// chunk of lines in them, and branches, with up to ten leaves or +// other branch nodes below them. The top node is always a branch +// node, and is the document object itself (meaning it has +// additional methods and properties). +// +// All nodes have parent links. The tree is used both to go from +// line numbers to line objects, and to go from objects to numbers. +// It also indexes by height, and is used to convert between height +// and line object, and to find the total height of the document. +// +// See also http://marijnhaverbeke.nl/blog/codemirror-line-tree.html + +function LeafChunk(lines) { + var this$1 = this; + + this.lines = lines; + this.parent = null; + var height = 0; + for (var i = 0; i < lines.length; ++i) { + lines[i].parent = this$1; + height += lines[i].height; + } + this.height = height; +} + +LeafChunk.prototype = { + chunkSize: function chunkSize() { return this.lines.length }, + + // Remove the n lines at offset 'at'. + removeInner: function removeInner(at, n) { + var this$1 = this; + + for (var i = at, e = at + n; i < e; ++i) { + var line = this$1.lines[i]; + this$1.height -= line.height; + cleanUpLine(line); + signalLater(line, "delete"); + } + this.lines.splice(at, n); + }, + + // Helper used to collapse a small branch into a single leaf. + collapse: function collapse(lines) { + lines.push.apply(lines, this.lines); + }, + + // Insert the given array of lines at offset 'at', count them as + // having the given height. + insertInner: function insertInner(at, lines, height) { + var this$1 = this; + + this.height += height; + this.lines = this.lines.slice(0, at).concat(lines).concat(this.lines.slice(at)); + for (var i = 0; i < lines.length; ++i) { lines[i].parent = this$1; } + }, + + // Used to iterate over a part of the tree. + iterN: function iterN(at, n, op) { + var this$1 = this; + + for (var e = at + n; at < e; ++at) + { if (op(this$1.lines[at])) { return true } } + } +}; + +function BranchChunk(children) { + var this$1 = this; + + this.children = children; + var size = 0, height = 0; + for (var i = 0; i < children.length; ++i) { + var ch = children[i]; + size += ch.chunkSize(); height += ch.height; + ch.parent = this$1; + } + this.size = size; + this.height = height; + this.parent = null; +} + +BranchChunk.prototype = { + chunkSize: function chunkSize() { return this.size }, + + removeInner: function removeInner(at, n) { + var this$1 = this; + + this.size -= n; + for (var i = 0; i < this.children.length; ++i) { + var child = this$1.children[i], sz = child.chunkSize(); + if (at < sz) { + var rm = Math.min(n, sz - at), oldHeight = child.height; + child.removeInner(at, rm); + this$1.height -= oldHeight - child.height; + if (sz == rm) { this$1.children.splice(i--, 1); child.parent = null; } + if ((n -= rm) == 0) { break } + at = 0; + } else { at -= sz; } + } + // If the result is smaller than 25 lines, ensure that it is a + // single leaf node. + if (this.size - n < 25 && + (this.children.length > 1 || !(this.children[0] instanceof LeafChunk))) { + var lines = []; + this.collapse(lines); + this.children = [new LeafChunk(lines)]; + this.children[0].parent = this; + } + }, + + collapse: function collapse(lines) { + var this$1 = this; + + for (var i = 0; i < this.children.length; ++i) { this$1.children[i].collapse(lines); } + }, + + insertInner: function insertInner(at, lines, height) { + var this$1 = this; + + this.size += lines.length; + this.height += height; + for (var i = 0; i < this.children.length; ++i) { + var child = this$1.children[i], sz = child.chunkSize(); + if (at <= sz) { + child.insertInner(at, lines, height); + if (child.lines && child.lines.length > 50) { + // To avoid memory thrashing when child.lines is huge (e.g. first view of a large file), it's never spliced. + // Instead, small slices are taken. They're taken in order because sequential memory accesses are fastest. + var remaining = child.lines.length % 25 + 25; + for (var pos = remaining; pos < child.lines.length;) { + var leaf = new LeafChunk(child.lines.slice(pos, pos += 25)); + child.height -= leaf.height; + this$1.children.splice(++i, 0, leaf); + leaf.parent = this$1; + } + child.lines = child.lines.slice(0, remaining); + this$1.maybeSpill(); + } + break + } + at -= sz; + } + }, + + // When a node has grown, check whether it should be split. + maybeSpill: function maybeSpill() { + if (this.children.length <= 10) { return } + var me = this; + do { + var spilled = me.children.splice(me.children.length - 5, 5); + var sibling = new BranchChunk(spilled); + if (!me.parent) { // Become the parent node + var copy = new BranchChunk(me.children); + copy.parent = me; + me.children = [copy, sibling]; + me = copy; + } else { + me.size -= sibling.size; + me.height -= sibling.height; + var myIndex = indexOf(me.parent.children, me); + me.parent.children.splice(myIndex + 1, 0, sibling); + } + sibling.parent = me.parent; + } while (me.children.length > 10) + me.parent.maybeSpill(); + }, + + iterN: function iterN(at, n, op) { + var this$1 = this; + + for (var i = 0; i < this.children.length; ++i) { + var child = this$1.children[i], sz = child.chunkSize(); + if (at < sz) { + var used = Math.min(n, sz - at); + if (child.iterN(at, used, op)) { return true } + if ((n -= used) == 0) { break } + at = 0; + } else { at -= sz; } + } + } +}; + +// Line widgets are block elements displayed above or below a line. + +var LineWidget = function(doc, node, options) { + var this$1 = this; + + if (options) { for (var opt in options) { if (options.hasOwnProperty(opt)) + { this$1[opt] = options[opt]; } } } + this.doc = doc; + this.node = node; +}; + +LineWidget.prototype.clear = function () { + var this$1 = this; + + var cm = this.doc.cm, ws = this.line.widgets, line = this.line, no = lineNo(line); + if (no == null || !ws) { return } + for (var i = 0; i < ws.length; ++i) { if (ws[i] == this$1) { ws.splice(i--, 1); } } + if (!ws.length) { line.widgets = null; } + var height = widgetHeight(this); + updateLineHeight(line, Math.max(0, line.height - height)); + if (cm) { + runInOp(cm, function () { + adjustScrollWhenAboveVisible(cm, line, -height); + regLineChange(cm, no, "widget"); + }); + signalLater(cm, "lineWidgetCleared", cm, this, no); + } +}; + +LineWidget.prototype.changed = function () { + var this$1 = this; + + var oldH = this.height, cm = this.doc.cm, line = this.line; + this.height = null; + var diff = widgetHeight(this) - oldH; + if (!diff) { return } + updateLineHeight(line, line.height + diff); + if (cm) { + runInOp(cm, function () { + cm.curOp.forceUpdate = true; + adjustScrollWhenAboveVisible(cm, line, diff); + signalLater(cm, "lineWidgetChanged", cm, this$1, lineNo(line)); + }); + } +}; +eventMixin(LineWidget); + +function adjustScrollWhenAboveVisible(cm, line, diff) { + if (heightAtLine(line) < ((cm.curOp && cm.curOp.scrollTop) || cm.doc.scrollTop)) + { addToScrollTop(cm, diff); } +} + +function addLineWidget(doc, handle, node, options) { + var widget = new LineWidget(doc, node, options); + var cm = doc.cm; + if (cm && widget.noHScroll) { cm.display.alignWidgets = true; } + changeLine(doc, handle, "widget", function (line) { + var widgets = line.widgets || (line.widgets = []); + if (widget.insertAt == null) { widgets.push(widget); } + else { widgets.splice(Math.min(widgets.length - 1, Math.max(0, widget.insertAt)), 0, widget); } + widget.line = line; + if (cm && !lineIsHidden(doc, line)) { + var aboveVisible = heightAtLine(line) < doc.scrollTop; + updateLineHeight(line, line.height + widgetHeight(widget)); + if (aboveVisible) { addToScrollTop(cm, widget.height); } + cm.curOp.forceUpdate = true; + } + return true + }); + signalLater(cm, "lineWidgetAdded", cm, widget, typeof handle == "number" ? handle : lineNo(handle)); + return widget +} + +// TEXTMARKERS + +// Created with markText and setBookmark methods. A TextMarker is a +// handle that can be used to clear or find a marked position in the +// document. Line objects hold arrays (markedSpans) containing +// {from, to, marker} object pointing to such marker objects, and +// indicating that such a marker is present on that line. Multiple +// lines may point to the same marker when it spans across lines. +// The spans will have null for their from/to properties when the +// marker continues beyond the start/end of the line. Markers have +// links back to the lines they currently touch. + +// Collapsed markers have unique ids, in order to be able to order +// them, which is needed for uniquely determining an outer marker +// when they overlap (they may nest, but not partially overlap). +var nextMarkerId = 0; + +var TextMarker = function(doc, type) { + this.lines = []; + this.type = type; + this.doc = doc; + this.id = ++nextMarkerId; +}; + +// Clear the marker. +TextMarker.prototype.clear = function () { + var this$1 = this; + + if (this.explicitlyCleared) { return } + var cm = this.doc.cm, withOp = cm && !cm.curOp; + if (withOp) { startOperation(cm); } + if (hasHandler(this, "clear")) { + var found = this.find(); + if (found) { signalLater(this, "clear", found.from, found.to); } + } + var min = null, max = null; + for (var i = 0; i < this.lines.length; ++i) { + var line = this$1.lines[i]; + var span = getMarkedSpanFor(line.markedSpans, this$1); + if (cm && !this$1.collapsed) { regLineChange(cm, lineNo(line), "text"); } + else if (cm) { + if (span.to != null) { max = lineNo(line); } + if (span.from != null) { min = lineNo(line); } + } + line.markedSpans = removeMarkedSpan(line.markedSpans, span); + if (span.from == null && this$1.collapsed && !lineIsHidden(this$1.doc, line) && cm) + { updateLineHeight(line, textHeight(cm.display)); } + } + if (cm && this.collapsed && !cm.options.lineWrapping) { for (var i$1 = 0; i$1 < this.lines.length; ++i$1) { + var visual = visualLine(this$1.lines[i$1]), len = lineLength(visual); + if (len > cm.display.maxLineLength) { + cm.display.maxLine = visual; + cm.display.maxLineLength = len; + cm.display.maxLineChanged = true; + } + } } + + if (min != null && cm && this.collapsed) { regChange(cm, min, max + 1); } + this.lines.length = 0; + this.explicitlyCleared = true; + if (this.atomic && this.doc.cantEdit) { + this.doc.cantEdit = false; + if (cm) { reCheckSelection(cm.doc); } + } + if (cm) { signalLater(cm, "markerCleared", cm, this, min, max); } + if (withOp) { endOperation(cm); } + if (this.parent) { this.parent.clear(); } +}; + +// Find the position of the marker in the document. Returns a {from, +// to} object by default. Side can be passed to get a specific side +// -- 0 (both), -1 (left), or 1 (right). When lineObj is true, the +// Pos objects returned contain a line object, rather than a line +// number (used to prevent looking up the same line twice). +TextMarker.prototype.find = function (side, lineObj) { + var this$1 = this; + + if (side == null && this.type == "bookmark") { side = 1; } + var from, to; + for (var i = 0; i < this.lines.length; ++i) { + var line = this$1.lines[i]; + var span = getMarkedSpanFor(line.markedSpans, this$1); + if (span.from != null) { + from = Pos(lineObj ? line : lineNo(line), span.from); + if (side == -1) { return from } + } + if (span.to != null) { + to = Pos(lineObj ? line : lineNo(line), span.to); + if (side == 1) { return to } + } + } + return from && {from: from, to: to} +}; + +// Signals that the marker's widget changed, and surrounding layout +// should be recomputed. +TextMarker.prototype.changed = function () { + var this$1 = this; + + var pos = this.find(-1, true), widget = this, cm = this.doc.cm; + if (!pos || !cm) { return } + runInOp(cm, function () { + var line = pos.line, lineN = lineNo(pos.line); + var view = findViewForLine(cm, lineN); + if (view) { + clearLineMeasurementCacheFor(view); + cm.curOp.selectionChanged = cm.curOp.forceUpdate = true; + } + cm.curOp.updateMaxLine = true; + if (!lineIsHidden(widget.doc, line) && widget.height != null) { + var oldHeight = widget.height; + widget.height = null; + var dHeight = widgetHeight(widget) - oldHeight; + if (dHeight) + { updateLineHeight(line, line.height + dHeight); } + } + signalLater(cm, "markerChanged", cm, this$1); + }); +}; + +TextMarker.prototype.attachLine = function (line) { + if (!this.lines.length && this.doc.cm) { + var op = this.doc.cm.curOp; + if (!op.maybeHiddenMarkers || indexOf(op.maybeHiddenMarkers, this) == -1) + { (op.maybeUnhiddenMarkers || (op.maybeUnhiddenMarkers = [])).push(this); } + } + this.lines.push(line); +}; + +TextMarker.prototype.detachLine = function (line) { + this.lines.splice(indexOf(this.lines, line), 1); + if (!this.lines.length && this.doc.cm) { + var op = this.doc.cm.curOp;(op.maybeHiddenMarkers || (op.maybeHiddenMarkers = [])).push(this); + } +}; +eventMixin(TextMarker); + +// Create a marker, wire it up to the right lines, and +function markText(doc, from, to, options, type) { + // Shared markers (across linked documents) are handled separately + // (markTextShared will call out to this again, once per + // document). + if (options && options.shared) { return markTextShared(doc, from, to, options, type) } + // Ensure we are in an operation. + if (doc.cm && !doc.cm.curOp) { return operation(doc.cm, markText)(doc, from, to, options, type) } + + var marker = new TextMarker(doc, type), diff = cmp(from, to); + if (options) { copyObj(options, marker, false); } + // Don't connect empty markers unless clearWhenEmpty is false + if (diff > 0 || diff == 0 && marker.clearWhenEmpty !== false) + { return marker } + if (marker.replacedWith) { + // Showing up as a widget implies collapsed (widget replaces text) + marker.collapsed = true; + marker.widgetNode = eltP("span", [marker.replacedWith], "CodeMirror-widget"); + if (!options.handleMouseEvents) { marker.widgetNode.setAttribute("cm-ignore-events", "true"); } + if (options.insertLeft) { marker.widgetNode.insertLeft = true; } + } + if (marker.collapsed) { + if (conflictingCollapsedRange(doc, from.line, from, to, marker) || + from.line != to.line && conflictingCollapsedRange(doc, to.line, from, to, marker)) + { throw new Error("Inserting collapsed marker partially overlapping an existing one") } + seeCollapsedSpans(); + } + + if (marker.addToHistory) + { addChangeToHistory(doc, {from: from, to: to, origin: "markText"}, doc.sel, NaN); } + + var curLine = from.line, cm = doc.cm, updateMaxLine; + doc.iter(curLine, to.line + 1, function (line) { + if (cm && marker.collapsed && !cm.options.lineWrapping && visualLine(line) == cm.display.maxLine) + { updateMaxLine = true; } + if (marker.collapsed && curLine != from.line) { updateLineHeight(line, 0); } + addMarkedSpan(line, new MarkedSpan(marker, + curLine == from.line ? from.ch : null, + curLine == to.line ? to.ch : null)); + ++curLine; + }); + // lineIsHidden depends on the presence of the spans, so needs a second pass + if (marker.collapsed) { doc.iter(from.line, to.line + 1, function (line) { + if (lineIsHidden(doc, line)) { updateLineHeight(line, 0); } + }); } + + if (marker.clearOnEnter) { on(marker, "beforeCursorEnter", function () { return marker.clear(); }); } + + if (marker.readOnly) { + seeReadOnlySpans(); + if (doc.history.done.length || doc.history.undone.length) + { doc.clearHistory(); } + } + if (marker.collapsed) { + marker.id = ++nextMarkerId; + marker.atomic = true; + } + if (cm) { + // Sync editor state + if (updateMaxLine) { cm.curOp.updateMaxLine = true; } + if (marker.collapsed) + { regChange(cm, from.line, to.line + 1); } + else if (marker.className || marker.title || marker.startStyle || marker.endStyle || marker.css) + { for (var i = from.line; i <= to.line; i++) { regLineChange(cm, i, "text"); } } + if (marker.atomic) { reCheckSelection(cm.doc); } + signalLater(cm, "markerAdded", cm, marker); + } + return marker +} + +// SHARED TEXTMARKERS + +// A shared marker spans multiple linked documents. It is +// implemented as a meta-marker-object controlling multiple normal +// markers. +var SharedTextMarker = function(markers, primary) { + var this$1 = this; + + this.markers = markers; + this.primary = primary; + for (var i = 0; i < markers.length; ++i) + { markers[i].parent = this$1; } +}; + +SharedTextMarker.prototype.clear = function () { + var this$1 = this; + + if (this.explicitlyCleared) { return } + this.explicitlyCleared = true; + for (var i = 0; i < this.markers.length; ++i) + { this$1.markers[i].clear(); } + signalLater(this, "clear"); +}; + +SharedTextMarker.prototype.find = function (side, lineObj) { + return this.primary.find(side, lineObj) +}; +eventMixin(SharedTextMarker); + +function markTextShared(doc, from, to, options, type) { + options = copyObj(options); + options.shared = false; + var markers = [markText(doc, from, to, options, type)], primary = markers[0]; + var widget = options.widgetNode; + linkedDocs(doc, function (doc) { + if (widget) { options.widgetNode = widget.cloneNode(true); } + markers.push(markText(doc, clipPos(doc, from), clipPos(doc, to), options, type)); + for (var i = 0; i < doc.linked.length; ++i) + { if (doc.linked[i].isParent) { return } } + primary = lst(markers); + }); + return new SharedTextMarker(markers, primary) +} + +function findSharedMarkers(doc) { + return doc.findMarks(Pos(doc.first, 0), doc.clipPos(Pos(doc.lastLine())), function (m) { return m.parent; }) +} + +function copySharedMarkers(doc, markers) { + for (var i = 0; i < markers.length; i++) { + var marker = markers[i], pos = marker.find(); + var mFrom = doc.clipPos(pos.from), mTo = doc.clipPos(pos.to); + if (cmp(mFrom, mTo)) { + var subMark = markText(doc, mFrom, mTo, marker.primary, marker.primary.type); + marker.markers.push(subMark); + subMark.parent = marker; + } + } +} + +function detachSharedMarkers(markers) { + var loop = function ( i ) { + var marker = markers[i], linked = [marker.primary.doc]; + linkedDocs(marker.primary.doc, function (d) { return linked.push(d); }); + for (var j = 0; j < marker.markers.length; j++) { + var subMarker = marker.markers[j]; + if (indexOf(linked, subMarker.doc) == -1) { + subMarker.parent = null; + marker.markers.splice(j--, 1); + } + } + }; + + for (var i = 0; i < markers.length; i++) loop( i ); +} + +var nextDocId = 0; +var Doc = function(text, mode, firstLine, lineSep, direction) { + if (!(this instanceof Doc)) { return new Doc(text, mode, firstLine, lineSep, direction) } + if (firstLine == null) { firstLine = 0; } + + BranchChunk.call(this, [new LeafChunk([new Line("", null)])]); + this.first = firstLine; + this.scrollTop = this.scrollLeft = 0; + this.cantEdit = false; + this.cleanGeneration = 1; + this.modeFrontier = this.highlightFrontier = firstLine; + var start = Pos(firstLine, 0); + this.sel = simpleSelection(start); + this.history = new History(null); + this.id = ++nextDocId; + this.modeOption = mode; + this.lineSep = lineSep; + this.direction = (direction == "rtl") ? "rtl" : "ltr"; + this.extend = false; + + if (typeof text == "string") { text = this.splitLines(text); } + updateDoc(this, {from: start, to: start, text: text}); + setSelection(this, simpleSelection(start), sel_dontScroll); +}; + +Doc.prototype = createObj(BranchChunk.prototype, { + constructor: Doc, + // Iterate over the document. Supports two forms -- with only one + // argument, it calls that for each line in the document. With + // three, it iterates over the range given by the first two (with + // the second being non-inclusive). + iter: function(from, to, op) { + if (op) { this.iterN(from - this.first, to - from, op); } + else { this.iterN(this.first, this.first + this.size, from); } + }, + + // Non-public interface for adding and removing lines. + insert: function(at, lines) { + var height = 0; + for (var i = 0; i < lines.length; ++i) { height += lines[i].height; } + this.insertInner(at - this.first, lines, height); + }, + remove: function(at, n) { this.removeInner(at - this.first, n); }, + + // From here, the methods are part of the public interface. Most + // are also available from CodeMirror (editor) instances. + + getValue: function(lineSep) { + var lines = getLines(this, this.first, this.first + this.size); + if (lineSep === false) { return lines } + return lines.join(lineSep || this.lineSeparator()) + }, + setValue: docMethodOp(function(code) { + var top = Pos(this.first, 0), last = this.first + this.size - 1; + makeChange(this, {from: top, to: Pos(last, getLine(this, last).text.length), + text: this.splitLines(code), origin: "setValue", full: true}, true); + if (this.cm) { scrollToCoords(this.cm, 0, 0); } + setSelection(this, simpleSelection(top), sel_dontScroll); + }), + replaceRange: function(code, from, to, origin) { + from = clipPos(this, from); + to = to ? clipPos(this, to) : from; + replaceRange(this, code, from, to, origin); + }, + getRange: function(from, to, lineSep) { + var lines = getBetween(this, clipPos(this, from), clipPos(this, to)); + if (lineSep === false) { return lines } + return lines.join(lineSep || this.lineSeparator()) + }, + + getLine: function(line) {var l = this.getLineHandle(line); return l && l.text}, + + getLineHandle: function(line) {if (isLine(this, line)) { return getLine(this, line) }}, + getLineNumber: function(line) {return lineNo(line)}, + + getLineHandleVisualStart: function(line) { + if (typeof line == "number") { line = getLine(this, line); } + return visualLine(line) + }, + + lineCount: function() {return this.size}, + firstLine: function() {return this.first}, + lastLine: function() {return this.first + this.size - 1}, + + clipPos: function(pos) {return clipPos(this, pos)}, + + getCursor: function(start) { + var range$$1 = this.sel.primary(), pos; + if (start == null || start == "head") { pos = range$$1.head; } + else if (start == "anchor") { pos = range$$1.anchor; } + else if (start == "end" || start == "to" || start === false) { pos = range$$1.to(); } + else { pos = range$$1.from(); } + return pos + }, + listSelections: function() { return this.sel.ranges }, + somethingSelected: function() {return this.sel.somethingSelected()}, + + setCursor: docMethodOp(function(line, ch, options) { + setSimpleSelection(this, clipPos(this, typeof line == "number" ? Pos(line, ch || 0) : line), null, options); + }), + setSelection: docMethodOp(function(anchor, head, options) { + setSimpleSelection(this, clipPos(this, anchor), clipPos(this, head || anchor), options); + }), + extendSelection: docMethodOp(function(head, other, options) { + extendSelection(this, clipPos(this, head), other && clipPos(this, other), options); + }), + extendSelections: docMethodOp(function(heads, options) { + extendSelections(this, clipPosArray(this, heads), options); + }), + extendSelectionsBy: docMethodOp(function(f, options) { + var heads = map(this.sel.ranges, f); + extendSelections(this, clipPosArray(this, heads), options); + }), + setSelections: docMethodOp(function(ranges, primary, options) { + var this$1 = this; + + if (!ranges.length) { return } + var out = []; + for (var i = 0; i < ranges.length; i++) + { out[i] = new Range(clipPos(this$1, ranges[i].anchor), + clipPos(this$1, ranges[i].head)); } + if (primary == null) { primary = Math.min(ranges.length - 1, this.sel.primIndex); } + setSelection(this, normalizeSelection(out, primary), options); + }), + addSelection: docMethodOp(function(anchor, head, options) { + var ranges = this.sel.ranges.slice(0); + ranges.push(new Range(clipPos(this, anchor), clipPos(this, head || anchor))); + setSelection(this, normalizeSelection(ranges, ranges.length - 1), options); + }), + + getSelection: function(lineSep) { + var this$1 = this; + + var ranges = this.sel.ranges, lines; + for (var i = 0; i < ranges.length; i++) { + var sel = getBetween(this$1, ranges[i].from(), ranges[i].to()); + lines = lines ? lines.concat(sel) : sel; + } + if (lineSep === false) { return lines } + else { return lines.join(lineSep || this.lineSeparator()) } + }, + getSelections: function(lineSep) { + var this$1 = this; + + var parts = [], ranges = this.sel.ranges; + for (var i = 0; i < ranges.length; i++) { + var sel = getBetween(this$1, ranges[i].from(), ranges[i].to()); + if (lineSep !== false) { sel = sel.join(lineSep || this$1.lineSeparator()); } + parts[i] = sel; + } + return parts + }, + replaceSelection: function(code, collapse, origin) { + var dup = []; + for (var i = 0; i < this.sel.ranges.length; i++) + { dup[i] = code; } + this.replaceSelections(dup, collapse, origin || "+input"); + }, + replaceSelections: docMethodOp(function(code, collapse, origin) { + var this$1 = this; + + var changes = [], sel = this.sel; + for (var i = 0; i < sel.ranges.length; i++) { + var range$$1 = sel.ranges[i]; + changes[i] = {from: range$$1.from(), to: range$$1.to(), text: this$1.splitLines(code[i]), origin: origin}; + } + var newSel = collapse && collapse != "end" && computeReplacedSel(this, changes, collapse); + for (var i$1 = changes.length - 1; i$1 >= 0; i$1--) + { makeChange(this$1, changes[i$1]); } + if (newSel) { setSelectionReplaceHistory(this, newSel); } + else if (this.cm) { ensureCursorVisible(this.cm); } + }), + undo: docMethodOp(function() {makeChangeFromHistory(this, "undo");}), + redo: docMethodOp(function() {makeChangeFromHistory(this, "redo");}), + undoSelection: docMethodOp(function() {makeChangeFromHistory(this, "undo", true);}), + redoSelection: docMethodOp(function() {makeChangeFromHistory(this, "redo", true);}), + + setExtending: function(val) {this.extend = val;}, + getExtending: function() {return this.extend}, + + historySize: function() { + var hist = this.history, done = 0, undone = 0; + for (var i = 0; i < hist.done.length; i++) { if (!hist.done[i].ranges) { ++done; } } + for (var i$1 = 0; i$1 < hist.undone.length; i$1++) { if (!hist.undone[i$1].ranges) { ++undone; } } + return {undo: done, redo: undone} + }, + clearHistory: function() {this.history = new History(this.history.maxGeneration);}, + + markClean: function() { + this.cleanGeneration = this.changeGeneration(true); + }, + changeGeneration: function(forceSplit) { + if (forceSplit) + { this.history.lastOp = this.history.lastSelOp = this.history.lastOrigin = null; } + return this.history.generation + }, + isClean: function (gen) { + return this.history.generation == (gen || this.cleanGeneration) + }, + + getHistory: function() { + return {done: copyHistoryArray(this.history.done), + undone: copyHistoryArray(this.history.undone)} + }, + setHistory: function(histData) { + var hist = this.history = new History(this.history.maxGeneration); + hist.done = copyHistoryArray(histData.done.slice(0), null, true); + hist.undone = copyHistoryArray(histData.undone.slice(0), null, true); + }, + + setGutterMarker: docMethodOp(function(line, gutterID, value) { + return changeLine(this, line, "gutter", function (line) { + var markers = line.gutterMarkers || (line.gutterMarkers = {}); + markers[gutterID] = value; + if (!value && isEmpty(markers)) { line.gutterMarkers = null; } + return true + }) + }), + + clearGutter: docMethodOp(function(gutterID) { + var this$1 = this; + + this.iter(function (line) { + if (line.gutterMarkers && line.gutterMarkers[gutterID]) { + changeLine(this$1, line, "gutter", function () { + line.gutterMarkers[gutterID] = null; + if (isEmpty(line.gutterMarkers)) { line.gutterMarkers = null; } + return true + }); + } + }); + }), + + lineInfo: function(line) { + var n; + if (typeof line == "number") { + if (!isLine(this, line)) { return null } + n = line; + line = getLine(this, line); + if (!line) { return null } + } else { + n = lineNo(line); + if (n == null) { return null } + } + return {line: n, handle: line, text: line.text, gutterMarkers: line.gutterMarkers, + textClass: line.textClass, bgClass: line.bgClass, wrapClass: line.wrapClass, + widgets: line.widgets} + }, + + addLineClass: docMethodOp(function(handle, where, cls) { + return changeLine(this, handle, where == "gutter" ? "gutter" : "class", function (line) { + var prop = where == "text" ? "textClass" + : where == "background" ? "bgClass" + : where == "gutter" ? "gutterClass" : "wrapClass"; + if (!line[prop]) { line[prop] = cls; } + else if (classTest(cls).test(line[prop])) { return false } + else { line[prop] += " " + cls; } + return true + }) + }), + removeLineClass: docMethodOp(function(handle, where, cls) { + return changeLine(this, handle, where == "gutter" ? "gutter" : "class", function (line) { + var prop = where == "text" ? "textClass" + : where == "background" ? "bgClass" + : where == "gutter" ? "gutterClass" : "wrapClass"; + var cur = line[prop]; + if (!cur) { return false } + else if (cls == null) { line[prop] = null; } + else { + var found = cur.match(classTest(cls)); + if (!found) { return false } + var end = found.index + found[0].length; + line[prop] = cur.slice(0, found.index) + (!found.index || end == cur.length ? "" : " ") + cur.slice(end) || null; + } + return true + }) + }), + + addLineWidget: docMethodOp(function(handle, node, options) { + return addLineWidget(this, handle, node, options) + }), + removeLineWidget: function(widget) { widget.clear(); }, + + markText: function(from, to, options) { + return markText(this, clipPos(this, from), clipPos(this, to), options, options && options.type || "range") + }, + setBookmark: function(pos, options) { + var realOpts = {replacedWith: options && (options.nodeType == null ? options.widget : options), + insertLeft: options && options.insertLeft, + clearWhenEmpty: false, shared: options && options.shared, + handleMouseEvents: options && options.handleMouseEvents}; + pos = clipPos(this, pos); + return markText(this, pos, pos, realOpts, "bookmark") + }, + findMarksAt: function(pos) { + pos = clipPos(this, pos); + var markers = [], spans = getLine(this, pos.line).markedSpans; + if (spans) { for (var i = 0; i < spans.length; ++i) { + var span = spans[i]; + if ((span.from == null || span.from <= pos.ch) && + (span.to == null || span.to >= pos.ch)) + { markers.push(span.marker.parent || span.marker); } + } } + return markers + }, + findMarks: function(from, to, filter) { + from = clipPos(this, from); to = clipPos(this, to); + var found = [], lineNo$$1 = from.line; + this.iter(from.line, to.line + 1, function (line) { + var spans = line.markedSpans; + if (spans) { for (var i = 0; i < spans.length; i++) { + var span = spans[i]; + if (!(span.to != null && lineNo$$1 == from.line && from.ch >= span.to || + span.from == null && lineNo$$1 != from.line || + span.from != null && lineNo$$1 == to.line && span.from >= to.ch) && + (!filter || filter(span.marker))) + { found.push(span.marker.parent || span.marker); } + } } + ++lineNo$$1; + }); + return found + }, + getAllMarks: function() { + var markers = []; + this.iter(function (line) { + var sps = line.markedSpans; + if (sps) { for (var i = 0; i < sps.length; ++i) + { if (sps[i].from != null) { markers.push(sps[i].marker); } } } + }); + return markers + }, + + posFromIndex: function(off) { + var ch, lineNo$$1 = this.first, sepSize = this.lineSeparator().length; + this.iter(function (line) { + var sz = line.text.length + sepSize; + if (sz > off) { ch = off; return true } + off -= sz; + ++lineNo$$1; + }); + return clipPos(this, Pos(lineNo$$1, ch)) + }, + indexFromPos: function (coords) { + coords = clipPos(this, coords); + var index = coords.ch; + if (coords.line < this.first || coords.ch < 0) { return 0 } + var sepSize = this.lineSeparator().length; + this.iter(this.first, coords.line, function (line) { // iter aborts when callback returns a truthy value + index += line.text.length + sepSize; + }); + return index + }, + + copy: function(copyHistory) { + var doc = new Doc(getLines(this, this.first, this.first + this.size), + this.modeOption, this.first, this.lineSep, this.direction); + doc.scrollTop = this.scrollTop; doc.scrollLeft = this.scrollLeft; + doc.sel = this.sel; + doc.extend = false; + if (copyHistory) { + doc.history.undoDepth = this.history.undoDepth; + doc.setHistory(this.getHistory()); + } + return doc + }, + + linkedDoc: function(options) { + if (!options) { options = {}; } + var from = this.first, to = this.first + this.size; + if (options.from != null && options.from > from) { from = options.from; } + if (options.to != null && options.to < to) { to = options.to; } + var copy = new Doc(getLines(this, from, to), options.mode || this.modeOption, from, this.lineSep, this.direction); + if (options.sharedHist) { copy.history = this.history + ; }(this.linked || (this.linked = [])).push({doc: copy, sharedHist: options.sharedHist}); + copy.linked = [{doc: this, isParent: true, sharedHist: options.sharedHist}]; + copySharedMarkers(copy, findSharedMarkers(this)); + return copy + }, + unlinkDoc: function(other) { + var this$1 = this; + + if (other instanceof CodeMirror$1) { other = other.doc; } + if (this.linked) { for (var i = 0; i < this.linked.length; ++i) { + var link = this$1.linked[i]; + if (link.doc != other) { continue } + this$1.linked.splice(i, 1); + other.unlinkDoc(this$1); + detachSharedMarkers(findSharedMarkers(this$1)); + break + } } + // If the histories were shared, split them again + if (other.history == this.history) { + var splitIds = [other.id]; + linkedDocs(other, function (doc) { return splitIds.push(doc.id); }, true); + other.history = new History(null); + other.history.done = copyHistoryArray(this.history.done, splitIds); + other.history.undone = copyHistoryArray(this.history.undone, splitIds); + } + }, + iterLinkedDocs: function(f) {linkedDocs(this, f);}, + + getMode: function() {return this.mode}, + getEditor: function() {return this.cm}, + + splitLines: function(str) { + if (this.lineSep) { return str.split(this.lineSep) } + return splitLinesAuto(str) + }, + lineSeparator: function() { return this.lineSep || "\n" }, + + setDirection: docMethodOp(function (dir) { + if (dir != "rtl") { dir = "ltr"; } + if (dir == this.direction) { return } + this.direction = dir; + this.iter(function (line) { return line.order = null; }); + if (this.cm) { directionChanged(this.cm); } + }) +}); + +// Public alias. +Doc.prototype.eachLine = Doc.prototype.iter; + +// Kludge to work around strange IE behavior where it'll sometimes +// re-fire a series of drag-related events right after the drop (#1551) +var lastDrop = 0; + +function onDrop(e) { + var cm = this; + clearDragCursor(cm); + if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) + { return } + e_preventDefault(e); + if (ie) { lastDrop = +new Date; } + var pos = posFromMouse(cm, e, true), files = e.dataTransfer.files; + if (!pos || cm.isReadOnly()) { return } + // Might be a file drop, in which case we simply extract the text + // and insert it. + if (files && files.length && window.FileReader && window.File) { + var n = files.length, text = Array(n), read = 0; + var loadFile = function (file, i) { + if (cm.options.allowDropFileTypes && + indexOf(cm.options.allowDropFileTypes, file.type) == -1) + { return } + + var reader = new FileReader; + reader.onload = operation(cm, function () { + var content = reader.result; + if (/[\x00-\x08\x0e-\x1f]{2}/.test(content)) { content = ""; } + text[i] = content; + if (++read == n) { + pos = clipPos(cm.doc, pos); + var change = {from: pos, to: pos, + text: cm.doc.splitLines(text.join(cm.doc.lineSeparator())), + origin: "paste"}; + makeChange(cm.doc, change); + setSelectionReplaceHistory(cm.doc, simpleSelection(pos, changeEnd(change))); + } + }); + reader.readAsText(file); + }; + for (var i = 0; i < n; ++i) { loadFile(files[i], i); } + } else { // Normal drop + // Don't do a replace if the drop happened inside of the selected text. + if (cm.state.draggingText && cm.doc.sel.contains(pos) > -1) { + cm.state.draggingText(e); + // Ensure the editor is re-focused + setTimeout(function () { return cm.display.input.focus(); }, 20); + return + } + try { + var text$1 = e.dataTransfer.getData("Text"); + if (text$1) { + var selected; + if (cm.state.draggingText && !cm.state.draggingText.copy) + { selected = cm.listSelections(); } + setSelectionNoUndo(cm.doc, simpleSelection(pos, pos)); + if (selected) { for (var i$1 = 0; i$1 < selected.length; ++i$1) + { replaceRange(cm.doc, "", selected[i$1].anchor, selected[i$1].head, "drag"); } } + cm.replaceSelection(text$1, "around", "paste"); + cm.display.input.focus(); + } + } + catch(e){} + } +} + +function onDragStart(cm, e) { + if (ie && (!cm.state.draggingText || +new Date - lastDrop < 100)) { e_stop(e); return } + if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) { return } + + e.dataTransfer.setData("Text", cm.getSelection()); + e.dataTransfer.effectAllowed = "copyMove"; + + // Use dummy image instead of default browsers image. + // Recent Safari (~6.0.2) have a tendency to segfault when this happens, so we don't do it there. + if (e.dataTransfer.setDragImage && !safari) { + var img = elt("img", null, null, "position: fixed; left: 0; top: 0;"); + img.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="; + if (presto) { + img.width = img.height = 1; + cm.display.wrapper.appendChild(img); + // Force a relayout, or Opera won't use our image for some obscure reason + img._top = img.offsetTop; + } + e.dataTransfer.setDragImage(img, 0, 0); + if (presto) { img.parentNode.removeChild(img); } + } +} + +function onDragOver(cm, e) { + var pos = posFromMouse(cm, e); + if (!pos) { return } + var frag = document.createDocumentFragment(); + drawSelectionCursor(cm, pos, frag); + if (!cm.display.dragCursor) { + cm.display.dragCursor = elt("div", null, "CodeMirror-cursors CodeMirror-dragcursors"); + cm.display.lineSpace.insertBefore(cm.display.dragCursor, cm.display.cursorDiv); + } + removeChildrenAndAdd(cm.display.dragCursor, frag); +} + +function clearDragCursor(cm) { + if (cm.display.dragCursor) { + cm.display.lineSpace.removeChild(cm.display.dragCursor); + cm.display.dragCursor = null; + } +} + +// These must be handled carefully, because naively registering a +// handler for each editor will cause the editors to never be +// garbage collected. + +function forEachCodeMirror(f) { + if (!document.getElementsByClassName) { return } + var byClass = document.getElementsByClassName("CodeMirror"); + for (var i = 0; i < byClass.length; i++) { + var cm = byClass[i].CodeMirror; + if (cm) { f(cm); } + } +} + +var globalsRegistered = false; +function ensureGlobalHandlers() { + if (globalsRegistered) { return } + registerGlobalHandlers(); + globalsRegistered = true; +} +function registerGlobalHandlers() { + // When the window resizes, we need to refresh active editors. + var resizeTimer; + on(window, "resize", function () { + if (resizeTimer == null) { resizeTimer = setTimeout(function () { + resizeTimer = null; + forEachCodeMirror(onResize); + }, 100); } + }); + // When the window loses focus, we want to show the editor as blurred + on(window, "blur", function () { return forEachCodeMirror(onBlur); }); +} +// Called when the window resizes +function onResize(cm) { + var d = cm.display; + if (d.lastWrapHeight == d.wrapper.clientHeight && d.lastWrapWidth == d.wrapper.clientWidth) + { return } + // Might be a text scaling operation, clear size caches. + d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null; + d.scrollbarsClipped = false; + cm.setSize(); +} + +var keyNames = { + 3: "Enter", 8: "Backspace", 9: "Tab", 13: "Enter", 16: "Shift", 17: "Ctrl", 18: "Alt", + 19: "Pause", 20: "CapsLock", 27: "Esc", 32: "Space", 33: "PageUp", 34: "PageDown", 35: "End", + 36: "Home", 37: "Left", 38: "Up", 39: "Right", 40: "Down", 44: "PrintScrn", 45: "Insert", + 46: "Delete", 59: ";", 61: "=", 91: "Mod", 92: "Mod", 93: "Mod", + 106: "*", 107: "=", 109: "-", 110: ".", 111: "/", 127: "Delete", + 173: "-", 186: ";", 187: "=", 188: ",", 189: "-", 190: ".", 191: "/", 192: "`", 219: "[", 220: "\\", + 221: "]", 222: "'", 63232: "Up", 63233: "Down", 63234: "Left", 63235: "Right", 63272: "Delete", + 63273: "Home", 63275: "End", 63276: "PageUp", 63277: "PageDown", 63302: "Insert" +}; + +// Number keys +for (var i = 0; i < 10; i++) { keyNames[i + 48] = keyNames[i + 96] = String(i); } +// Alphabetic keys +for (var i$1 = 65; i$1 <= 90; i$1++) { keyNames[i$1] = String.fromCharCode(i$1); } +// Function keys +for (var i$2 = 1; i$2 <= 12; i$2++) { keyNames[i$2 + 111] = keyNames[i$2 + 63235] = "F" + i$2; } + +var keyMap = {}; + +keyMap.basic = { + "Left": "goCharLeft", "Right": "goCharRight", "Up": "goLineUp", "Down": "goLineDown", + "End": "goLineEnd", "Home": "goLineStartSmart", "PageUp": "goPageUp", "PageDown": "goPageDown", + "Delete": "delCharAfter", "Backspace": "delCharBefore", "Shift-Backspace": "delCharBefore", + "Tab": "defaultTab", "Shift-Tab": "indentAuto", + "Enter": "newlineAndIndent", "Insert": "toggleOverwrite", + "Esc": "singleSelection" +}; +// Note that the save and find-related commands aren't defined by +// default. User code or addons can define them. Unknown commands +// are simply ignored. +keyMap.pcDefault = { + "Ctrl-A": "selectAll", "Ctrl-D": "deleteLine", "Ctrl-Z": "undo", "Shift-Ctrl-Z": "redo", "Ctrl-Y": "redo", + "Ctrl-Home": "goDocStart", "Ctrl-End": "goDocEnd", "Ctrl-Up": "goLineUp", "Ctrl-Down": "goLineDown", + "Ctrl-Left": "goGroupLeft", "Ctrl-Right": "goGroupRight", "Alt-Left": "goLineStart", "Alt-Right": "goLineEnd", + "Ctrl-Backspace": "delGroupBefore", "Ctrl-Delete": "delGroupAfter", "Ctrl-S": "save", "Ctrl-F": "find", + "Ctrl-G": "findNext", "Shift-Ctrl-G": "findPrev", "Shift-Ctrl-F": "replace", "Shift-Ctrl-R": "replaceAll", + "Ctrl-[": "indentLess", "Ctrl-]": "indentMore", + "Ctrl-U": "undoSelection", "Shift-Ctrl-U": "redoSelection", "Alt-U": "redoSelection", + fallthrough: "basic" +}; +// Very basic readline/emacs-style bindings, which are standard on Mac. +keyMap.emacsy = { + "Ctrl-F": "goCharRight", "Ctrl-B": "goCharLeft", "Ctrl-P": "goLineUp", "Ctrl-N": "goLineDown", + "Alt-F": "goWordRight", "Alt-B": "goWordLeft", "Ctrl-A": "goLineStart", "Ctrl-E": "goLineEnd", + "Ctrl-V": "goPageDown", "Shift-Ctrl-V": "goPageUp", "Ctrl-D": "delCharAfter", "Ctrl-H": "delCharBefore", + "Alt-D": "delWordAfter", "Alt-Backspace": "delWordBefore", "Ctrl-K": "killLine", "Ctrl-T": "transposeChars", + "Ctrl-O": "openLine" +}; +keyMap.macDefault = { + "Cmd-A": "selectAll", "Cmd-D": "deleteLine", "Cmd-Z": "undo", "Shift-Cmd-Z": "redo", "Cmd-Y": "redo", + "Cmd-Home": "goDocStart", "Cmd-Up": "goDocStart", "Cmd-End": "goDocEnd", "Cmd-Down": "goDocEnd", "Alt-Left": "goGroupLeft", + "Alt-Right": "goGroupRight", "Cmd-Left": "goLineLeft", "Cmd-Right": "goLineRight", "Alt-Backspace": "delGroupBefore", + "Ctrl-Alt-Backspace": "delGroupAfter", "Alt-Delete": "delGroupAfter", "Cmd-S": "save", "Cmd-F": "find", + "Cmd-G": "findNext", "Shift-Cmd-G": "findPrev", "Cmd-Alt-F": "replace", "Shift-Cmd-Alt-F": "replaceAll", + "Cmd-[": "indentLess", "Cmd-]": "indentMore", "Cmd-Backspace": "delWrappedLineLeft", "Cmd-Delete": "delWrappedLineRight", + "Cmd-U": "undoSelection", "Shift-Cmd-U": "redoSelection", "Ctrl-Up": "goDocStart", "Ctrl-Down": "goDocEnd", + fallthrough: ["basic", "emacsy"] +}; +keyMap["default"] = mac ? keyMap.macDefault : keyMap.pcDefault; + +// KEYMAP DISPATCH + +function normalizeKeyName(name) { + var parts = name.split(/-(?!$)/); + name = parts[parts.length - 1]; + var alt, ctrl, shift, cmd; + for (var i = 0; i < parts.length - 1; i++) { + var mod = parts[i]; + if (/^(cmd|meta|m)$/i.test(mod)) { cmd = true; } + else if (/^a(lt)?$/i.test(mod)) { alt = true; } + else if (/^(c|ctrl|control)$/i.test(mod)) { ctrl = true; } + else if (/^s(hift)?$/i.test(mod)) { shift = true; } + else { throw new Error("Unrecognized modifier name: " + mod) } + } + if (alt) { name = "Alt-" + name; } + if (ctrl) { name = "Ctrl-" + name; } + if (cmd) { name = "Cmd-" + name; } + if (shift) { name = "Shift-" + name; } + return name +} + +// This is a kludge to keep keymaps mostly working as raw objects +// (backwards compatibility) while at the same time support features +// like normalization and multi-stroke key bindings. It compiles a +// new normalized keymap, and then updates the old object to reflect +// this. +function normalizeKeyMap(keymap) { + var copy = {}; + for (var keyname in keymap) { if (keymap.hasOwnProperty(keyname)) { + var value = keymap[keyname]; + if (/^(name|fallthrough|(de|at)tach)$/.test(keyname)) { continue } + if (value == "...") { delete keymap[keyname]; continue } + + var keys = map(keyname.split(" "), normalizeKeyName); + for (var i = 0; i < keys.length; i++) { + var val = (void 0), name = (void 0); + if (i == keys.length - 1) { + name = keys.join(" "); + val = value; + } else { + name = keys.slice(0, i + 1).join(" "); + val = "..."; + } + var prev = copy[name]; + if (!prev) { copy[name] = val; } + else if (prev != val) { throw new Error("Inconsistent bindings for " + name) } + } + delete keymap[keyname]; + } } + for (var prop in copy) { keymap[prop] = copy[prop]; } + return keymap +} + +function lookupKey(key, map$$1, handle, context) { + map$$1 = getKeyMap(map$$1); + var found = map$$1.call ? map$$1.call(key, context) : map$$1[key]; + if (found === false) { return "nothing" } + if (found === "...") { return "multi" } + if (found != null && handle(found)) { return "handled" } + + if (map$$1.fallthrough) { + if (Object.prototype.toString.call(map$$1.fallthrough) != "[object Array]") + { return lookupKey(key, map$$1.fallthrough, handle, context) } + for (var i = 0; i < map$$1.fallthrough.length; i++) { + var result = lookupKey(key, map$$1.fallthrough[i], handle, context); + if (result) { return result } + } + } +} + +// Modifier key presses don't count as 'real' key presses for the +// purpose of keymap fallthrough. +function isModifierKey(value) { + var name = typeof value == "string" ? value : keyNames[value.keyCode]; + return name == "Ctrl" || name == "Alt" || name == "Shift" || name == "Mod" +} + +function addModifierNames(name, event, noShift) { + var base = name; + if (event.altKey && base != "Alt") { name = "Alt-" + name; } + if ((flipCtrlCmd ? event.metaKey : event.ctrlKey) && base != "Ctrl") { name = "Ctrl-" + name; } + if ((flipCtrlCmd ? event.ctrlKey : event.metaKey) && base != "Cmd") { name = "Cmd-" + name; } + if (!noShift && event.shiftKey && base != "Shift") { name = "Shift-" + name; } + return name +} + +// Look up the name of a key as indicated by an event object. +function keyName(event, noShift) { + if (presto && event.keyCode == 34 && event["char"]) { return false } + var name = keyNames[event.keyCode]; + if (name == null || event.altGraphKey) { return false } + return addModifierNames(name, event, noShift) +} + +function getKeyMap(val) { + return typeof val == "string" ? keyMap[val] : val +} + +// Helper for deleting text near the selection(s), used to implement +// backspace, delete, and similar functionality. +function deleteNearSelection(cm, compute) { + var ranges = cm.doc.sel.ranges, kill = []; + // Build up a set of ranges to kill first, merging overlapping + // ranges. + for (var i = 0; i < ranges.length; i++) { + var toKill = compute(ranges[i]); + while (kill.length && cmp(toKill.from, lst(kill).to) <= 0) { + var replaced = kill.pop(); + if (cmp(replaced.from, toKill.from) < 0) { + toKill.from = replaced.from; + break + } + } + kill.push(toKill); + } + // Next, remove those actual ranges. + runInOp(cm, function () { + for (var i = kill.length - 1; i >= 0; i--) + { replaceRange(cm.doc, "", kill[i].from, kill[i].to, "+delete"); } + ensureCursorVisible(cm); + }); +} + +// Commands are parameter-less actions that can be performed on an +// editor, mostly used for keybindings. +var commands = { + selectAll: selectAll, + singleSelection: function (cm) { return cm.setSelection(cm.getCursor("anchor"), cm.getCursor("head"), sel_dontScroll); }, + killLine: function (cm) { return deleteNearSelection(cm, function (range) { + if (range.empty()) { + var len = getLine(cm.doc, range.head.line).text.length; + if (range.head.ch == len && range.head.line < cm.lastLine()) + { return {from: range.head, to: Pos(range.head.line + 1, 0)} } + else + { return {from: range.head, to: Pos(range.head.line, len)} } + } else { + return {from: range.from(), to: range.to()} + } + }); }, + deleteLine: function (cm) { return deleteNearSelection(cm, function (range) { return ({ + from: Pos(range.from().line, 0), + to: clipPos(cm.doc, Pos(range.to().line + 1, 0)) + }); }); }, + delLineLeft: function (cm) { return deleteNearSelection(cm, function (range) { return ({ + from: Pos(range.from().line, 0), to: range.from() + }); }); }, + delWrappedLineLeft: function (cm) { return deleteNearSelection(cm, function (range) { + var top = cm.charCoords(range.head, "div").top + 5; + var leftPos = cm.coordsChar({left: 0, top: top}, "div"); + return {from: leftPos, to: range.from()} + }); }, + delWrappedLineRight: function (cm) { return deleteNearSelection(cm, function (range) { + var top = cm.charCoords(range.head, "div").top + 5; + var rightPos = cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, "div"); + return {from: range.from(), to: rightPos } + }); }, + undo: function (cm) { return cm.undo(); }, + redo: function (cm) { return cm.redo(); }, + undoSelection: function (cm) { return cm.undoSelection(); }, + redoSelection: function (cm) { return cm.redoSelection(); }, + goDocStart: function (cm) { return cm.extendSelection(Pos(cm.firstLine(), 0)); }, + goDocEnd: function (cm) { return cm.extendSelection(Pos(cm.lastLine())); }, + goLineStart: function (cm) { return cm.extendSelectionsBy(function (range) { return lineStart(cm, range.head.line); }, + {origin: "+move", bias: 1} + ); }, + goLineStartSmart: function (cm) { return cm.extendSelectionsBy(function (range) { return lineStartSmart(cm, range.head); }, + {origin: "+move", bias: 1} + ); }, + goLineEnd: function (cm) { return cm.extendSelectionsBy(function (range) { return lineEnd(cm, range.head.line); }, + {origin: "+move", bias: -1} + ); }, + goLineRight: function (cm) { return cm.extendSelectionsBy(function (range) { + var top = cm.charCoords(range.head, "div").top + 5; + return cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, "div") + }, sel_move); }, + goLineLeft: function (cm) { return cm.extendSelectionsBy(function (range) { + var top = cm.charCoords(range.head, "div").top + 5; + return cm.coordsChar({left: 0, top: top}, "div") + }, sel_move); }, + goLineLeftSmart: function (cm) { return cm.extendSelectionsBy(function (range) { + var top = cm.charCoords(range.head, "div").top + 5; + var pos = cm.coordsChar({left: 0, top: top}, "div"); + if (pos.ch < cm.getLine(pos.line).search(/\S/)) { return lineStartSmart(cm, range.head) } + return pos + }, sel_move); }, + goLineUp: function (cm) { return cm.moveV(-1, "line"); }, + goLineDown: function (cm) { return cm.moveV(1, "line"); }, + goPageUp: function (cm) { return cm.moveV(-1, "page"); }, + goPageDown: function (cm) { return cm.moveV(1, "page"); }, + goCharLeft: function (cm) { return cm.moveH(-1, "char"); }, + goCharRight: function (cm) { return cm.moveH(1, "char"); }, + goColumnLeft: function (cm) { return cm.moveH(-1, "column"); }, + goColumnRight: function (cm) { return cm.moveH(1, "column"); }, + goWordLeft: function (cm) { return cm.moveH(-1, "word"); }, + goGroupRight: function (cm) { return cm.moveH(1, "group"); }, + goGroupLeft: function (cm) { return cm.moveH(-1, "group"); }, + goWordRight: function (cm) { return cm.moveH(1, "word"); }, + delCharBefore: function (cm) { return cm.deleteH(-1, "char"); }, + delCharAfter: function (cm) { return cm.deleteH(1, "char"); }, + delWordBefore: function (cm) { return cm.deleteH(-1, "word"); }, + delWordAfter: function (cm) { return cm.deleteH(1, "word"); }, + delGroupBefore: function (cm) { return cm.deleteH(-1, "group"); }, + delGroupAfter: function (cm) { return cm.deleteH(1, "group"); }, + indentAuto: function (cm) { return cm.indentSelection("smart"); }, + indentMore: function (cm) { return cm.indentSelection("add"); }, + indentLess: function (cm) { return cm.indentSelection("subtract"); }, + insertTab: function (cm) { return cm.replaceSelection("\t"); }, + insertSoftTab: function (cm) { + var spaces = [], ranges = cm.listSelections(), tabSize = cm.options.tabSize; + for (var i = 0; i < ranges.length; i++) { + var pos = ranges[i].from(); + var col = countColumn(cm.getLine(pos.line), pos.ch, tabSize); + spaces.push(spaceStr(tabSize - col % tabSize)); + } + cm.replaceSelections(spaces); + }, + defaultTab: function (cm) { + if (cm.somethingSelected()) { cm.indentSelection("add"); } + else { cm.execCommand("insertTab"); } + }, + // Swap the two chars left and right of each selection's head. + // Move cursor behind the two swapped characters afterwards. + // + // Doesn't consider line feeds a character. + // Doesn't scan more than one line above to find a character. + // Doesn't do anything on an empty line. + // Doesn't do anything with non-empty selections. + transposeChars: function (cm) { return runInOp(cm, function () { + var ranges = cm.listSelections(), newSel = []; + for (var i = 0; i < ranges.length; i++) { + if (!ranges[i].empty()) { continue } + var cur = ranges[i].head, line = getLine(cm.doc, cur.line).text; + if (line) { + if (cur.ch == line.length) { cur = new Pos(cur.line, cur.ch - 1); } + if (cur.ch > 0) { + cur = new Pos(cur.line, cur.ch + 1); + cm.replaceRange(line.charAt(cur.ch - 1) + line.charAt(cur.ch - 2), + Pos(cur.line, cur.ch - 2), cur, "+transpose"); + } else if (cur.line > cm.doc.first) { + var prev = getLine(cm.doc, cur.line - 1).text; + if (prev) { + cur = new Pos(cur.line, 1); + cm.replaceRange(line.charAt(0) + cm.doc.lineSeparator() + + prev.charAt(prev.length - 1), + Pos(cur.line - 1, prev.length - 1), cur, "+transpose"); + } + } + } + newSel.push(new Range(cur, cur)); + } + cm.setSelections(newSel); + }); }, + newlineAndIndent: function (cm) { return runInOp(cm, function () { + var sels = cm.listSelections(); + for (var i = sels.length - 1; i >= 0; i--) + { cm.replaceRange(cm.doc.lineSeparator(), sels[i].anchor, sels[i].head, "+input"); } + sels = cm.listSelections(); + for (var i$1 = 0; i$1 < sels.length; i$1++) + { cm.indentLine(sels[i$1].from().line, null, true); } + ensureCursorVisible(cm); + }); }, + openLine: function (cm) { return cm.replaceSelection("\n", "start"); }, + toggleOverwrite: function (cm) { return cm.toggleOverwrite(); } +}; + + +function lineStart(cm, lineN) { + var line = getLine(cm.doc, lineN); + var visual = visualLine(line); + if (visual != line) { lineN = lineNo(visual); } + return endOfLine(true, cm, visual, lineN, 1) +} +function lineEnd(cm, lineN) { + var line = getLine(cm.doc, lineN); + var visual = visualLineEnd(line); + if (visual != line) { lineN = lineNo(visual); } + return endOfLine(true, cm, line, lineN, -1) +} +function lineStartSmart(cm, pos) { + var start = lineStart(cm, pos.line); + var line = getLine(cm.doc, start.line); + var order = getOrder(line, cm.doc.direction); + if (!order || order[0].level == 0) { + var firstNonWS = Math.max(0, line.text.search(/\S/)); + var inWS = pos.line == start.line && pos.ch <= firstNonWS && pos.ch; + return Pos(start.line, inWS ? 0 : firstNonWS, start.sticky) + } + return start +} + +// Run a handler that was bound to a key. +function doHandleBinding(cm, bound, dropShift) { + if (typeof bound == "string") { + bound = commands[bound]; + if (!bound) { return false } + } + // Ensure previous input has been read, so that the handler sees a + // consistent view of the document + cm.display.input.ensurePolled(); + var prevShift = cm.display.shift, done = false; + try { + if (cm.isReadOnly()) { cm.state.suppressEdits = true; } + if (dropShift) { cm.display.shift = false; } + done = bound(cm) != Pass; + } finally { + cm.display.shift = prevShift; + cm.state.suppressEdits = false; + } + return done +} + +function lookupKeyForEditor(cm, name, handle) { + for (var i = 0; i < cm.state.keyMaps.length; i++) { + var result = lookupKey(name, cm.state.keyMaps[i], handle, cm); + if (result) { return result } + } + return (cm.options.extraKeys && lookupKey(name, cm.options.extraKeys, handle, cm)) + || lookupKey(name, cm.options.keyMap, handle, cm) +} + +// Note that, despite the name, this function is also used to check +// for bound mouse clicks. + +var stopSeq = new Delayed; +function dispatchKey(cm, name, e, handle) { + var seq = cm.state.keySeq; + if (seq) { + if (isModifierKey(name)) { return "handled" } + stopSeq.set(50, function () { + if (cm.state.keySeq == seq) { + cm.state.keySeq = null; + cm.display.input.reset(); + } + }); + name = seq + " " + name; + } + var result = lookupKeyForEditor(cm, name, handle); + + if (result == "multi") + { cm.state.keySeq = name; } + if (result == "handled") + { signalLater(cm, "keyHandled", cm, name, e); } + + if (result == "handled" || result == "multi") { + e_preventDefault(e); + restartBlink(cm); + } + + if (seq && !result && /\'$/.test(name)) { + e_preventDefault(e); + return true + } + return !!result +} + +// Handle a key from the keydown event. +function handleKeyBinding(cm, e) { + var name = keyName(e, true); + if (!name) { return false } + + if (e.shiftKey && !cm.state.keySeq) { + // First try to resolve full name (including 'Shift-'). Failing + // that, see if there is a cursor-motion command (starting with + // 'go') bound to the keyname without 'Shift-'. + return dispatchKey(cm, "Shift-" + name, e, function (b) { return doHandleBinding(cm, b, true); }) + || dispatchKey(cm, name, e, function (b) { + if (typeof b == "string" ? /^go[A-Z]/.test(b) : b.motion) + { return doHandleBinding(cm, b) } + }) + } else { + return dispatchKey(cm, name, e, function (b) { return doHandleBinding(cm, b); }) + } +} + +// Handle a key from the keypress event +function handleCharBinding(cm, e, ch) { + return dispatchKey(cm, "'" + ch + "'", e, function (b) { return doHandleBinding(cm, b, true); }) +} + +var lastStoppedKey = null; +function onKeyDown(e) { + var cm = this; + cm.curOp.focus = activeElt(); + if (signalDOMEvent(cm, e)) { return } + // IE does strange things with escape. + if (ie && ie_version < 11 && e.keyCode == 27) { e.returnValue = false; } + var code = e.keyCode; + cm.display.shift = code == 16 || e.shiftKey; + var handled = handleKeyBinding(cm, e); + if (presto) { + lastStoppedKey = handled ? code : null; + // Opera has no cut event... we try to at least catch the key combo + if (!handled && code == 88 && !hasCopyEvent && (mac ? e.metaKey : e.ctrlKey)) + { cm.replaceSelection("", null, "cut"); } + } + + // Turn mouse into crosshair when Alt is held on Mac. + if (code == 18 && !/\bCodeMirror-crosshair\b/.test(cm.display.lineDiv.className)) + { showCrossHair(cm); } +} + +function showCrossHair(cm) { + var lineDiv = cm.display.lineDiv; + addClass(lineDiv, "CodeMirror-crosshair"); + + function up(e) { + if (e.keyCode == 18 || !e.altKey) { + rmClass(lineDiv, "CodeMirror-crosshair"); + off(document, "keyup", up); + off(document, "mouseover", up); + } + } + on(document, "keyup", up); + on(document, "mouseover", up); +} + +function onKeyUp(e) { + if (e.keyCode == 16) { this.doc.sel.shift = false; } + signalDOMEvent(this, e); +} + +function onKeyPress(e) { + var cm = this; + if (eventInWidget(cm.display, e) || signalDOMEvent(cm, e) || e.ctrlKey && !e.altKey || mac && e.metaKey) { return } + var keyCode = e.keyCode, charCode = e.charCode; + if (presto && keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return} + if ((presto && (!e.which || e.which < 10)) && handleKeyBinding(cm, e)) { return } + var ch = String.fromCharCode(charCode == null ? keyCode : charCode); + // Some browsers fire keypress events for backspace + if (ch == "\x08") { return } + if (handleCharBinding(cm, e, ch)) { return } + cm.display.input.onKeyPress(e); +} + +var DOUBLECLICK_DELAY = 400; + +var PastClick = function(time, pos, button) { + this.time = time; + this.pos = pos; + this.button = button; +}; + +PastClick.prototype.compare = function (time, pos, button) { + return this.time + DOUBLECLICK_DELAY > time && + cmp(pos, this.pos) == 0 && button == this.button +}; + +var lastClick; +var lastDoubleClick; +function clickRepeat(pos, button) { + var now = +new Date; + if (lastDoubleClick && lastDoubleClick.compare(now, pos, button)) { + lastClick = lastDoubleClick = null; + return "triple" + } else if (lastClick && lastClick.compare(now, pos, button)) { + lastDoubleClick = new PastClick(now, pos, button); + lastClick = null; + return "double" + } else { + lastClick = new PastClick(now, pos, button); + lastDoubleClick = null; + return "single" + } +} + +// A mouse down can be a single click, double click, triple click, +// start of selection drag, start of text drag, new cursor +// (ctrl-click), rectangle drag (alt-drag), or xwin +// middle-click-paste. Or it might be a click on something we should +// not interfere with, such as a scrollbar or widget. +function onMouseDown(e) { + var cm = this, display = cm.display; + if (signalDOMEvent(cm, e) || display.activeTouch && display.input.supportsTouch()) { return } + display.input.ensurePolled(); + display.shift = e.shiftKey; + + if (eventInWidget(display, e)) { + if (!webkit) { + // Briefly turn off draggability, to allow widgets to do + // normal dragging things. + display.scroller.draggable = false; + setTimeout(function () { return display.scroller.draggable = true; }, 100); + } + return + } + if (clickInGutter(cm, e)) { return } + var pos = posFromMouse(cm, e), button = e_button(e), repeat = pos ? clickRepeat(pos, button) : "single"; + window.focus(); + + // #3261: make sure, that we're not starting a second selection + if (button == 1 && cm.state.selectingText) + { cm.state.selectingText(e); } + + if (pos && handleMappedButton(cm, button, pos, repeat, e)) { return } + + if (button == 1) { + if (pos) { leftButtonDown(cm, pos, repeat, e); } + else if (e_target(e) == display.scroller) { e_preventDefault(e); } + } else if (button == 2) { + if (pos) { extendSelection(cm.doc, pos); } + setTimeout(function () { return display.input.focus(); }, 20); + } else if (button == 3) { + if (captureRightClick) { onContextMenu(cm, e); } + else { delayBlurEvent(cm); } + } +} + +function handleMappedButton(cm, button, pos, repeat, event) { + var name = "Click"; + if (repeat == "double") { name = "Double" + name; } + else if (repeat == "triple") { name = "Triple" + name; } + name = (button == 1 ? "Left" : button == 2 ? "Middle" : "Right") + name; + + return dispatchKey(cm, addModifierNames(name, event), event, function (bound) { + if (typeof bound == "string") { bound = commands[bound]; } + if (!bound) { return false } + var done = false; + try { + if (cm.isReadOnly()) { cm.state.suppressEdits = true; } + done = bound(cm, pos) != Pass; + } finally { + cm.state.suppressEdits = false; + } + return done + }) +} + +function configureMouse(cm, repeat, event) { + var option = cm.getOption("configureMouse"); + var value = option ? option(cm, repeat, event) : {}; + if (value.unit == null) { + var rect = chromeOS ? event.shiftKey && event.metaKey : event.altKey; + value.unit = rect ? "rectangle" : repeat == "single" ? "char" : repeat == "double" ? "word" : "line"; + } + if (value.extend == null || cm.doc.extend) { value.extend = cm.doc.extend || event.shiftKey; } + if (value.addNew == null) { value.addNew = mac ? event.metaKey : event.ctrlKey; } + if (value.moveOnDrag == null) { value.moveOnDrag = !(mac ? event.altKey : event.ctrlKey); } + return value +} + +function leftButtonDown(cm, pos, repeat, event) { + if (ie) { setTimeout(bind(ensureFocus, cm), 0); } + else { cm.curOp.focus = activeElt(); } + + var behavior = configureMouse(cm, repeat, event); + + var sel = cm.doc.sel, contained; + if (cm.options.dragDrop && dragAndDrop && !cm.isReadOnly() && + repeat == "single" && (contained = sel.contains(pos)) > -1 && + (cmp((contained = sel.ranges[contained]).from(), pos) < 0 || pos.xRel > 0) && + (cmp(contained.to(), pos) > 0 || pos.xRel < 0)) + { leftButtonStartDrag(cm, event, pos, behavior); } + else + { leftButtonSelect(cm, event, pos, behavior); } +} + +// Start a text drag. When it ends, see if any dragging actually +// happen, and treat as a click if it didn't. +function leftButtonStartDrag(cm, event, pos, behavior) { + var display = cm.display, moved = false; + var dragEnd = operation(cm, function (e) { + if (webkit) { display.scroller.draggable = false; } + cm.state.draggingText = false; + off(document, "mouseup", dragEnd); + off(document, "mousemove", mouseMove); + off(display.scroller, "dragstart", dragStart); + off(display.scroller, "drop", dragEnd); + if (!moved) { + e_preventDefault(e); + if (!behavior.addNew) + { extendSelection(cm.doc, pos, null, null, behavior.extend); } + // Work around unexplainable focus problem in IE9 (#2127) and Chrome (#3081) + if (webkit || ie && ie_version == 9) + { setTimeout(function () {document.body.focus(); display.input.focus();}, 20); } + else + { display.input.focus(); } + } + }); + var mouseMove = function(e2) { + moved = moved || Math.abs(event.clientX - e2.clientX) + Math.abs(event.clientY - e2.clientY) >= 10; + }; + var dragStart = function () { return moved = true; }; + // Let the drag handler handle this. + if (webkit) { display.scroller.draggable = true; } + cm.state.draggingText = dragEnd; + dragEnd.copy = !behavior.moveOnDrag; + // IE's approach to draggable + if (display.scroller.dragDrop) { display.scroller.dragDrop(); } + on(document, "mouseup", dragEnd); + on(document, "mousemove", mouseMove); + on(display.scroller, "dragstart", dragStart); + on(display.scroller, "drop", dragEnd); + + delayBlurEvent(cm); + setTimeout(function () { return display.input.focus(); }, 20); +} + +function rangeForUnit(cm, pos, unit) { + if (unit == "char") { return new Range(pos, pos) } + if (unit == "word") { return cm.findWordAt(pos) } + if (unit == "line") { return new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0))) } + var result = unit(cm, pos); + return new Range(result.from, result.to) +} + +// Normal selection, as opposed to text dragging. +function leftButtonSelect(cm, event, start, behavior) { + var display = cm.display, doc = cm.doc; + e_preventDefault(event); + + var ourRange, ourIndex, startSel = doc.sel, ranges = startSel.ranges; + if (behavior.addNew && !behavior.extend) { + ourIndex = doc.sel.contains(start); + if (ourIndex > -1) + { ourRange = ranges[ourIndex]; } + else + { ourRange = new Range(start, start); } + } else { + ourRange = doc.sel.primary(); + ourIndex = doc.sel.primIndex; + } + + if (behavior.unit == "rectangle") { + if (!behavior.addNew) { ourRange = new Range(start, start); } + start = posFromMouse(cm, event, true, true); + ourIndex = -1; + } else { + var range$$1 = rangeForUnit(cm, start, behavior.unit); + if (behavior.extend) + { ourRange = extendRange(ourRange, range$$1.anchor, range$$1.head, behavior.extend); } + else + { ourRange = range$$1; } + } + + if (!behavior.addNew) { + ourIndex = 0; + setSelection(doc, new Selection([ourRange], 0), sel_mouse); + startSel = doc.sel; + } else if (ourIndex == -1) { + ourIndex = ranges.length; + setSelection(doc, normalizeSelection(ranges.concat([ourRange]), ourIndex), + {scroll: false, origin: "*mouse"}); + } else if (ranges.length > 1 && ranges[ourIndex].empty() && behavior.unit == "char" && !behavior.extend) { + setSelection(doc, normalizeSelection(ranges.slice(0, ourIndex).concat(ranges.slice(ourIndex + 1)), 0), + {scroll: false, origin: "*mouse"}); + startSel = doc.sel; + } else { + replaceOneSelection(doc, ourIndex, ourRange, sel_mouse); + } + + var lastPos = start; + function extendTo(pos) { + if (cmp(lastPos, pos) == 0) { return } + lastPos = pos; + + if (behavior.unit == "rectangle") { + var ranges = [], tabSize = cm.options.tabSize; + var startCol = countColumn(getLine(doc, start.line).text, start.ch, tabSize); + var posCol = countColumn(getLine(doc, pos.line).text, pos.ch, tabSize); + var left = Math.min(startCol, posCol), right = Math.max(startCol, posCol); + for (var line = Math.min(start.line, pos.line), end = Math.min(cm.lastLine(), Math.max(start.line, pos.line)); + line <= end; line++) { + var text = getLine(doc, line).text, leftPos = findColumn(text, left, tabSize); + if (left == right) + { ranges.push(new Range(Pos(line, leftPos), Pos(line, leftPos))); } + else if (text.length > leftPos) + { ranges.push(new Range(Pos(line, leftPos), Pos(line, findColumn(text, right, tabSize)))); } + } + if (!ranges.length) { ranges.push(new Range(start, start)); } + setSelection(doc, normalizeSelection(startSel.ranges.slice(0, ourIndex).concat(ranges), ourIndex), + {origin: "*mouse", scroll: false}); + cm.scrollIntoView(pos); + } else { + var oldRange = ourRange; + var range$$1 = rangeForUnit(cm, pos, behavior.unit); + var anchor = oldRange.anchor, head; + if (cmp(range$$1.anchor, anchor) > 0) { + head = range$$1.head; + anchor = minPos(oldRange.from(), range$$1.anchor); + } else { + head = range$$1.anchor; + anchor = maxPos(oldRange.to(), range$$1.head); + } + var ranges$1 = startSel.ranges.slice(0); + ranges$1[ourIndex] = new Range(clipPos(doc, anchor), head); + setSelection(doc, normalizeSelection(ranges$1, ourIndex), sel_mouse); + } + } + + var editorSize = display.wrapper.getBoundingClientRect(); + // Used to ensure timeout re-tries don't fire when another extend + // happened in the meantime (clearTimeout isn't reliable -- at + // least on Chrome, the timeouts still happen even when cleared, + // if the clear happens after their scheduled firing time). + var counter = 0; + + function extend(e) { + var curCount = ++counter; + var cur = posFromMouse(cm, e, true, behavior.unit == "rectangle"); + if (!cur) { return } + if (cmp(cur, lastPos) != 0) { + cm.curOp.focus = activeElt(); + extendTo(cur); + var visible = visibleLines(display, doc); + if (cur.line >= visible.to || cur.line < visible.from) + { setTimeout(operation(cm, function () {if (counter == curCount) { extend(e); }}), 150); } + } else { + var outside = e.clientY < editorSize.top ? -20 : e.clientY > editorSize.bottom ? 20 : 0; + if (outside) { setTimeout(operation(cm, function () { + if (counter != curCount) { return } + display.scroller.scrollTop += outside; + extend(e); + }), 50); } + } + } + + function done(e) { + cm.state.selectingText = false; + counter = Infinity; + e_preventDefault(e); + display.input.focus(); + off(document, "mousemove", move); + off(document, "mouseup", up); + doc.history.lastSelOrigin = null; + } + + var move = operation(cm, function (e) { + if (!e_button(e)) { done(e); } + else { extend(e); } + }); + var up = operation(cm, done); + cm.state.selectingText = up; + on(document, "mousemove", move); + on(document, "mouseup", up); +} + + +// Determines whether an event happened in the gutter, and fires the +// handlers for the corresponding event. +function gutterEvent(cm, e, type, prevent) { + var mX, mY; + try { mX = e.clientX; mY = e.clientY; } + catch(e) { return false } + if (mX >= Math.floor(cm.display.gutters.getBoundingClientRect().right)) { return false } + if (prevent) { e_preventDefault(e); } + + var display = cm.display; + var lineBox = display.lineDiv.getBoundingClientRect(); + + if (mY > lineBox.bottom || !hasHandler(cm, type)) { return e_defaultPrevented(e) } + mY -= lineBox.top - display.viewOffset; + + for (var i = 0; i < cm.options.gutters.length; ++i) { + var g = display.gutters.childNodes[i]; + if (g && g.getBoundingClientRect().right >= mX) { + var line = lineAtHeight(cm.doc, mY); + var gutter = cm.options.gutters[i]; + signal(cm, type, cm, line, gutter, e); + return e_defaultPrevented(e) + } + } +} + +function clickInGutter(cm, e) { + return gutterEvent(cm, e, "gutterClick", true) +} + +// CONTEXT MENU HANDLING + +// To make the context menu work, we need to briefly unhide the +// textarea (making it as unobtrusive as possible) to let the +// right-click take effect on it. +function onContextMenu(cm, e) { + if (eventInWidget(cm.display, e) || contextMenuInGutter(cm, e)) { return } + if (signalDOMEvent(cm, e, "contextmenu")) { return } + cm.display.input.onContextMenu(e); +} + +function contextMenuInGutter(cm, e) { + if (!hasHandler(cm, "gutterContextMenu")) { return false } + return gutterEvent(cm, e, "gutterContextMenu", false) +} + +function themeChanged(cm) { + cm.display.wrapper.className = cm.display.wrapper.className.replace(/\s*cm-s-\S+/g, "") + + cm.options.theme.replace(/(^|\s)\s*/g, " cm-s-"); + clearCaches(cm); +} + +var Init = {toString: function(){return "CodeMirror.Init"}}; + +var defaults = {}; +var optionHandlers = {}; + +function defineOptions(CodeMirror) { + var optionHandlers = CodeMirror.optionHandlers; + + function option(name, deflt, handle, notOnInit) { + CodeMirror.defaults[name] = deflt; + if (handle) { optionHandlers[name] = + notOnInit ? function (cm, val, old) {if (old != Init) { handle(cm, val, old); }} : handle; } + } + + CodeMirror.defineOption = option; + + // Passed to option handlers when there is no old value. + CodeMirror.Init = Init; + + // These two are, on init, called from the constructor because they + // have to be initialized before the editor can start at all. + option("value", "", function (cm, val) { return cm.setValue(val); }, true); + option("mode", null, function (cm, val) { + cm.doc.modeOption = val; + loadMode(cm); + }, true); + + option("indentUnit", 2, loadMode, true); + option("indentWithTabs", false); + option("smartIndent", true); + option("tabSize", 4, function (cm) { + resetModeState(cm); + clearCaches(cm); + regChange(cm); + }, true); + option("lineSeparator", null, function (cm, val) { + cm.doc.lineSep = val; + if (!val) { return } + var newBreaks = [], lineNo = cm.doc.first; + cm.doc.iter(function (line) { + for (var pos = 0;;) { + var found = line.text.indexOf(val, pos); + if (found == -1) { break } + pos = found + val.length; + newBreaks.push(Pos(lineNo, found)); + } + lineNo++; + }); + for (var i = newBreaks.length - 1; i >= 0; i--) + { replaceRange(cm.doc, val, newBreaks[i], Pos(newBreaks[i].line, newBreaks[i].ch + val.length)); } + }); + option("specialChars", /[\u0000-\u001f\u007f-\u009f\u00ad\u061c\u200b-\u200f\u2028\u2029\ufeff]/g, function (cm, val, old) { + cm.state.specialChars = new RegExp(val.source + (val.test("\t") ? "" : "|\t"), "g"); + if (old != Init) { cm.refresh(); } + }); + option("specialCharPlaceholder", defaultSpecialCharPlaceholder, function (cm) { return cm.refresh(); }, true); + option("electricChars", true); + option("inputStyle", mobile ? "contenteditable" : "textarea", function () { + throw new Error("inputStyle can not (yet) be changed in a running editor") // FIXME + }, true); + option("spellcheck", false, function (cm, val) { return cm.getInputField().spellcheck = val; }, true); + option("rtlMoveVisually", !windows); + option("wholeLineUpdateBefore", true); + + option("theme", "default", function (cm) { + themeChanged(cm); + guttersChanged(cm); + }, true); + option("keyMap", "default", function (cm, val, old) { + var next = getKeyMap(val); + var prev = old != Init && getKeyMap(old); + if (prev && prev.detach) { prev.detach(cm, next); } + if (next.attach) { next.attach(cm, prev || null); } + }); + option("extraKeys", null); + option("configureMouse", null); + + option("lineWrapping", false, wrappingChanged, true); + option("gutters", [], function (cm) { + setGuttersForLineNumbers(cm.options); + guttersChanged(cm); + }, true); + option("fixedGutter", true, function (cm, val) { + cm.display.gutters.style.left = val ? compensateForHScroll(cm.display) + "px" : "0"; + cm.refresh(); + }, true); + option("coverGutterNextToScrollbar", false, function (cm) { return updateScrollbars(cm); }, true); + option("scrollbarStyle", "native", function (cm) { + initScrollbars(cm); + updateScrollbars(cm); + cm.display.scrollbars.setScrollTop(cm.doc.scrollTop); + cm.display.scrollbars.setScrollLeft(cm.doc.scrollLeft); + }, true); + option("lineNumbers", false, function (cm) { + setGuttersForLineNumbers(cm.options); + guttersChanged(cm); + }, true); + option("firstLineNumber", 1, guttersChanged, true); + option("lineNumberFormatter", function (integer) { return integer; }, guttersChanged, true); + option("showCursorWhenSelecting", false, updateSelection, true); + + option("resetSelectionOnContextMenu", true); + option("lineWiseCopyCut", true); + option("pasteLinesPerSelection", true); + + option("readOnly", false, function (cm, val) { + if (val == "nocursor") { + onBlur(cm); + cm.display.input.blur(); + } + cm.display.input.readOnlyChanged(val); + }); + option("disableInput", false, function (cm, val) {if (!val) { cm.display.input.reset(); }}, true); + option("dragDrop", true, dragDropChanged); + option("allowDropFileTypes", null); + + option("cursorBlinkRate", 530); + option("cursorScrollMargin", 0); + option("cursorHeight", 1, updateSelection, true); + option("singleCursorHeightPerLine", true, updateSelection, true); + option("workTime", 100); + option("workDelay", 100); + option("flattenSpans", true, resetModeState, true); + option("addModeClass", false, resetModeState, true); + option("pollInterval", 100); + option("undoDepth", 200, function (cm, val) { return cm.doc.history.undoDepth = val; }); + option("historyEventDelay", 1250); + option("viewportMargin", 10, function (cm) { return cm.refresh(); }, true); + option("maxHighlightLength", 10000, resetModeState, true); + option("moveInputWithCursor", true, function (cm, val) { + if (!val) { cm.display.input.resetPosition(); } + }); + + option("tabindex", null, function (cm, val) { return cm.display.input.getField().tabIndex = val || ""; }); + option("autofocus", null); + option("direction", "ltr", function (cm, val) { return cm.doc.setDirection(val); }, true); +} + +function guttersChanged(cm) { + updateGutters(cm); + regChange(cm); + alignHorizontally(cm); +} + +function dragDropChanged(cm, value, old) { + var wasOn = old && old != Init; + if (!value != !wasOn) { + var funcs = cm.display.dragFunctions; + var toggle = value ? on : off; + toggle(cm.display.scroller, "dragstart", funcs.start); + toggle(cm.display.scroller, "dragenter", funcs.enter); + toggle(cm.display.scroller, "dragover", funcs.over); + toggle(cm.display.scroller, "dragleave", funcs.leave); + toggle(cm.display.scroller, "drop", funcs.drop); + } +} + +function wrappingChanged(cm) { + if (cm.options.lineWrapping) { + addClass(cm.display.wrapper, "CodeMirror-wrap"); + cm.display.sizer.style.minWidth = ""; + cm.display.sizerWidth = null; + } else { + rmClass(cm.display.wrapper, "CodeMirror-wrap"); + findMaxLine(cm); + } + estimateLineHeights(cm); + regChange(cm); + clearCaches(cm); + setTimeout(function () { return updateScrollbars(cm); }, 100); +} + +// A CodeMirror instance represents an editor. This is the object +// that user code is usually dealing with. + +function CodeMirror$1(place, options) { + var this$1 = this; + + if (!(this instanceof CodeMirror$1)) { return new CodeMirror$1(place, options) } + + this.options = options = options ? copyObj(options) : {}; + // Determine effective options based on given values and defaults. + copyObj(defaults, options, false); + setGuttersForLineNumbers(options); + + var doc = options.value; + if (typeof doc == "string") { doc = new Doc(doc, options.mode, null, options.lineSeparator, options.direction); } + this.doc = doc; + + var input = new CodeMirror$1.inputStyles[options.inputStyle](this); + var display = this.display = new Display(place, doc, input); + display.wrapper.CodeMirror = this; + updateGutters(this); + themeChanged(this); + if (options.lineWrapping) + { this.display.wrapper.className += " CodeMirror-wrap"; } + initScrollbars(this); + + this.state = { + keyMaps: [], // stores maps added by addKeyMap + overlays: [], // highlighting overlays, as added by addOverlay + modeGen: 0, // bumped when mode/overlay changes, used to invalidate highlighting info + overwrite: false, + delayingBlurEvent: false, + focused: false, + suppressEdits: false, // used to disable editing during key handlers when in readOnly mode + pasteIncoming: false, cutIncoming: false, // help recognize paste/cut edits in input.poll + selectingText: false, + draggingText: false, + highlight: new Delayed(), // stores highlight worker timeout + keySeq: null, // Unfinished key sequence + specialChars: null + }; + + if (options.autofocus && !mobile) { display.input.focus(); } + + // Override magic textarea content restore that IE sometimes does + // on our hidden textarea on reload + if (ie && ie_version < 11) { setTimeout(function () { return this$1.display.input.reset(true); }, 20); } + + registerEventHandlers(this); + ensureGlobalHandlers(); + + startOperation(this); + this.curOp.forceUpdate = true; + attachDoc(this, doc); + + if ((options.autofocus && !mobile) || this.hasFocus()) + { setTimeout(bind(onFocus, this), 20); } + else + { onBlur(this); } + + for (var opt in optionHandlers) { if (optionHandlers.hasOwnProperty(opt)) + { optionHandlers[opt](this$1, options[opt], Init); } } + maybeUpdateLineNumberWidth(this); + if (options.finishInit) { options.finishInit(this); } + for (var i = 0; i < initHooks.length; ++i) { initHooks[i](this$1); } + endOperation(this); + // Suppress optimizelegibility in Webkit, since it breaks text + // measuring on line wrapping boundaries. + if (webkit && options.lineWrapping && + getComputedStyle(display.lineDiv).textRendering == "optimizelegibility") + { display.lineDiv.style.textRendering = "auto"; } +} + +// The default configuration options. +CodeMirror$1.defaults = defaults; +// Functions to run when options are changed. +CodeMirror$1.optionHandlers = optionHandlers; + +// Attach the necessary event handlers when initializing the editor +function registerEventHandlers(cm) { + var d = cm.display; + on(d.scroller, "mousedown", operation(cm, onMouseDown)); + // Older IE's will not fire a second mousedown for a double click + if (ie && ie_version < 11) + { on(d.scroller, "dblclick", operation(cm, function (e) { + if (signalDOMEvent(cm, e)) { return } + var pos = posFromMouse(cm, e); + if (!pos || clickInGutter(cm, e) || eventInWidget(cm.display, e)) { return } + e_preventDefault(e); + var word = cm.findWordAt(pos); + extendSelection(cm.doc, word.anchor, word.head); + })); } + else + { on(d.scroller, "dblclick", function (e) { return signalDOMEvent(cm, e) || e_preventDefault(e); }); } + // Some browsers fire contextmenu *after* opening the menu, at + // which point we can't mess with it anymore. Context menu is + // handled in onMouseDown for these browsers. + if (!captureRightClick) { on(d.scroller, "contextmenu", function (e) { return onContextMenu(cm, e); }); } + + // Used to suppress mouse event handling when a touch happens + var touchFinished, prevTouch = {end: 0}; + function finishTouch() { + if (d.activeTouch) { + touchFinished = setTimeout(function () { return d.activeTouch = null; }, 1000); + prevTouch = d.activeTouch; + prevTouch.end = +new Date; + } + } + function isMouseLikeTouchEvent(e) { + if (e.touches.length != 1) { return false } + var touch = e.touches[0]; + return touch.radiusX <= 1 && touch.radiusY <= 1 + } + function farAway(touch, other) { + if (other.left == null) { return true } + var dx = other.left - touch.left, dy = other.top - touch.top; + return dx * dx + dy * dy > 20 * 20 + } + on(d.scroller, "touchstart", function (e) { + if (!signalDOMEvent(cm, e) && !isMouseLikeTouchEvent(e)) { + d.input.ensurePolled(); + clearTimeout(touchFinished); + var now = +new Date; + d.activeTouch = {start: now, moved: false, + prev: now - prevTouch.end <= 300 ? prevTouch : null}; + if (e.touches.length == 1) { + d.activeTouch.left = e.touches[0].pageX; + d.activeTouch.top = e.touches[0].pageY; + } + } + }); + on(d.scroller, "touchmove", function () { + if (d.activeTouch) { d.activeTouch.moved = true; } + }); + on(d.scroller, "touchend", function (e) { + var touch = d.activeTouch; + if (touch && !eventInWidget(d, e) && touch.left != null && + !touch.moved && new Date - touch.start < 300) { + var pos = cm.coordsChar(d.activeTouch, "page"), range; + if (!touch.prev || farAway(touch, touch.prev)) // Single tap + { range = new Range(pos, pos); } + else if (!touch.prev.prev || farAway(touch, touch.prev.prev)) // Double tap + { range = cm.findWordAt(pos); } + else // Triple tap + { range = new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0))); } + cm.setSelection(range.anchor, range.head); + cm.focus(); + e_preventDefault(e); + } + finishTouch(); + }); + on(d.scroller, "touchcancel", finishTouch); + + // Sync scrolling between fake scrollbars and real scrollable + // area, ensure viewport is updated when scrolling. + on(d.scroller, "scroll", function () { + if (d.scroller.clientHeight) { + updateScrollTop(cm, d.scroller.scrollTop); + setScrollLeft(cm, d.scroller.scrollLeft, true); + signal(cm, "scroll", cm); + } + }); + + // Listen to wheel events in order to try and update the viewport on time. + on(d.scroller, "mousewheel", function (e) { return onScrollWheel(cm, e); }); + on(d.scroller, "DOMMouseScroll", function (e) { return onScrollWheel(cm, e); }); + + // Prevent wrapper from ever scrolling + on(d.wrapper, "scroll", function () { return d.wrapper.scrollTop = d.wrapper.scrollLeft = 0; }); + + d.dragFunctions = { + enter: function (e) {if (!signalDOMEvent(cm, e)) { e_stop(e); }}, + over: function (e) {if (!signalDOMEvent(cm, e)) { onDragOver(cm, e); e_stop(e); }}, + start: function (e) { return onDragStart(cm, e); }, + drop: operation(cm, onDrop), + leave: function (e) {if (!signalDOMEvent(cm, e)) { clearDragCursor(cm); }} + }; + + var inp = d.input.getField(); + on(inp, "keyup", function (e) { return onKeyUp.call(cm, e); }); + on(inp, "keydown", operation(cm, onKeyDown)); + on(inp, "keypress", operation(cm, onKeyPress)); + on(inp, "focus", function (e) { return onFocus(cm, e); }); + on(inp, "blur", function (e) { return onBlur(cm, e); }); +} + +var initHooks = []; +CodeMirror$1.defineInitHook = function (f) { return initHooks.push(f); }; + +// Indent the given line. The how parameter can be "smart", +// "add"/null, "subtract", or "prev". When aggressive is false +// (typically set to true for forced single-line indents), empty +// lines are not indented, and places where the mode returns Pass +// are left alone. +function indentLine(cm, n, how, aggressive) { + var doc = cm.doc, state; + if (how == null) { how = "add"; } + if (how == "smart") { + // Fall back to "prev" when the mode doesn't have an indentation + // method. + if (!doc.mode.indent) { how = "prev"; } + else { state = getContextBefore(cm, n).state; } + } + + var tabSize = cm.options.tabSize; + var line = getLine(doc, n), curSpace = countColumn(line.text, null, tabSize); + if (line.stateAfter) { line.stateAfter = null; } + var curSpaceString = line.text.match(/^\s*/)[0], indentation; + if (!aggressive && !/\S/.test(line.text)) { + indentation = 0; + how = "not"; + } else if (how == "smart") { + indentation = doc.mode.indent(state, line.text.slice(curSpaceString.length), line.text); + if (indentation == Pass || indentation > 150) { + if (!aggressive) { return } + how = "prev"; + } + } + if (how == "prev") { + if (n > doc.first) { indentation = countColumn(getLine(doc, n-1).text, null, tabSize); } + else { indentation = 0; } + } else if (how == "add") { + indentation = curSpace + cm.options.indentUnit; + } else if (how == "subtract") { + indentation = curSpace - cm.options.indentUnit; + } else if (typeof how == "number") { + indentation = curSpace + how; + } + indentation = Math.max(0, indentation); + + var indentString = "", pos = 0; + if (cm.options.indentWithTabs) + { for (var i = Math.floor(indentation / tabSize); i; --i) {pos += tabSize; indentString += "\t";} } + if (pos < indentation) { indentString += spaceStr(indentation - pos); } + + if (indentString != curSpaceString) { + replaceRange(doc, indentString, Pos(n, 0), Pos(n, curSpaceString.length), "+input"); + line.stateAfter = null; + return true + } else { + // Ensure that, if the cursor was in the whitespace at the start + // of the line, it is moved to the end of that space. + for (var i$1 = 0; i$1 < doc.sel.ranges.length; i$1++) { + var range = doc.sel.ranges[i$1]; + if (range.head.line == n && range.head.ch < curSpaceString.length) { + var pos$1 = Pos(n, curSpaceString.length); + replaceOneSelection(doc, i$1, new Range(pos$1, pos$1)); + break + } + } + } +} + +// This will be set to a {lineWise: bool, text: [string]} object, so +// that, when pasting, we know what kind of selections the copied +// text was made out of. +var lastCopied = null; + +function setLastCopied(newLastCopied) { + lastCopied = newLastCopied; +} + +function applyTextInput(cm, inserted, deleted, sel, origin) { + var doc = cm.doc; + cm.display.shift = false; + if (!sel) { sel = doc.sel; } + + var paste = cm.state.pasteIncoming || origin == "paste"; + var textLines = splitLinesAuto(inserted), multiPaste = null; + // When pasing N lines into N selections, insert one line per selection + if (paste && sel.ranges.length > 1) { + if (lastCopied && lastCopied.text.join("\n") == inserted) { + if (sel.ranges.length % lastCopied.text.length == 0) { + multiPaste = []; + for (var i = 0; i < lastCopied.text.length; i++) + { multiPaste.push(doc.splitLines(lastCopied.text[i])); } + } + } else if (textLines.length == sel.ranges.length && cm.options.pasteLinesPerSelection) { + multiPaste = map(textLines, function (l) { return [l]; }); + } + } + + var updateInput; + // Normal behavior is to insert the new text into every selection + for (var i$1 = sel.ranges.length - 1; i$1 >= 0; i$1--) { + var range$$1 = sel.ranges[i$1]; + var from = range$$1.from(), to = range$$1.to(); + if (range$$1.empty()) { + if (deleted && deleted > 0) // Handle deletion + { from = Pos(from.line, from.ch - deleted); } + else if (cm.state.overwrite && !paste) // Handle overwrite + { to = Pos(to.line, Math.min(getLine(doc, to.line).text.length, to.ch + lst(textLines).length)); } + else if (lastCopied && lastCopied.lineWise && lastCopied.text.join("\n") == inserted) + { from = to = Pos(from.line, 0); } + } + updateInput = cm.curOp.updateInput; + var changeEvent = {from: from, to: to, text: multiPaste ? multiPaste[i$1 % multiPaste.length] : textLines, + origin: origin || (paste ? "paste" : cm.state.cutIncoming ? "cut" : "+input")}; + makeChange(cm.doc, changeEvent); + signalLater(cm, "inputRead", cm, changeEvent); + } + if (inserted && !paste) + { triggerElectric(cm, inserted); } + + ensureCursorVisible(cm); + cm.curOp.updateInput = updateInput; + cm.curOp.typing = true; + cm.state.pasteIncoming = cm.state.cutIncoming = false; +} + +function handlePaste(e, cm) { + var pasted = e.clipboardData && e.clipboardData.getData("Text"); + if (pasted) { + e.preventDefault(); + if (!cm.isReadOnly() && !cm.options.disableInput) + { runInOp(cm, function () { return applyTextInput(cm, pasted, 0, null, "paste"); }); } + return true + } +} + +function triggerElectric(cm, inserted) { + // When an 'electric' character is inserted, immediately trigger a reindent + if (!cm.options.electricChars || !cm.options.smartIndent) { return } + var sel = cm.doc.sel; + + for (var i = sel.ranges.length - 1; i >= 0; i--) { + var range$$1 = sel.ranges[i]; + if (range$$1.head.ch > 100 || (i && sel.ranges[i - 1].head.line == range$$1.head.line)) { continue } + var mode = cm.getModeAt(range$$1.head); + var indented = false; + if (mode.electricChars) { + for (var j = 0; j < mode.electricChars.length; j++) + { if (inserted.indexOf(mode.electricChars.charAt(j)) > -1) { + indented = indentLine(cm, range$$1.head.line, "smart"); + break + } } + } else if (mode.electricInput) { + if (mode.electricInput.test(getLine(cm.doc, range$$1.head.line).text.slice(0, range$$1.head.ch))) + { indented = indentLine(cm, range$$1.head.line, "smart"); } + } + if (indented) { signalLater(cm, "electricInput", cm, range$$1.head.line); } + } +} + +function copyableRanges(cm) { + var text = [], ranges = []; + for (var i = 0; i < cm.doc.sel.ranges.length; i++) { + var line = cm.doc.sel.ranges[i].head.line; + var lineRange = {anchor: Pos(line, 0), head: Pos(line + 1, 0)}; + ranges.push(lineRange); + text.push(cm.getRange(lineRange.anchor, lineRange.head)); + } + return {text: text, ranges: ranges} +} + +function disableBrowserMagic(field, spellcheck) { + field.setAttribute("autocorrect", "off"); + field.setAttribute("autocapitalize", "off"); + field.setAttribute("spellcheck", !!spellcheck); +} + +function hiddenTextarea() { + var te = elt("textarea", null, null, "position: absolute; bottom: -1em; padding: 0; width: 1px; height: 1em; outline: none"); + var div = elt("div", [te], null, "overflow: hidden; position: relative; width: 3px; height: 0px;"); + // The textarea is kept positioned near the cursor to prevent the + // fact that it'll be scrolled into view on input from scrolling + // our fake cursor out of view. On webkit, when wrap=off, paste is + // very slow. So make the area wide instead. + if (webkit) { te.style.width = "1000px"; } + else { te.setAttribute("wrap", "off"); } + // If border: 0; -- iOS fails to open keyboard (issue #1287) + if (ios) { te.style.border = "1px solid black"; } + disableBrowserMagic(te); + return div +} + +// The publicly visible API. Note that methodOp(f) means +// 'wrap f in an operation, performed on its `this` parameter'. + +// This is not the complete set of editor methods. Most of the +// methods defined on the Doc type are also injected into +// CodeMirror.prototype, for backwards compatibility and +// convenience. + +var addEditorMethods = function(CodeMirror) { + var optionHandlers = CodeMirror.optionHandlers; + + var helpers = CodeMirror.helpers = {}; + + CodeMirror.prototype = { + constructor: CodeMirror, + focus: function(){window.focus(); this.display.input.focus();}, + + setOption: function(option, value) { + var options = this.options, old = options[option]; + if (options[option] == value && option != "mode") { return } + options[option] = value; + if (optionHandlers.hasOwnProperty(option)) + { operation(this, optionHandlers[option])(this, value, old); } + signal(this, "optionChange", this, option); + }, + + getOption: function(option) {return this.options[option]}, + getDoc: function() {return this.doc}, + + addKeyMap: function(map$$1, bottom) { + this.state.keyMaps[bottom ? "push" : "unshift"](getKeyMap(map$$1)); + }, + removeKeyMap: function(map$$1) { + var maps = this.state.keyMaps; + for (var i = 0; i < maps.length; ++i) + { if (maps[i] == map$$1 || maps[i].name == map$$1) { + maps.splice(i, 1); + return true + } } + }, + + addOverlay: methodOp(function(spec, options) { + var mode = spec.token ? spec : CodeMirror.getMode(this.options, spec); + if (mode.startState) { throw new Error("Overlays may not be stateful.") } + insertSorted(this.state.overlays, + {mode: mode, modeSpec: spec, opaque: options && options.opaque, + priority: (options && options.priority) || 0}, + function (overlay) { return overlay.priority; }); + this.state.modeGen++; + regChange(this); + }), + removeOverlay: methodOp(function(spec) { + var this$1 = this; + + var overlays = this.state.overlays; + for (var i = 0; i < overlays.length; ++i) { + var cur = overlays[i].modeSpec; + if (cur == spec || typeof spec == "string" && cur.name == spec) { + overlays.splice(i, 1); + this$1.state.modeGen++; + regChange(this$1); + return + } + } + }), + + indentLine: methodOp(function(n, dir, aggressive) { + if (typeof dir != "string" && typeof dir != "number") { + if (dir == null) { dir = this.options.smartIndent ? "smart" : "prev"; } + else { dir = dir ? "add" : "subtract"; } + } + if (isLine(this.doc, n)) { indentLine(this, n, dir, aggressive); } + }), + indentSelection: methodOp(function(how) { + var this$1 = this; + + var ranges = this.doc.sel.ranges, end = -1; + for (var i = 0; i < ranges.length; i++) { + var range$$1 = ranges[i]; + if (!range$$1.empty()) { + var from = range$$1.from(), to = range$$1.to(); + var start = Math.max(end, from.line); + end = Math.min(this$1.lastLine(), to.line - (to.ch ? 0 : 1)) + 1; + for (var j = start; j < end; ++j) + { indentLine(this$1, j, how); } + var newRanges = this$1.doc.sel.ranges; + if (from.ch == 0 && ranges.length == newRanges.length && newRanges[i].from().ch > 0) + { replaceOneSelection(this$1.doc, i, new Range(from, newRanges[i].to()), sel_dontScroll); } + } else if (range$$1.head.line > end) { + indentLine(this$1, range$$1.head.line, how, true); + end = range$$1.head.line; + if (i == this$1.doc.sel.primIndex) { ensureCursorVisible(this$1); } + } + } + }), + + // Fetch the parser token for a given character. Useful for hacks + // that want to inspect the mode state (say, for completion). + getTokenAt: function(pos, precise) { + return takeToken(this, pos, precise) + }, + + getLineTokens: function(line, precise) { + return takeToken(this, Pos(line), precise, true) + }, + + getTokenTypeAt: function(pos) { + pos = clipPos(this.doc, pos); + var styles = getLineStyles(this, getLine(this.doc, pos.line)); + var before = 0, after = (styles.length - 1) / 2, ch = pos.ch; + var type; + if (ch == 0) { type = styles[2]; } + else { for (;;) { + var mid = (before + after) >> 1; + if ((mid ? styles[mid * 2 - 1] : 0) >= ch) { after = mid; } + else if (styles[mid * 2 + 1] < ch) { before = mid + 1; } + else { type = styles[mid * 2 + 2]; break } + } } + var cut = type ? type.indexOf("overlay ") : -1; + return cut < 0 ? type : cut == 0 ? null : type.slice(0, cut - 1) + }, + + getModeAt: function(pos) { + var mode = this.doc.mode; + if (!mode.innerMode) { return mode } + return CodeMirror.innerMode(mode, this.getTokenAt(pos).state).mode + }, + + getHelper: function(pos, type) { + return this.getHelpers(pos, type)[0] + }, + + getHelpers: function(pos, type) { + var this$1 = this; + + var found = []; + if (!helpers.hasOwnProperty(type)) { return found } + var help = helpers[type], mode = this.getModeAt(pos); + if (typeof mode[type] == "string") { + if (help[mode[type]]) { found.push(help[mode[type]]); } + } else if (mode[type]) { + for (var i = 0; i < mode[type].length; i++) { + var val = help[mode[type][i]]; + if (val) { found.push(val); } + } + } else if (mode.helperType && help[mode.helperType]) { + found.push(help[mode.helperType]); + } else if (help[mode.name]) { + found.push(help[mode.name]); + } + for (var i$1 = 0; i$1 < help._global.length; i$1++) { + var cur = help._global[i$1]; + if (cur.pred(mode, this$1) && indexOf(found, cur.val) == -1) + { found.push(cur.val); } + } + return found + }, + + getStateAfter: function(line, precise) { + var doc = this.doc; + line = clipLine(doc, line == null ? doc.first + doc.size - 1: line); + return getContextBefore(this, line + 1, precise).state + }, + + cursorCoords: function(start, mode) { + var pos, range$$1 = this.doc.sel.primary(); + if (start == null) { pos = range$$1.head; } + else if (typeof start == "object") { pos = clipPos(this.doc, start); } + else { pos = start ? range$$1.from() : range$$1.to(); } + return cursorCoords(this, pos, mode || "page") + }, + + charCoords: function(pos, mode) { + return charCoords(this, clipPos(this.doc, pos), mode || "page") + }, + + coordsChar: function(coords, mode) { + coords = fromCoordSystem(this, coords, mode || "page"); + return coordsChar(this, coords.left, coords.top) + }, + + lineAtHeight: function(height, mode) { + height = fromCoordSystem(this, {top: height, left: 0}, mode || "page").top; + return lineAtHeight(this.doc, height + this.display.viewOffset) + }, + heightAtLine: function(line, mode, includeWidgets) { + var end = false, lineObj; + if (typeof line == "number") { + var last = this.doc.first + this.doc.size - 1; + if (line < this.doc.first) { line = this.doc.first; } + else if (line > last) { line = last; end = true; } + lineObj = getLine(this.doc, line); + } else { + lineObj = line; + } + return intoCoordSystem(this, lineObj, {top: 0, left: 0}, mode || "page", includeWidgets || end).top + + (end ? this.doc.height - heightAtLine(lineObj) : 0) + }, + + defaultTextHeight: function() { return textHeight(this.display) }, + defaultCharWidth: function() { return charWidth(this.display) }, + + getViewport: function() { return {from: this.display.viewFrom, to: this.display.viewTo}}, + + addWidget: function(pos, node, scroll, vert, horiz) { + var display = this.display; + pos = cursorCoords(this, clipPos(this.doc, pos)); + var top = pos.bottom, left = pos.left; + node.style.position = "absolute"; + node.setAttribute("cm-ignore-events", "true"); + this.display.input.setUneditable(node); + display.sizer.appendChild(node); + if (vert == "over") { + top = pos.top; + } else if (vert == "above" || vert == "near") { + var vspace = Math.max(display.wrapper.clientHeight, this.doc.height), + hspace = Math.max(display.sizer.clientWidth, display.lineSpace.clientWidth); + // Default to positioning above (if specified and possible); otherwise default to positioning below + if ((vert == 'above' || pos.bottom + node.offsetHeight > vspace) && pos.top > node.offsetHeight) + { top = pos.top - node.offsetHeight; } + else if (pos.bottom + node.offsetHeight <= vspace) + { top = pos.bottom; } + if (left + node.offsetWidth > hspace) + { left = hspace - node.offsetWidth; } + } + node.style.top = top + "px"; + node.style.left = node.style.right = ""; + if (horiz == "right") { + left = display.sizer.clientWidth - node.offsetWidth; + node.style.right = "0px"; + } else { + if (horiz == "left") { left = 0; } + else if (horiz == "middle") { left = (display.sizer.clientWidth - node.offsetWidth) / 2; } + node.style.left = left + "px"; + } + if (scroll) + { scrollIntoView(this, {left: left, top: top, right: left + node.offsetWidth, bottom: top + node.offsetHeight}); } + }, + + triggerOnKeyDown: methodOp(onKeyDown), + triggerOnKeyPress: methodOp(onKeyPress), + triggerOnKeyUp: onKeyUp, + triggerOnMouseDown: methodOp(onMouseDown), + + execCommand: function(cmd) { + if (commands.hasOwnProperty(cmd)) + { return commands[cmd].call(null, this) } + }, + + triggerElectric: methodOp(function(text) { triggerElectric(this, text); }), + + findPosH: function(from, amount, unit, visually) { + var this$1 = this; + + var dir = 1; + if (amount < 0) { dir = -1; amount = -amount; } + var cur = clipPos(this.doc, from); + for (var i = 0; i < amount; ++i) { + cur = findPosH(this$1.doc, cur, dir, unit, visually); + if (cur.hitSide) { break } + } + return cur + }, + + moveH: methodOp(function(dir, unit) { + var this$1 = this; + + this.extendSelectionsBy(function (range$$1) { + if (this$1.display.shift || this$1.doc.extend || range$$1.empty()) + { return findPosH(this$1.doc, range$$1.head, dir, unit, this$1.options.rtlMoveVisually) } + else + { return dir < 0 ? range$$1.from() : range$$1.to() } + }, sel_move); + }), + + deleteH: methodOp(function(dir, unit) { + var sel = this.doc.sel, doc = this.doc; + if (sel.somethingSelected()) + { doc.replaceSelection("", null, "+delete"); } + else + { deleteNearSelection(this, function (range$$1) { + var other = findPosH(doc, range$$1.head, dir, unit, false); + return dir < 0 ? {from: other, to: range$$1.head} : {from: range$$1.head, to: other} + }); } + }), + + findPosV: function(from, amount, unit, goalColumn) { + var this$1 = this; + + var dir = 1, x = goalColumn; + if (amount < 0) { dir = -1; amount = -amount; } + var cur = clipPos(this.doc, from); + for (var i = 0; i < amount; ++i) { + var coords = cursorCoords(this$1, cur, "div"); + if (x == null) { x = coords.left; } + else { coords.left = x; } + cur = findPosV(this$1, coords, dir, unit); + if (cur.hitSide) { break } + } + return cur + }, + + moveV: methodOp(function(dir, unit) { + var this$1 = this; + + var doc = this.doc, goals = []; + var collapse = !this.display.shift && !doc.extend && doc.sel.somethingSelected(); + doc.extendSelectionsBy(function (range$$1) { + if (collapse) + { return dir < 0 ? range$$1.from() : range$$1.to() } + var headPos = cursorCoords(this$1, range$$1.head, "div"); + if (range$$1.goalColumn != null) { headPos.left = range$$1.goalColumn; } + goals.push(headPos.left); + var pos = findPosV(this$1, headPos, dir, unit); + if (unit == "page" && range$$1 == doc.sel.primary()) + { addToScrollTop(this$1, charCoords(this$1, pos, "div").top - headPos.top); } + return pos + }, sel_move); + if (goals.length) { for (var i = 0; i < doc.sel.ranges.length; i++) + { doc.sel.ranges[i].goalColumn = goals[i]; } } + }), + + // Find the word at the given position (as returned by coordsChar). + findWordAt: function(pos) { + var doc = this.doc, line = getLine(doc, pos.line).text; + var start = pos.ch, end = pos.ch; + if (line) { + var helper = this.getHelper(pos, "wordChars"); + if ((pos.sticky == "before" || end == line.length) && start) { --start; } else { ++end; } + var startChar = line.charAt(start); + var check = isWordChar(startChar, helper) + ? function (ch) { return isWordChar(ch, helper); } + : /\s/.test(startChar) ? function (ch) { return /\s/.test(ch); } + : function (ch) { return (!/\s/.test(ch) && !isWordChar(ch)); }; + while (start > 0 && check(line.charAt(start - 1))) { --start; } + while (end < line.length && check(line.charAt(end))) { ++end; } + } + return new Range(Pos(pos.line, start), Pos(pos.line, end)) + }, + + toggleOverwrite: function(value) { + if (value != null && value == this.state.overwrite) { return } + if (this.state.overwrite = !this.state.overwrite) + { addClass(this.display.cursorDiv, "CodeMirror-overwrite"); } + else + { rmClass(this.display.cursorDiv, "CodeMirror-overwrite"); } + + signal(this, "overwriteToggle", this, this.state.overwrite); + }, + hasFocus: function() { return this.display.input.getField() == activeElt() }, + isReadOnly: function() { return !!(this.options.readOnly || this.doc.cantEdit) }, + + scrollTo: methodOp(function (x, y) { scrollToCoords(this, x, y); }), + getScrollInfo: function() { + var scroller = this.display.scroller; + return {left: scroller.scrollLeft, top: scroller.scrollTop, + height: scroller.scrollHeight - scrollGap(this) - this.display.barHeight, + width: scroller.scrollWidth - scrollGap(this) - this.display.barWidth, + clientHeight: displayHeight(this), clientWidth: displayWidth(this)} + }, + + scrollIntoView: methodOp(function(range$$1, margin) { + if (range$$1 == null) { + range$$1 = {from: this.doc.sel.primary().head, to: null}; + if (margin == null) { margin = this.options.cursorScrollMargin; } + } else if (typeof range$$1 == "number") { + range$$1 = {from: Pos(range$$1, 0), to: null}; + } else if (range$$1.from == null) { + range$$1 = {from: range$$1, to: null}; + } + if (!range$$1.to) { range$$1.to = range$$1.from; } + range$$1.margin = margin || 0; + + if (range$$1.from.line != null) { + scrollToRange(this, range$$1); + } else { + scrollToCoordsRange(this, range$$1.from, range$$1.to, range$$1.margin); + } + }), + + setSize: methodOp(function(width, height) { + var this$1 = this; + + var interpret = function (val) { return typeof val == "number" || /^\d+$/.test(String(val)) ? val + "px" : val; }; + if (width != null) { this.display.wrapper.style.width = interpret(width); } + if (height != null) { this.display.wrapper.style.height = interpret(height); } + if (this.options.lineWrapping) { clearLineMeasurementCache(this); } + var lineNo$$1 = this.display.viewFrom; + this.doc.iter(lineNo$$1, this.display.viewTo, function (line) { + if (line.widgets) { for (var i = 0; i < line.widgets.length; i++) + { if (line.widgets[i].noHScroll) { regLineChange(this$1, lineNo$$1, "widget"); break } } } + ++lineNo$$1; + }); + this.curOp.forceUpdate = true; + signal(this, "refresh", this); + }), + + operation: function(f){return runInOp(this, f)}, + + refresh: methodOp(function() { + var oldHeight = this.display.cachedTextHeight; + regChange(this); + this.curOp.forceUpdate = true; + clearCaches(this); + scrollToCoords(this, this.doc.scrollLeft, this.doc.scrollTop); + updateGutterSpace(this); + if (oldHeight == null || Math.abs(oldHeight - textHeight(this.display)) > .5) + { estimateLineHeights(this); } + signal(this, "refresh", this); + }), + + swapDoc: methodOp(function(doc) { + var old = this.doc; + old.cm = null; + attachDoc(this, doc); + clearCaches(this); + this.display.input.reset(); + scrollToCoords(this, doc.scrollLeft, doc.scrollTop); + this.curOp.forceScroll = true; + signalLater(this, "swapDoc", this, old); + return old + }), + + getInputField: function(){return this.display.input.getField()}, + getWrapperElement: function(){return this.display.wrapper}, + getScrollerElement: function(){return this.display.scroller}, + getGutterElement: function(){return this.display.gutters} + }; + eventMixin(CodeMirror); + + CodeMirror.registerHelper = function(type, name, value) { + if (!helpers.hasOwnProperty(type)) { helpers[type] = CodeMirror[type] = {_global: []}; } + helpers[type][name] = value; + }; + CodeMirror.registerGlobalHelper = function(type, name, predicate, value) { + CodeMirror.registerHelper(type, name, value); + helpers[type]._global.push({pred: predicate, val: value}); + }; +}; + +// Used for horizontal relative motion. Dir is -1 or 1 (left or +// right), unit can be "char", "column" (like char, but doesn't +// cross line boundaries), "word" (across next word), or "group" (to +// the start of next group of word or non-word-non-whitespace +// chars). The visually param controls whether, in right-to-left +// text, direction 1 means to move towards the next index in the +// string, or towards the character to the right of the current +// position. The resulting position will have a hitSide=true +// property if it reached the end of the document. +function findPosH(doc, pos, dir, unit, visually) { + var oldPos = pos; + var origDir = dir; + var lineObj = getLine(doc, pos.line); + function findNextLine() { + var l = pos.line + dir; + if (l < doc.first || l >= doc.first + doc.size) { return false } + pos = new Pos(l, pos.ch, pos.sticky); + return lineObj = getLine(doc, l) + } + function moveOnce(boundToLine) { + var next; + if (visually) { + next = moveVisually(doc.cm, lineObj, pos, dir); + } else { + next = moveLogically(lineObj, pos, dir); + } + if (next == null) { + if (!boundToLine && findNextLine()) + { pos = endOfLine(visually, doc.cm, lineObj, pos.line, dir); } + else + { return false } + } else { + pos = next; + } + return true + } + + if (unit == "char") { + moveOnce(); + } else if (unit == "column") { + moveOnce(true); + } else if (unit == "word" || unit == "group") { + var sawType = null, group = unit == "group"; + var helper = doc.cm && doc.cm.getHelper(pos, "wordChars"); + for (var first = true;; first = false) { + if (dir < 0 && !moveOnce(!first)) { break } + var cur = lineObj.text.charAt(pos.ch) || "\n"; + var type = isWordChar(cur, helper) ? "w" + : group && cur == "\n" ? "n" + : !group || /\s/.test(cur) ? null + : "p"; + if (group && !first && !type) { type = "s"; } + if (sawType && sawType != type) { + if (dir < 0) {dir = 1; moveOnce(); pos.sticky = "after";} + break + } + + if (type) { sawType = type; } + if (dir > 0 && !moveOnce(!first)) { break } + } + } + var result = skipAtomic(doc, pos, oldPos, origDir, true); + if (equalCursorPos(oldPos, result)) { result.hitSide = true; } + return result +} + +// For relative vertical movement. Dir may be -1 or 1. Unit can be +// "page" or "line". The resulting position will have a hitSide=true +// property if it reached the end of the document. +function findPosV(cm, pos, dir, unit) { + var doc = cm.doc, x = pos.left, y; + if (unit == "page") { + var pageSize = Math.min(cm.display.wrapper.clientHeight, window.innerHeight || document.documentElement.clientHeight); + var moveAmount = Math.max(pageSize - .5 * textHeight(cm.display), 3); + y = (dir > 0 ? pos.bottom : pos.top) + dir * moveAmount; + + } else if (unit == "line") { + y = dir > 0 ? pos.bottom + 3 : pos.top - 3; + } + var target; + for (;;) { + target = coordsChar(cm, x, y); + if (!target.outside) { break } + if (dir < 0 ? y <= 0 : y >= doc.height) { target.hitSide = true; break } + y += dir * 5; + } + return target +} + +// CONTENTEDITABLE INPUT STYLE + +var ContentEditableInput = function(cm) { + this.cm = cm; + this.lastAnchorNode = this.lastAnchorOffset = this.lastFocusNode = this.lastFocusOffset = null; + this.polling = new Delayed(); + this.composing = null; + this.gracePeriod = false; + this.readDOMTimeout = null; +}; + +ContentEditableInput.prototype.init = function (display) { + var this$1 = this; + + var input = this, cm = input.cm; + var div = input.div = display.lineDiv; + disableBrowserMagic(div, cm.options.spellcheck); + + on(div, "paste", function (e) { + if (signalDOMEvent(cm, e) || handlePaste(e, cm)) { return } + // IE doesn't fire input events, so we schedule a read for the pasted content in this way + if (ie_version <= 11) { setTimeout(operation(cm, function () { return this$1.updateFromDOM(); }), 20); } + }); + + on(div, "compositionstart", function (e) { + this$1.composing = {data: e.data, done: false}; + }); + on(div, "compositionupdate", function (e) { + if (!this$1.composing) { this$1.composing = {data: e.data, done: false}; } + }); + on(div, "compositionend", function (e) { + if (this$1.composing) { + if (e.data != this$1.composing.data) { this$1.readFromDOMSoon(); } + this$1.composing.done = true; + } + }); + + on(div, "touchstart", function () { return input.forceCompositionEnd(); }); + + on(div, "input", function () { + if (!this$1.composing) { this$1.readFromDOMSoon(); } + }); + + function onCopyCut(e) { + if (signalDOMEvent(cm, e)) { return } + if (cm.somethingSelected()) { + setLastCopied({lineWise: false, text: cm.getSelections()}); + if (e.type == "cut") { cm.replaceSelection("", null, "cut"); } + } else if (!cm.options.lineWiseCopyCut) { + return + } else { + var ranges = copyableRanges(cm); + setLastCopied({lineWise: true, text: ranges.text}); + if (e.type == "cut") { + cm.operation(function () { + cm.setSelections(ranges.ranges, 0, sel_dontScroll); + cm.replaceSelection("", null, "cut"); + }); + } + } + if (e.clipboardData) { + e.clipboardData.clearData(); + var content = lastCopied.text.join("\n"); + // iOS exposes the clipboard API, but seems to discard content inserted into it + e.clipboardData.setData("Text", content); + if (e.clipboardData.getData("Text") == content) { + e.preventDefault(); + return + } + } + // Old-fashioned briefly-focus-a-textarea hack + var kludge = hiddenTextarea(), te = kludge.firstChild; + cm.display.lineSpace.insertBefore(kludge, cm.display.lineSpace.firstChild); + te.value = lastCopied.text.join("\n"); + var hadFocus = document.activeElement; + selectInput(te); + setTimeout(function () { + cm.display.lineSpace.removeChild(kludge); + hadFocus.focus(); + if (hadFocus == div) { input.showPrimarySelection(); } + }, 50); + } + on(div, "copy", onCopyCut); + on(div, "cut", onCopyCut); +}; + +ContentEditableInput.prototype.prepareSelection = function () { + var result = prepareSelection(this.cm, false); + result.focus = this.cm.state.focused; + return result +}; + +ContentEditableInput.prototype.showSelection = function (info, takeFocus) { + if (!info || !this.cm.display.view.length) { return } + if (info.focus || takeFocus) { this.showPrimarySelection(); } + this.showMultipleSelections(info); +}; + +ContentEditableInput.prototype.showPrimarySelection = function () { + var sel = window.getSelection(), cm = this.cm, prim = cm.doc.sel.primary(); + var from = prim.from(), to = prim.to(); + + if (cm.display.viewTo == cm.display.viewFrom || from.line >= cm.display.viewTo || to.line < cm.display.viewFrom) { + sel.removeAllRanges(); + return + } + + var curAnchor = domToPos(cm, sel.anchorNode, sel.anchorOffset); + var curFocus = domToPos(cm, sel.focusNode, sel.focusOffset); + if (curAnchor && !curAnchor.bad && curFocus && !curFocus.bad && + cmp(minPos(curAnchor, curFocus), from) == 0 && + cmp(maxPos(curAnchor, curFocus), to) == 0) + { return } + + var view = cm.display.view; + var start = (from.line >= cm.display.viewFrom && posToDOM(cm, from)) || + {node: view[0].measure.map[2], offset: 0}; + var end = to.line < cm.display.viewTo && posToDOM(cm, to); + if (!end) { + var measure = view[view.length - 1].measure; + var map$$1 = measure.maps ? measure.maps[measure.maps.length - 1] : measure.map; + end = {node: map$$1[map$$1.length - 1], offset: map$$1[map$$1.length - 2] - map$$1[map$$1.length - 3]}; + } + + if (!start || !end) { + sel.removeAllRanges(); + return + } + + var old = sel.rangeCount && sel.getRangeAt(0), rng; + try { rng = range(start.node, start.offset, end.offset, end.node); } + catch(e) {} // Our model of the DOM might be outdated, in which case the range we try to set can be impossible + if (rng) { + if (!gecko && cm.state.focused) { + sel.collapse(start.node, start.offset); + if (!rng.collapsed) { + sel.removeAllRanges(); + sel.addRange(rng); + } + } else { + sel.removeAllRanges(); + sel.addRange(rng); + } + if (old && sel.anchorNode == null) { sel.addRange(old); } + else if (gecko) { this.startGracePeriod(); } + } + this.rememberSelection(); +}; + +ContentEditableInput.prototype.startGracePeriod = function () { + var this$1 = this; + + clearTimeout(this.gracePeriod); + this.gracePeriod = setTimeout(function () { + this$1.gracePeriod = false; + if (this$1.selectionChanged()) + { this$1.cm.operation(function () { return this$1.cm.curOp.selectionChanged = true; }); } + }, 20); +}; + +ContentEditableInput.prototype.showMultipleSelections = function (info) { + removeChildrenAndAdd(this.cm.display.cursorDiv, info.cursors); + removeChildrenAndAdd(this.cm.display.selectionDiv, info.selection); +}; + +ContentEditableInput.prototype.rememberSelection = function () { + var sel = window.getSelection(); + this.lastAnchorNode = sel.anchorNode; this.lastAnchorOffset = sel.anchorOffset; + this.lastFocusNode = sel.focusNode; this.lastFocusOffset = sel.focusOffset; +}; + +ContentEditableInput.prototype.selectionInEditor = function () { + var sel = window.getSelection(); + if (!sel.rangeCount) { return false } + var node = sel.getRangeAt(0).commonAncestorContainer; + return contains(this.div, node) +}; + +ContentEditableInput.prototype.focus = function () { + if (this.cm.options.readOnly != "nocursor") { + if (!this.selectionInEditor()) + { this.showSelection(this.prepareSelection(), true); } + this.div.focus(); + } +}; +ContentEditableInput.prototype.blur = function () { this.div.blur(); }; +ContentEditableInput.prototype.getField = function () { return this.div }; + +ContentEditableInput.prototype.supportsTouch = function () { return true }; + +ContentEditableInput.prototype.receivedFocus = function () { + var input = this; + if (this.selectionInEditor()) + { this.pollSelection(); } + else + { runInOp(this.cm, function () { return input.cm.curOp.selectionChanged = true; }); } + + function poll() { + if (input.cm.state.focused) { + input.pollSelection(); + input.polling.set(input.cm.options.pollInterval, poll); + } + } + this.polling.set(this.cm.options.pollInterval, poll); +}; + +ContentEditableInput.prototype.selectionChanged = function () { + var sel = window.getSelection(); + return sel.anchorNode != this.lastAnchorNode || sel.anchorOffset != this.lastAnchorOffset || + sel.focusNode != this.lastFocusNode || sel.focusOffset != this.lastFocusOffset +}; + +ContentEditableInput.prototype.pollSelection = function () { + if (this.readDOMTimeout != null || this.gracePeriod || !this.selectionChanged()) { return } + var sel = window.getSelection(), cm = this.cm; + // On Android Chrome (version 56, at least), backspacing into an + // uneditable block element will put the cursor in that element, + // and then, because it's not editable, hide the virtual keyboard. + // Because Android doesn't allow us to actually detect backspace + // presses in a sane way, this code checks for when that happens + // and simulates a backspace press in this case. + if (android && chrome && this.cm.options.gutters.length && isInGutter(sel.anchorNode)) { + this.cm.triggerOnKeyDown({type: "keydown", keyCode: 8, preventDefault: Math.abs}); + this.blur(); + this.focus(); + return + } + if (this.composing) { return } + this.rememberSelection(); + var anchor = domToPos(cm, sel.anchorNode, sel.anchorOffset); + var head = domToPos(cm, sel.focusNode, sel.focusOffset); + if (anchor && head) { runInOp(cm, function () { + setSelection(cm.doc, simpleSelection(anchor, head), sel_dontScroll); + if (anchor.bad || head.bad) { cm.curOp.selectionChanged = true; } + }); } +}; + +ContentEditableInput.prototype.pollContent = function () { + if (this.readDOMTimeout != null) { + clearTimeout(this.readDOMTimeout); + this.readDOMTimeout = null; + } + + var cm = this.cm, display = cm.display, sel = cm.doc.sel.primary(); + var from = sel.from(), to = sel.to(); + if (from.ch == 0 && from.line > cm.firstLine()) + { from = Pos(from.line - 1, getLine(cm.doc, from.line - 1).length); } + if (to.ch == getLine(cm.doc, to.line).text.length && to.line < cm.lastLine()) + { to = Pos(to.line + 1, 0); } + if (from.line < display.viewFrom || to.line > display.viewTo - 1) { return false } + + var fromIndex, fromLine, fromNode; + if (from.line == display.viewFrom || (fromIndex = findViewIndex(cm, from.line)) == 0) { + fromLine = lineNo(display.view[0].line); + fromNode = display.view[0].node; + } else { + fromLine = lineNo(display.view[fromIndex].line); + fromNode = display.view[fromIndex - 1].node.nextSibling; + } + var toIndex = findViewIndex(cm, to.line); + var toLine, toNode; + if (toIndex == display.view.length - 1) { + toLine = display.viewTo - 1; + toNode = display.lineDiv.lastChild; + } else { + toLine = lineNo(display.view[toIndex + 1].line) - 1; + toNode = display.view[toIndex + 1].node.previousSibling; + } + + if (!fromNode) { return false } + var newText = cm.doc.splitLines(domTextBetween(cm, fromNode, toNode, fromLine, toLine)); + var oldText = getBetween(cm.doc, Pos(fromLine, 0), Pos(toLine, getLine(cm.doc, toLine).text.length)); + while (newText.length > 1 && oldText.length > 1) { + if (lst(newText) == lst(oldText)) { newText.pop(); oldText.pop(); toLine--; } + else if (newText[0] == oldText[0]) { newText.shift(); oldText.shift(); fromLine++; } + else { break } + } + + var cutFront = 0, cutEnd = 0; + var newTop = newText[0], oldTop = oldText[0], maxCutFront = Math.min(newTop.length, oldTop.length); + while (cutFront < maxCutFront && newTop.charCodeAt(cutFront) == oldTop.charCodeAt(cutFront)) + { ++cutFront; } + var newBot = lst(newText), oldBot = lst(oldText); + var maxCutEnd = Math.min(newBot.length - (newText.length == 1 ? cutFront : 0), + oldBot.length - (oldText.length == 1 ? cutFront : 0)); + while (cutEnd < maxCutEnd && + newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1)) + { ++cutEnd; } + // Try to move start of change to start of selection if ambiguous + if (newText.length == 1 && oldText.length == 1 && fromLine == from.line) { + while (cutFront && cutFront > from.ch && + newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1)) { + cutFront--; + cutEnd++; + } + } + + newText[newText.length - 1] = newBot.slice(0, newBot.length - cutEnd).replace(/^\u200b+/, ""); + newText[0] = newText[0].slice(cutFront).replace(/\u200b+$/, ""); + + var chFrom = Pos(fromLine, cutFront); + var chTo = Pos(toLine, oldText.length ? lst(oldText).length - cutEnd : 0); + if (newText.length > 1 || newText[0] || cmp(chFrom, chTo)) { + replaceRange(cm.doc, newText, chFrom, chTo, "+input"); + return true + } +}; + +ContentEditableInput.prototype.ensurePolled = function () { + this.forceCompositionEnd(); +}; +ContentEditableInput.prototype.reset = function () { + this.forceCompositionEnd(); +}; +ContentEditableInput.prototype.forceCompositionEnd = function () { + if (!this.composing) { return } + clearTimeout(this.readDOMTimeout); + this.composing = null; + this.updateFromDOM(); + this.div.blur(); + this.div.focus(); +}; +ContentEditableInput.prototype.readFromDOMSoon = function () { + var this$1 = this; + + if (this.readDOMTimeout != null) { return } + this.readDOMTimeout = setTimeout(function () { + this$1.readDOMTimeout = null; + if (this$1.composing) { + if (this$1.composing.done) { this$1.composing = null; } + else { return } + } + this$1.updateFromDOM(); + }, 80); +}; + +ContentEditableInput.prototype.updateFromDOM = function () { + var this$1 = this; + + if (this.cm.isReadOnly() || !this.pollContent()) + { runInOp(this.cm, function () { return regChange(this$1.cm); }); } +}; + +ContentEditableInput.prototype.setUneditable = function (node) { + node.contentEditable = "false"; +}; + +ContentEditableInput.prototype.onKeyPress = function (e) { + if (e.charCode == 0) { return } + e.preventDefault(); + if (!this.cm.isReadOnly()) + { operation(this.cm, applyTextInput)(this.cm, String.fromCharCode(e.charCode == null ? e.keyCode : e.charCode), 0); } +}; + +ContentEditableInput.prototype.readOnlyChanged = function (val) { + this.div.contentEditable = String(val != "nocursor"); +}; + +ContentEditableInput.prototype.onContextMenu = function () {}; +ContentEditableInput.prototype.resetPosition = function () {}; + +ContentEditableInput.prototype.needsContentAttribute = true; + +function posToDOM(cm, pos) { + var view = findViewForLine(cm, pos.line); + if (!view || view.hidden) { return null } + var line = getLine(cm.doc, pos.line); + var info = mapFromLineView(view, line, pos.line); + + var order = getOrder(line, cm.doc.direction), side = "left"; + if (order) { + var partPos = getBidiPartAt(order, pos.ch); + side = partPos % 2 ? "right" : "left"; + } + var result = nodeAndOffsetInLineMap(info.map, pos.ch, side); + result.offset = result.collapse == "right" ? result.end : result.start; + return result +} + +function isInGutter(node) { + for (var scan = node; scan; scan = scan.parentNode) + { if (/CodeMirror-gutter-wrapper/.test(scan.className)) { return true } } + return false +} + +function badPos(pos, bad) { if (bad) { pos.bad = true; } return pos } + +function domTextBetween(cm, from, to, fromLine, toLine) { + var text = "", closing = false, lineSep = cm.doc.lineSeparator(); + function recognizeMarker(id) { return function (marker) { return marker.id == id; } } + function close() { + if (closing) { + text += lineSep; + closing = false; + } + } + function addText(str) { + if (str) { + close(); + text += str; + } + } + function walk(node) { + if (node.nodeType == 1) { + var cmText = node.getAttribute("cm-text"); + if (cmText != null) { + addText(cmText || node.textContent.replace(/\u200b/g, "")); + return + } + var markerID = node.getAttribute("cm-marker"), range$$1; + if (markerID) { + var found = cm.findMarks(Pos(fromLine, 0), Pos(toLine + 1, 0), recognizeMarker(+markerID)); + if (found.length && (range$$1 = found[0].find())) + { addText(getBetween(cm.doc, range$$1.from, range$$1.to).join(lineSep)); } + return + } + if (node.getAttribute("contenteditable") == "false") { return } + var isBlock = /^(pre|div|p)$/i.test(node.nodeName); + if (isBlock) { close(); } + for (var i = 0; i < node.childNodes.length; i++) + { walk(node.childNodes[i]); } + if (isBlock) { closing = true; } + } else if (node.nodeType == 3) { + addText(node.nodeValue); + } + } + for (;;) { + walk(from); + if (from == to) { break } + from = from.nextSibling; + } + return text +} + +function domToPos(cm, node, offset) { + var lineNode; + if (node == cm.display.lineDiv) { + lineNode = cm.display.lineDiv.childNodes[offset]; + if (!lineNode) { return badPos(cm.clipPos(Pos(cm.display.viewTo - 1)), true) } + node = null; offset = 0; + } else { + for (lineNode = node;; lineNode = lineNode.parentNode) { + if (!lineNode || lineNode == cm.display.lineDiv) { return null } + if (lineNode.parentNode && lineNode.parentNode == cm.display.lineDiv) { break } + } + } + for (var i = 0; i < cm.display.view.length; i++) { + var lineView = cm.display.view[i]; + if (lineView.node == lineNode) + { return locateNodeInLineView(lineView, node, offset) } + } +} + +function locateNodeInLineView(lineView, node, offset) { + var wrapper = lineView.text.firstChild, bad = false; + if (!node || !contains(wrapper, node)) { return badPos(Pos(lineNo(lineView.line), 0), true) } + if (node == wrapper) { + bad = true; + node = wrapper.childNodes[offset]; + offset = 0; + if (!node) { + var line = lineView.rest ? lst(lineView.rest) : lineView.line; + return badPos(Pos(lineNo(line), line.text.length), bad) + } + } + + var textNode = node.nodeType == 3 ? node : null, topNode = node; + if (!textNode && node.childNodes.length == 1 && node.firstChild.nodeType == 3) { + textNode = node.firstChild; + if (offset) { offset = textNode.nodeValue.length; } + } + while (topNode.parentNode != wrapper) { topNode = topNode.parentNode; } + var measure = lineView.measure, maps = measure.maps; + + function find(textNode, topNode, offset) { + for (var i = -1; i < (maps ? maps.length : 0); i++) { + var map$$1 = i < 0 ? measure.map : maps[i]; + for (var j = 0; j < map$$1.length; j += 3) { + var curNode = map$$1[j + 2]; + if (curNode == textNode || curNode == topNode) { + var line = lineNo(i < 0 ? lineView.line : lineView.rest[i]); + var ch = map$$1[j] + offset; + if (offset < 0 || curNode != textNode) { ch = map$$1[j + (offset ? 1 : 0)]; } + return Pos(line, ch) + } + } + } + } + var found = find(textNode, topNode, offset); + if (found) { return badPos(found, bad) } + + // FIXME this is all really shaky. might handle the few cases it needs to handle, but likely to cause problems + for (var after = topNode.nextSibling, dist = textNode ? textNode.nodeValue.length - offset : 0; after; after = after.nextSibling) { + found = find(after, after.firstChild, 0); + if (found) + { return badPos(Pos(found.line, found.ch - dist), bad) } + else + { dist += after.textContent.length; } + } + for (var before = topNode.previousSibling, dist$1 = offset; before; before = before.previousSibling) { + found = find(before, before.firstChild, -1); + if (found) + { return badPos(Pos(found.line, found.ch + dist$1), bad) } + else + { dist$1 += before.textContent.length; } + } +} + +// TEXTAREA INPUT STYLE + +var TextareaInput = function(cm) { + this.cm = cm; + // See input.poll and input.reset + this.prevInput = ""; + + // Flag that indicates whether we expect input to appear real soon + // now (after some event like 'keypress' or 'input') and are + // polling intensively. + this.pollingFast = false; + // Self-resetting timeout for the poller + this.polling = new Delayed(); + // Tracks when input.reset has punted to just putting a short + // string into the textarea instead of the full selection. + this.inaccurateSelection = false; + // Used to work around IE issue with selection being forgotten when focus moves away from textarea + this.hasSelection = false; + this.composing = null; +}; + +TextareaInput.prototype.init = function (display) { + var this$1 = this; + + var input = this, cm = this.cm; + + // Wraps and hides input textarea + var div = this.wrapper = hiddenTextarea(); + // The semihidden textarea that is focused when the editor is + // focused, and receives input. + var te = this.textarea = div.firstChild; + display.wrapper.insertBefore(div, display.wrapper.firstChild); + + // Needed to hide big blue blinking cursor on Mobile Safari (doesn't seem to work in iOS 8 anymore) + if (ios) { te.style.width = "0px"; } + + on(te, "input", function () { + if (ie && ie_version >= 9 && this$1.hasSelection) { this$1.hasSelection = null; } + input.poll(); + }); + + on(te, "paste", function (e) { + if (signalDOMEvent(cm, e) || handlePaste(e, cm)) { return } + + cm.state.pasteIncoming = true; + input.fastPoll(); + }); + + function prepareCopyCut(e) { + if (signalDOMEvent(cm, e)) { return } + if (cm.somethingSelected()) { + setLastCopied({lineWise: false, text: cm.getSelections()}); + if (input.inaccurateSelection) { + input.prevInput = ""; + input.inaccurateSelection = false; + te.value = lastCopied.text.join("\n"); + selectInput(te); + } + } else if (!cm.options.lineWiseCopyCut) { + return + } else { + var ranges = copyableRanges(cm); + setLastCopied({lineWise: true, text: ranges.text}); + if (e.type == "cut") { + cm.setSelections(ranges.ranges, null, sel_dontScroll); + } else { + input.prevInput = ""; + te.value = ranges.text.join("\n"); + selectInput(te); + } + } + if (e.type == "cut") { cm.state.cutIncoming = true; } + } + on(te, "cut", prepareCopyCut); + on(te, "copy", prepareCopyCut); + + on(display.scroller, "paste", function (e) { + if (eventInWidget(display, e) || signalDOMEvent(cm, e)) { return } + cm.state.pasteIncoming = true; + input.focus(); + }); + + // Prevent normal selection in the editor (we handle our own) + on(display.lineSpace, "selectstart", function (e) { + if (!eventInWidget(display, e)) { e_preventDefault(e); } + }); + + on(te, "compositionstart", function () { + var start = cm.getCursor("from"); + if (input.composing) { input.composing.range.clear(); } + input.composing = { + start: start, + range: cm.markText(start, cm.getCursor("to"), {className: "CodeMirror-composing"}) + }; + }); + on(te, "compositionend", function () { + if (input.composing) { + input.poll(); + input.composing.range.clear(); + input.composing = null; + } + }); +}; + +TextareaInput.prototype.prepareSelection = function () { + // Redraw the selection and/or cursor + var cm = this.cm, display = cm.display, doc = cm.doc; + var result = prepareSelection(cm); + + // Move the hidden textarea near the cursor to prevent scrolling artifacts + if (cm.options.moveInputWithCursor) { + var headPos = cursorCoords(cm, doc.sel.primary().head, "div"); + var wrapOff = display.wrapper.getBoundingClientRect(), lineOff = display.lineDiv.getBoundingClientRect(); + result.teTop = Math.max(0, Math.min(display.wrapper.clientHeight - 10, + headPos.top + lineOff.top - wrapOff.top)); + result.teLeft = Math.max(0, Math.min(display.wrapper.clientWidth - 10, + headPos.left + lineOff.left - wrapOff.left)); + } + + return result +}; + +TextareaInput.prototype.showSelection = function (drawn) { + var cm = this.cm, display = cm.display; + removeChildrenAndAdd(display.cursorDiv, drawn.cursors); + removeChildrenAndAdd(display.selectionDiv, drawn.selection); + if (drawn.teTop != null) { + this.wrapper.style.top = drawn.teTop + "px"; + this.wrapper.style.left = drawn.teLeft + "px"; + } +}; + +// Reset the input to correspond to the selection (or to be empty, +// when not typing and nothing is selected) +TextareaInput.prototype.reset = function (typing) { + if (this.contextMenuPending || this.composing) { return } + var minimal, selected, cm = this.cm, doc = cm.doc; + if (cm.somethingSelected()) { + this.prevInput = ""; + var range$$1 = doc.sel.primary(); + minimal = hasCopyEvent && + (range$$1.to().line - range$$1.from().line > 100 || (selected = cm.getSelection()).length > 1000); + var content = minimal ? "-" : selected || cm.getSelection(); + this.textarea.value = content; + if (cm.state.focused) { selectInput(this.textarea); } + if (ie && ie_version >= 9) { this.hasSelection = content; } + } else if (!typing) { + this.prevInput = this.textarea.value = ""; + if (ie && ie_version >= 9) { this.hasSelection = null; } + } + this.inaccurateSelection = minimal; +}; + +TextareaInput.prototype.getField = function () { return this.textarea }; + +TextareaInput.prototype.supportsTouch = function () { return false }; + +TextareaInput.prototype.focus = function () { + if (this.cm.options.readOnly != "nocursor" && (!mobile || activeElt() != this.textarea)) { + try { this.textarea.focus(); } + catch (e) {} // IE8 will throw if the textarea is display: none or not in DOM + } +}; + +TextareaInput.prototype.blur = function () { this.textarea.blur(); }; + +TextareaInput.prototype.resetPosition = function () { + this.wrapper.style.top = this.wrapper.style.left = 0; +}; + +TextareaInput.prototype.receivedFocus = function () { this.slowPoll(); }; + +// Poll for input changes, using the normal rate of polling. This +// runs as long as the editor is focused. +TextareaInput.prototype.slowPoll = function () { + var this$1 = this; + + if (this.pollingFast) { return } + this.polling.set(this.cm.options.pollInterval, function () { + this$1.poll(); + if (this$1.cm.state.focused) { this$1.slowPoll(); } + }); +}; + +// When an event has just come in that is likely to add or change +// something in the input textarea, we poll faster, to ensure that +// the change appears on the screen quickly. +TextareaInput.prototype.fastPoll = function () { + var missed = false, input = this; + input.pollingFast = true; + function p() { + var changed = input.poll(); + if (!changed && !missed) {missed = true; input.polling.set(60, p);} + else {input.pollingFast = false; input.slowPoll();} + } + input.polling.set(20, p); +}; + +// Read input from the textarea, and update the document to match. +// When something is selected, it is present in the textarea, and +// selected (unless it is huge, in which case a placeholder is +// used). When nothing is selected, the cursor sits after previously +// seen text (can be empty), which is stored in prevInput (we must +// not reset the textarea when typing, because that breaks IME). +TextareaInput.prototype.poll = function () { + var this$1 = this; + + var cm = this.cm, input = this.textarea, prevInput = this.prevInput; + // Since this is called a *lot*, try to bail out as cheaply as + // possible when it is clear that nothing happened. hasSelection + // will be the case when there is a lot of text in the textarea, + // in which case reading its value would be expensive. + if (this.contextMenuPending || !cm.state.focused || + (hasSelection(input) && !prevInput && !this.composing) || + cm.isReadOnly() || cm.options.disableInput || cm.state.keySeq) + { return false } + + var text = input.value; + // If nothing changed, bail. + if (text == prevInput && !cm.somethingSelected()) { return false } + // Work around nonsensical selection resetting in IE9/10, and + // inexplicable appearance of private area unicode characters on + // some key combos in Mac (#2689). + if (ie && ie_version >= 9 && this.hasSelection === text || + mac && /[\uf700-\uf7ff]/.test(text)) { + cm.display.input.reset(); + return false + } + + if (cm.doc.sel == cm.display.selForContextMenu) { + var first = text.charCodeAt(0); + if (first == 0x200b && !prevInput) { prevInput = "\u200b"; } + if (first == 0x21da) { this.reset(); return this.cm.execCommand("undo") } + } + // Find the part of the input that is actually new + var same = 0, l = Math.min(prevInput.length, text.length); + while (same < l && prevInput.charCodeAt(same) == text.charCodeAt(same)) { ++same; } + + runInOp(cm, function () { + applyTextInput(cm, text.slice(same), prevInput.length - same, + null, this$1.composing ? "*compose" : null); + + // Don't leave long text in the textarea, since it makes further polling slow + if (text.length > 1000 || text.indexOf("\n") > -1) { input.value = this$1.prevInput = ""; } + else { this$1.prevInput = text; } + + if (this$1.composing) { + this$1.composing.range.clear(); + this$1.composing.range = cm.markText(this$1.composing.start, cm.getCursor("to"), + {className: "CodeMirror-composing"}); + } + }); + return true +}; + +TextareaInput.prototype.ensurePolled = function () { + if (this.pollingFast && this.poll()) { this.pollingFast = false; } +}; + +TextareaInput.prototype.onKeyPress = function () { + if (ie && ie_version >= 9) { this.hasSelection = null; } + this.fastPoll(); +}; + +TextareaInput.prototype.onContextMenu = function (e) { + var input = this, cm = input.cm, display = cm.display, te = input.textarea; + var pos = posFromMouse(cm, e), scrollPos = display.scroller.scrollTop; + if (!pos || presto) { return } // Opera is difficult. + + // Reset the current text selection only if the click is done outside of the selection + // and 'resetSelectionOnContextMenu' option is true. + var reset = cm.options.resetSelectionOnContextMenu; + if (reset && cm.doc.sel.contains(pos) == -1) + { operation(cm, setSelection)(cm.doc, simpleSelection(pos), sel_dontScroll); } + + var oldCSS = te.style.cssText, oldWrapperCSS = input.wrapper.style.cssText; + input.wrapper.style.cssText = "position: absolute"; + var wrapperBox = input.wrapper.getBoundingClientRect(); + te.style.cssText = "position: absolute; width: 30px; height: 30px;\n top: " + (e.clientY - wrapperBox.top - 5) + "px; left: " + (e.clientX - wrapperBox.left - 5) + "px;\n z-index: 1000; background: " + (ie ? "rgba(255, 255, 255, .05)" : "transparent") + ";\n outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);"; + var oldScrollY; + if (webkit) { oldScrollY = window.scrollY; } // Work around Chrome issue (#2712) + display.input.focus(); + if (webkit) { window.scrollTo(null, oldScrollY); } + display.input.reset(); + // Adds "Select all" to context menu in FF + if (!cm.somethingSelected()) { te.value = input.prevInput = " "; } + input.contextMenuPending = true; + display.selForContextMenu = cm.doc.sel; + clearTimeout(display.detectingSelectAll); + + // Select-all will be greyed out if there's nothing to select, so + // this adds a zero-width space so that we can later check whether + // it got selected. + function prepareSelectAllHack() { + if (te.selectionStart != null) { + var selected = cm.somethingSelected(); + var extval = "\u200b" + (selected ? te.value : ""); + te.value = "\u21da"; // Used to catch context-menu undo + te.value = extval; + input.prevInput = selected ? "" : "\u200b"; + te.selectionStart = 1; te.selectionEnd = extval.length; + // Re-set this, in case some other handler touched the + // selection in the meantime. + display.selForContextMenu = cm.doc.sel; + } + } + function rehide() { + input.contextMenuPending = false; + input.wrapper.style.cssText = oldWrapperCSS; + te.style.cssText = oldCSS; + if (ie && ie_version < 9) { display.scrollbars.setScrollTop(display.scroller.scrollTop = scrollPos); } + + // Try to detect the user choosing select-all + if (te.selectionStart != null) { + if (!ie || (ie && ie_version < 9)) { prepareSelectAllHack(); } + var i = 0, poll = function () { + if (display.selForContextMenu == cm.doc.sel && te.selectionStart == 0 && + te.selectionEnd > 0 && input.prevInput == "\u200b") { + operation(cm, selectAll)(cm); + } else if (i++ < 10) { + display.detectingSelectAll = setTimeout(poll, 500); + } else { + display.selForContextMenu = null; + display.input.reset(); + } + }; + display.detectingSelectAll = setTimeout(poll, 200); + } + } + + if (ie && ie_version >= 9) { prepareSelectAllHack(); } + if (captureRightClick) { + e_stop(e); + var mouseup = function () { + off(window, "mouseup", mouseup); + setTimeout(rehide, 20); + }; + on(window, "mouseup", mouseup); + } else { + setTimeout(rehide, 50); + } +}; + +TextareaInput.prototype.readOnlyChanged = function (val) { + if (!val) { this.reset(); } + this.textarea.disabled = val == "nocursor"; +}; + +TextareaInput.prototype.setUneditable = function () {}; + +TextareaInput.prototype.needsContentAttribute = false; + +function fromTextArea(textarea, options) { + options = options ? copyObj(options) : {}; + options.value = textarea.value; + if (!options.tabindex && textarea.tabIndex) + { options.tabindex = textarea.tabIndex; } + if (!options.placeholder && textarea.placeholder) + { options.placeholder = textarea.placeholder; } + // Set autofocus to true if this textarea is focused, or if it has + // autofocus and no other element is focused. + if (options.autofocus == null) { + var hasFocus = activeElt(); + options.autofocus = hasFocus == textarea || + textarea.getAttribute("autofocus") != null && hasFocus == document.body; + } + + function save() {textarea.value = cm.getValue();} + + var realSubmit; + if (textarea.form) { + on(textarea.form, "submit", save); + // Deplorable hack to make the submit method do the right thing. + if (!options.leaveSubmitMethodAlone) { + var form = textarea.form; + realSubmit = form.submit; + try { + var wrappedSubmit = form.submit = function () { + save(); + form.submit = realSubmit; + form.submit(); + form.submit = wrappedSubmit; + }; + } catch(e) {} + } + } + + options.finishInit = function (cm) { + cm.save = save; + cm.getTextArea = function () { return textarea; }; + cm.toTextArea = function () { + cm.toTextArea = isNaN; // Prevent this from being ran twice + save(); + textarea.parentNode.removeChild(cm.getWrapperElement()); + textarea.style.display = ""; + if (textarea.form) { + off(textarea.form, "submit", save); + if (typeof textarea.form.submit == "function") + { textarea.form.submit = realSubmit; } + } + }; + }; + + textarea.style.display = "none"; + var cm = CodeMirror$1(function (node) { return textarea.parentNode.insertBefore(node, textarea.nextSibling); }, + options); + return cm +} + +function addLegacyProps(CodeMirror) { + CodeMirror.off = off; + CodeMirror.on = on; + CodeMirror.wheelEventPixels = wheelEventPixels; + CodeMirror.Doc = Doc; + CodeMirror.splitLines = splitLinesAuto; + CodeMirror.countColumn = countColumn; + CodeMirror.findColumn = findColumn; + CodeMirror.isWordChar = isWordCharBasic; + CodeMirror.Pass = Pass; + CodeMirror.signal = signal; + CodeMirror.Line = Line; + CodeMirror.changeEnd = changeEnd; + CodeMirror.scrollbarModel = scrollbarModel; + CodeMirror.Pos = Pos; + CodeMirror.cmpPos = cmp; + CodeMirror.modes = modes; + CodeMirror.mimeModes = mimeModes; + CodeMirror.resolveMode = resolveMode; + CodeMirror.getMode = getMode; + CodeMirror.modeExtensions = modeExtensions; + CodeMirror.extendMode = extendMode; + CodeMirror.copyState = copyState; + CodeMirror.startState = startState; + CodeMirror.innerMode = innerMode; + CodeMirror.commands = commands; + CodeMirror.keyMap = keyMap; + CodeMirror.keyName = keyName; + CodeMirror.isModifierKey = isModifierKey; + CodeMirror.lookupKey = lookupKey; + CodeMirror.normalizeKeyMap = normalizeKeyMap; + CodeMirror.StringStream = StringStream; + CodeMirror.SharedTextMarker = SharedTextMarker; + CodeMirror.TextMarker = TextMarker; + CodeMirror.LineWidget = LineWidget; + CodeMirror.e_preventDefault = e_preventDefault; + CodeMirror.e_stopPropagation = e_stopPropagation; + CodeMirror.e_stop = e_stop; + CodeMirror.addClass = addClass; + CodeMirror.contains = contains; + CodeMirror.rmClass = rmClass; + CodeMirror.keyNames = keyNames; +} + +// EDITOR CONSTRUCTOR + +defineOptions(CodeMirror$1); + +addEditorMethods(CodeMirror$1); + +// Set up methods on CodeMirror's prototype to redirect to the editor's document. +var dontDelegate = "iter insert remove copy getEditor constructor".split(" "); +for (var prop in Doc.prototype) { if (Doc.prototype.hasOwnProperty(prop) && indexOf(dontDelegate, prop) < 0) + { CodeMirror$1.prototype[prop] = (function(method) { + return function() {return method.apply(this.doc, arguments)} + })(Doc.prototype[prop]); } } + +eventMixin(Doc); + +// INPUT HANDLING + +CodeMirror$1.inputStyles = {"textarea": TextareaInput, "contenteditable": ContentEditableInput}; + +// MODE DEFINITION AND QUERYING + +// Extra arguments are stored as the mode's dependencies, which is +// used by (legacy) mechanisms like loadmode.js to automatically +// load a mode. (Preferred mechanism is the require/define calls.) +CodeMirror$1.defineMode = function(name/*, mode, …*/) { + if (!CodeMirror$1.defaults.mode && name != "null") { CodeMirror$1.defaults.mode = name; } + defineMode.apply(this, arguments); +}; + +CodeMirror$1.defineMIME = defineMIME; + +// Minimal default mode. +CodeMirror$1.defineMode("null", function () { return ({token: function (stream) { return stream.skipToEnd(); }}); }); +CodeMirror$1.defineMIME("text/plain", "null"); + +// EXTENSIONS + +CodeMirror$1.defineExtension = function (name, func) { + CodeMirror$1.prototype[name] = func; +}; +CodeMirror$1.defineDocExtension = function (name, func) { + Doc.prototype[name] = func; +}; + +CodeMirror$1.fromTextArea = fromTextArea; + +addLegacyProps(CodeMirror$1); + +CodeMirror$1.version = "5.27.4"; + +return CodeMirror$1; + +}))); diff --git a/pigx-register/src/main/resources/static/console-fe/public/js/codemirror.lib.clike-lint.js b/pigx-register/src/main/resources/static/console-fe/public/js/codemirror.lib.clike-lint.js new file mode 100755 index 000000000..8c6e921bb --- /dev/null +++ b/pigx-register/src/main/resources/static/console-fe/public/js/codemirror.lib.clike-lint.js @@ -0,0 +1,799 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * 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(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +function Context(indented, column, type, info, align, prev) { + this.indented = indented; + this.column = column; + this.type = type; + this.info = info; + this.align = align; + this.prev = prev; +} +function pushContext(state, col, type, info) { + var indent = state.indented; + if (state.context && state.context.type == "statement" && type != "statement") + indent = state.context.indented; + return state.context = new Context(indent, col, type, info, null, state.context); +} +function popContext(state) { + var t = state.context.type; + if (t == ")" || t == "]" || t == "}") + state.indented = state.context.indented; + return state.context = state.context.prev; +} + +function typeBefore(stream, state, pos) { + if (state.prevToken == "variable" || state.prevToken == "type") return true; + if (/\S(?:[^- ]>|[*\]])\s*$|\*$/.test(stream.string.slice(0, pos))) return true; + if (state.typeAtEndOfLine && stream.column() == stream.indentation()) return true; +} + +function isTopScope(context) { + for (;;) { + if (!context || context.type == "top") return true; + if (context.type == "}" && context.prev.info != "namespace") return false; + context = context.prev; + } +} + +CodeMirror.defineMode("clike", function(config, parserConfig) { + var indentUnit = config.indentUnit, + statementIndentUnit = parserConfig.statementIndentUnit || indentUnit, + dontAlignCalls = parserConfig.dontAlignCalls, + keywords = parserConfig.keywords || {}, + types = parserConfig.types || {}, + builtin = parserConfig.builtin || {}, + blockKeywords = parserConfig.blockKeywords || {}, + defKeywords = parserConfig.defKeywords || {}, + atoms = parserConfig.atoms || {}, + hooks = parserConfig.hooks || {}, + multiLineStrings = parserConfig.multiLineStrings, + indentStatements = parserConfig.indentStatements !== false, + indentSwitch = parserConfig.indentSwitch !== false, + namespaceSeparator = parserConfig.namespaceSeparator, + isPunctuationChar = parserConfig.isPunctuationChar || /[\[\]{}\(\),;\:\.]/, + numberStart = parserConfig.numberStart || /[\d\.]/, + number = parserConfig.number || /^(?:0x[a-f\d]+|0b[01]+|(?:\d+\.?\d*|\.\d+)(?:e[-+]?\d+)?)(u|ll?|l|f)?/i, + isOperatorChar = parserConfig.isOperatorChar || /[+\-*&%=<>!?|\/]/, + isIdentifierChar = parserConfig.isIdentifierChar || /[\w\$_\xa1-\uffff]/; + + var curPunc, isDefKeyword; + + function tokenBase(stream, state) { + var ch = stream.next(); + if (hooks[ch]) { + var result = hooks[ch](stream, state); + if (result !== false) return result; + } + if (ch == '"' || ch == "'") { + state.tokenize = tokenString(ch); + return state.tokenize(stream, state); + } + if (isPunctuationChar.test(ch)) { + curPunc = ch; + return null; + } + if (numberStart.test(ch)) { + stream.backUp(1) + if (stream.match(number)) return "number" + stream.next() + } + if (ch == "/") { + if (stream.eat("*")) { + state.tokenize = tokenComment; + return tokenComment(stream, state); + } + if (stream.eat("/")) { + stream.skipToEnd(); + return "comment"; + } + } + if (isOperatorChar.test(ch)) { + while (!stream.match(/^\/[\/*]/, false) && stream.eat(isOperatorChar)) {} + return "operator"; + } + stream.eatWhile(isIdentifierChar); + if (namespaceSeparator) while (stream.match(namespaceSeparator)) + stream.eatWhile(isIdentifierChar); + + var cur = stream.current(); + if (contains(keywords, cur)) { + if (contains(blockKeywords, cur)) curPunc = "newstatement"; + if (contains(defKeywords, cur)) isDefKeyword = true; + return "keyword"; + } + if (contains(types, cur)) return "type"; + if (contains(builtin, cur)) { + if (contains(blockKeywords, cur)) curPunc = "newstatement"; + return "builtin"; + } + if (contains(atoms, cur)) return "atom"; + return "variable"; + } + + function tokenString(quote) { + return function(stream, state) { + var escaped = false, next, end = false; + while ((next = stream.next()) != null) { + if (next == quote && !escaped) {end = true; break;} + escaped = !escaped && next == "\\"; + } + if (end || !(escaped || multiLineStrings)) + state.tokenize = null; + return "string"; + }; + } + + function tokenComment(stream, state) { + var maybeEnd = false, ch; + while (ch = stream.next()) { + if (ch == "/" && maybeEnd) { + state.tokenize = null; + break; + } + maybeEnd = (ch == "*"); + } + return "comment"; + } + + function maybeEOL(stream, state) { + if (parserConfig.typeFirstDefinitions && stream.eol() && isTopScope(state.context)) + state.typeAtEndOfLine = typeBefore(stream, state, stream.pos) + } + + // Interface + + return { + startState: function(basecolumn) { + return { + tokenize: null, + context: new Context((basecolumn || 0) - indentUnit, 0, "top", null, false), + indented: 0, + startOfLine: true, + prevToken: null + }; + }, + + token: function(stream, state) { + var ctx = state.context; + if (stream.sol()) { + if (ctx.align == null) ctx.align = false; + state.indented = stream.indentation(); + state.startOfLine = true; + } + if (stream.eatSpace()) { maybeEOL(stream, state); return null; } + curPunc = isDefKeyword = null; + var style = (state.tokenize || tokenBase)(stream, state); + if (style == "comment" || style == "meta") return style; + if (ctx.align == null) ctx.align = true; + + if (curPunc == ";" || curPunc == ":" || (curPunc == "," && stream.match(/^\s*(?:\/\/.*)?$/, false))) + while (state.context.type == "statement") popContext(state); + else if (curPunc == "{") pushContext(state, stream.column(), "}"); + else if (curPunc == "[") pushContext(state, stream.column(), "]"); + else if (curPunc == "(") pushContext(state, stream.column(), ")"); + else if (curPunc == "}") { + while (ctx.type == "statement") ctx = popContext(state); + if (ctx.type == "}") ctx = popContext(state); + while (ctx.type == "statement") ctx = popContext(state); + } + else if (curPunc == ctx.type) popContext(state); + else if (indentStatements && + (((ctx.type == "}" || ctx.type == "top") && curPunc != ";") || + (ctx.type == "statement" && curPunc == "newstatement"))) { + pushContext(state, stream.column(), "statement", stream.current()); + } + + if (style == "variable" && + ((state.prevToken == "def" || + (parserConfig.typeFirstDefinitions && typeBefore(stream, state, stream.start) && + isTopScope(state.context) && stream.match(/^\s*\(/, false))))) + style = "def"; + + if (hooks.token) { + var result = hooks.token(stream, state, style); + if (result !== undefined) style = result; + } + + if (style == "def" && parserConfig.styleDefs === false) style = "variable"; + + state.startOfLine = false; + state.prevToken = isDefKeyword ? "def" : style || curPunc; + maybeEOL(stream, state); + return style; + }, + + indent: function(state, textAfter) { + if (state.tokenize != tokenBase && state.tokenize != null || state.typeAtEndOfLine) return CodeMirror.Pass; + var ctx = state.context, firstChar = textAfter && textAfter.charAt(0); + if (ctx.type == "statement" && firstChar == "}") ctx = ctx.prev; + if (parserConfig.dontIndentStatements) + while (ctx.type == "statement" && parserConfig.dontIndentStatements.test(ctx.info)) + ctx = ctx.prev + if (hooks.indent) { + var hook = hooks.indent(state, ctx, textAfter); + if (typeof hook == "number") return hook + } + var closing = firstChar == ctx.type; + var switchBlock = ctx.prev && ctx.prev.info == "switch"; + if (parserConfig.allmanIndentation && /[{(]/.test(firstChar)) { + while (ctx.type != "top" && ctx.type != "}") ctx = ctx.prev + return ctx.indented + } + if (ctx.type == "statement") + return ctx.indented + (firstChar == "{" ? 0 : statementIndentUnit); + if (ctx.align && (!dontAlignCalls || ctx.type != ")")) + return ctx.column + (closing ? 0 : 1); + if (ctx.type == ")" && !closing) + return ctx.indented + statementIndentUnit; + + return ctx.indented + (closing ? 0 : indentUnit) + + (!closing && switchBlock && !/^(?:case|default)\b/.test(textAfter) ? indentUnit : 0); + }, + + electricInput: indentSwitch ? /^\s*(?:case .*?:|default:|\{\}?|\})$/ : /^\s*[{}]$/, + blockCommentStart: "/*", + blockCommentEnd: "*/", + lineComment: "//", + fold: "brace" + }; +}); + + function words(str) { + var obj = {}, words = str.split(" "); + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; + } + function contains(words, word) { + if (typeof words === "function") { + return words(word); + } else { + return words.propertyIsEnumerable(word); + } + } + var cKeywords = "auto if break case register continue return default do sizeof " + + "static else struct switch extern typedef union for goto while enum const volatile"; + var cTypes = "int long char short double float unsigned signed void size_t ptrdiff_t"; + + function cppHook(stream, state) { + if (!state.startOfLine) return false + for (var ch, next = null; ch = stream.peek();) { + if (ch == "\\" && stream.match(/^.$/)) { + next = cppHook + break + } else if (ch == "/" && stream.match(/^\/[\/\*]/, false)) { + break + } + stream.next() + } + state.tokenize = next + return "meta" + } + + function pointerHook(_stream, state) { + if (state.prevToken == "type") return "type"; + return false; + } + + function cpp14Literal(stream) { + stream.eatWhile(/[\w\.']/); + return "number"; + } + + function cpp11StringHook(stream, state) { + stream.backUp(1); + // Raw strings. + if (stream.match(/(R|u8R|uR|UR|LR)/)) { + var match = stream.match(/"([^\s\\()]{0,16})\(/); + if (!match) { + return false; + } + state.cpp11RawStringDelim = match[1]; + state.tokenize = tokenRawString; + return tokenRawString(stream, state); + } + // Unicode strings/chars. + if (stream.match(/(u8|u|U|L)/)) { + if (stream.match(/["']/, /* eat */ false)) { + return "string"; + } + return false; + } + // Ignore this hook. + stream.next(); + return false; + } + + function cppLooksLikeConstructor(word) { + var lastTwo = /(\w+)::~?(\w+)$/.exec(word); + return lastTwo && lastTwo[1] == lastTwo[2]; + } + + // C#-style strings where "" escapes a quote. + function tokenAtString(stream, state) { + var next; + while ((next = stream.next()) != null) { + if (next == '"' && !stream.eat('"')) { + state.tokenize = null; + break; + } + } + return "string"; + } + + // C++11 raw string literal is "( anything )", where + // can be a string up to 16 characters long. + function tokenRawString(stream, state) { + // Escape characters that have special regex meanings. + var delim = state.cpp11RawStringDelim.replace(/[^\w\s]/g, '\\$&'); + var match = stream.match(new RegExp(".*?\\)" + delim + '"')); + if (match) + state.tokenize = null; + else + stream.skipToEnd(); + return "string"; + } + + function def(mimes, mode) { + if (typeof mimes == "string") mimes = [mimes]; + var words = []; + function add(obj) { + if (obj) for (var prop in obj) if (obj.hasOwnProperty(prop)) + words.push(prop); + } + add(mode.keywords); + add(mode.types); + add(mode.builtin); + add(mode.atoms); + if (words.length) { + mode.helperType = mimes[0]; + CodeMirror.registerHelper("hintWords", mimes[0], words); + } + + for (var i = 0; i < mimes.length; ++i) + CodeMirror.defineMIME(mimes[i], mode); + } + + def(["text/x-csrc", "text/x-c", "text/x-chdr"], { + name: "clike", + keywords: words(cKeywords), + types: words(cTypes + " bool _Complex _Bool float_t double_t intptr_t intmax_t " + + "int8_t int16_t int32_t int64_t uintptr_t uintmax_t uint8_t uint16_t " + + "uint32_t uint64_t"), + blockKeywords: words("case do else for if switch while struct"), + defKeywords: words("struct"), + typeFirstDefinitions: true, + atoms: words("null true false"), + hooks: {"#": cppHook, "*": pointerHook}, + modeProps: {fold: ["brace", "include"]} + }); + + def(["text/x-c++src", "text/x-c++hdr"], { + name: "clike", + keywords: words(cKeywords + " asm dynamic_cast namespace reinterpret_cast try explicit new " + + "static_cast typeid catch operator template typename class friend private " + + "this using const_cast inline public throw virtual delete mutable protected " + + "alignas alignof constexpr decltype nullptr noexcept thread_local final " + + "static_assert override"), + types: words(cTypes + " bool wchar_t"), + blockKeywords: words("catch class do else finally for if struct switch try while"), + defKeywords: words("class namespace struct enum union"), + typeFirstDefinitions: true, + atoms: words("true false null"), + dontIndentStatements: /^template$/, + isIdentifierChar: /[\w\$_~\xa1-\uffff]/, + hooks: { + "#": cppHook, + "*": pointerHook, + "u": cpp11StringHook, + "U": cpp11StringHook, + "L": cpp11StringHook, + "R": cpp11StringHook, + "0": cpp14Literal, + "1": cpp14Literal, + "2": cpp14Literal, + "3": cpp14Literal, + "4": cpp14Literal, + "5": cpp14Literal, + "6": cpp14Literal, + "7": cpp14Literal, + "8": cpp14Literal, + "9": cpp14Literal, + token: function(stream, state, style) { + if (style == "variable" && stream.peek() == "(" && + (state.prevToken == ";" || state.prevToken == null || + state.prevToken == "}") && + cppLooksLikeConstructor(stream.current())) + return "def"; + } + }, + namespaceSeparator: "::", + modeProps: {fold: ["brace", "include"]} + }); + + def("text/x-java", { + name: "clike", + keywords: words("abstract assert break case catch class const continue default " + + "do else enum extends final finally float for goto if implements import " + + "instanceof interface native new package private protected public " + + "return static strictfp super switch synchronized this throw throws transient " + + "try volatile while @interface"), + types: words("byte short int long float double boolean char void Boolean Byte Character Double Float " + + "Integer Long Number Object Short String StringBuffer StringBuilder Void"), + blockKeywords: words("catch class do else finally for if switch try while"), + defKeywords: words("class interface package enum @interface"), + typeFirstDefinitions: true, + atoms: words("true false null"), + number: /^(?:0x[a-f\d_]+|0b[01_]+|(?:[\d_]+\.?\d*|\.\d+)(?:e[-+]?[\d_]+)?)(u|ll?|l|f)?/i, + hooks: { + "@": function(stream) { + // Don't match the @interface keyword. + if (stream.match('interface', false)) return false; + + stream.eatWhile(/[\w\$_]/); + return "meta"; + } + }, + modeProps: {fold: ["brace", "import"]} + }); + + def("text/x-csharp", { + name: "clike", + keywords: words("abstract as async await base break case catch checked class const continue" + + " default delegate do else enum event explicit extern finally fixed for" + + " foreach goto if implicit in interface internal is lock namespace new" + + " operator out override params private protected public readonly ref return sealed" + + " sizeof stackalloc static struct switch this throw try typeof unchecked" + + " unsafe using virtual void volatile while add alias ascending descending dynamic from get" + + " global group into join let orderby partial remove select set value var yield"), + types: words("Action Boolean Byte Char DateTime DateTimeOffset Decimal Double Func" + + " Guid Int16 Int32 Int64 Object SByte Single String Task TimeSpan UInt16 UInt32" + + " UInt64 bool byte char decimal double short int long object" + + " sbyte float string ushort uint ulong"), + blockKeywords: words("catch class do else finally for foreach if struct switch try while"), + defKeywords: words("class interface namespace struct var"), + typeFirstDefinitions: true, + atoms: words("true false null"), + hooks: { + "@": function(stream, state) { + if (stream.eat('"')) { + state.tokenize = tokenAtString; + return tokenAtString(stream, state); + } + stream.eatWhile(/[\w\$_]/); + return "meta"; + } + } + }); + + function tokenTripleString(stream, state) { + var escaped = false; + while (!stream.eol()) { + if (!escaped && stream.match('"""')) { + state.tokenize = null; + break; + } + escaped = stream.next() == "\\" && !escaped; + } + return "string"; + } + + def("text/x-scala", { + name: "clike", + keywords: words( + + /* scala */ + "abstract case catch class def do else extends final finally for forSome if " + + "implicit import lazy match new null object override package private protected return " + + "sealed super this throw trait try type val var while with yield _ " + + + /* package scala */ + "assert assume require print println printf readLine readBoolean readByte readShort " + + "readChar readInt readLong readFloat readDouble" + ), + types: words( + "AnyVal App Application Array BufferedIterator BigDecimal BigInt Char Console Either " + + "Enumeration Equiv Error Exception Fractional Function IndexedSeq Int Integral Iterable " + + "Iterator List Map Numeric Nil NotNull Option Ordered Ordering PartialFunction PartialOrdering " + + "Product Proxy Range Responder Seq Serializable Set Specializable Stream StringBuilder " + + "StringContext Symbol Throwable Traversable TraversableOnce Tuple Unit Vector " + + + /* package java.lang */ + "Boolean Byte Character CharSequence Class ClassLoader Cloneable Comparable " + + "Compiler Double Exception Float Integer Long Math Number Object Package Pair Process " + + "Runtime Runnable SecurityManager Short StackTraceElement StrictMath String " + + "StringBuffer System Thread ThreadGroup ThreadLocal Throwable Triple Void" + ), + multiLineStrings: true, + blockKeywords: words("catch class enum do else finally for forSome if match switch try while"), + defKeywords: words("class enum def object package trait type val var"), + atoms: words("true false null"), + indentStatements: false, + indentSwitch: false, + isOperatorChar: /[+\-*&%=<>!?|\/#:@]/, + hooks: { + "@": function(stream) { + stream.eatWhile(/[\w\$_]/); + return "meta"; + }, + '"': function(stream, state) { + if (!stream.match('""')) return false; + state.tokenize = tokenTripleString; + return state.tokenize(stream, state); + }, + "'": function(stream) { + stream.eatWhile(/[\w\$_\xa1-\uffff]/); + return "atom"; + }, + "=": function(stream, state) { + var cx = state.context + if (cx.type == "}" && cx.align && stream.eat(">")) { + state.context = new Context(cx.indented, cx.column, cx.type, cx.info, null, cx.prev) + return "operator" + } else { + return false + } + } + }, + modeProps: {closeBrackets: {triples: '"'}} + }); + + function tokenKotlinString(tripleString){ + return function (stream, state) { + var escaped = false, next, end = false; + while (!stream.eol()) { + if (!tripleString && !escaped && stream.match('"') ) {end = true; break;} + if (tripleString && stream.match('"""')) {end = true; break;} + next = stream.next(); + if(!escaped && next == "$" && stream.match('{')) + stream.skipTo("}"); + escaped = !escaped && next == "\\" && !tripleString; + } + if (end || !tripleString) + state.tokenize = null; + return "string"; + } + } + + def("text/x-kotlin", { + name: "clike", + keywords: words( + /*keywords*/ + "package as typealias class interface this super val " + + "var fun for is in This throw return " + + "break continue object if else while do try when !in !is as? " + + + /*soft keywords*/ + "file import where by get set abstract enum open inner override private public internal " + + "protected catch finally out final vararg reified dynamic companion constructor init " + + "sealed field property receiver param sparam lateinit data inline noinline tailrec " + + "external annotation crossinline const operator infix suspend" + ), + types: words( + /* package java.lang */ + "Boolean Byte Character CharSequence Class ClassLoader Cloneable Comparable " + + "Compiler Double Exception Float Integer Long Math Number Object Package Pair Process " + + "Runtime Runnable SecurityManager Short StackTraceElement StrictMath String " + + "StringBuffer System Thread ThreadGroup ThreadLocal Throwable Triple Void" + ), + intendSwitch: false, + indentStatements: false, + multiLineStrings: true, + number: /^(?:0x[a-f\d_]+|0b[01_]+|(?:[\d_]+\.?\d*|\.\d+)(?:e[-+]?[\d_]+)?)(u|ll?|l|f)?/i, + blockKeywords: words("catch class do else finally for if where try while enum"), + defKeywords: words("class val var object package interface fun"), + atoms: words("true false null this"), + hooks: { + '"': function(stream, state) { + state.tokenize = tokenKotlinString(stream.match('""')); + return state.tokenize(stream, state); + } + }, + modeProps: {closeBrackets: {triples: '"'}} + }); + + def(["x-shader/x-vertex", "x-shader/x-fragment"], { + name: "clike", + keywords: words("sampler1D sampler2D sampler3D samplerCube " + + "sampler1DShadow sampler2DShadow " + + "const attribute uniform varying " + + "break continue discard return " + + "for while do if else struct " + + "in out inout"), + types: words("float int bool void " + + "vec2 vec3 vec4 ivec2 ivec3 ivec4 bvec2 bvec3 bvec4 " + + "mat2 mat3 mat4"), + blockKeywords: words("for while do if else struct"), + builtin: words("radians degrees sin cos tan asin acos atan " + + "pow exp log exp2 sqrt inversesqrt " + + "abs sign floor ceil fract mod min max clamp mix step smoothstep " + + "length distance dot cross normalize ftransform faceforward " + + "reflect refract matrixCompMult " + + "lessThan lessThanEqual greaterThan greaterThanEqual " + + "equal notEqual any all not " + + "texture1D texture1DProj texture1DLod texture1DProjLod " + + "texture2D texture2DProj texture2DLod texture2DProjLod " + + "texture3D texture3DProj texture3DLod texture3DProjLod " + + "textureCube textureCubeLod " + + "shadow1D shadow2D shadow1DProj shadow2DProj " + + "shadow1DLod shadow2DLod shadow1DProjLod shadow2DProjLod " + + "dFdx dFdy fwidth " + + "noise1 noise2 noise3 noise4"), + atoms: words("true false " + + "gl_FragColor gl_SecondaryColor gl_Normal gl_Vertex " + + "gl_MultiTexCoord0 gl_MultiTexCoord1 gl_MultiTexCoord2 gl_MultiTexCoord3 " + + "gl_MultiTexCoord4 gl_MultiTexCoord5 gl_MultiTexCoord6 gl_MultiTexCoord7 " + + "gl_FogCoord gl_PointCoord " + + "gl_Position gl_PointSize gl_ClipVertex " + + "gl_FrontColor gl_BackColor gl_FrontSecondaryColor gl_BackSecondaryColor " + + "gl_TexCoord gl_FogFragCoord " + + "gl_FragCoord gl_FrontFacing " + + "gl_FragData gl_FragDepth " + + "gl_ModelViewMatrix gl_ProjectionMatrix gl_ModelViewProjectionMatrix " + + "gl_TextureMatrix gl_NormalMatrix gl_ModelViewMatrixInverse " + + "gl_ProjectionMatrixInverse gl_ModelViewProjectionMatrixInverse " + + "gl_TexureMatrixTranspose gl_ModelViewMatrixInverseTranspose " + + "gl_ProjectionMatrixInverseTranspose " + + "gl_ModelViewProjectionMatrixInverseTranspose " + + "gl_TextureMatrixInverseTranspose " + + "gl_NormalScale gl_DepthRange gl_ClipPlane " + + "gl_Point gl_FrontMaterial gl_BackMaterial gl_LightSource gl_LightModel " + + "gl_FrontLightModelProduct gl_BackLightModelProduct " + + "gl_TextureColor gl_EyePlaneS gl_EyePlaneT gl_EyePlaneR gl_EyePlaneQ " + + "gl_FogParameters " + + "gl_MaxLights gl_MaxClipPlanes gl_MaxTextureUnits gl_MaxTextureCoords " + + "gl_MaxVertexAttribs gl_MaxVertexUniformComponents gl_MaxVaryingFloats " + + "gl_MaxVertexTextureImageUnits gl_MaxTextureImageUnits " + + "gl_MaxFragmentUniformComponents gl_MaxCombineTextureImageUnits " + + "gl_MaxDrawBuffers"), + indentSwitch: false, + hooks: {"#": cppHook}, + modeProps: {fold: ["brace", "include"]} + }); + + def("text/x-nesc", { + name: "clike", + keywords: words(cKeywords + "as atomic async call command component components configuration event generic " + + "implementation includes interface module new norace nx_struct nx_union post provides " + + "signal task uses abstract extends"), + types: words(cTypes), + blockKeywords: words("case do else for if switch while struct"), + atoms: words("null true false"), + hooks: {"#": cppHook}, + modeProps: {fold: ["brace", "include"]} + }); + + def("text/x-objectivec", { + name: "clike", + keywords: words(cKeywords + "inline restrict _Bool _Complex _Imaginary BOOL Class bycopy byref id IMP in " + + "inout nil oneway out Protocol SEL self super atomic nonatomic retain copy readwrite readonly"), + types: words(cTypes), + atoms: words("YES NO NULL NILL ON OFF true false"), + hooks: { + "@": function(stream) { + stream.eatWhile(/[\w\$]/); + return "keyword"; + }, + "#": cppHook, + indent: function(_state, ctx, textAfter) { + if (ctx.type == "statement" && /^@\w/.test(textAfter)) return ctx.indented + } + }, + modeProps: {fold: "brace"} + }); + + def("text/x-squirrel", { + name: "clike", + keywords: words("base break clone continue const default delete enum extends function in class" + + " foreach local resume return this throw typeof yield constructor instanceof static"), + types: words(cTypes), + blockKeywords: words("case catch class else for foreach if switch try while"), + defKeywords: words("function local class"), + typeFirstDefinitions: true, + atoms: words("true false null"), + hooks: {"#": cppHook}, + modeProps: {fold: ["brace", "include"]} + }); + + // Ceylon Strings need to deal with interpolation + var stringTokenizer = null; + function tokenCeylonString(type) { + return function(stream, state) { + var escaped = false, next, end = false; + while (!stream.eol()) { + if (!escaped && stream.match('"') && + (type == "single" || stream.match('""'))) { + end = true; + break; + } + if (!escaped && stream.match('``')) { + stringTokenizer = tokenCeylonString(type); + end = true; + break; + } + next = stream.next(); + escaped = type == "single" && !escaped && next == "\\"; + } + if (end) + state.tokenize = null; + return "string"; + } + } + + def("text/x-ceylon", { + name: "clike", + keywords: words("abstracts alias assembly assert assign break case catch class continue dynamic else" + + " exists extends finally for function given if import in interface is let module new" + + " nonempty object of out outer package return satisfies super switch then this throw" + + " try value void while"), + types: function(word) { + // In Ceylon all identifiers that start with an uppercase are types + var first = word.charAt(0); + return (first === first.toUpperCase() && first !== first.toLowerCase()); + }, + blockKeywords: words("case catch class dynamic else finally for function if interface module new object switch try while"), + defKeywords: words("class dynamic function interface module object package value"), + builtin: words("abstract actual aliased annotation by default deprecated doc final formal late license" + + " native optional sealed see serializable shared suppressWarnings tagged throws variable"), + isPunctuationChar: /[\[\]{}\(\),;\:\.`]/, + isOperatorChar: /[+\-*&%=<>!?|^~:\/]/, + numberStart: /[\d#$]/, + number: /^(?:#[\da-fA-F_]+|\$[01_]+|[\d_]+[kMGTPmunpf]?|[\d_]+\.[\d_]+(?:[eE][-+]?\d+|[kMGTPmunpf]|)|)/i, + multiLineStrings: true, + typeFirstDefinitions: true, + atoms: words("true false null larger smaller equal empty finished"), + indentSwitch: false, + styleDefs: false, + hooks: { + "@": function(stream) { + stream.eatWhile(/[\w\$_]/); + return "meta"; + }, + '"': function(stream, state) { + state.tokenize = tokenCeylonString(stream.match('""') ? "triple" : "single"); + return state.tokenize(stream, state); + }, + '`': function(stream, state) { + if (!stringTokenizer || !stream.match('`')) return false; + state.tokenize = stringTokenizer; + stringTokenizer = null; + return state.tokenize(stream, state); + }, + "'": function(stream) { + stream.eatWhile(/[\w\$_\xa1-\uffff]/); + return "atom"; + }, + token: function(_stream, state, style) { + if ((style == "variable" || style == "type") && + state.prevToken == ".") { + return "variable-2"; + } + } + }, + modeProps: { + fold: ["brace", "import"], + closeBrackets: {triples: '"'} + } + }); + +}); \ No newline at end of file diff --git a/pigx-register/src/main/resources/static/console-fe/public/js/codemirror.lib.json-lint.js b/pigx-register/src/main/resources/static/console-fe/public/js/codemirror.lib.json-lint.js new file mode 100755 index 000000000..d395030b1 --- /dev/null +++ b/pigx-register/src/main/resources/static/console-fe/public/js/codemirror.lib.json-lint.js @@ -0,0 +1,445 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * 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. + */ + +/* Jison generated parser */ +var jsonlint = (function(){ +var parser = {trace: function trace() { }, +yy: {}, +symbols_: {"error":2,"JSONString":3,"STRING":4,"JSONNumber":5,"NUMBER":6,"JSONNullLiteral":7,"NULL":8,"JSONBooleanLiteral":9,"TRUE":10,"FALSE":11,"JSONText":12,"JSONValue":13,"EOF":14,"JSONObject":15,"JSONArray":16,"{":17,"}":18,"JSONMemberList":19,"JSONMember":20,":":21,",":22,"[":23,"]":24,"JSONElementList":25,"$accept":0,"$end":1}, +terminals_: {2:"error",4:"STRING",6:"NUMBER",8:"NULL",10:"TRUE",11:"FALSE",14:"EOF",17:"{",18:"}",21:":",22:",",23:"[",24:"]"}, +productions_: [0,[3,1],[5,1],[7,1],[9,1],[9,1],[12,2],[13,1],[13,1],[13,1],[13,1],[13,1],[13,1],[15,2],[15,3],[20,3],[19,1],[19,3],[16,2],[16,3],[25,1],[25,3]], +performAction: function anonymous(yytext,yyleng,yylineno,yy,yystate,$$,_$) { + +var $0 = $$.length - 1; +switch (yystate) { +case 1: // replace escaped characters with actual character + this.$ = yytext.replace(/\\(\\|")/g, "$"+"1") + .replace(/\\n/g,'\n') + .replace(/\\r/g,'\r') + .replace(/\\t/g,'\t') + .replace(/\\v/g,'\v') + .replace(/\\f/g,'\f') + .replace(/\\b/g,'\b'); + +break; +case 2:this.$ = Number(yytext); +break; +case 3:this.$ = null; +break; +case 4:this.$ = true; +break; +case 5:this.$ = false; +break; +case 6:return this.$ = $$[$0-1]; +break; +case 13:this.$ = {}; +break; +case 14:this.$ = $$[$0-1]; +break; +case 15:this.$ = [$$[$0-2], $$[$0]]; +break; +case 16:this.$ = {}; this.$[$$[$0][0]] = $$[$0][1]; +break; +case 17:this.$ = $$[$0-2]; $$[$0-2][$$[$0][0]] = $$[$0][1]; +break; +case 18:this.$ = []; +break; +case 19:this.$ = $$[$0-1]; +break; +case 20:this.$ = [$$[$0]]; +break; +case 21:this.$ = $$[$0-2]; $$[$0-2].push($$[$0]); +break; +} +}, +table: [{3:5,4:[1,12],5:6,6:[1,13],7:3,8:[1,9],9:4,10:[1,10],11:[1,11],12:1,13:2,15:7,16:8,17:[1,14],23:[1,15]},{1:[3]},{14:[1,16]},{14:[2,7],18:[2,7],22:[2,7],24:[2,7]},{14:[2,8],18:[2,8],22:[2,8],24:[2,8]},{14:[2,9],18:[2,9],22:[2,9],24:[2,9]},{14:[2,10],18:[2,10],22:[2,10],24:[2,10]},{14:[2,11],18:[2,11],22:[2,11],24:[2,11]},{14:[2,12],18:[2,12],22:[2,12],24:[2,12]},{14:[2,3],18:[2,3],22:[2,3],24:[2,3]},{14:[2,4],18:[2,4],22:[2,4],24:[2,4]},{14:[2,5],18:[2,5],22:[2,5],24:[2,5]},{14:[2,1],18:[2,1],21:[2,1],22:[2,1],24:[2,1]},{14:[2,2],18:[2,2],22:[2,2],24:[2,2]},{3:20,4:[1,12],18:[1,17],19:18,20:19},{3:5,4:[1,12],5:6,6:[1,13],7:3,8:[1,9],9:4,10:[1,10],11:[1,11],13:23,15:7,16:8,17:[1,14],23:[1,15],24:[1,21],25:22},{1:[2,6]},{14:[2,13],18:[2,13],22:[2,13],24:[2,13]},{18:[1,24],22:[1,25]},{18:[2,16],22:[2,16]},{21:[1,26]},{14:[2,18],18:[2,18],22:[2,18],24:[2,18]},{22:[1,28],24:[1,27]},{22:[2,20],24:[2,20]},{14:[2,14],18:[2,14],22:[2,14],24:[2,14]},{3:20,4:[1,12],20:29},{3:5,4:[1,12],5:6,6:[1,13],7:3,8:[1,9],9:4,10:[1,10],11:[1,11],13:30,15:7,16:8,17:[1,14],23:[1,15]},{14:[2,19],18:[2,19],22:[2,19],24:[2,19]},{3:5,4:[1,12],5:6,6:[1,13],7:3,8:[1,9],9:4,10:[1,10],11:[1,11],13:31,15:7,16:8,17:[1,14],23:[1,15]},{18:[2,17],22:[2,17]},{18:[2,15],22:[2,15]},{22:[2,21],24:[2,21]}], +defaultActions: {16:[2,6]}, +parseError: function parseError(str, hash) { + throw new Error(str); +}, +parse: function parse(input) { + var self = this, + stack = [0], + vstack = [null], // semantic value stack + lstack = [], // location stack + table = this.table, + yytext = '', + yylineno = 0, + yyleng = 0, + recovering = 0, + TERROR = 2, + EOF = 1; + + //this.reductionCount = this.shiftCount = 0; + + this.lexer.setInput(input); + this.lexer.yy = this.yy; + this.yy.lexer = this.lexer; + if (typeof this.lexer.yylloc == 'undefined') + this.lexer.yylloc = {}; + var yyloc = this.lexer.yylloc; + lstack.push(yyloc); + + if (typeof this.yy.parseError === 'function') + this.parseError = this.yy.parseError; + + function popStack (n) { + stack.length = stack.length - 2*n; + vstack.length = vstack.length - n; + lstack.length = lstack.length - n; + } + + function lex() { + var token; + token = self.lexer.lex() || 1; // $end = 1 + // if token isn't its numeric value, convert + if (typeof token !== 'number') { + token = self.symbols_[token] || token; + } + return token; + } + + var symbol, preErrorSymbol, state, action, a, r, yyval={},p,len,newState, expected; + while (true) { + // retreive state number from top of stack + state = stack[stack.length-1]; + + // use default actions if available + if (this.defaultActions[state]) { + action = this.defaultActions[state]; + } else { + if (symbol == null) + symbol = lex(); + // read action for current state and first input + action = table[state] && table[state][symbol]; + } + + // handle parse error + _handle_error: + if (typeof action === 'undefined' || !action.length || !action[0]) { + + if (!recovering) { + // Report error + expected = []; + for (p in table[state]) if (this.terminals_[p] && p > 2) { + expected.push("'"+this.terminals_[p]+"'"); + } + var errStr = ''; + if (this.lexer.showPosition) { + errStr = 'Parse error on line '+(yylineno+1)+":\n"+this.lexer.showPosition()+"\nExpecting "+expected.join(', ') + ", got '" + this.terminals_[symbol]+ "'"; + } else { + errStr = 'Parse error on line '+(yylineno+1)+": Unexpected " + + (symbol == 1 /*EOF*/ ? "end of input" : + ("'"+(this.terminals_[symbol] || symbol)+"'")); + } + this.parseError(errStr, + {text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected}); + } + + // just recovered from another error + if (recovering == 3) { + if (symbol == EOF) { + throw new Error(errStr || 'Parsing halted.'); + } + + // discard current lookahead and grab another + yyleng = this.lexer.yyleng; + yytext = this.lexer.yytext; + yylineno = this.lexer.yylineno; + yyloc = this.lexer.yylloc; + symbol = lex(); + } + + // try to recover from error + while (1) { + // check for error recovery rule in this state + if ((TERROR.toString()) in table[state]) { + break; + } + if (state == 0) { + throw new Error(errStr || 'Parsing halted.'); + } + popStack(1); + state = stack[stack.length-1]; + } + + preErrorSymbol = symbol; // save the lookahead token + symbol = TERROR; // insert generic error symbol as new lookahead + state = stack[stack.length-1]; + action = table[state] && table[state][TERROR]; + recovering = 3; // allow 3 real symbols to be shifted before reporting a new error + } + + // this shouldn't happen, unless resolve defaults are off + if (action[0] instanceof Array && action.length > 1) { + throw new Error('Parse Error: multiple actions possible at state: '+state+', token: '+symbol); + } + + switch (action[0]) { + + case 1: // shift + //this.shiftCount++; + + stack.push(symbol); + vstack.push(this.lexer.yytext); + lstack.push(this.lexer.yylloc); + stack.push(action[1]); // push state + symbol = null; + if (!preErrorSymbol) { // normal execution/no error + yyleng = this.lexer.yyleng; + yytext = this.lexer.yytext; + yylineno = this.lexer.yylineno; + yyloc = this.lexer.yylloc; + if (recovering > 0) + recovering--; + } else { // error just occurred, resume old lookahead f/ before error + symbol = preErrorSymbol; + preErrorSymbol = null; + } + break; + + case 2: // reduce + //this.reductionCount++; + + len = this.productions_[action[1]][1]; + + // perform semantic action + yyval.$ = vstack[vstack.length-len]; // default to $$ = $1 + // default location, uses first token for firsts, last for lasts + yyval._$ = { + first_line: lstack[lstack.length-(len||1)].first_line, + last_line: lstack[lstack.length-1].last_line, + first_column: lstack[lstack.length-(len||1)].first_column, + last_column: lstack[lstack.length-1].last_column + }; + r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack); + + if (typeof r !== 'undefined') { + return r; + } + + // pop off stack + if (len) { + stack = stack.slice(0,-1*len*2); + vstack = vstack.slice(0, -1*len); + lstack = lstack.slice(0, -1*len); + } + + stack.push(this.productions_[action[1]][0]); // push nonterminal (reduce) + vstack.push(yyval.$); + lstack.push(yyval._$); + // goto new state = table[STATE][NONTERMINAL] + newState = table[stack[stack.length-2]][stack[stack.length-1]]; + stack.push(newState); + break; + + case 3: // accept + return true; + } + + } + + return true; +}}; +/* Jison generated lexer */ +var lexer = (function(){ +var lexer = ({EOF:1, +parseError:function parseError(str, hash) { + if (this.yy.parseError) { + this.yy.parseError(str, hash); + } else { + throw new Error(str); + } + }, +setInput:function (input) { + this._input = input; + this._more = this._less = this.done = false; + this.yylineno = this.yyleng = 0; + this.yytext = this.matched = this.match = ''; + this.conditionStack = ['INITIAL']; + this.yylloc = {first_line:1,first_column:0,last_line:1,last_column:0}; + return this; + }, +input:function () { + var ch = this._input[0]; + this.yytext+=ch; + this.yyleng++; + this.match+=ch; + this.matched+=ch; + var lines = ch.match(/\n/); + if (lines) this.yylineno++; + this._input = this._input.slice(1); + return ch; + }, +unput:function (ch) { + this._input = ch + this._input; + return this; + }, +more:function () { + this._more = true; + return this; + }, +less:function (n) { + this._input = this.match.slice(n) + this._input; + }, +pastInput:function () { + var past = this.matched.substr(0, this.matched.length - this.match.length); + return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, ""); + }, +upcomingInput:function () { + var next = this.match; + if (next.length < 20) { + next += this._input.substr(0, 20-next.length); + } + return (next.substr(0,20)+(next.length > 20 ? '...':'')).replace(/\n/g, ""); + }, +showPosition:function () { + var pre = this.pastInput(); + var c = new Array(pre.length + 1).join("-"); + return pre + this.upcomingInput() + "\n" + c+"^"; + }, +next:function () { + if (this.done) { + return this.EOF; + } + if (!this._input) this.done = true; + + var token, + match, + tempMatch, + index, + col, + lines; + if (!this._more) { + this.yytext = ''; + this.match = ''; + } + var rules = this._currentRules(); + for (var i=0;i < rules.length; i++) { + tempMatch = this._input.match(this.rules[rules[i]]); + if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { + match = tempMatch; + index = i; + if (!this.options.flex) break; + } + } + if (match) { + lines = match[0].match(/\n.*/g); + if (lines) this.yylineno += lines.length; + this.yylloc = {first_line: this.yylloc.last_line, + last_line: this.yylineno+1, + first_column: this.yylloc.last_column, + last_column: lines ? lines[lines.length-1].length-1 : this.yylloc.last_column + match[0].length} + this.yytext += match[0]; + this.match += match[0]; + this.yyleng = this.yytext.length; + this._more = false; + this._input = this._input.slice(match[0].length); + this.matched += match[0]; + token = this.performAction.call(this, this.yy, this, rules[index],this.conditionStack[this.conditionStack.length-1]); + if (this.done && this._input) this.done = false; + if (token) return token; + else return; + } + if (this._input === "") { + return this.EOF; + } else { + this.parseError('Lexical error on line '+(this.yylineno+1)+'. Unrecognized text.\n'+this.showPosition(), + {text: "", token: null, line: this.yylineno}); + } + }, +lex:function lex() { + var r = this.next(); + if (typeof r !== 'undefined') { + return r; + } else { + return this.lex(); + } + }, +begin:function begin(condition) { + this.conditionStack.push(condition); + }, +popState:function popState() { + return this.conditionStack.pop(); + }, +_currentRules:function _currentRules() { + return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules; + }, +topState:function () { + return this.conditionStack[this.conditionStack.length-2]; + }, +pushState:function begin(condition) { + this.begin(condition); + }}); +lexer.options = {}; +lexer.performAction = function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) { + +var YYSTATE=YY_START +switch($avoiding_name_collisions) { +case 0:/* skip whitespace */ +break; +case 1:return 6 +break; +case 2:yy_.yytext = yy_.yytext.substr(1,yy_.yyleng-2); return 4 +break; +case 3:return 17 +break; +case 4:return 18 +break; +case 5:return 23 +break; +case 6:return 24 +break; +case 7:return 22 +break; +case 8:return 21 +break; +case 9:return 10 +break; +case 10:return 11 +break; +case 11:return 8 +break; +case 12:return 14 +break; +case 13:return 'INVALID' +break; +} +}; +lexer.rules = [/^(?:\s+)/,/^(?:(-?([0-9]|[1-9][0-9]+))(\.[0-9]+)?([eE][-+]?[0-9]+)?\b)/,/^(?:"(?:\\[\\"bfnrt/]|\\u[a-fA-F0-9]{4}|[^\\\0-\x09\x0a-\x1f"])*")/,/^(?:\{)/,/^(?:\})/,/^(?:\[)/,/^(?:\])/,/^(?:,)/,/^(?::)/,/^(?:true\b)/,/^(?:false\b)/,/^(?:null\b)/,/^(?:$)/,/^(?:.)/]; +lexer.conditions = {"INITIAL":{"rules":[0,1,2,3,4,5,6,7,8,9,10,11,12,13],"inclusive":true}}; + + +; +return lexer;})() +parser.lexer = lexer; +return parser; +})(); +if (typeof require !== 'undefined' && typeof exports !== 'undefined') { +exports.parser = jsonlint; +exports.parse = function () { return jsonlint.parse.apply(jsonlint, arguments); } +exports.main = function commonjsMain(args) { + if (!args[1]) + throw new Error('Usage: '+args[0]+' FILE'); + if (typeof process !== 'undefined') { + var source = require('fs').readFileSync(require('path').join(process.cwd(), args[1]), "utf8"); + } else { + var cwd = require("file").path(require("file").cwd()); + var source = cwd.join(args[1]).read({charset: "utf-8"}); + } + return exports.parser.parse(source); +} +if (typeof module !== 'undefined' && require.main === module) { + exports.main(typeof process !== 'undefined' ? process.argv.slice(1) : require("system").args); +} +} \ No newline at end of file diff --git a/pigx-register/src/main/resources/static/console-fe/public/js/diff_match_patch.js b/pigx-register/src/main/resources/static/console-fe/public/js/diff_match_patch.js new file mode 100755 index 000000000..c41b51327 --- /dev/null +++ b/pigx-register/src/main/resources/static/console-fe/public/js/diff_match_patch.js @@ -0,0 +1,49 @@ +(function(){function diff_match_patch(){this.Diff_Timeout=1;this.Diff_EditCost=4;this.Match_Threshold=0.5;this.Match_Distance=1E3;this.Patch_DeleteThreshold=0.5;this.Patch_Margin=4;this.Match_MaxBits=32} +diff_match_patch.prototype.diff_main=function(a,b,c,d){"undefined"==typeof d&&(d=0>=this.Diff_Timeout?Number.MAX_VALUE:(new Date).getTime()+1E3*this.Diff_Timeout);if(null==a||null==b)throw Error("Null input. (diff_main)");if(a==b)return a?[[0,a]]:[];"undefined"==typeof c&&(c=!0);var e=c,f=this.diff_commonPrefix(a,b);c=a.substring(0,f);a=a.substring(f);b=b.substring(f);var f=this.diff_commonSuffix(a,b),g=a.substring(a.length-f);a=a.substring(0,a.length-f);b=b.substring(0,b.length-f);a=this.diff_compute_(a, +b,e,d);c&&a.unshift([0,c]);g&&a.push([0,g]);this.diff_cleanupMerge(a);return a}; +diff_match_patch.prototype.diff_compute_=function(a,b,c,d){if(!a)return[[1,b]];if(!b)return[[-1,a]];var e=a.length>b.length?a:b,f=a.length>b.length?b:a,g=e.indexOf(f);return-1!=g?(c=[[1,e.substring(0,g)],[0,f],[1,e.substring(g+f.length)]],a.length>b.length&&(c[0][0]=c[2][0]=-1),c):1==f.length?[[-1,a],[1,b]]:(e=this.diff_halfMatch_(a,b))?(f=e[0],a=e[1],g=e[2],b=e[3],e=e[4],f=this.diff_main(f,g,c,d),c=this.diff_main(a,b,c,d),f.concat([[0,e]],c)):c&&100c);v++){for(var n=-v+r;n<=v-t;n+=2){var l=g+n,m;m=n==-v||n!=v&&j[l-1]d)t+=2;else if(s>e)r+=2;else if(q&&(l=g+k-n,0<=l&&l= +u)return this.diff_bisectSplit_(a,b,m,s,c)}}for(n=-v+p;n<=v-w;n+=2){l=g+n;u=n==-v||n!=v&&i[l-1]d)w+=2;else if(m>e)p+=2;else if(!q&&(l=g+k-n,0<=l&&(l=u)))return this.diff_bisectSplit_(a,b,m,s,c)}}return[[-1,a],[1,b]]}; +diff_match_patch.prototype.diff_bisectSplit_=function(a,b,c,d,e){var f=a.substring(0,c),g=b.substring(0,d);a=a.substring(c);b=b.substring(d);f=this.diff_main(f,g,!1,e);e=this.diff_main(a,b,!1,e);return f.concat(e)}; +diff_match_patch.prototype.diff_linesToChars_=function(a,b){function c(a){for(var b="",c=0,f=-1,g=d.length;fd?a=a.substring(c-d):c=a.length?[h,j,n,l,g]:null}if(0>=this.Diff_Timeout)return null; +var d=a.length>b.length?a:b,e=a.length>b.length?b:a;if(4>d.length||2*e.lengthd[4].length?g:d:d:g;var j;a.length>b.length?(g=h[0],d=h[1],e=h[2],j=h[3]):(e=h[0],j=h[1],g=h[2],d=h[3]);h=h[4];return[g,d,e,j,h]}; +diff_match_patch.prototype.diff_cleanupSemantic=function(a){for(var b=!1,c=[],d=0,e=null,f=0,g=0,h=0,j=0,i=0;f=e){if(d>=b.length/2||d>=c.length/2)a.splice(f,0,[0,c.substring(0,d)]),a[f-1][1]=b.substring(0,b.length-d),a[f+1][1]=c.substring(d),f++}else if(e>=b.length/2||e>=c.length/2)a.splice(f,0,[0,b.substring(0,e)]),a[f-1][0]=1,a[f-1][1]=c.substring(0,c.length-e),a[f+1][0]=-1,a[f+1][1]=b.substring(e),f++;f++}f++}}; +diff_match_patch.prototype.diff_cleanupSemanticLossless=function(a){function b(a,b){if(!a||!b)return 6;var c=a.charAt(a.length-1),d=b.charAt(0),e=c.match(diff_match_patch.nonAlphaNumericRegex_),f=d.match(diff_match_patch.nonAlphaNumericRegex_),g=e&&c.match(diff_match_patch.whitespaceRegex_),h=f&&d.match(diff_match_patch.whitespaceRegex_),c=g&&c.match(diff_match_patch.linebreakRegex_),d=h&&d.match(diff_match_patch.linebreakRegex_),i=c&&a.match(diff_match_patch.blanklineEndRegex_),j=d&&b.match(diff_match_patch.blanklineStartRegex_); +return i||j?5:c||d?4:e&&!g&&h?3:g||h?2:e||f?1:0}for(var c=1;c=i&&(i=k,g=d,h=e,j=f)}a[c-1][1]!=g&&(g?a[c-1][1]=g:(a.splice(c-1,1),c--),a[c][1]= +h,j?a[c+1][1]=j:(a.splice(c+1,1),c--))}c++}};diff_match_patch.nonAlphaNumericRegex_=/[^a-zA-Z0-9]/;diff_match_patch.whitespaceRegex_=/\s/;diff_match_patch.linebreakRegex_=/[\r\n]/;diff_match_patch.blanklineEndRegex_=/\n\r?\n$/;diff_match_patch.blanklineStartRegex_=/^\r?\n\r?\n/; +diff_match_patch.prototype.diff_cleanupEfficiency=function(a){for(var b=!1,c=[],d=0,e=null,f=0,g=!1,h=!1,j=!1,i=!1;fb)break;e=c;f=d}return a.length!=g&&-1===a[g][0]?f:f+(b-e)}; +diff_match_patch.prototype.diff_prettyHtml=function(a){for(var b=[],c=/&/g,d=//g,f=/\n/g,g=0;g");switch(h){case 1:b[g]=''+j+"";break;case -1:b[g]=''+j+"";break;case 0:b[g]=""+j+""}}return b.join("")}; +diff_match_patch.prototype.diff_text1=function(a){for(var b=[],c=0;cthis.Match_MaxBits)throw Error("Pattern too long for this browser.");var e=this.match_alphabet_(b),f=this,g=this.Match_Threshold,h=a.indexOf(b,c);-1!=h&&(g=Math.min(d(0,h),g),h=a.lastIndexOf(b,c+b.length),-1!=h&&(g=Math.min(d(0,h),g)));for(var j=1<=i;p--){var w=e[a.charAt(p-1)];k[p]=0===t?(k[p+1]<<1|1)&w:(k[p+1]<<1|1)&w|((r[p+1]|r[p])<<1|1)|r[p+1];if(k[p]&j&&(w=d(t,p-1),w<=g))if(g=w,h=p-1,h>c)i=Math.max(1,2*c-h);else break}if(d(t+1,c)>g)break;r=k}return h}; +diff_match_patch.prototype.match_alphabet_=function(a){for(var b={},c=0;c=2*this.Patch_Margin&& +e&&(this.patch_addContext_(a,h),c.push(a),a=new diff_match_patch.patch_obj,e=0,h=d,f=g)}1!==i&&(f+=k.length);-1!==i&&(g+=k.length)}e&&(this.patch_addContext_(a,h),c.push(a));return c};diff_match_patch.prototype.patch_deepCopy=function(a){for(var b=[],c=0;cthis.Match_MaxBits){if(j=this.match_main(b,h.substring(0,this.Match_MaxBits),g),-1!=j&&(i=this.match_main(b,h.substring(h.length-this.Match_MaxBits),g+h.length-this.Match_MaxBits),-1==i||j>=i))j=-1}else j=this.match_main(b,h,g); +if(-1==j)e[f]=!1,d-=a[f].length2-a[f].length1;else if(e[f]=!0,d=j-g,g=-1==i?b.substring(j,j+h.length):b.substring(j,i+this.Match_MaxBits),h==g)b=b.substring(0,j)+this.diff_text2(a[f].diffs)+b.substring(j+h.length);else if(g=this.diff_main(h,g,!1),h.length>this.Match_MaxBits&&this.diff_levenshtein(g)/h.length>this.Patch_DeleteThreshold)e[f]=!1;else{this.diff_cleanupSemanticLossless(g);for(var h=0,k,i=0;ie[0][1].length){var f=b-e[0][1].length;e[0][1]=c.substring(e[0][1].length)+e[0][1];d.start1-=f;d.start2-=f;d.length1+=f;d.length2+=f}d=a[a.length-1];e=d.diffs;0==e.length||0!=e[e.length-1][0]?(e.push([0, +c]),d.length1+=b,d.length2+=b):b>e[e.length-1][1].length&&(f=b-e[e.length-1][1].length,e[e.length-1][1]+=c.substring(0,f),d.length1+=f,d.length2+=f);return c}; +diff_match_patch.prototype.patch_splitMax=function(a){for(var b=this.Match_MaxBits,c=0;c2*b?(h.length1+=i.length,e+=i.length,j=!1,h.diffs.push([g,i]),d.diffs.shift()):(i=i.substring(0,b-h.length1-this.Patch_Margin),h.length1+=i.length,e+=i.length,0===g?(h.length2+=i.length,f+=i.length):j=!1,h.diffs.push([g,i]),i==d.diffs[0][1]?d.diffs.shift():d.diffs[0][1]=d.diffs[0][1].substring(i.length))}g=this.diff_text2(h.diffs);g=g.substring(g.length-this.Patch_Margin);i=this.diff_text1(d.diffs).substring(0,this.Patch_Margin);""!==i&& +(h.length1+=i.length,h.length2+=i.length,0!==h.diffs.length&&0===h.diffs[h.diffs.length-1][0]?h.diffs[h.diffs.length-1][1]+=i:h.diffs.push([0,i]));j||a.splice(++c,0,h)}}};diff_match_patch.prototype.patch_toText=function(a){for(var b=[],c=0;c)$/.test(state.lastType) || + (state.lastType == "quasi" && /\{\s*$/.test(stream.string.slice(0, stream.pos - (backUp || 0)))) +} + +CodeMirror.defineMode("javascript", function(config, parserConfig) { + var indentUnit = config.indentUnit; + var statementIndent = parserConfig.statementIndent; + var jsonldMode = parserConfig.jsonld; + var jsonMode = parserConfig.json || jsonldMode; + var isTS = parserConfig.typescript; + var wordRE = parserConfig.wordCharacters || /[\w$\xa1-\uffff]/; + + // Tokenizer + + var keywords = function(){ + function kw(type) {return {type: type, style: "keyword"};} + var A = kw("keyword a"), B = kw("keyword b"), C = kw("keyword c"); + var operator = kw("operator"), atom = {type: "atom", style: "atom"}; + + var jsKeywords = { + "if": kw("if"), "while": A, "with": A, "else": B, "do": B, "try": B, "finally": B, + "return": C, "break": C, "continue": C, "new": kw("new"), "delete": C, "throw": C, "debugger": C, + "var": kw("var"), "const": kw("var"), "let": kw("var"), + "function": kw("function"), "catch": kw("catch"), + "for": kw("for"), "switch": kw("switch"), "case": kw("case"), "default": kw("default"), + "in": operator, "typeof": operator, "instanceof": operator, + "true": atom, "false": atom, "null": atom, "undefined": atom, "NaN": atom, "Infinity": atom, + "this": kw("this"), "class": kw("class"), "super": kw("atom"), + "yield": C, "export": kw("export"), "import": kw("import"), "extends": C, + "await": C + }; + + // Extend the 'normal' keywords with the TypeScript language extensions + if (isTS) { + var type = {type: "variable", style: "type"}; + var tsKeywords = { + // object-like things + "interface": kw("class"), + "implements": C, + "namespace": C, + "module": kw("module"), + "enum": kw("module"), + + // scope modifiers + "public": kw("modifier"), + "private": kw("modifier"), + "protected": kw("modifier"), + "abstract": kw("modifier"), + + // types + "string": type, "number": type, "boolean": type, "any": type + }; + + for (var attr in tsKeywords) { + jsKeywords[attr] = tsKeywords[attr]; + } + } + + return jsKeywords; + }(); + + var isOperatorChar = /[+\-*&%=<>!?|~^@]/; + var isJsonldKeyword = /^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)"/; + + function readRegexp(stream) { + var escaped = false, next, inSet = false; + while ((next = stream.next()) != null) { + if (!escaped) { + if (next == "/" && !inSet) return; + if (next == "[") inSet = true; + else if (inSet && next == "]") inSet = false; + } + escaped = !escaped && next == "\\"; + } + } + + // Used as scratch variables to communicate multiple values without + // consing up tons of objects. + var type, content; + function ret(tp, style, cont) { + type = tp; content = cont; + return style; + } + function tokenBase(stream, state) { + var ch = stream.next(); + if (ch == '"' || ch == "'") { + state.tokenize = tokenString(ch); + return state.tokenize(stream, state); + } else if (ch == "." && stream.match(/^\d+(?:[eE][+\-]?\d+)?/)) { + return ret("number", "number"); + } else if (ch == "." && stream.match("..")) { + return ret("spread", "meta"); + } else if (/[\[\]{}\(\),;\:\.]/.test(ch)) { + return ret(ch); + } else if (ch == "=" && stream.eat(">")) { + return ret("=>", "operator"); + } else if (ch == "0" && stream.eat(/x/i)) { + stream.eatWhile(/[\da-f]/i); + return ret("number", "number"); + } else if (ch == "0" && stream.eat(/o/i)) { + stream.eatWhile(/[0-7]/i); + return ret("number", "number"); + } else if (ch == "0" && stream.eat(/b/i)) { + stream.eatWhile(/[01]/i); + return ret("number", "number"); + } else if (/\d/.test(ch)) { + stream.match(/^\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?/); + return ret("number", "number"); + } else if (ch == "/") { + if (stream.eat("*")) { + state.tokenize = tokenComment; + return tokenComment(stream, state); + } else if (stream.eat("/")) { + stream.skipToEnd(); + return ret("comment", "comment"); + } else if (expressionAllowed(stream, state, 1)) { + readRegexp(stream); + stream.match(/^\b(([gimyu])(?![gimyu]*\2))+\b/); + return ret("regexp", "string-2"); + } else { + stream.eatWhile(isOperatorChar); + return ret("operator", "operator", stream.current()); + } + } else if (ch == "`") { + state.tokenize = tokenQuasi; + return tokenQuasi(stream, state); + } else if (ch == "#") { + stream.skipToEnd(); + return ret("error", "error"); + } else if (isOperatorChar.test(ch)) { + if (ch != ">" || !state.lexical || state.lexical.type != ">") + stream.eatWhile(isOperatorChar); + return ret("operator", "operator", stream.current()); + } else if (wordRE.test(ch)) { + stream.eatWhile(wordRE); + var word = stream.current() + if (state.lastType != ".") { + if (keywords.propertyIsEnumerable(word)) { + var kw = keywords[word] + return ret(kw.type, kw.style, word) + } + if (word == "async" && stream.match(/^\s*[\(\w]/, false)) + return ret("async", "keyword", word) + } + return ret("variable", "variable", word) + } + } + + function tokenString(quote) { + return function(stream, state) { + var escaped = false, next; + if (jsonldMode && stream.peek() == "@" && stream.match(isJsonldKeyword)){ + state.tokenize = tokenBase; + return ret("jsonld-keyword", "meta"); + } + while ((next = stream.next()) != null) { + if (next == quote && !escaped) break; + escaped = !escaped && next == "\\"; + } + if (!escaped) state.tokenize = tokenBase; + return ret("string", "string"); + }; + } + + function tokenComment(stream, state) { + var maybeEnd = false, ch; + while (ch = stream.next()) { + if (ch == "/" && maybeEnd) { + state.tokenize = tokenBase; + break; + } + maybeEnd = (ch == "*"); + } + return ret("comment", "comment"); + } + + function tokenQuasi(stream, state) { + var escaped = false, next; + while ((next = stream.next()) != null) { + if (!escaped && (next == "`" || next == "$" && stream.eat("{"))) { + state.tokenize = tokenBase; + break; + } + escaped = !escaped && next == "\\"; + } + return ret("quasi", "string-2", stream.current()); + } + + var brackets = "([{}])"; + // This is a crude lookahead trick to try and notice that we're + // parsing the argument patterns for a fat-arrow function before we + // actually hit the arrow token. It only works if the arrow is on + // the same line as the arguments and there's no strange noise + // (comments) in between. Fallback is to only notice when we hit the + // arrow, and not declare the arguments as locals for the arrow + // body. + function findFatArrow(stream, state) { + if (state.fatArrowAt) state.fatArrowAt = null; + var arrow = stream.string.indexOf("=>", stream.start); + if (arrow < 0) return; + + if (isTS) { // Try to skip TypeScript return type declarations after the arguments + var m = /:\s*(?:\w+(?:<[^>]*>|\[\])?|\{[^}]*\})\s*$/.exec(stream.string.slice(stream.start, arrow)) + if (m) arrow = m.index + } + + var depth = 0, sawSomething = false; + for (var pos = arrow - 1; pos >= 0; --pos) { + var ch = stream.string.charAt(pos); + var bracket = brackets.indexOf(ch); + if (bracket >= 0 && bracket < 3) { + if (!depth) { ++pos; break; } + if (--depth == 0) { if (ch == "(") sawSomething = true; break; } + } else if (bracket >= 3 && bracket < 6) { + ++depth; + } else if (wordRE.test(ch)) { + sawSomething = true; + } else if (/["'\/]/.test(ch)) { + return; + } else if (sawSomething && !depth) { + ++pos; + break; + } + } + if (sawSomething && !depth) state.fatArrowAt = pos; + } + + // Parser + + var atomicTypes = {"atom": true, "number": true, "variable": true, "string": true, "regexp": true, "this": true, "jsonld-keyword": true}; + + function JSLexical(indented, column, type, align, prev, info) { + this.indented = indented; + this.column = column; + this.type = type; + this.prev = prev; + this.info = info; + if (align != null) this.align = align; + } + + function inScope(state, varname) { + for (var v = state.localVars; v; v = v.next) + if (v.name == varname) return true; + for (var cx = state.context; cx; cx = cx.prev) { + for (var v = cx.vars; v; v = v.next) + if (v.name == varname) return true; + } + } + + function parseJS(state, style, type, content, stream) { + var cc = state.cc; + // Communicate our context to the combinators. + // (Less wasteful than consing up a hundred closures on every call.) + cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc; cx.style = style; + + if (!state.lexical.hasOwnProperty("align")) + state.lexical.align = true; + + while(true) { + var combinator = cc.length ? cc.pop() : jsonMode ? expression : statement; + if (combinator(type, content)) { + while(cc.length && cc[cc.length - 1].lex) + cc.pop()(); + if (cx.marked) return cx.marked; + if (type == "variable" && inScope(state, content)) return "variable-2"; + return style; + } + } + } + + // Combinator utils + + var cx = {state: null, column: null, marked: null, cc: null}; + function pass() { + for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]); + } + function cont() { + pass.apply(null, arguments); + return true; + } + function register(varname) { + function inList(list) { + for (var v = list; v; v = v.next) + if (v.name == varname) return true; + return false; + } + var state = cx.state; + cx.marked = "def"; + if (state.context) { + if (inList(state.localVars)) return; + state.localVars = {name: varname, next: state.localVars}; + } else { + if (inList(state.globalVars)) return; + if (parserConfig.globalVars) + state.globalVars = {name: varname, next: state.globalVars}; + } + } + + // Combinators + + var defaultVars = {name: "this", next: {name: "arguments"}}; + function pushcontext() { + cx.state.context = {prev: cx.state.context, vars: cx.state.localVars}; + cx.state.localVars = defaultVars; + } + function popcontext() { + cx.state.localVars = cx.state.context.vars; + cx.state.context = cx.state.context.prev; + } + function pushlex(type, info) { + var result = function() { + var state = cx.state, indent = state.indented; + if (state.lexical.type == "stat") indent = state.lexical.indented; + else for (var outer = state.lexical; outer && outer.type == ")" && outer.align; outer = outer.prev) + indent = outer.indented; + state.lexical = new JSLexical(indent, cx.stream.column(), type, null, state.lexical, info); + }; + result.lex = true; + return result; + } + function poplex() { + var state = cx.state; + if (state.lexical.prev) { + if (state.lexical.type == ")") + state.indented = state.lexical.indented; + state.lexical = state.lexical.prev; + } + } + poplex.lex = true; + + function expect(wanted) { + function exp(type) { + if (type == wanted) return cont(); + else if (wanted == ";") return pass(); + else return cont(exp); + }; + return exp; + } + + function statement(type, value) { + if (type == "var") return cont(pushlex("vardef", value.length), vardef, expect(";"), poplex); + if (type == "keyword a") return cont(pushlex("form"), parenExpr, statement, poplex); + if (type == "keyword b") return cont(pushlex("form"), statement, poplex); + if (type == "{") return cont(pushlex("}"), block, poplex); + if (type == ";") return cont(); + if (type == "if") { + if (cx.state.lexical.info == "else" && cx.state.cc[cx.state.cc.length - 1] == poplex) + cx.state.cc.pop()(); + return cont(pushlex("form"), parenExpr, statement, poplex, maybeelse); + } + if (type == "function") return cont(functiondef); + if (type == "for") return cont(pushlex("form"), forspec, statement, poplex); + if (type == "variable") { + if (isTS && value == "type") { + cx.marked = "keyword" + return cont(typeexpr, expect("operator"), typeexpr, expect(";")); + } else { + return cont(pushlex("stat"), maybelabel); + } + } + if (type == "switch") return cont(pushlex("form"), parenExpr, expect("{"), pushlex("}", "switch"), + block, poplex, poplex); + if (type == "case") return cont(expression, expect(":")); + if (type == "default") return cont(expect(":")); + if (type == "catch") return cont(pushlex("form"), pushcontext, expect("("), funarg, expect(")"), + statement, poplex, popcontext); + if (type == "class") return cont(pushlex("form"), className, poplex); + if (type == "export") return cont(pushlex("stat"), afterExport, poplex); + if (type == "import") return cont(pushlex("stat"), afterImport, poplex); + if (type == "module") return cont(pushlex("form"), pattern, expect("{"), pushlex("}"), block, poplex, poplex) + if (type == "async") return cont(statement) + if (value == "@") return cont(expression, statement) + return pass(pushlex("stat"), expression, expect(";"), poplex); + } + function expression(type) { + return expressionInner(type, false); + } + function expressionNoComma(type) { + return expressionInner(type, true); + } + function parenExpr(type) { + if (type != "(") return pass() + return cont(pushlex(")"), expression, expect(")"), poplex) + } + function expressionInner(type, noComma) { + if (cx.state.fatArrowAt == cx.stream.start) { + var body = noComma ? arrowBodyNoComma : arrowBody; + if (type == "(") return cont(pushcontext, pushlex(")"), commasep(pattern, ")"), poplex, expect("=>"), body, popcontext); + else if (type == "variable") return pass(pushcontext, pattern, expect("=>"), body, popcontext); + } + + var maybeop = noComma ? maybeoperatorNoComma : maybeoperatorComma; + if (atomicTypes.hasOwnProperty(type)) return cont(maybeop); + if (type == "function") return cont(functiondef, maybeop); + if (type == "class") return cont(pushlex("form"), classExpression, poplex); + if (type == "keyword c" || type == "async") return cont(noComma ? maybeexpressionNoComma : maybeexpression); + if (type == "(") return cont(pushlex(")"), maybeexpression, expect(")"), poplex, maybeop); + if (type == "operator" || type == "spread") return cont(noComma ? expressionNoComma : expression); + if (type == "[") return cont(pushlex("]"), arrayLiteral, poplex, maybeop); + if (type == "{") return contCommasep(objprop, "}", null, maybeop); + if (type == "quasi") return pass(quasi, maybeop); + if (type == "new") return cont(maybeTarget(noComma)); + return cont(); + } + function maybeexpression(type) { + if (type.match(/[;\}\)\],]/)) return pass(); + return pass(expression); + } + function maybeexpressionNoComma(type) { + if (type.match(/[;\}\)\],]/)) return pass(); + return pass(expressionNoComma); + } + + function maybeoperatorComma(type, value) { + if (type == ",") return cont(expression); + return maybeoperatorNoComma(type, value, false); + } + function maybeoperatorNoComma(type, value, noComma) { + var me = noComma == false ? maybeoperatorComma : maybeoperatorNoComma; + var expr = noComma == false ? expression : expressionNoComma; + if (type == "=>") return cont(pushcontext, noComma ? arrowBodyNoComma : arrowBody, popcontext); + if (type == "operator") { + if (/\+\+|--/.test(value)) return cont(me); + if (value == "?") return cont(expression, expect(":"), expr); + return cont(expr); + } + if (type == "quasi") { return pass(quasi, me); } + if (type == ";") return; + if (type == "(") return contCommasep(expressionNoComma, ")", "call", me); + if (type == ".") return cont(property, me); + if (type == "[") return cont(pushlex("]"), maybeexpression, expect("]"), poplex, me); + if (isTS && value == "as") { cx.marked = "keyword"; return cont(typeexpr, me) } + } + function quasi(type, value) { + if (type != "quasi") return pass(); + if (value.slice(value.length - 2) != "${") return cont(quasi); + return cont(expression, continueQuasi); + } + function continueQuasi(type) { + if (type == "}") { + cx.marked = "string-2"; + cx.state.tokenize = tokenQuasi; + return cont(quasi); + } + } + function arrowBody(type) { + findFatArrow(cx.stream, cx.state); + return pass(type == "{" ? statement : expression); + } + function arrowBodyNoComma(type) { + findFatArrow(cx.stream, cx.state); + return pass(type == "{" ? statement : expressionNoComma); + } + function maybeTarget(noComma) { + return function(type) { + if (type == ".") return cont(noComma ? targetNoComma : target); + else return pass(noComma ? expressionNoComma : expression); + }; + } + function target(_, value) { + if (value == "target") { cx.marked = "keyword"; return cont(maybeoperatorComma); } + } + function targetNoComma(_, value) { + if (value == "target") { cx.marked = "keyword"; return cont(maybeoperatorNoComma); } + } + function maybelabel(type) { + if (type == ":") return cont(poplex, statement); + return pass(maybeoperatorComma, expect(";"), poplex); + } + function property(type) { + if (type == "variable") {cx.marked = "property"; return cont();} + } + function objprop(type, value) { + if (type == "async") { + cx.marked = "property"; + return cont(objprop); + } else if (type == "variable" || cx.style == "keyword") { + cx.marked = "property"; + if (value == "get" || value == "set") return cont(getterSetter); + return cont(afterprop); + } else if (type == "number" || type == "string") { + cx.marked = jsonldMode ? "property" : (cx.style + " property"); + return cont(afterprop); + } else if (type == "jsonld-keyword") { + return cont(afterprop); + } else if (type == "modifier") { + return cont(objprop) + } else if (type == "[") { + return cont(expression, expect("]"), afterprop); + } else if (type == "spread") { + return cont(expression, afterprop); + } else if (type == ":") { + return pass(afterprop) + } + } + function getterSetter(type) { + if (type != "variable") return pass(afterprop); + cx.marked = "property"; + return cont(functiondef); + } + function afterprop(type) { + if (type == ":") return cont(expressionNoComma); + if (type == "(") return pass(functiondef); + } + function commasep(what, end, sep) { + function proceed(type, value) { + if (sep ? sep.indexOf(type) > -1 : type == ",") { + var lex = cx.state.lexical; + if (lex.info == "call") lex.pos = (lex.pos || 0) + 1; + return cont(function(type, value) { + if (type == end || value == end) return pass() + return pass(what) + }, proceed); + } + if (type == end || value == end) return cont(); + return cont(expect(end)); + } + return function(type, value) { + if (type == end || value == end) return cont(); + return pass(what, proceed); + }; + } + function contCommasep(what, end, info) { + for (var i = 3; i < arguments.length; i++) + cx.cc.push(arguments[i]); + return cont(pushlex(end, info), commasep(what, end), poplex); + } + function block(type) { + if (type == "}") return cont(); + return pass(statement, block); + } + function maybetype(type, value) { + if (isTS) { + if (type == ":") return cont(typeexpr); + if (value == "?") return cont(maybetype); + } + } + function typeexpr(type) { + if (type == "variable") {cx.marked = "type"; return cont(afterType);} + if (type == "string" || type == "number" || type == "atom") return cont(afterType); + if (type == "{") return cont(pushlex("}"), commasep(typeprop, "}", ",;"), poplex, afterType) + if (type == "(") return cont(commasep(typearg, ")"), maybeReturnType) + } + function maybeReturnType(type) { + if (type == "=>") return cont(typeexpr) + } + function typeprop(type, value) { + if (type == "variable" || cx.style == "keyword") { + cx.marked = "property" + return cont(typeprop) + } else if (value == "?") { + return cont(typeprop) + } else if (type == ":") { + return cont(typeexpr) + } else if (type == "[") { + return cont(expression, maybetype, expect("]"), typeprop) + } + } + function typearg(type) { + if (type == "variable") return cont(typearg) + else if (type == ":") return cont(typeexpr) + } + function afterType(type, value) { + if (value == "<") return cont(pushlex(">"), commasep(typeexpr, ">"), poplex, afterType) + if (value == "|" || type == ".") return cont(typeexpr) + if (type == "[") return cont(expect("]"), afterType) + if (value == "extends") return cont(typeexpr) + } + function vardef() { + return pass(pattern, maybetype, maybeAssign, vardefCont); + } + function pattern(type, value) { + if (type == "modifier") return cont(pattern) + if (type == "variable") { register(value); return cont(); } + if (type == "spread") return cont(pattern); + if (type == "[") return contCommasep(pattern, "]"); + if (type == "{") return contCommasep(proppattern, "}"); + } + function proppattern(type, value) { + if (type == "variable" && !cx.stream.match(/^\s*:/, false)) { + register(value); + return cont(maybeAssign); + } + if (type == "variable") cx.marked = "property"; + if (type == "spread") return cont(pattern); + if (type == "}") return pass(); + return cont(expect(":"), pattern, maybeAssign); + } + function maybeAssign(_type, value) { + if (value == "=") return cont(expressionNoComma); + } + function vardefCont(type) { + if (type == ",") return cont(vardef); + } + function maybeelse(type, value) { + if (type == "keyword b" && value == "else") return cont(pushlex("form", "else"), statement, poplex); + } + function forspec(type) { + if (type == "(") return cont(pushlex(")"), forspec1, expect(")"), poplex); + } + function forspec1(type) { + if (type == "var") return cont(vardef, expect(";"), forspec2); + if (type == ";") return cont(forspec2); + if (type == "variable") return cont(formaybeinof); + return pass(expression, expect(";"), forspec2); + } + function formaybeinof(_type, value) { + if (value == "in" || value == "of") { cx.marked = "keyword"; return cont(expression); } + return cont(maybeoperatorComma, forspec2); + } + function forspec2(type, value) { + if (type == ";") return cont(forspec3); + if (value == "in" || value == "of") { cx.marked = "keyword"; return cont(expression); } + return pass(expression, expect(";"), forspec3); + } + function forspec3(type) { + if (type != ")") cont(expression); + } + function functiondef(type, value) { + if (value == "*") {cx.marked = "keyword"; return cont(functiondef);} + if (type == "variable") {register(value); return cont(functiondef);} + if (type == "(") return cont(pushcontext, pushlex(")"), commasep(funarg, ")"), poplex, maybetype, statement, popcontext); + if (isTS && value == "<") return cont(pushlex(">"), commasep(typeexpr, ">"), poplex, functiondef) + } + function funarg(type) { + if (type == "spread") return cont(funarg); + return pass(pattern, maybetype, maybeAssign); + } + function classExpression(type, value) { + // Class expressions may have an optional name. + if (type == "variable") return className(type, value); + return classNameAfter(type, value); + } + function className(type, value) { + if (type == "variable") {register(value); return cont(classNameAfter);} + } + function classNameAfter(type, value) { + if (value == "<") return cont(pushlex(">"), commasep(typeexpr, ">"), poplex, classNameAfter) + if (value == "extends" || value == "implements" || (isTS && type == ",")) + return cont(isTS ? typeexpr : expression, classNameAfter); + if (type == "{") return cont(pushlex("}"), classBody, poplex); + } + function classBody(type, value) { + if (type == "variable" || cx.style == "keyword") { + if ((value == "async" || value == "static" || value == "get" || value == "set" || + (isTS && (value == "public" || value == "private" || value == "protected" || value == "readonly" || value == "abstract"))) && + cx.stream.match(/^\s+[\w$\xa1-\uffff]/, false)) { + cx.marked = "keyword"; + return cont(classBody); + } + cx.marked = "property"; + return cont(isTS ? classfield : functiondef, classBody); + } + if (type == "[") + return cont(expression, expect("]"), isTS ? classfield : functiondef, classBody) + if (value == "*") { + cx.marked = "keyword"; + return cont(classBody); + } + if (type == ";") return cont(classBody); + if (type == "}") return cont(); + if (value == "@") return cont(expression, classBody) + } + function classfield(type, value) { + if (value == "?") return cont(classfield) + if (type == ":") return cont(typeexpr, maybeAssign) + if (value == "=") return cont(expressionNoComma) + return pass(functiondef) + } + function afterExport(type, value) { + if (value == "*") { cx.marked = "keyword"; return cont(maybeFrom, expect(";")); } + if (value == "default") { cx.marked = "keyword"; return cont(expression, expect(";")); } + if (type == "{") return cont(commasep(exportField, "}"), maybeFrom, expect(";")); + return pass(statement); + } + function exportField(type, value) { + if (value == "as") { cx.marked = "keyword"; return cont(expect("variable")); } + if (type == "variable") return pass(expressionNoComma, exportField); + } + function afterImport(type) { + if (type == "string") return cont(); + return pass(importSpec, maybeMoreImports, maybeFrom); + } + function importSpec(type, value) { + if (type == "{") return contCommasep(importSpec, "}"); + if (type == "variable") register(value); + if (value == "*") cx.marked = "keyword"; + return cont(maybeAs); + } + function maybeMoreImports(type) { + if (type == ",") return cont(importSpec, maybeMoreImports) + } + function maybeAs(_type, value) { + if (value == "as") { cx.marked = "keyword"; return cont(importSpec); } + } + function maybeFrom(_type, value) { + if (value == "from") { cx.marked = "keyword"; return cont(expression); } + } + function arrayLiteral(type) { + if (type == "]") return cont(); + return pass(commasep(expressionNoComma, "]")); + } + + function isContinuedStatement(state, textAfter) { + return state.lastType == "operator" || state.lastType == "," || + isOperatorChar.test(textAfter.charAt(0)) || + /[,.]/.test(textAfter.charAt(0)); + } + + // Interface + + return { + startState: function(basecolumn) { + var state = { + tokenize: tokenBase, + lastType: "sof", + cc: [], + lexical: new JSLexical((basecolumn || 0) - indentUnit, 0, "block", false), + localVars: parserConfig.localVars, + context: parserConfig.localVars && {vars: parserConfig.localVars}, + indented: basecolumn || 0 + }; + if (parserConfig.globalVars && typeof parserConfig.globalVars == "object") + state.globalVars = parserConfig.globalVars; + return state; + }, + + token: function(stream, state) { + if (stream.sol()) { + if (!state.lexical.hasOwnProperty("align")) + state.lexical.align = false; + state.indented = stream.indentation(); + findFatArrow(stream, state); + } + if (state.tokenize != tokenComment && stream.eatSpace()) return null; + var style = state.tokenize(stream, state); + if (type == "comment") return style; + state.lastType = type == "operator" && (content == "++" || content == "--") ? "incdec" : type; + return parseJS(state, style, type, content, stream); + }, + + indent: function(state, textAfter) { + if (state.tokenize == tokenComment) return CodeMirror.Pass; + if (state.tokenize != tokenBase) return 0; + var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical, top + // Kludge to prevent 'maybelse' from blocking lexical scope pops + if (!/^\s*else\b/.test(textAfter)) for (var i = state.cc.length - 1; i >= 0; --i) { + var c = state.cc[i]; + if (c == poplex) lexical = lexical.prev; + else if (c != maybeelse) break; + } + while ((lexical.type == "stat" || lexical.type == "form") && + (firstChar == "}" || ((top = state.cc[state.cc.length - 1]) && + (top == maybeoperatorComma || top == maybeoperatorNoComma) && + !/^[,\.=+\-*:?[\(]/.test(textAfter)))) + lexical = lexical.prev; + if (statementIndent && lexical.type == ")" && lexical.prev.type == "stat") + lexical = lexical.prev; + var type = lexical.type, closing = firstChar == type; + + if (type == "vardef") return lexical.indented + (state.lastType == "operator" || state.lastType == "," ? lexical.info + 1 : 0); + else if (type == "form" && firstChar == "{") return lexical.indented; + else if (type == "form") return lexical.indented + indentUnit; + else if (type == "stat") + return lexical.indented + (isContinuedStatement(state, textAfter) ? statementIndent || indentUnit : 0); + else if (lexical.info == "switch" && !closing && parserConfig.doubleIndentSwitch != false) + return lexical.indented + (/^(?:case|default)\b/.test(textAfter) ? indentUnit : 2 * indentUnit); + else if (lexical.align) return lexical.column + (closing ? 0 : 1); + else return lexical.indented + (closing ? 0 : indentUnit); + }, + + electricInput: /^\s*(?:case .*?:|default:|\{|\})$/, + blockCommentStart: jsonMode ? null : "/*", + blockCommentEnd: jsonMode ? null : "*/", + lineComment: jsonMode ? null : "//", + fold: "brace", + closeBrackets: "()[]{}''\"\"``", + + helperType: jsonMode ? "json" : "javascript", + jsonldMode: jsonldMode, + jsonMode: jsonMode, + + expressionAllowed: expressionAllowed, + skipExpression: function(state) { + var top = state.cc[state.cc.length - 1] + if (top == expression || top == expressionNoComma) state.cc.pop() + } + }; +}); + +CodeMirror.registerHelper("wordChars", "javascript", /[\w$]/); + +CodeMirror.defineMIME("text/javascript", "javascript"); +CodeMirror.defineMIME("text/ecmascript", "javascript"); +CodeMirror.defineMIME("application/javascript", "javascript"); +CodeMirror.defineMIME("application/x-javascript", "javascript"); +CodeMirror.defineMIME("application/ecmascript", "javascript"); +CodeMirror.defineMIME("application/json", {name: "javascript", json: true}); +CodeMirror.defineMIME("application/x-json", {name: "javascript", json: true}); +CodeMirror.defineMIME("application/ld+json", {name: "javascript", jsonld: true}); +CodeMirror.defineMIME("text/typescript", { name: "javascript", typescript: true }); +CodeMirror.defineMIME("application/typescript", { name: "javascript", typescript: true }); + +}); diff --git a/pigx-register/src/main/resources/static/console-fe/public/js/jquery.js b/pigx-register/src/main/resources/static/console-fe/public/js/jquery.js new file mode 100755 index 000000000..bcd3956c8 --- /dev/null +++ b/pigx-register/src/main/resources/static/console-fe/public/js/jquery.js @@ -0,0 +1,4 @@ +/*! jQuery v3.2.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.2.1",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null==a?f.call(this):a<0?this[a+this.length]:this[a]},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="
",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext;function B(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()}var C=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,D=/^.[^:#\[\.,]*$/;function E(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?r.grep(a,function(a){return a===b!==c}):"string"!=typeof b?r.grep(a,function(a){return i.call(b,a)>-1!==c}):D.test(b)?r.filter(b,a,c):(b=r.filter(b,a),r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType}))}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(E(this,a||[],!1))},not:function(a){return this.pushStack(E(this,a||[],!0))},is:function(a){return!!E(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var F,G=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,H=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||F,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:G.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),C.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};H.prototype=r.fn,F=r(d);var I=/^(?:parents|prev(?:Until|All))/,J={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function K(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return K(a,"nextSibling")},prev:function(a){return K(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return B(a,"iframe")?a.contentDocument:(B(a,"template")&&(a=a.content||a),r.merge([],a.childNodes))}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(J[a]||r.uniqueSort(e),I.test(a)&&e.reverse()),this.pushStack(e)}});var L=/[^\x20\t\r\n\f]+/g;function M(a){var b={};return r.each(a.match(L)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?M(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=e||a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function N(a){return a}function O(a){throw a}function P(a,b,c,d){var e;try{a&&r.isFunction(e=a.promise)?e.call(a).done(b).fail(c):a&&r.isFunction(e=a.then)?e.call(a,b,c):b.apply(void 0,[a].slice(d))}catch(a){c.apply(void 0,[a])}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b=f&&(d!==O&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:N,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:N)),c[2][3].add(g(0,a,r.isFunction(d)?d:O))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(P(a,g.done(h(c)).resolve,g.reject,!b),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)P(e[c],h(c),g.reject);return g.promise()}});var Q=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&Q.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var R=r.Deferred();r.fn.ready=function(a){return R.then(a)["catch"](function(a){r.readyException(a)}),this},r.extend({isReady:!1,readyWait:1,ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||R.resolveWith(d,[r]))}}),r.ready.then=R.then;function S(){d.removeEventListener("DOMContentLoaded",S), +a.removeEventListener("load",S),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",S),a.addEventListener("load",S));var T=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)T(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h1,null,!0)},removeData:function(a){return this.each(function(){X.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=W.get(a,b),c&&(!d||Array.isArray(c)?d=W.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return W.get(a,c)||W.access(a,c,{empty:r.Callbacks("once memory").add(function(){W.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length\x20\t\r\n\f]+)/i,la=/^$|\/(?:java|ecma)script/i,ma={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ma.optgroup=ma.option,ma.tbody=ma.tfoot=ma.colgroup=ma.caption=ma.thead,ma.th=ma.td;function na(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&B(a,b)?r.merge([a],c):c}function oa(a,b){for(var c=0,d=a.length;c-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=na(l.appendChild(f),"script"),j&&oa(g),c){k=0;while(f=g[k++])la.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var ra=d.documentElement,sa=/^key/,ta=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ua=/^([^.]*)(?:\.(.+)|)/;function va(){return!0}function wa(){return!1}function xa(){try{return d.activeElement}catch(a){}}function ya(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ya(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=wa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(ra,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(L)||[""],j=b.length;while(j--)h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.hasData(a)&&W.get(a);if(q&&(i=q.events)){b=(b||"").match(L)||[""],j=b.length;while(j--)if(h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&W.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(W.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c-1:r.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i\x20\t\r\n\f]*)[^>]*)\/>/gi,Aa=/\s*$/g;function Ea(a,b){return B(a,"table")&&B(11!==b.nodeType?b:b.firstChild,"tr")?r(">tbody",a)[0]||a:a}function Fa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Ga(a){var b=Ca.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ha(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(W.hasData(a)&&(f=W.access(a),g=W.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c1&&"string"==typeof q&&!o.checkClone&&Ba.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ja(f,b,c,d)});if(m&&(e=qa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(na(e,"script"),Fa),i=h.length;l")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=na(h),f=na(a),d=0,e=f.length;d0&&oa(g,!i&&na(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(U(c)){if(b=c[W.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[W.expando]=void 0}c[X.expando]&&(c[X.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ka(this,a,!0)},remove:function(a){return Ka(this,a)},text:function(a){return T(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.appendChild(a)}})},prepend:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(na(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return T(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!Aa.test(a)&&!ma[(ka.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c1)}});function _a(a,b,c,d,e){return new _a.prototype.init(a,b,c,d,e)}r.Tween=_a,_a.prototype={constructor:_a,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||r.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(r.cssNumber[c]?"":"px")},cur:function(){var a=_a.propHooks[this.prop];return a&&a.get?a.get(this):_a.propHooks._default.get(this)},run:function(a){var b,c=_a.propHooks[this.prop];return this.options.duration?this.pos=b=r.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):_a.propHooks._default.set(this),this}},_a.prototype.init.prototype=_a.prototype,_a.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=r.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){r.fx.step[a.prop]?r.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[r.cssProps[a.prop]]&&!r.cssHooks[a.prop]?a.elem[a.prop]=a.now:r.style(a.elem,a.prop,a.now+a.unit)}}},_a.propHooks.scrollTop=_a.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},r.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},r.fx=_a.prototype.init,r.fx.step={};var ab,bb,cb=/^(?:toggle|show|hide)$/,db=/queueHooks$/;function eb(){bb&&(d.hidden===!1&&a.requestAnimationFrame?a.requestAnimationFrame(eb):a.setTimeout(eb,r.fx.interval),r.fx.tick())}function fb(){return a.setTimeout(function(){ab=void 0}),ab=r.now()}function gb(a,b){var c,d=0,e={height:a};for(b=b?1:0;d<4;d+=2-b)c=ca[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function hb(a,b,c){for(var d,e=(kb.tweeners[b]||[]).concat(kb.tweeners["*"]),f=0,g=e.length;f1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?lb:void 0)),void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b), +null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&B(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(L);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),lb={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=mb[b]||r.find.attr;mb[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=mb[g],mb[g]=e,e=null!=c(a,b,d)?g:null,mb[g]=f),e}});var nb=/^(?:input|select|textarea|button)$/i,ob=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return T(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):nb.test(a.nodeName)||ob.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});function pb(a){var b=a.match(L)||[];return b.join(" ")}function qb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,qb(this)))});if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=qb(c),d=1===c.nodeType&&" "+pb(e)+" "){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=pb(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,qb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=qb(c),d=1===c.nodeType&&" "+pb(e)+" "){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=pb(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,qb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(L)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=qb(this),b&&W.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":W.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+pb(qb(c))+" ").indexOf(b)>-1)return!0;return!1}});var rb=/\r/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":Array.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(rb,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:pb(r.text(a))}},select:{get:function(a){var b,c,d,e=a.options,f=a.selectedIndex,g="select-one"===a.type,h=g?null:[],i=g?f+1:e.length;for(d=f<0?i:g?f:0;d-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(Array.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var sb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!sb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,sb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(W.get(h,"events")||{})[b.type]&&W.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&U(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!U(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=W.access(d,b);e||d.addEventListener(a,c,!0),W.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=W.access(d,b)-1;e?W.access(d,b,e):(d.removeEventListener(a,c,!0),W.remove(d,b))}}});var tb=a.location,ub=r.now(),vb=/\?/;r.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+b),c};var wb=/\[\]$/,xb=/\r?\n/g,yb=/^(?:submit|button|image|reset|file)$/i,zb=/^(?:input|select|textarea|keygen)/i;function Ab(a,b,c,d){var e;if(Array.isArray(b))r.each(b,function(b,e){c||wb.test(a)?d(a,e):Ab(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)Ab(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(Array.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)Ab(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&zb.test(this.nodeName)&&!yb.test(a)&&(this.checked||!ja.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:Array.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(xb,"\r\n")}}):{name:b.name,value:c.replace(xb,"\r\n")}}).get()}});var Bb=/%20/g,Cb=/#.*$/,Db=/([?&])_=[^&]*/,Eb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Fb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Gb=/^(?:GET|HEAD)$/,Hb=/^\/\//,Ib={},Jb={},Kb="*/".concat("*"),Lb=d.createElement("a");Lb.href=tb.href;function Mb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(L)||[];if(r.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Nb(a,b,c,d){var e={},f=a===Jb;function g(h){var i;return e[h]=!0,r.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Ob(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&r.extend(!0,a,d),a}function Pb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}if(f)return f!==i[0]&&i.unshift(f),c[f]}function Qb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}r.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:tb.href,type:"GET",isLocal:Fb.test(tb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Kb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":r.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Ob(Ob(a,r.ajaxSettings),b):Ob(r.ajaxSettings,a)},ajaxPrefilter:Mb(Ib),ajaxTransport:Mb(Jb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=r.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?r(p):r.event,s=r.Deferred(),t=r.Callbacks("once memory"),u=o.statusCode||{},v={},w={},x="canceled",y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=Eb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w[a.toLowerCase()]=w[a.toLowerCase()]||a,v[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a[y.status]);else for(b in a)u[b]=[u[b],a[b]];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),o.url=((b||o.url||tb.href)+"").replace(Hb,tb.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(L)||[""],null==o.crossDomain){j=d.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=Lb.protocol+"//"+Lb.host!=j.protocol+"//"+j.host}catch(z){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=r.param(o.data,o.traditional)),Nb(Ib,o,c,y),k)return y;l=r.event&&o.global,l&&0===r.active++&&r.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Gb.test(o.type),f=o.url.replace(Cb,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(Bb,"+")):(n=o.url.slice(f.length),o.data&&(f+=(vb.test(f)?"&":"?")+o.data,delete o.data),o.cache===!1&&(f=f.replace(Db,"$1"),n=(vb.test(f)?"&":"?")+"_="+ub++ +n),o.url=f+n),o.ifModified&&(r.lastModified[f]&&y.setRequestHeader("If-Modified-Since",r.lastModified[f]),r.etag[f]&&y.setRequestHeader("If-None-Match",r.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&y.setRequestHeader("Content-Type",o.contentType),y.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+Kb+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)y.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,y,o)===!1||k))return y.abort();if(x="abort",t.add(o.complete),y.done(o.success),y.fail(o.error),e=Nb(Jb,o,c,y)){if(y.readyState=1,l&&q.trigger("ajaxSend",[y,o]),k)return y;o.async&&o.timeout>0&&(i=a.setTimeout(function(){y.abort("timeout")},o.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,"No Transport");function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",y.readyState=b>0?4:0,j=b>=200&&b<300||304===b,d&&(v=Pb(o,y,d)),v=Qb(o,v,y,j),j?(o.ifModified&&(w=y.getResponseHeader("Last-Modified"),w&&(r.lastModified[f]=w),w=y.getResponseHeader("etag"),w&&(r.etag[f]=w)),204===b||"HEAD"===o.type?x="nocontent":304===b?x="notmodified":(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,!b&&x||(x="error",b<0&&(b=0))),y.status=b,y.statusText=(c||x)+"",j?s.resolveWith(p,[m,x,y]):s.rejectWith(p,[y,x,n]),y.statusCode(u),u=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[y,o,j?m:n]),t.fireWith(p,[y,x]),l&&(q.trigger("ajaxComplete",[y,o]),--r.active||r.event.trigger("ajaxStop")))}return y},getJSON:function(a,b,c){return r.get(a,b,c,"json")},getScript:function(a,b){return r.get(a,void 0,b,"script")}}),r.each(["get","post"],function(a,b){r[b]=function(a,c,d,e){return r.isFunction(c)&&(e=e||d,d=c,c=void 0),r.ajax(r.extend({url:a,type:b,dataType:e,data:c,success:d},r.isPlainObject(a)&&a))}}),r._evalUrl=function(a){return r.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},r.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Rb={0:200,1223:204},Sb=r.ajaxSettings.xhr();o.cors=!!Sb&&"withCredentials"in Sb,o.ajax=Sb=!!Sb,r.ajaxTransport(function(b){var c,d;if(o.cors||Sb&&!b.crossDomain)return{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Rb[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}}),r.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),r.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return r.globalEval(a),a}}}),r.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),r.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=r(" + + + + + + + + + + + + + + + + diff --git a/pigx-register/src/main/resources/static/js/main.js b/pigx-register/src/main/resources/static/js/main.js new file mode 100755 index 000000000..0d742f130 --- /dev/null +++ b/pigx-register/src/main/resources/static/js/main.js @@ -0,0 +1,95 @@ +!function(n){var a={};function o(e){if(a[e])return a[e].exports;var t=a[e]={i:e,l:!1,exports:{}};return n[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=n,o.c=a,o.d=function(e,t,n){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},o.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var n=Object.create(null);if(o.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var a in t)o.d(n,a,function(e){return t[e]}.bind(null,a));return n},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,"a",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p="",o(o.s=362)}([function(e,t,n){"use strict";e.exports=n(404)},function(e,t,n){"use strict";n.d(t,"a",function(){return C}),n.d(t,"b",function(){return D}),n.d(t,"d",function(){return E}),n.d(t,"c",function(){return O});var s,l,a,o,r,u,c,i,d,f=n(66),p=n(84),h=n(61),m=n(60),g=n(85),y=n.n(g),_=n(3),v=n.n(_),b=n(42),M=n.n(b),w=n(92),k=n.n(w),S=window,T=function(s){var l="";return(document.cookie&&document.cookie.split(";")||[]).forEach(function(e){var t=e.split("=")||[],n=Object(m.a)(t,2),a=n[0],o=void 0===a?"":a,r=n[1],i=void 0===r?"":r;-1!==o.trim().indexOf(s)&&(l=i)}),l.trim()},x=(s={},l={},{once:function(e,t){this.listen.call(this,e,t,!0)},listen:function(e,t){var n=2>>0,a=0;aSe(e)?(r=e+1,u-Se(e)):(r=e,u),{year:r,dayOfYear:i}}function Ke(e,t,n){var a,o,r=We(e.year(),t,n),i=Math.floor((e.dayOfYear()-r-1)/7)+1;return i<1?(o=e.year()-1,a=i+Be(o,t,n)):i>Be(e.year(),t,n)?(a=i-Be(e.year(),t,n),o=e.year()+1):(o=e.year(),a=i),{week:a,year:o}}function Be(e,t,n){var a=We(e,t,n),o=We(e+1,t,n);return(Se(e)-a+o)/7}function Ue(e,t){return e.slice(t,7).concat(e.slice(0,t))}V("w",["ww",2],"wo","week"),V("W",["WW",2],"Wo","isoWeek"),N("week","w"),N("isoWeek","W"),I("week",5),I("isoWeek",5),ue("w",Q),ue("ww",Q,q),ue("W",Q),ue("WW",Q,q),he(["w","ww","W","WW"],function(e,t,n,a){t[a.substr(0,1)]=k(e)}),V("d",0,"do","day"),V("dd",0,0,function(e){return this.localeData().weekdaysMin(this,e)}),V("ddd",0,0,function(e){return this.localeData().weekdaysShort(this,e)}),V("dddd",0,0,function(e){return this.localeData().weekdays(this,e)}),V("e",0,0,"weekday"),V("E",0,0,"isoWeekday"),N("day","d"),N("weekday","e"),N("isoWeekday","E"),I("day",11),I("weekday",11),I("isoWeekday",11),ue("d",Q),ue("e",Q),ue("E",Q),ue("dd",function(e,t){return t.weekdaysMinRegex(e)}),ue("ddd",function(e,t){return t.weekdaysShortRegex(e)}),ue("dddd",function(e,t){return t.weekdaysRegex(e)}),he(["dd","ddd","dddd"],function(e,t,n,a){var o=n._locale.weekdaysParse(e,a,n._strict);null!=o?t.d=o:_(n).invalidWeekday=e}),he(["d","e","E"],function(e,t,n,a){t[a]=k(e)});var qe="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),Ge="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),Je="Su_Mo_Tu_We_Th_Fr_Sa".split("_");function $e(e,t,n){var a,o,r,i=e.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],a=0;a<7;++a)r=f([2e3,1]).day(a),this._minWeekdaysParse[a]=this.weekdaysMin(r,"").toLocaleLowerCase(),this._shortWeekdaysParse[a]=this.weekdaysShort(r,"").toLocaleLowerCase(),this._weekdaysParse[a]=this.weekdays(r,"").toLocaleLowerCase();return n?"dddd"===t?-1!==(o=xe.call(this._weekdaysParse,i))?o:null:"ddd"===t?-1!==(o=xe.call(this._shortWeekdaysParse,i))?o:null:-1!==(o=xe.call(this._minWeekdaysParse,i))?o:null:"dddd"===t?-1!==(o=xe.call(this._weekdaysParse,i))?o:-1!==(o=xe.call(this._shortWeekdaysParse,i))?o:-1!==(o=xe.call(this._minWeekdaysParse,i))?o:null:"ddd"===t?-1!==(o=xe.call(this._shortWeekdaysParse,i))?o:-1!==(o=xe.call(this._weekdaysParse,i))?o:-1!==(o=xe.call(this._minWeekdaysParse,i))?o:null:-1!==(o=xe.call(this._minWeekdaysParse,i))?o:-1!==(o=xe.call(this._weekdaysParse,i))?o:-1!==(o=xe.call(this._shortWeekdaysParse,i))?o:null}var Qe=se,Xe=se,Ze=se;function et(){function e(e,t){return t.length-e.length}var t,n,a,o,r,i=[],s=[],l=[],u=[];for(t=0;t<7;t++)n=f([2e3,1]).day(t),a=this.weekdaysMin(n,""),o=this.weekdaysShort(n,""),r=this.weekdays(n,""),i.push(a),s.push(o),l.push(r),u.push(a),u.push(o),u.push(r);for(i.sort(e),s.sort(e),l.sort(e),u.sort(e),t=0;t<7;t++)s[t]=de(s[t]),l[t]=de(l[t]),u[t]=de(u[t]);this._weekdaysRegex=new RegExp("^("+u.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+l.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+s.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+i.join("|")+")","i")}function tt(){return this.hours()%12||12}function nt(e,t){V(e,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),t)})}function at(e,t){return t._meridiemParse}V("H",["HH",2],0,"hour"),V("h",["hh",2],0,tt),V("k",["kk",2],0,function(){return this.hours()||24}),V("hmm",0,0,function(){return""+tt.apply(this)+H(this.minutes(),2)}),V("hmmss",0,0,function(){return""+tt.apply(this)+H(this.minutes(),2)+H(this.seconds(),2)}),V("Hmm",0,0,function(){return""+this.hours()+H(this.minutes(),2)}),V("Hmmss",0,0,function(){return""+this.hours()+H(this.minutes(),2)+H(this.seconds(),2)}),nt("a",!0),nt("A",!1),N("hour","h"),I("hour",13),ue("a",at),ue("A",at),ue("H",Q),ue("h",Q),ue("k",Q),ue("HH",Q,q),ue("hh",Q,q),ue("kk",Q,q),ue("hmm",X),ue("hmmss",Z),ue("Hmm",X),ue("Hmmss",Z),pe(["H","HH"],_e),pe(["k","kk"],function(e,t,n){var a=k(e);t[_e]=24===a?0:a}),pe(["a","A"],function(e,t,n){n._isPm=n._locale.isPM(e),n._meridiem=e}),pe(["h","hh"],function(e,t,n){t[_e]=k(e),_(n).bigHour=!0}),pe("hmm",function(e,t,n){var a=e.length-2;t[_e]=k(e.substr(0,a)),t[ve]=k(e.substr(a)),_(n).bigHour=!0}),pe("hmmss",function(e,t,n){var a=e.length-4,o=e.length-2;t[_e]=k(e.substr(0,a)),t[ve]=k(e.substr(a,2)),t[be]=k(e.substr(o)),_(n).bigHour=!0}),pe("Hmm",function(e,t,n){var a=e.length-2;t[_e]=k(e.substr(0,a)),t[ve]=k(e.substr(a))}),pe("Hmmss",function(e,t,n){var a=e.length-4,o=e.length-2;t[_e]=k(e.substr(0,a)),t[ve]=k(e.substr(a,2)),t[be]=k(e.substr(o))});var ot,rt=Ce("Hours",!0),it={calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},invalidDate:"Invalid date",ordinal:"%d",dayOfMonthOrdinalParse:/\d{1,2}/,relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},months:Ye,monthsShort:je,week:{dow:0,doy:6},weekdays:qe,weekdaysMin:Je,weekdaysShort:Ge,meridiemParse:/[ap]\.?m?\.?/i},st={},lt={};function ut(e){return e?e.toLowerCase().replace("_","-"):e}function ct(e){var t=null;if(!st[e]&&void 0!==Xn&&Xn&&Xn.exports)try{t=ot._abbr,Zn(416)("./"+e),dt(t)}catch(e){}return st[e]}function dt(e,t){var n;return e&&((n=r(t)?pt(e):ft(e,t))?ot=n:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+e+" not found. Did you forget to load it?")),ot._abbr}function ft(e,t){if(null===t)return delete st[e],null;var n,a=it;if(t.abbr=e,null!=st[e])L("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),a=st[e]._config;else if(null!=t.parentLocale)if(null!=st[t.parentLocale])a=st[t.parentLocale]._config;else{if(null==(n=ct(t.parentLocale)))return lt[t.parentLocale]||(lt[t.parentLocale]=[]),lt[t.parentLocale].push({name:e,config:t}),null;a=n._config}return st[e]=new E(D(a,t)),lt[e]&<[e].forEach(function(e){ft(e.name,e.config)}),dt(e),st[e]}function pt(e){var t;if(e&&e._locale&&e._locale._abbr&&(e=e._locale._abbr),!e)return ot;if(!s(e)){if(t=ct(e))return t;e=[e]}return function(e){for(var t,n,a,o,r=0;r=t&&S(o,n,!0)>=t-1)break;t--}r++}return ot}(e)}function ht(e){var t,n=e._a;return n&&-2===_(e).overflow&&(t=n[ge]<0||11Oe(n[me],n[ge])?ye:n[_e]<0||24Be(n,r,i)?_(e)._overflowWeeks=!0:null!=l?_(e)._overflowWeekday=!0:(s=Ve(n,a,o,r,i),e._a[me]=s.year,e._dayOfYear=s.dayOfYear)}(e),null!=e._dayOfYear&&(r=mt(e._a[me],a[me]),(e._dayOfYear>Se(r)||0===e._dayOfYear)&&(_(e)._overflowDayOfYear=!0),n=Fe(r,0,e._dayOfYear),e._a[ge]=n.getUTCMonth(),e._a[ye]=n.getUTCDate()),t=0;t<3&&null==e._a[t];++t)e._a[t]=l[t]=a[t];for(;t<7;t++)e._a[t]=l[t]=null==e._a[t]?2===t?1:0:e._a[t];24===e._a[_e]&&0===e._a[ve]&&0===e._a[be]&&0===e._a[Me]&&(e._nextDay=!0,e._a[_e]=0),e._d=(e._useUTC?Fe:function(e,t,n,a,o,r,i){var s;return e<100&&0<=e?(s=new Date(e+400,t,n,a,o,r,i),isFinite(s.getFullYear())&&s.setFullYear(e)):s=new Date(e,t,n,a,o,r,i),s}).apply(null,l),o=e._useUTC?e._d.getUTCDay():e._d.getDay(),null!=e._tzm&&e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),e._nextDay&&(e._a[_e]=24),e._w&&void 0!==e._w.d&&e._w.d!==o&&(_(e).weekdayMismatch=!0)}}var yt=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,_t=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,vt=/Z|[+-]\d\d(?::?\d\d)?/,bt=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],Mt=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],wt=/^\/?Date\((\-?\d+)/i;function kt(e){var t,n,a,o,r,i,s=e._i,l=yt.exec(s)||_t.exec(s);if(l){for(_(e).iso=!0,t=0,n=bt.length;tn.valueOf():n.valueOf()this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},yn.isLocal=function(){return!!this.isValid()&&!this._isUTC},yn.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},yn.isUtc=Kt,yn.isUTC=Kt,yn.zoneAbbr=function(){return this._isUTC?"UTC":""},yn.zoneName=function(){return this._isUTC?"Coordinated Universal Time":""},yn.dates=n("dates accessor is deprecated. Use date instead.",dn),yn.months=n("months accessor is deprecated. Use month instead",Ae),yn.years=n("years accessor is deprecated. Use year instead",Le),yn.zone=n("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",function(e,t){return null!=e?("string"!=typeof e&&(e=-e),this.utcOffset(e,t),this):-this.utcOffset()}),yn.isDSTShifted=n("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",function(){if(!r(this._isDSTShifted))return this._isDSTShifted;var e={};if(v(e,this),(e=Dt(e))._a){var t=e._isUTC?f(e._a):Ot(e._a);this._isDSTShifted=this.isValid()&&0","Select");var n=u(e,t);return e.onInputUpdate&&(n.onSearch=e.onInputUpdate,n.showSearch=!0),n}}),t.default=a.default.config(o.default,{transform:u,exportNames:["focusInput"]}),e.exports=t.default},function(e,t,n){"use strict";n(30),n(476)},function(e,t,n){"use strict";n(62),n(50),n(29),n(30),n(524)},function(e,t,n){"use strict";e.exports=function(){}},function(e,t,n){"use strict";n(78),n(29),n(491)},function(e,t,n){"use strict";n.d(t,"a",function(){return a});var o=n(66);function a(t){for(var e=1;e+~]|"+I+")"+I+"*"),K=new RegExp("="+I+"*([^\\]'\"]*?)"+I+"*\\]","g"),B=new RegExp(R),U=new RegExp("^"+A+"$"),q={ID:new RegExp("^#("+A+")"),CLASS:new RegExp("^\\.("+A+")"),TAG:new RegExp("^("+A+"|[*])"),ATTR:new RegExp("^"+H),PSEUDO:new RegExp("^"+R),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+I+"*(even|odd|(([+-]|)(\\d*)n|)"+I+"*(?:([+-]|)"+I+"*(\\d+)|))"+I+"*\\)|)","i"),bool:new RegExp("^(?:"+P+")$","i"),needsContext:new RegExp("^"+I+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+I+"*((?:-\\d)?\\d*)"+I+"*\\)|)(?=[^-]|$)","i")},G=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,Q=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,X=/[+~]/,Z=new RegExp("\\\\([\\da-f]{1,6}"+I+"?|("+I+")|.)","ig"),ee=function(e,t,n){var a="0x"+t-65536;return a!=a||n?t:a<0?String.fromCharCode(a+65536):String.fromCharCode(a>>10|55296,1023&a|56320)},te=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ne=function(e,t){return t?"\0"===e?"�":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},ae=function(){w()},oe=_e(function(e){return!0===e.disabled&&("form"in e||"label"in e)},{dir:"parentNode",next:"legend"});try{N.apply(t=Y.call(_.childNodes),_.childNodes),t[_.childNodes.length].nodeType}catch(e){N={apply:t.length?function(e,t){O.apply(e,Y.call(t))}:function(e,t){for(var n=e.length,a=0;e[n++]=t[a++];);e.length=n-1}}}function re(e,t,n,a){var o,r,i,s,l,u,c,d=t&&t.ownerDocument,f=t?t.nodeType:9;if(n=n||[],"string"!=typeof e||!e||1!==f&&9!==f&&11!==f)return n;if(!a&&((t?t.ownerDocument||t:_)!==k&&w(t),t=t||k,S)){if(11!==f&&(l=Q.exec(e)))if(o=l[1]){if(9===f){if(!(i=t.getElementById(o)))return n;if(i.id===o)return n.push(i),n}else if(d&&(i=d.getElementById(o))&&y(t,i)&&i.id===o)return n.push(i),n}else{if(l[2])return N.apply(n,t.getElementsByTagName(e)),n;if((o=l[3])&&p.getElementsByClassName&&t.getElementsByClassName)return N.apply(n,t.getElementsByClassName(o)),n}if(p.qsa&&!L[e+" "]&&(!g||!g.test(e))){if(1!==f)d=t,c=e;else if("object"!==t.nodeName.toLowerCase()){for((s=t.getAttribute("id"))?s=s.replace(te,ne):t.setAttribute("id",s=T),r=(u=h(e)).length;r--;)u[r]="#"+s+" "+ye(u[r]);c=u.join(","),d=X.test(e)&&me(t.parentNode)||t}if(c)try{return N.apply(n,d.querySelectorAll(c)),n}catch(e){}finally{s===T&&t.removeAttribute("id")}}}return m(e.replace(F,"$1"),t,n,a)}function ie(){var a=[];return function e(t,n){return a.push(t+" ")>b.cacheLength&&delete e[a.shift()],e[t+" "]=n}}function se(e){return e[T]=!0,e}function le(e){var t=k.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function ue(e,t){for(var n=e.split("|"),a=n.length;a--;)b.attrHandle[n[a]]=t}function ce(e,t){var n=t&&e,a=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(a)return a;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function fe(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function pe(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&oe(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function he(i){return se(function(r){return r=+r,se(function(e,t){for(var n,a=i([],e.length,r),o=a.length;o--;)e[n=a[o]]&&(e[n]=!(t[n]=e[n]))})})}function me(e){return e&&void 0!==e.getElementsByTagName&&e}for(e in p=re.support={},o=re.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},w=re.setDocument=function(e){var t,n,a=e?e.ownerDocument||e:_;return a!==k&&9===a.nodeType&&a.documentElement&&(i=(k=a).documentElement,S=!o(k),_!==k&&(n=k.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",ae,!1):n.attachEvent&&n.attachEvent("onunload",ae)),p.attributes=le(function(e){return e.className="i",!e.getAttribute("className")}),p.getElementsByTagName=le(function(e){return e.appendChild(k.createComment("")),!e.getElementsByTagName("*").length}),p.getElementsByClassName=$.test(k.getElementsByClassName),p.getById=le(function(e){return i.appendChild(e).id=T,!k.getElementsByName||!k.getElementsByName(T).length}),p.getById?(b.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if(void 0!==t.getElementById&&S){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(Z,ee);return function(e){var t=void 0!==e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if(void 0!==t.getElementById&&S){var n,a,o,r=t.getElementById(e);if(r){if((n=r.getAttributeNode("id"))&&n.value===e)return[r];for(o=t.getElementsByName(e),a=0;r=o[a++];)if((n=r.getAttributeNode("id"))&&n.value===e)return[r]}return[]}}),b.find.TAG=p.getElementsByTagName?function(e,t){return void 0!==t.getElementsByTagName?t.getElementsByTagName(e):p.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,a=[],o=0,r=t.getElementsByTagName(e);if("*"!==e)return r;for(;n=r[o++];)1===n.nodeType&&a.push(n);return a},b.find.CLASS=p.getElementsByClassName&&function(e,t){if(void 0!==t.getElementsByClassName&&S)return t.getElementsByClassName(e)},s=[],g=[],(p.qsa=$.test(k.querySelectorAll))&&(le(function(e){i.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&g.push("[*^$]="+I+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||g.push("\\["+I+"*(?:value|"+P+")"),e.querySelectorAll("[id~="+T+"-]").length||g.push("~="),e.querySelectorAll(":checked").length||g.push(":checked"),e.querySelectorAll("a#"+T+"+*").length||g.push(".#.+[+~]")}),le(function(e){e.innerHTML="";var t=k.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&g.push("name"+I+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&g.push(":enabled",":disabled"),i.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&g.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),g.push(",.*:")})),(p.matchesSelector=$.test(c=i.matches||i.webkitMatchesSelector||i.mozMatchesSelector||i.oMatchesSelector||i.msMatchesSelector))&&le(function(e){p.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",R)}),g=g.length&&new RegExp(g.join("|")),s=s.length&&new RegExp(s.join("|")),t=$.test(i.compareDocumentPosition),y=t||$.test(i.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,a=t&&t.parentNode;return e===a||!(!a||1!==a.nodeType||!(n.contains?n.contains(a):e.compareDocumentPosition&&16&e.compareDocumentPosition(a)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},C=t?function(e,t){if(e===t)return u=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!p.sortDetached&&t.compareDocumentPosition(e)===n?e===k||e.ownerDocument===_&&y(_,e)?-1:t===k||t.ownerDocument===_&&y(_,t)?1:l?j(l,e)-j(l,t):0:4&n?-1:1)}:function(e,t){if(e===t)return u=!0,0;var n,a=0,o=e.parentNode,r=t.parentNode,i=[e],s=[t];if(!o||!r)return e===k?-1:t===k?1:o?-1:r?1:l?j(l,e)-j(l,t):0;if(o===r)return ce(e,t);for(n=e;n=n.parentNode;)i.unshift(n);for(n=t;n=n.parentNode;)s.unshift(n);for(;i[a]===s[a];)a++;return a?ce(i[a],s[a]):i[a]===_?-1:s[a]===_?1:0}),k},re.matches=function(e,t){return re(e,null,null,t)},re.matchesSelector=function(e,t){if((e.ownerDocument||e)!==k&&w(e),t=t.replace(K,"='$1']"),p.matchesSelector&&S&&!L[t+" "]&&(!s||!s.test(t))&&(!g||!g.test(t)))try{var n=c.call(e,t);if(n||p.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(Z,ee),e[3]=(e[3]||e[4]||e[5]||"").replace(Z,ee),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||re.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&re.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return q.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&B.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(Z,ee).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=f[e+" "];return t||(t=new RegExp("(^|"+I+")"+e+"("+I+"|$)"))&&f(e,function(e){return t.test("string"==typeof e.className&&e.className||void 0!==e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,a,o){return function(e){var t=re.attr(e,n);return null==t?"!="===a:!a||(t+="","="===a?t===o:"!="===a?t!==o:"^="===a?o&&0===t.indexOf(o):"*="===a?o&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,a){return _(n)?T.grep(e,function(e,t){return!!n.call(e,t,e)!==a}):n.nodeType?T.grep(e,function(e){return e===n!==a}):"string"!=typeof n?T.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(T.fn.init=function(e,t,n){var a,o;if(!e)return this;if(n=n||E,"string"!=typeof e)return e.nodeType?(this[0]=e,this.length=1,this):_(e)?void 0!==n.ready?n.ready(e):e(T):T.makeArray(e,this);if(!(a="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:O.exec(e))||!a[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(a[1]){if(t=t instanceof T?t[0]:t,T.merge(this,T.parseHTML(a[1],t&&t.nodeType?t.ownerDocument||t:S,!0)),C.test(a[1])&&T.isPlainObject(t))for(a in t)_(this[a])?this[a](t[a]):this.attr(a,t[a]);return this}return(o=S.getElementById(a[2]))&&(this[0]=o,this.length=1),this}).prototype=T.fn,E=T(S);var N=/^(?:parents|prev(?:Until|All))/,Y={children:!0,contents:!0,next:!0,prev:!0};function j(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}T.fn.extend({has:function(e){var t=T(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]+)/i,ce=/^$|^module$|\/(?:java|ecma)script/i,de={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function fe(e,t){var n;return n=void 0!==e.getElementsByTagName?e.getElementsByTagName(t||"*"):void 0!==e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&L(e,t)?T.merge([e],n):n}function pe(e,t){for(var n=0,a=e.length;nx",y.noCloneChecked=!!he.cloneNode(!0).lastChild.defaultValue;var _e=S.documentElement,ve=/^key/,be=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Me=/^([^.]*)(?:\.(.+)|)/;function we(){return!0}function ke(){return!1}function Se(){try{return S.activeElement}catch(e){}}function Te(e,t,n,a,o,r){var i,s;if("object"==typeof t){for(s in"string"!=typeof n&&(a=a||n,n=void 0),t)Te(e,s,n,a,t[s],r);return e}if(null==a&&null==o?(o=n,a=n=void 0):null==o&&("string"==typeof n?(o=a,a=void 0):(o=a,a=n,n=void 0)),!1===o)o=ke;else if(!o)return e;return 1===r&&(i=o,(o=function(e){return T().off(e),i.apply(this,arguments)}).guid=i.guid||(i.guid=T.guid++)),e.each(function(){T.event.add(this,t,o,a,n)})}T.event={global:{},add:function(t,e,n,a,o){var r,i,s,l,u,c,d,f,p,h,m,g=J.get(t);if(g)for(n.handler&&(n=(r=n).handler,o=r.selector),o&&T.find.matchesSelector(_e,o),n.guid||(n.guid=T.guid++),(l=g.events)||(l=g.events={}),(i=g.handle)||(i=g.handle=function(e){return void 0!==T&&T.event.triggered!==e.type?T.event.dispatch.apply(t,arguments):void 0}),u=(e=(e||"").match(P)||[""]).length;u--;)p=m=(s=Me.exec(e[u])||[])[1],h=(s[2]||"").split(".").sort(),p&&(d=T.event.special[p]||{},p=(o?d.delegateType:d.bindType)||p,d=T.event.special[p]||{},c=T.extend({type:p,origType:m,data:a,handler:n,guid:n.guid,selector:o,needsContext:o&&T.expr.match.needsContext.test(o),namespace:h.join(".")},r),(f=l[p])||((f=l[p]=[]).delegateCount=0,d.setup&&!1!==d.setup.call(t,a,h,i)||t.addEventListener&&t.addEventListener(p,i)),d.add&&(d.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),o?f.splice(f.delegateCount++,0,c):f.push(c),T.event.global[p]=!0)},remove:function(e,t,n,a,o){var r,i,s,l,u,c,d,f,p,h,m,g=J.hasData(e)&&J.get(e);if(g&&(l=g.events)){for(u=(t=(t||"").match(P)||[""]).length;u--;)if(p=m=(s=Me.exec(t[u])||[])[1],h=(s[2]||"").split(".").sort(),p){for(d=T.event.special[p]||{},f=l[p=(a?d.delegateType:d.bindType)||p]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=r=f.length;r--;)c=f[r],!o&&m!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||a&&a!==c.selector&&("**"!==a||!c.selector)||(f.splice(r,1),c.selector&&f.delegateCount--,d.remove&&d.remove.call(e,c));i&&!f.length&&(d.teardown&&!1!==d.teardown.call(e,h,g.handle)||T.removeEvent(e,p,g.handle),delete l[p])}else for(p in l)T.event.remove(e,p+t[u],n,a,!0);T.isEmptyObject(l)&&J.remove(e,"handle events")}},dispatch:function(e){var t,n,a,o,r,i,s=T.event.fix(e),l=new Array(arguments.length),u=(J.get(this,"events")||{})[s.type]||[],c=T.event.special[s.type]||{};for(l[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,Le=/\s*$/g;function Ee(e,t){return L(e,"table")&&L(11!==t.nodeType?t:t.firstChild,"tr")&&T(e).children("tbody")[0]||e}function Oe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Ne(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Ye(e,t){var n,a,o,r,i,s,l,u;if(1===t.nodeType){if(J.hasData(e)&&(r=J.access(e),i=J.set(t,r),u=r.events))for(o in delete i.handle,i.events={},u)for(n=0,a=u[o].length;n")},clone:function(e,t,n){var a,o,r,i,s,l,u,c=e.cloneNode(!0),d=T.contains(e.ownerDocument,e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||T.isXMLDoc(e)))for(i=fe(c),a=0,o=(r=fe(e)).length;a").prop({charset:n.scriptCharset,src:n.url}).on("load error",o=function(e){a.remove(),o=null,e&&t("error"===e.type?404:200,e.type)}),S.head.appendChild(a[0])},abort:function(){o&&o()}}});var Wt,Vt=[],Kt=/(=)\?(?=&|$)|\?\?/;T.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Vt.pop()||T.expando+"_"+bt++;return this[e]=!0,e}}),T.ajaxPrefilter("json jsonp",function(e,t,n){var a,o,r,i=!1!==e.jsonp&&(Kt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Kt.test(e.data)&&"data");if(i||"jsonp"===e.dataTypes[0])return a=e.jsonpCallback=_(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,i?e[i]=e[i].replace(Kt,"$1"+a):!1!==e.jsonp&&(e.url+=(Mt.test(e.url)?"&":"?")+e.jsonp+"="+a),e.converters["script json"]=function(){return r||T.error(a+" was not called"),r[0]},e.dataTypes[0]="json",o=k[a],k[a]=function(){r=arguments},n.always(function(){void 0===o?T(k).removeProp(a):k[a]=o,e[a]&&(e.jsonpCallback=t.jsonpCallback,Vt.push(a)),r&&_(o)&&o(r[0]),r=o=void 0}),"script"}),y.createHTMLDocument=((Wt=S.implementation.createHTMLDocument("").body).innerHTML="
",2===Wt.childNodes.length),T.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((a=(t=S.implementation.createHTMLDocument("")).createElement("base")).href=S.location.href,t.head.appendChild(a)):t=S),r=!n&&[],(o=C.exec(e))?[t.createElement(o[1])]:(o=ye([e],t,r),r&&r.length&&T(r).remove(),T.merge([],o.childNodes)));var a,o,r},T.fn.load=function(e,t,n){var a,o,r,i=this,s=e.indexOf(" ");return-1").append(T.parseHTML(e)).find(a):e)}).always(n&&function(e,t){i.each(function(){n.apply(this,r||[e.responseText,t,e])})}),this},T.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){T.fn[t]=function(e){return this.on(t,e)}}),T.expr.pseudos.animated=function(t){return T.grep(T.timers,function(e){return t===e.elem}).length},T.offset={setOffset:function(e,t,n){var a,o,r,i,s,l,u=T.css(e,"position"),c=T(e),d={};"static"===u&&(e.style.position="relative"),s=c.offset(),r=T.css(e,"top"),l=T.css(e,"left"),o=("absolute"===u||"fixed"===u)&&-1<(r+l).indexOf("auto")?(i=(a=c.position()).top,a.left):(i=parseFloat(r)||0,parseFloat(l)||0),_(t)&&(t=t.call(e,n,T.extend({},s))),null!=t.top&&(d.top=t.top-s.top+i),null!=t.left&&(d.left=t.left-s.left+o),"using"in t?t.using.call(e,d):c.css(d)}},T.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){T.offset.setOffset(this,t,e)});var e,n,a=this[0];return a?a.getClientRects().length?(e=a.getBoundingClientRect(),n=a.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,a=this[0],o={top:0,left:0};if("fixed"===T.css(a,"position"))t=a.getBoundingClientRect();else{for(t=this.offset(),n=a.ownerDocument,e=a.offsetParent||n.documentElement;e&&(e===n.body||e===n.documentElement)&&"static"===T.css(e,"position");)e=e.parentNode;e&&e!==a&&1===e.nodeType&&((o=T(e).offset()).top+=T.css(e,"borderTopWidth",!0),o.left+=T.css(e,"borderLeftWidth",!0))}return{top:t.top-o.top-T.css(a,"marginTop",!0),left:t.left-o.left-T.css(a,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var e=this.offsetParent;e&&"static"===T.css(e,"position");)e=e.offsetParent;return e||_e})}}),T.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,o){var r="pageYOffset"===o;T.fn[t]=function(e){return W(this,function(e,t,n){var a;if(v(e)?a=e:9===e.nodeType&&(a=e.defaultView),void 0===n)return a?a[o]:e[t];a?a.scrollTo(r?a.pageXOffset:n,r?n:a.pageYOffset):e[t]=n},t,e,arguments.length)}}),T.each(["top","left"],function(e,n){T.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=Re(e,n),Ie.test(t)?T(e).position()[n]+"px":t})}),T.each({Height:"height",Width:"width"},function(i,s){T.each({padding:"inner"+i,content:s,"":"outer"+i},function(a,r){T.fn[r]=function(e,t){var n=arguments.length&&(a||"boolean"!=typeof e),o=a||(!0===e||!0===t?"margin":"border");return W(this,function(e,t,n){var a;return v(e)?0===r.indexOf("outer")?e["inner"+i]:e.document.documentElement["client"+i]:9===e.nodeType?(a=e.documentElement,Math.max(e.body["scroll"+i],a["scroll"+i],e.body["offset"+i],a["offset"+i],a["client"+i])):void 0===n?T.css(e,t,o):T.style(e,t,n,o)},s,n?e:void 0,n)}})}),T.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(e,n){T.fn[n]=function(e,t){return 0, or explicitly pass "'+h+'" as a prop to "'+o+'".'),n.initSelector(),n.initSubscription(),n}w(e,a);var t=e.prototype;return t.getChildContext=function(){var e,t=this.propsMode?null:this.subscription;return(e={})[_]=t||this.context[_],e},t.componentDidMount=function(){f&&(this.subscription.trySubscribe(),this.selector.run(this.props),this.selector.shouldComponentUpdate&&this.forceUpdate())},t.componentWillReceiveProps=function(e){this.selector.run(e)},t.shouldComponentUpdate=function(){return this.selector.shouldComponentUpdate},t.componentWillUnmount=function(){this.subscription&&this.subscription.tryUnsubscribe(),this.subscription=null,this.notifyNestedSubs=P,this.store=null,this.selector.run=P,this.selector.shouldComponentUpdate=!1},t.getWrappedInstance=function(){return E()(g,"To access the wrapped instance, you need to specify { withRef: true } in the options argument of the "+l+"() call."),this.wrappedInstance},t.setWrappedInstance=function(e){this.wrappedInstance=e},t.initSelector=function(){var n,a,o,e=i(this.store.dispatch,r);this.selector=(n=e,a=this.store,o={run:function(e){try{var t=n(a.getState(),e);(t!==o.props||o.error)&&(o.shouldComponentUpdate=!0,o.props=t,o.error=null)}catch(e){o.shouldComponentUpdate=!0,o.error=e}}}),this.selector.run(this.props)},t.initSubscription=function(){if(f){var e=(this.propsMode?this.props:this.context)[_];this.subscription=new N(this.store,e,this.onStateChange.bind(this)),this.notifyNestedSubs=this.subscription.notifyNestedSubs.bind(this.subscription)}},t.onStateChange=function(){this.selector.run(this.props),this.selector.shouldComponentUpdate?(this.componentDidUpdate=this.notifyNestedSubsOnComponentDidUpdate,this.setState(j)):this.notifyNestedSubs()},t.notifyNestedSubsOnComponentDidUpdate=function(){this.componentDidUpdate=void 0,this.notifyNestedSubs()},t.isSubscribed=function(){return Boolean(this.subscription)&&this.subscription.isSubscribed()},t.addExtraProps=function(e){if(!(g||c||this.propsMode&&this.subscription))return e;var t=L({},e);return g&&(t.ref=this.setWrappedInstance),c&&(t[c]=this.renderCount++),this.propsMode&&this.subscription&&(t[_]=this.subscription),t},t.render=function(){var e=this.selector;if(e.shouldComponentUpdate=!1,e.error)throw e.error;return Object(k.createElement)(n,this.addExtraProps(e.props))},e}(k.Component);return t.WrappedComponent=n,t.displayName=o,t.childContextTypes=M,t.contextTypes=b,t.propTypes=b,D()(t,n)}}var c=Object.prototype.hasOwnProperty;function d(e,t){return e===t?0!==e||0!==t||1/e==1/t:e!=e&&t!=t}function v(e,t){if(d(e,t))return!0;if("object"!=typeof e||null===e||"object"!=typeof t||null===t)return!1;var n=Object.keys(e),a=Object.keys(t);if(n.length!==a.length)return!1;for(var o=0;othis.menuNode.clientHeight)){var e=this.menuNode.clientHeight+this.menuNode.scrollTop,t=this.itemNode.offsetTop+this.itemNode.offsetHeight;e or withRouter() outside a ");var l=t.route,u=(a||l.location).pathname;return Object(f.a)(u,{path:o,strict:r,exact:i,sensitive:s},l.match)},i.prototype.componentWillMount=function(){o()(!(this.props.component&&this.props.render),"You should not use and in the same route; will be ignored"),o()(!(this.props.component&&this.props.children&&!h(this.props.children)),"You should not use and in the same route; will be ignored"),o()(!(this.props.render&&this.props.children&&!h(this.props.children)),"You should not use and in the same route; will be ignored")},i.prototype.componentWillReceiveProps=function(e,t){o()(!(e.location&&!this.props.location),' elements should not change from uncontrolled to controlled (or vice versa). You initially used no "location" prop and then provided one on a subsequent render.'),o()(!(!e.location&&this.props.location),' elements should not change from controlled to uncontrolled (or vice versa). You provided a "location" prop initially but omitted it on a subsequent render.'),this.setState({match:this.computeMatch(e,t.router)})},i.prototype.render=function(){var e=this.state.match,t=this.props,n=t.children,a=t.component,o=t.render,r=this.context.router,i=r.history,s=r.route,l=r.staticContext,u={match:e,location:this.props.location||s.location,history:i,staticContext:l};return a?e?d.a.createElement(a,u):null:o?e?o(u):null:"function"==typeof n?n(u):n&&!h(n)?d.a.Children.only(n):null},i}(d.a.Component);m.propTypes={computedMatch:l.a.object,path:l.a.string,exact:l.a.bool,strict:l.a.bool,sensitive:l.a.bool,component:l.a.func,render:l.a.func,children:l.a.oneOfType([l.a.func,l.a.node]),location:l.a.object},m.contextTypes={router:l.a.shape({history:l.a.object.isRequired,route:l.a.object.isRequired,staticContext:l.a.object})},m.childContextTypes={router:l.a.object.isRequired},t.a=m},function(e,t,n){"use strict";var a=n(108),y=n.n(a),_={},v=0;t.a=function(e){var t=1document.F=Object<\/script>"),e.close(),c=e.F;n--;)delete c[u][i[n]];return c()};e.exports=Object.create||function(e,t){var n;return null!==e?(l[u]=o(e),n=new l,l[u]=null,n[s]=e):n=c(),void 0===t?n:r(n,t)}},function(e,t,n){var a=n(70).f,o=n(64),r=n(74)("toStringTag");e.exports=function(e,t,n){e&&!o(e=n?e:e.prototype,r)&&a(e,r,{configurable:!0,value:t})}},function(e,t,n){t.f=n(74)},function(e,t,n){var a=n(57),o=n(63),r=n(95),i=n(126),s=n(70).f;e.exports=function(e){var t=o.Symbol||(o.Symbol=r?{}:a.Symbol||{});"_"==e.charAt(0)||e in t||s(t,e,{value:i.f(e)})}},function(e,t,n){"use strict";t.__esModule=!0,t.default=function(t,e){if(!t)return null;if("string"==typeof t)return document.getElementById(t);"function"==typeof t&&(t=t(e));if(!t)return null;try{return(0,a.findDOMNode)(t)}catch(e){return t}};var a=n(24);e.exports=t.default},function(e,t,n){"use strict";n(62),n(428)},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var a,o,h=f(n(5)),r=f(n(4)),i=f(n(6)),s=f(n(7)),l=n(0),m=f(l),u=f(n(2)),g=f(n(12)),c=f(n(23)),d=n(11),y=f(n(90));function f(e){return e&&e.__esModule?e:{default:e}}var _=d.func.bindCtx,v=d.obj.pickOthers,p=(o=a=function(n){function p(e){(0,r.default)(this,p);var t=(0,i.default)(this,n.call(this,e));return _(t,["handleKeyDown","handleClick"]),t}return(0,s.default)(p,n),p.prototype.getSelected=function(){var e=this.props,t=e._key,n=e.root,a=e.selected,o=n.props.selectMode,r=n.state.selectedKeys;return a||!!o&&-1o;)i(a,n=t[o++])&&(~l(r,n)||r.push(n));return r}},function(e,t,n){var a=n(149);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==a(e)?e.split(""):Object(e)}},function(e,t){var n={}.toString;e.exports=function(e){return n.call(e).slice(8,-1)}},function(e,t,n){var a=n(117);e.exports=function(e){return Object(a(e))}},function(e,t,n){"use strict";var v=n(95),b=n(87),M=n(152),w=n(69),k=n(123),S=n(379),T=n(125),x=n(382),L=n(74)("iterator"),C=!([].keys&&"next"in[].keys()),D="values",E=function(){return this};e.exports=function(e,t,n,a,o,r,i){S(n,t,a);var s,l,u,c=function(e){if(!C&&e in h)return h[e];switch(e){case"keys":case D:return function(){return new n(this,e)}}return function(){return new n(this,e)}},d=t+" Iterator",f=o==D,p=!1,h=e.prototype,m=h[L]||h["@@iterator"]||o&&h[o],g=m||c(o),y=o?f?c("entries"):g:void 0,_="Array"==t&&h.entries||m;if(_&&(u=x(_.call(new e)))!==Object.prototype&&u.next&&(T(u,d,!0),v||"function"==typeof u[L]||w(u,L,E)),f&&m&&m.name!==D&&(p=!0,g=function(){return m.call(this)}),v&&!i||!C&&!p&&h[L]||w(h,L,g),k[t]=g,k[d]=E,o)if(s={values:f?g:c(D),keys:r?g:c("keys"),entries:y},i)for(l in s)l in h||M(h,l,s[l]);else b(b.P+b.F*(C||p),t,s);return s}},function(e,t,n){e.exports=n(69)},function(e,t,n){var a=n(147),o=n(121).concat("length","prototype");t.f=Object.getOwnPropertyNames||function(e){return a(e,o)}},function(e,t,n){var a=n(97),o=n(93),r=n(73),i=n(116),s=n(64),l=n(145),u=Object.getOwnPropertyDescriptor;t.f=n(72)?u:function(e,t){if(e=r(e),t=i(t,!0),l)try{return u(e,t)}catch(e){}if(s(e,t))return o(!a.f.call(e,t),e[t])}},function(e,t,n){"use strict"; +/* +object-assign +(c) Sindre Sorhus +@license MIT +*/var l=Object.getOwnPropertySymbols,u=Object.prototype.hasOwnProperty,c=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map(function(e){return t[e]}).join(""))return!1;var a={};return"abcdefghijklmnopqrst".split("").forEach(function(e){a[e]=e}),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},a)).join("")}catch(e){return!1}}()?Object.assign:function(e,t){for(var n,a,o=function(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}(e),r=1;re.clientHeight&&0a.length&&a.every(function(e,t){return e===n[t]})},y.prototype.handleOpen=function(t,e,n,a){var o=this,r=void 0,i=this.props,s=i.mode,l=i.openMode,u=this.state.openKeys,c=u.indexOf(t);e&&-1===c?"inline"===s?"single"===l?(r=u.filter(function(e){return!o.isSibling(o.k2n[t].pos,o.k2n[e].pos)})).push(t):r=u.concat(t):(r=u.filter(function(e){return o.isAncestor(o.k2n[t].pos,o.k2n[e].pos)})).push(t):!e&&-1this.popupNode.offsetWidth&&y(this.popupNode,"width",p.offsetWidth+"px")}"outside"!==u||"hoz"===l&&1===n||(y(this.popupNode,"height",f.offsetHeight+"px"),y(this.popupNode,"overflow-y","scroll"));var h=this.popupProps;h.onOpen&&h.onOpen()},D.prototype.handlePopupClose=function(){var e=this.props.root.popupNodes,t=e.indexOf(this.popupNode);-1e.slidesToShow&&(t=e.slideWidth*e.slidesToShow*-1,o=e.slideHeight*e.slidesToShow*-1),e.slideCount%e.slidesToScroll!=0){var r=e.slideIndex+e.slidesToScroll>e.slideCount&&e.slideCount>e.slidesToShow;if(e.rtl)r=(e.slideIndex>=e.slideCount?e.slideCount-e.slideIndex:e.slideIndex)+e.slidesToScroll>e.slideCount&&e.slideCount>e.slidesToShow;r&&(o=e.slideIndex>e.slideCount?(t=(e.slidesToShow-(e.slideIndex-e.slideCount))*e.slideWidth*-1,(e.slidesToShow-(e.slideIndex-e.slideCount))*e.slideHeight*-1):(t=e.slideCount%e.slidesToScroll*e.slideWidth*-1,e.slideCount%e.slidesToScroll*e.slideHeight*-1))}}else e.slideCount%e.slidesToScroll!=0&&e.slideIndex+e.slidesToScroll>e.slideCount&&e.slideCount>e.slidesToShow&&(t=(e.slidesToShow-e.slideCount%e.slidesToScroll)*e.slideWidth);if(e.centerMode&&(e.infinite?t+=e.slideWidth*Math.floor(e.slidesToShow/2):t=e.slideWidth*Math.floor(e.slidesToShow/2)),n=e.vertical?e.slideIndex*e.slideHeight*-1+o:e.slideIndex*e.slideWidth*-1+t,!0===e.variableWidth){var i=void 0;n=(a=e.slideCount<=e.slidesToShow||!1===e.infinite?s.default.findDOMNode(e.trackRef).childNodes[e.slideIndex]:(i=e.slideIndex+e.slidesToShow,s.default.findDOMNode(e.trackRef).childNodes[i]))?-1*a.offsetLeft:0,!0===e.centerMode&&(a=!1===e.infinite?s.default.findDOMNode(e.trackRef).children[e.slideIndex]:s.default.findDOMNode(e.trackRef).children[e.slideIndex+e.slidesToShow+1])&&(n=-1*a.offsetLeft+(e.listWidth-a.offsetWidth)/2)}return n}},function(e,t,n){"use strict";n(592)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.routerMiddleware=t.routerActions=t.goForward=t.goBack=t.go=t.replace=t.push=t.CALL_HISTORY_METHOD=t.routerReducer=t.LOCATION_CHANGE=t.syncHistoryWithStore=void 0;var a=n(293);Object.defineProperty(t,"LOCATION_CHANGE",{enumerable:!0,get:function(){return a.LOCATION_CHANGE}}),Object.defineProperty(t,"routerReducer",{enumerable:!0,get:function(){return a.routerReducer}});var o=n(294);Object.defineProperty(t,"CALL_HISTORY_METHOD",{enumerable:!0,get:function(){return o.CALL_HISTORY_METHOD}}),Object.defineProperty(t,"push",{enumerable:!0,get:function(){return o.push}}),Object.defineProperty(t,"replace",{enumerable:!0,get:function(){return o.replace}}),Object.defineProperty(t,"go",{enumerable:!0,get:function(){return o.go}}),Object.defineProperty(t,"goBack",{enumerable:!0,get:function(){return o.goBack}}),Object.defineProperty(t,"goForward",{enumerable:!0,get:function(){return o.goForward}}),Object.defineProperty(t,"routerActions",{enumerable:!0,get:function(){return o.routerActions}});var r=s(n(424)),i=s(n(425));function s(e){return e&&e.__esModule?e:{default:e}}t.syncHistoryWithStore=r.default,t.routerMiddleware=i.default},function(e,t,n){"use strict";function a(o){return function(e){var n=e.dispatch,a=e.getState;return function(t){return function(e){return"function"==typeof e?e(n,a,o):t(e)}}}}var o=a();o.withExtraArgument=a,t.a=o},function(e,t,n){"use strict";var a=n(140),o={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},d={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},r={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},i={};function f(e){return a.isMemo(e)?r:i[e.$$typeof]||o}i[a.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0};var p=Object.defineProperty,h=Object.getOwnPropertyNames,m=Object.getOwnPropertySymbols,g=Object.getOwnPropertyDescriptor,y=Object.getPrototypeOf,_=Object.prototype;e.exports=function e(t,n,a){if("string"==typeof n)return t;if(_){var o=y(n);o&&o!==_&&e(t,o,a)}var r=h(n);m&&(r=r.concat(m(n)));for(var i=f(t),s=f(n),l=0;l\n com.alibaba.nacos\n nacos-client\n ${version}\n
\n*/\npackage com.alibaba.nacos.example;\n\nimport java.util.Properties;\nimport java.util.concurrent.Executor;\nimport com.alibaba.nacos.api.NacosFactory;\nimport com.alibaba.nacos.api.config.ConfigService;\nimport com.alibaba.nacos.api.config.listener.Listener;\nimport com.alibaba.nacos.api.exception.NacosException;\n\n/**\n * Config service example\n * \n * @author Nacos\n *\n */\npublic class ConfigExample {\n\n\tpublic static void main(String[] args) throws NacosException, InterruptedException {\n\t\tString serverAddr = "localhost";\n\t\tString dataId = "'.concat(e.dataId,'";\n\t\tString group = "').concat(e.group,'";\n\t\tProperties properties = new Properties();\n\t\tproperties.put(PropertyKeyConst.SERVER_ADDR, serverAddr);\n\t\tConfigService configService = NacosFactory.createConfigService(properties);\n\t\tString content = configService.getConfig(dataId, group, 5000);\n\t\tSystem.out.println(content);\n\t\tconfigService.addListener(dataId, group, new Listener() {\n\t\t\t@Override\n\t\t\tpublic void receiveConfigInfo(String configInfo) {\n\t\t\t\tSystem.out.println("recieve:" + configInfo);\n\t\t\t}\n\n\t\t\t@Override\n\t\t\tpublic Executor getExecutor() {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t});\n\t\t\n\t\tboolean isPublishOk = configService.publishConfig(dataId, group, "content");\n\t\tSystem.out.println(isPublishOk);\n\t\t\n\t\tThread.sleep(3000);\n\t\tcontent = configService.getConfig(dataId, group, 5000);\n\t\tSystem.out.println(content);\n\n\t\tboolean isRemoveOk = configService.removeConfig(dataId, group);\n\t\tSystem.out.println(isRemoveOk);\n\t\tThread.sleep(3000);\n\n\t\tcontent = configService.getConfig(dataId, group, 5000);\n\t\tSystem.out.println(content);\n\t\tThread.sleep(300000);\n\n\t}\n}\n')}},{key:"getNodejsCode",value:function(e){return"TODO"}},{key:"getCppCode",value:function(e){return"TODO"}},{key:"getShellCode",value:function(e){return"TODO"}},{key:"getPythonCode",value:function(e){return"TODO"}},{key:"openDialog",value:function(e){var t=this;this.setState({dialogvisible:!0}),this.record=e,setTimeout(function(){t.getData()})}},{key:"closeDialog",value:function(){this.setState({dialogvisible:!1})}},{key:"createCodeMirror",value:function(e,t){var n=this.refs.codepreview;n&&(n.innerHTML="",this.cm=window.CodeMirror(n,{value:t,mode:e,height:400,width:500,lineNumbers:!0,theme:"xq-light",lint:!0,tabMode:"indent",autoMatchParens:!0,textWrapping:!0,gutters:["CodeMirror-lint-markers"],extraKeys:{F1:function(e){e.setOption("fullScreen",!e.getOption("fullScreen"))},Esc:function(e){e.getOption("fullScreen")&&e.setOption("fullScreen",!1)}}}))}},{key:"changeTab",value:function(e,t){var n=this;setTimeout(function(){n[e]=!0,n.createCodeMirror("text/javascript",t)})}},{key:"render",value:function(){var e=this.props.locale,t=void 0===e?{}:e,n=X.a.createElement("div",null);return X.a.createElement("div",null,X.a.createElement(H.a,{title:t.sampleCode,style:{width:"80%"},visible:this.state.dialogvisible,footer:n,onClose:this.closeDialog.bind(this)},X.a.createElement("div",{style:{height:500}},X.a.createElement(g.a,{tip:t.loading,style:{width:"100%"},visible:this.state.loading},X.a.createElement(re.a,{shape:"text",style:{height:40,paddingBottom:10}},X.a.createElement(ie,{title:"Java",key:1,onClick:this.changeTab.bind(this,"commoneditor1",this.defaultCode)}),X.a.createElement(ie,{title:"Spring Boot",key:2,onClick:this.changeTab.bind(this,"commoneditor2",this.sprigboot_code)}),X.a.createElement(ie,{title:"Spring Cloud",key:21,onClick:this.changeTab.bind(this,"commoneditor21",this.sprigcloud_code)}),X.a.createElement(ie,{title:"Node.js",key:3,onClick:this.changeTab.bind(this,"commoneditor3",this.nodejsCode)}),X.a.createElement(ie,{title:"C++",key:4,onClick:this.changeTab.bind(this,"commoneditor4",this.cppCode)}),X.a.createElement(ie,{title:"Shell",key:5,onClick:this.changeTab.bind(this,"commoneditor5",this.shellCode)}),X.a.createElement(ie,{title:"Python",key:6,onClick:this.changeTab.bind(this,"commoneditor6",this.pythonCode)})),X.a.createElement("div",{ref:"codepreview"})))))}}]),n}(X.a.Component),o.displayName="ShowCodeing",a=r))||a,le=(n(78),n(39)),ue=n.n(le),ce=(n(579),ue.a.Row),de=ue.a.Col,fe=(0,G.a.config)((l=s=function(e){function n(e){var t;return Object(F.a)(this,n),(t=Object(V.a)(this,Object(K.a)(n).call(this,e))).state={visible:!1,title:"",content:"",isok:!0,dataId:"",group:""},t}return Object(U.a)(n,e),Object(W.a)(n,[{key:"componentDidMount",value:function(){this.initData()}},{key:"initData",value:function(){var e=this.props.locale,t=void 0===e?{}:e;this.setState({title:t.confManagement})}},{key:"openDialog",value:function(e){this.setState({visible:!0,title:e.title,content:e.content,isok:e.isok,dataId:e.dataId,group:e.group,message:e.message})}},{key:"closeDialog",value:function(){this.setState({visible:!1})}},{key:"render",value:function(){var e=this.props.locale,t=void 0===e?{}:e,n=X.a.createElement("div",{style:{textAlign:"right"}},X.a.createElement(b.a,{type:"primary",onClick:this.closeDialog.bind(this)},t.determine));return X.a.createElement("div",null,X.a.createElement(H.a,{visible:this.state.visible,footer:n,style:{width:555},onCancel:this.closeDialog.bind(this),onClose:this.closeDialog.bind(this),title:t.deletetitle},X.a.createElement("div",null,X.a.createElement(ce,null,X.a.createElement(de,{span:"4",style:{paddingTop:16}},X.a.createElement(j.a,{type:"".concat(this.state.isok?"success":"delete","-filling"),style:{color:this.state.isok?"green":"red"},size:"xl"})),X.a.createElement(de,{span:"20"},X.a.createElement("div",null,X.a.createElement("h3",null,this.state.isok?t.deletedSuccessfully:t.deleteFailed),X.a.createElement("p",null,X.a.createElement("span",{style:{color:"#999",marginRight:5}},"Data ID:"),X.a.createElement("span",{style:{color:"#c7254e"}},this.state.dataId)),X.a.createElement("p",null,X.a.createElement("span",{style:{color:"#999",marginRight:5}},"Group:"),X.a.createElement("span",{style:{color:"#c7254e"}},this.state.group)),this.state.isok?"":X.a.createElement("p",{style:{color:"red"}},this.state.message)))))))}}]),n}(X.a.Component),s.displayName="DeleteDialog",i=l))||i,pe=(n(580),n(345)),he=n.n(pe),me=(0,G.a.config)((d=c=function(e){function t(){return Object(F.a)(this,t),Object(V.a)(this,Object(K.a)(t).apply(this,arguments))}return Object(U.a)(t,e),Object(W.a)(t,[{key:"render",value:function(){var e=this.props,t=e.data,n=void 0===t?{}:t,a=e.height,o=e.locale,r=void 0===o?{}:o;return X.a.createElement("div",null,"notice"===n.modeType?X.a.createElement("div",{"data-spm-click":"gostr=/aliyun;locaid=notice"},X.a.createElement(he.a,{style:{marginBottom:1l?P.a.createElement($.a,{className:"pagination",total:s.count,pageSize:l,onChange:function(e){return a.onChangePage(e)}}):null,P.a.createElement(Z,{ref:this.editInstanceDialog,serviceName:r,clusterName:n,openLoading:function(){return a.openLoading()},closeLoading:function(){return a.closeLoading()},getInstanceList:function(){return a.getInstanceList()}})):null}}]),n}(P.a.Component),c.displayName="InstanceTable",u=d))||u,te=(n(593),Y.a.Item),ne={labelCol:{fixedSpan:10},wrapperCol:{span:14}},ae=(0,O.a.config)((h=p=function(e){function n(e){var t;return Object(T.a)(this,n),(t=Object(L.a)(this,Object(C.a)(n).call(this,e))).editServiceDialog=P.a.createRef(),t.editClusterDialog=P.a.createRef(),t.state={serviceName:Object(q.a)(e.location.search,"name"),groupName:Object(q.a)(e.location.search,"groupName"),loading:!1,currentPage:1,clusters:[],instances:{},service:{},pageSize:10,pageNum:{}},t}return Object(D.a)(n,e),Object(x.a)(n,[{key:"componentDidMount",value:function(){this.state.serviceName?this.getServiceDetail():this.props.history.goBack()}},{key:"getServiceDetail",value:function(){var r=this,e=this.state,t=e.serviceName,n=e.groupName;Object(I.c)({url:"v1/ns/catalog/service?serviceName=".concat(t,"&groupName=").concat(n),beforeSend:function(){return r.openLoading()},success:function(e){var t=e.clusters,n=void 0===t?[]:t,a=e.service,o=void 0===a?{}:a;return r.setState({service:o,clusters:n})},error:function(e){return k.a.error(e.responseText||"error")},complete:function(){return r.closeLoading()}})}},{key:"openLoading",value:function(){this.setState({loading:!0})}},{key:"closeLoading",value:function(){this.setState({loading:!1})}},{key:"openEditServiceDialog",value:function(){this.editServiceDialog.current.getInstance().show(this.state.service)}},{key:"openClusterDialog",value:function(e){this.editClusterDialog.current.getInstance().show(e)}},{key:"render",value:function(){var t=this,e=this.props.locale,n=void 0===e?{}:e,a=this.state,o=a.serviceName,r=a.loading,i=a.service,s=void 0===i?{}:i,l=a.clusters,u=s.metadata,c=void 0===u?{}:u,d=s.selector,f=void 0===d?{}:d,p=Object(q.b)(B.c)(c);return P.a.createElement("div",{className:"main-container service-detail"},P.a.createElement(g.a,{shape:"flower",tip:"Loading...",className:"loading",visible:r,color:"#333"},P.a.createElement("h1",{style:{position:"relative",width:"100%"}},n.serviceDetails,P.a.createElement(M.a,{type:"primary",className:"header-btn",onClick:function(){return t.props.history.goBack()}},n.back),P.a.createElement(M.a,{type:"normal",className:"header-btn",onClick:function(){return t.openEditServiceDialog()}},n.editService)),P.a.createElement(Y.a,ne,P.a.createElement(te,{label:"".concat(n.serviceName,":")},P.a.createElement(S.a,{value:s.name,readOnly:!0})),P.a.createElement(te,{label:"".concat(n.groupName,":")},P.a.createElement(S.a,{value:s.groupName,readOnly:!0})),P.a.createElement(te,{label:"".concat(n.protectThreshold,":")},P.a.createElement(S.a,{value:s.protectThreshold,readOnly:!0})),P.a.createElement(te,{label:"".concat(n.metadata,":")},P.a.createElement(U.a,{language:"properties",width:"100%",height:200,value:p,options:B.e})),P.a.createElement(te,{label:"".concat(n.type,":")},P.a.createElement(S.a,{value:f.type,readOnly:!0})),"label"===s.type&&P.a.createElement(te,{label:"".concat(n.selector,":")},P.a.createElement(S.a,{value:f.selector,readOnly:!0}))),l.map(function(e){return P.a.createElement(_.a,{key:e.name,className:"cluster-card",title:"".concat(n.cluster,":"),subTitle:e.name,contentHeight:"auto",extra:P.a.createElement(M.a,{type:"normal",onClick:function(){return t.openClusterDialog(e)}},n.editCluster)},P.a.createElement(ee,{clusterName:e.name,serviceName:o}))})),P.a.createElement(A.a,{ref:this.editServiceDialog,openLoading:function(){return t.openLoading()},closeLoading:function(){return t.closeLoading()},getServiceDetail:function(){return t.getServiceDetail()}}),P.a.createElement(G,{ref:this.editClusterDialog,openLoading:function(){return t.openLoading()},closeLoading:function(){return t.closeLoading()},getServiceDetail:function(){return t.getServiceDetail()}}))}}]),n}(P.a.Component),p.displayName="ServiceDetail",f=h))||f;t.a=ae},function(e,t,n){"use strict";n(41);var a,o,r,i,s,l,u=n(25),c=n.n(u),d=(n(29),n(19)),f=n.n(d),p=(n(330),n(110)),h=n.n(p),m=(n(30),n(23)),g=n.n(m),y=(n(58),n(31)),_=n.n(y),v=(n(32),n(10)),b=n.n(v),M=(n(50),n(27)),w=n.n(M),k=(n(33),n(20)),S=n.n(k),T=(n(44),n(28)),x=n.n(T),L=n(14),C=n(15),D=n(16),E=n(17),O=n(22),N=n(18),Y=(n(26),n(8)),j=n.n(Y),P=(n(98),n(81)),I=n.n(P),A=(n(35),n(9)),H=n.n(A),R=(n(138),n(56)),z=n.n(R),F=n(42),W=n.n(F),V=n(0),K=n.n(V),B=n(1),U=(n(78),n(39)),q=n.n(U),G=(n(557),q.a.Row),J=q.a.Col,$=(0,j.a.config)((r=o=function(e){function n(e){var t;return Object(L.a)(this,n),(t=Object(D.a)(this,Object(E.a)(n).call(this,e))).diffeditor=K.a.createRef(),t.state={dialogvisible:!1},t}return Object(N.a)(n,e),Object(C.a)(n,[{key:"openDialog",value:function(e,t){var n=this;this.setState({dialogvisible:!0}),setTimeout(function(){n.createDiffCodeMirror(e,t)})}},{key:"closeDialog",value:function(){this.setState({dialogvisible:!1})}},{key:"createDiffCodeMirror",value:function(e,t){var n=this.diffeditor.current;n.innerHTML="",this.diffeditor=window.CodeMirror.MergeView(n,{value:e||"",readOnly:!0,origLeft:null,orig:t||"",lineNumbers:!0,mode:this.mode,theme:"xq-light",highlightDifferences:!0,connect:"align",collapseIdentical:!1})}},{key:"confirmPub",value:function(){this.closeDialog(),this.props.publishConfig()}},{key:"render",value:function(){var e=this.props.locale,t=void 0===e?{}:e,n=K.a.createElement("div",null," ",K.a.createElement(f.a,{type:"primary",onClick:this.confirmPub.bind(this)},t.publish));return K.a.createElement("div",null,K.a.createElement(S.a,{title:t.contents,style:{width:"80%"},visible:this.state.dialogvisible,footer:n,onClose:this.closeDialog.bind(this)},K.a.createElement("div",{style:{height:400}},K.a.createElement("div",null,K.a.createElement(G,null,K.a.createElement(J,{style:{textAlign:"center"}},t.currentArea),K.a.createElement(J,{style:{textAlign:"center"}},t.originalValue))),K.a.createElement("div",{style:{clear:"both",height:480},ref:this.diffeditor}))))}}]),n}(K.a.Component),o.displayName="DiffEditorDialog",a=r))||a,Q=n(83),X=n(111),Z=(n(558),z.a.Item),ee=H.a.Item,te=I.a.Group,ne=(0,j.a.config)((l=s=function(e){function t(e){var n;return Object(L.a)(this,t),(n=Object(D.a)(this,Object(E.a)(t).call(this,e)))._publishConfig=function(e){var t=n.props.locale,o=void 0===t?{}:t,r=Object(O.a)(n);n.codeValue=e,n.tenant=Object(B.b)("namespace")||"",n.serverId=Object(B.b)("serverId")||"center";var i={dataId:n.field.getValue("dataId"),appName:n.inApp?n.edasAppId:n.field.getValue("appName"),group:n.field.getValue("group"),desc:n.field.getValue("desc"),config_tags:n.state.config_tags.join(),type:n.state.configType,content:e,tenant:n.tenant};Object(B.c)({type:"post",contentType:"application/x-www-form-urlencoded",url:"v1/cs/configs",data:i,success:function(e){var t={};if(t.maintitle=o.toedittitle,t.title=K.a.createElement("div",null,o.toedit),t.content="",t.dataId=i.dataId,t.group=i.group,null!=e){t.isok=!0;var n=r.state.activeKey.split("-")[0];if("normal"===n&&!0===r.hasips){var a=(new Date).getTime();r.setState({tag:[{title:o.official,key:"normal-".concat(a)},{title:"BETA",key:"beta-".concat(a)}],hasbeta:!0,activeKey:"beta-".concat(a)}),i.betaIps=i.betaIps||i.ips,r.valueMap.beta=i,r.changeTab("beta-".concat(a))}"normal"===n&&!1===r.hasips&&(r.valueMap.normal=i),"beta"===n&&!0===r.hasips&&(r.valueMap.beta=i)}else t.isok=!1,t.message=e.message;r.successDialog.current.getInstance().openDialog(t)},error:function(){}})},n.diffEditorDialog=K.a.createRef(),n.successDialog=K.a.createRef(),n.edasAppName=Object(B.b)("edasAppName")||"",n.edasAppId=Object(B.b)("edasAppId")||"",n.inApp=n.edasAppName,n.field=new x.a(Object(O.a)(n)),n.dataId=Object(B.b)("dataId")||"yanlin",n.group=Object(B.b)("group")||"DEFAULT_GROUP",n.tenant=Object(B.b)("namespace")||"",n.state={configType:"text",codeValue:"",envname:"center",targetEnvName:"",envlist:[],envvalues:[],loading:!1,showmore:!1,activeKey:"normal",hasbeta:!1,ips:"",checkedBeta:!1,tagLst:[],config_tags:[],switchEncrypt:!1,tag:[]},n.codeValue="",n.mode="text",n.ips="",n.valueMap={},n.searchDataId=Object(B.b)("searchDataId")||"",n.searchGroup=Object(B.b)("searchGroup")||"",n}return Object(N.a)(t,e),Object(C.a)(t,[{key:"componentDidMount",value:function(){this.initData(),this.betaips=document.getElementById("betaips"),this.getDataDetail(),this.chontenttab=document.getElementById("chontenttab")}},{key:"initData",value:function(){var e=this.props.locale,t=void 0===e?{}:e;this.setState({tag:[{title:t.official,key:"normal"}]}),this.dataId.startsWith("cipher-")&&this.setState({switchEncrypt:!0})}},{key:"initMoacoEditor",value:function(e,t){var n=this;window.monaco?this.monacoEditor=window.monaco.editor.create(document.getElementById("container"),{value:t,language:this.state.configType,codeLens:!0,selectOnLineNumbers:!0,roundedSelection:!1,readOnly:!1,lineNumbersMinChars:!0,theme:"vs-dark",wordWrapColumn:120,folding:!1,showFoldingControls:"always",wordWrap:"wordWrapColumn",cursorStyle:"line",automaticLayout:!0}):window.importEditor(function(){n.monacoEditor=window.monaco.editor.create(document.getElementById("container"),{value:t,language:n.state.configType,codeLens:!0,selectOnLineNumbers:!0,roundedSelection:!1,readOnly:!1,lineNumbersMinChars:!0,theme:"vs-dark",wordWrapColumn:120,folding:!1,showFoldingControls:"always",wordWrap:"wordWrapColumn",cursorStyle:"line",automaticLayout:!0})})}},{key:"toggleMore",value:function(){this.setState({showmore:!this.state.showmore})}},{key:"navTo",value:function(e){this.serverId=Object(B.b)("serverId")||"",this.tenant=Object(B.b)("namespace")||"",this.props.history.push("".concat(e,"?serverId=").concat(this.serverId||"","&dataId=").concat(this.dataId,"&group=").concat(this.group,"&namespace=").concat(this.tenant))}},{key:"openLoading",value:function(){this.setState({loading:!0})}},{key:"closeLoading",value:function(){this.setState({loading:!1})}},{key:"getDataDetail",value:function(){var e=this.props.locale,o=void 0===e?{}:e,r=this;this.tenant=Object(B.b)("namespace")||"",this.serverId=Object(B.b)("serverId")||"center";var t="v1/cs/configs?show=all&dataId=".concat(this.dataId,"&group=").concat(this.group);Object(B.c)({url:t,beforeSend:function(){r.openLoading()},success:function(e){if(null!=e){var t=e;r.valueMap.normal=t,r.field.setValue("dataId",t.dataId),r.field.setValue("appName",r.inApp?r.edasAppName:t.appName),r.field.setValue("group",t.group),r.field.setValue("desc",t.desc),r.codeValue=t.content||"";var n=t.type||"text";if(r.setState({configType:n}),r.initMoacoEditor(n,r.codeValue),null!=t.configTags){var a=t.configTags.split(",");r.setConfigTags(a)}r.serverId={}.serverId,r.targetEnvs=[]}else S.a.alert({title:o.wrong,content:e.message})},complete:function(){r.closeLoading()}})}},{key:"goList",value:function(){var e=Object(B.b)("namespace");this.props.history.push("/configurationManagement?serverId=".concat(this.serverId,"&group=").concat(this.searchGroup,"&dataId=").concat(this.searchDataId,"&namespace=").concat(e))}},{key:"createCodeMirror",value:function(e,t){var n=this.refs.commoneditor;n.innerHTML="",this.commoneditor=window.CodeMirror(n,{value:t,mode:e,lineNumbers:!0,theme:"xq-light",lint:!0,gutters:["CodeMirror-lint-markers"],extraKeys:{F1:function(e){e.setOption("fullScreen",!e.getOption("fullScreen"))},Esc:function(e){e.getOption("fullScreen")&&e.setOption("fullScreen",!1)}}}),this.commoneditor.on("change",this.codemirrorValueChanged.bind(this))}},{key:"codemirrorValueChanged",value:function(e){this.diffeditor&&this.diffeditor.edit.doc.setValue(e.getValue())}},{key:"createDiffCodeMirror",value:function(e,t){var n=this.diffEditorDialog.current.getInstance();n.innerHTML="",this.diffeditor=window.CodeMirror.MergeView(n,{value:e||"",origLeft:null,orig:t||"",lineNumbers:!0,mode:this.mode,theme:"xq-light",highlightDifferences:!0,connect:"align",collapseIdentical:!1})}},{key:"changeConfig",value:function(e){0===e&&(this.createCodeMirror("text",this.codeValue),this.mode="text"),1===e&&(this.createCodeMirror("application/json",this.codeValue),this.mode="application/json"),2===e&&(this.createCodeMirror("xml",this.codeValue),this.mode="xml"),this.setState({configType:e})}},{key:"setCodeValue",value:function(e){this.setState({codeValue:e})}},{key:"toggleDiff",value:function(e){if(e){this.chontenttab.style.display="block";var t=this.commoneditor.doc.getValue();this.diffeditor||this.createDiffCodeMirror(t,this.codeValue)}else this.chontenttab.style.display="none"}},{key:"publishConfig",value:function(){var o=this,e=this.props.locale,r=void 0===e?{}:e;this.field.validate(function(e,t){if(!e){var n="",a=o.state.configType;(n=o.monacoEditor?o.monacoEditor.getValue():o.codeValue)?X.a.validate({content:n,type:a})?o._publishConfig(n):S.a.confirm({content:"配置信息可能有语法错误, 确定提交吗?",onOk:function(){o._publishConfig(n)}}):w.a.error({content:r.submitFailed,align:"cc cc"})}})}},{key:"validateChart",value:function(e,t,n){var a=this.props.locale,o=void 0===a?{}:a;/[@#\$%\^&\*]+/g.test(t)?n(o.vdchart):n()}},{key:"changeEnv",value:function(e){this.targetEnvs=e,this.setState({envvalues:e})}},{key:"changeBeta",value:function(e){this.betaips.style.display=e?"block":"none",this.setState({checkedBeta:e})}},{key:"getIps",value:function(e){this.ips=e,this.setState({ips:e})}},{key:"setConfigTags",value:function(n){5this.state.pageSize&&P.a.createElement("div",{style:{marginTop:10,textAlign:"right"}},P.a.createElement(b.a,{current:this.state.currentPage,total:this.state.total,pageSize:this.state.pageSize,onChange:function(e){return a.setState({currentPage:e},function(){return a.queryServiceList()})}}))),P.a.createElement(H.a,{ref:this.editServiceDialog,openLoading:function(){return a.openLoading()},closeLoading:function(){return a.closeLoading()},queryServiceList:function(){return a.setState({currentPage:1},function(){return a.queryServiceList()})}}))}}]),t}(P.a.Component),o.displayName="ServiceList",a=r))||a;t.a=V},function(e,t,n){"use strict";n(41);var a,o,r,i=n(25),s=n.n(i),l=(n(80),n(49)),u=n.n(l),c=(n(79),n(21)),d=n.n(c),f=(n(32),n(10)),p=n.n(f),h=(n(58),n(31)),m=n.n(h),g=(n(44),n(28)),y=n.n(g),_=n(60),v=n(14),b=n(15),M=n(16),w=n(17),k=n(22),S=n(18),T=(n(26),n(8)),x=n.n(T),L=(n(78),n(39)),C=n.n(L),D=(n(35),n(9)),E=n.n(D),O=n(0),N=n.n(O),Y=n(53),j=n(1),P=(n(564),E.a.Item),I=C.a.Row,A=C.a.Col,H=(0,x.a.config)((r=o=function(e){function t(e){var r;return Object(v.a)(this,t),(r=Object(M.a)(this,Object(w.a)(t).call(this,e))).queryTrackQuery=function(){var c=Object(k.a)(r),e="",d=r.getValue("type");if(1===d){var t=r.getValue("ip");e="v1/cs/listener?ip=".concat(t);var n=window.nownamespace||Object(j.b)("namespace")||"";n&&(e+="&tenant=".concat(n))}else{var a=r.getValue("dataId"),o=r.getValue("group");if(!a||!o)return!1;e="v1/cs/configs/listener?dataId=".concat(a,"&group=").concat(o)}Object(j.c)({url:e,beforeSend:function(){c.openLoading()},success:function(e){if(200===e.collectStatus){var t=[],n=e.lisentersGroupkeyStatus;for(var a in n)if(1===d){var o={},r=a.split("+"),i=Object(_.a)(r,2),s=i[0],l=i[1];o.dataId=s,o.group=l,o.md5=n[a],t.push(o)}else{var u={};u.ip=a,u.md5=n[a],t.push(u)}c.setState({dataSource:t||[],total:t.length||0})}},complete:function(){c.closeLoading()}})},r.changePage=function(e){r.setState({currentPage:e})},r.getQueryLater=function(){setTimeout(function(){r.queryTrackQuery()})},r.state={value:"",visible:!1,loading:!1,total:0,pageSize:10,currentPage:1,dataSource:[]},r.field=new y.a(Object(k.a)(r)),r.group=Object(j.b)("group")||"",r.dataId=Object(j.b)("dataId")||"",r.serverId=Object(j.b)("serverId")||"",r.tenant=Object(j.b)("namespace")||"",r}return Object(S.a)(t,e),Object(b.a)(t,[{key:"componentDidMount",value:function(){this.field.setValue("type",0),this.field.setValue("group",this.group),this.field.setValue("dataId",this.dataId)}},{key:"onSearch",value:function(){}},{key:"onChange",value:function(){}},{key:"openLoading",value:function(){this.setState({loading:!0})}},{key:"closeLoading",value:function(){this.setState({loading:!1})}},{key:"showMore",value:function(){}},{key:"resetSearch",value:function(){this.field.reset(),this.forceUpdate()}},{key:"renderStatus",value:function(e,t,n){var a=this.props.locale,o=void 0===a?{}:a;return N.a.createElement("div",null,!0===n.pushStatus?N.a.createElement("span",{style:{color:"green"}},o.success):N.a.createElement("span",{style:{color:"red"}},o.failure))}},{key:"render",value:function(){var e=this.props.locale,t=void 0===e?{}:e,n=this.field,a=n.init,o=n.getValue;this.init=a,this.getValue=o;var r=[{label:t.configuration,value:0},{label:"IP",value:1}];return N.a.createElement("div",{style:{padding:10}},N.a.createElement(s.a,{shape:"flower",style:{position:"relative"},visible:this.state.loading,tip:"Loading...",color:"#333"},N.a.createElement(Y.a,{left:t.listenerQuery,namespaceCallBack:this.getQueryLater}),N.a.createElement(I,{className:"demo-row",style:{marginBottom:10,padding:0}},N.a.createElement(A,{span:"24"},N.a.createElement(E.a,{inline:!0,field:this.field},N.a.createElement(P,{label:"".concat(t.queryDimension,":")},N.a.createElement(m.a,Object.assign({dataSource:r,style:{width:200}},this.init("type")))),N.a.createElement(P,{label:"Data ID:",style:{display:0===this.getValue("type")?"":"none"},required:!0},N.a.createElement(p.a,Object.assign({placeholder:t.pleaseEnterTheDataId,style:{width:200}},this.init("dataId",{rules:[{required:!0,message:t.dataIdCanNotBeEmpty}]})))),N.a.createElement(P,{label:"Group:",style:{display:0===this.getValue("type")?"":"none"},required:!0},N.a.createElement(p.a,Object.assign({placeholder:t.pleaseInputGroup,style:{width:200}},this.init("group",{rules:[{required:!0,message:t.groupCanNotBeEmpty}]})))),N.a.createElement(P,{label:"IP:",style:{display:0===this.getValue("type")?"none":""}},N.a.createElement(p.a,Object.assign({placeholder:t.pleaseInputIp,style:{width:200,boxSize:"border-box"}},this.init("ip")))),N.a.createElement(P,{label:""},N.a.createElement(E.a.Submit,{validate:!0,type:"primary",onClick:this.queryTrackQuery,style:{marginRight:10}},t.query))))),N.a.createElement("div",{style:{position:"relative"}},N.a.createElement("h3",{style:{height:28,lineHeight:"28px",paddingLeft:10,borderLeft:"3px solid #09c",margin:0,marginBottom:10,fontSize:16}},t.queryResultsQuery,N.a.createElement("strong",{style:{fontWeight:"bold"}}," ",this.state.total," "),t.articleMeetRequirementsConfiguration)),N.a.createElement(I,{style:{padding:0}},N.a.createElement(A,{span:"24",style:{padding:0}},1===this.getValue("type")?N.a.createElement(d.a,{dataSource:this.state.dataSource,fixedHeader:!0,maxBodyHeight:500,locale:{empty:t.pubNoData}},N.a.createElement(d.a.Column,{title:"Data ID",dataIndex:"dataId"}),N.a.createElement(d.a.Column,{title:"Group",dataIndex:"group"}),N.a.createElement(d.a.Column,{title:"MD5",dataIndex:"md5"})):N.a.createElement(d.a,{dataSource:this.state.dataSource,fixedHeader:!0,maxBodyHeight:400,locale:{empty:t.pubNoData}},N.a.createElement(d.a.Column,{title:"IP",dataIndex:"ip"}),N.a.createElement(d.a.Column,{title:"MD5",dataIndex:"md5"})))),N.a.createElement("div",{style:{marginTop:10,textAlign:"right"}},N.a.createElement(u.a,{current:this.state.currentPage,total:this.state.total,pageSize:this.state.pageSize,onChange:this.changePage}),",")))}}]),t}(N.a.Component),o.displayName="ListeningToQuery",a=r))||a;t.a=H},function(e,t,n){"use strict";n(41);var a,o,r,i=n(25),s=n.n(i),l=(n(80),n(49)),u=n.n(l),c=(n(79),n(21)),d=n.n(c),f=(n(35),n(9)),p=n.n(f),h=(n(32),n(10)),m=n.n(h),g=(n(44),n(28)),y=n.n(g),_=n(14),v=n(15),b=n(16),M=n(17),w=n(22),k=n(18),S=(n(26),n(8)),T=n.n(S),x=n(0),L=n.n(x),C=n(53),D=n(1),E=(n(563),(0,T.a.config)((r=o=function(e){function a(e){var t;Object(_.a)(this,a),(t=Object(b.a)(this,Object(M.a)(a).call(this,e))).field=new y.a(Object(w.a)(t)),t.appName=Object(D.b)("appName")||"",t.preAppName=t.appName,t.group=Object(D.b)("group")||"",t.preGroup=t.group,t.dataId=Object(D.b)("dataId")||"",t.preDataId=t.dataId,t.serverId=Object(D.b)("serverId")||"",t.state={value:"",visible:!1,total:0,pageSize:10,currentPage:1,dataSource:[],fieldValue:[],showAppName:!1,showgroup:!1,dataId:t.dataId,group:t.group,appName:t.appName,selectValue:[],loading:!1};var n={dataId:t.dataId||"",group:t.preGroup||"",appName:t.appName||"",serverId:t.serverId||""};return Object(D.d)(n),t}return Object(k.a)(a,e),Object(v.a)(a,[{key:"componentDidMount",value:function(){this.field.setValue("group",this.group),this.field.setValue("dataId",this.dataId)}},{key:"openLoading",value:function(){this.setState({loading:!0})}},{key:"closeLoading",value:function(){this.setState({loading:!1})}},{key:"keyDownSearch",value:function(e){var t=e||window.event;return 13!==(t.keyCode||t.which||t.charCode)||(this.getData(),!1)}},{key:"UNSAFE_componentWillMount",value:function(){window.addEventListener("keydown",this.keyDownSearch.bind(this),!1)}},{key:"componentWillUnmount",value:function(){window.removeEventListener("keydown",this.keyDownSearch.bind(this))}},{key:"onSearch",value:function(){}},{key:"onChange",value:function(){}},{key:"cleanAndGetData",value:function(){0=t.length?{value:void 0,done:!0}:(e=a(t,n),this._i+=e.length,{value:e,done:!1})})},function(e,t,n){var l=n(118),u=n(117);e.exports=function(s){return function(e,t){var n,a,o=String(u(e)),r=l(t),i=o.length;return r<0||i<=r?s?"":void 0:(n=o.charCodeAt(r))<55296||56319=e.length?(this._t=void 0,o(1)):o(0,"keys"==t?n:"values"==t?e[n]:[n,e[n]])},"values"),r.Arguments=r.Array,a("keys"),a("values"),a("entries")},function(e,t){e.exports=function(){}},function(e,t){e.exports=function(e,t){return{value:t,done:!!e}}},function(e,t,n){e.exports={default:n(388),__esModule:!0}},function(e,t,n){n(389),n(394),n(395),n(396),e.exports=n(63).Symbol},function(e,t,n){"use strict";var a=n(57),i=n(64),o=n(72),r=n(87),s=n(152),l=n(390).KEY,u=n(89),c=n(120),d=n(125),f=n(96),p=n(74),h=n(126),m=n(127),g=n(391),y=n(392),_=n(88),v=n(71),b=n(73),M=n(116),w=n(93),k=n(124),S=n(393),T=n(154),x=n(70),L=n(94),C=T.f,D=x.f,E=S.f,O=a.Symbol,N=a.JSON,Y=N&&N.stringify,j="prototype",P=p("_hidden"),I=p("toPrimitive"),A={}.propertyIsEnumerable,H=c("symbol-registry"),R=c("symbols"),z=c("op-symbols"),F=Object[j],W="function"==typeof O,V=a.QObject,K=!V||!V[j]||!V[j].findChild,B=o&&u(function(){return 7!=k(D({},"a",{get:function(){return D(this,"a",{value:7}).a}})).a})?function(e,t,n){var a=C(F,t);a&&delete F[t],D(e,t,n),a&&e!==F&&D(F,t,a)}:D,U=function(e){var t=R[e]=k(O[j]);return t._k=e,t},q=W&&"symbol"==typeof O.iterator?function(e){return"symbol"==typeof e}:function(e){return e instanceof O},G=function(e,t,n){return e===F&&G(z,t,n),_(e),t=M(t,!0),_(n),i(R,t)?(n.enumerable?(i(e,P)&&e[P][t]&&(e[P][t]=!1),n=k(n,{enumerable:w(0,!1)})):(i(e,P)||D(e,P,w(1,{})),e[P][t]=!0),B(e,t,n)):D(e,t,n)},J=function(e,t){_(e);for(var n,a=g(t=b(t)),o=0,r=a.length;oo;)i(R,t=n[o++])||t==P||t==l||a.push(t);return a},Z=function(e){for(var t,n=e===F,a=E(n?z:b(e)),o=[],r=0;a.length>r;)!i(R,t=a[r++])||n&&!i(F,t)||o.push(R[t]);return o};W||(s((O=function(){if(this instanceof O)throw TypeError("Symbol is not a constructor!");var t=f(0te;)p(ee[te++]);for(var ne=L(p.store),ae=0;ne.length>ae;)m(ne[ae++]);r(r.S+r.F*!W,"Symbol",{for:function(e){return i(H,e+="")?H[e]:H[e]=O(e)},keyFor:function(e){if(!q(e))throw TypeError(e+" is not a symbol!");for(var t in H)if(H[t]===e)return t},useSetter:function(){K=!0},useSimple:function(){K=!1}}),r(r.S+r.F*!W,"Object",{create:function(e,t){return void 0===t?k(e):J(k(e),t)},defineProperty:G,defineProperties:J,getOwnPropertyDescriptor:Q,getOwnPropertyNames:X,getOwnPropertySymbols:Z}),N&&r(r.S+r.F*(!W||u(function(){var e=O();return"[null]"!=Y([e])||"{}"!=Y({a:e})||"{}"!=Y(Object(e))})),"JSON",{stringify:function(e){for(var t,n,a=[e],o=1;arguments.length>o;)a.push(arguments[o++]);if(n=t=a[1],(v(t)||void 0!==e)&&!q(e))return y(t)||(t=function(e,t){if("function"==typeof n&&(t=n.call(this,e,t)),!q(t))return t}),a[1]=t,Y.apply(N,a)}}),O[j][I]||n(69)(O[j],I,O[j].valueOf),d(O,"Symbol"),d(Math,"Math",!0),d(a.JSON,"JSON",!0)},function(e,t,n){var a=n(96)("meta"),o=n(71),r=n(64),i=n(70).f,s=0,l=Object.isExtensible||function(){return!0},u=!n(89)(function(){return l(Object.preventExtensions({}))}),c=function(e){i(e,a,{value:{i:"O"+ ++s,w:{}}})},d=e.exports={KEY:a,NEED:!1,fastKey:function(e,t){if(!o(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!r(e,a)){if(!l(e))return"F";if(!t)return"E";c(e)}return e[a].i},getWeak:function(e,t){if(!r(e,a)){if(!l(e))return!0;if(!t)return!1;c(e)}return e[a].w},onFreeze:function(e){return u&&d.NEED&&l(e)&&!r(e,a)&&c(e),e}}},function(e,t,n){var s=n(94),l=n(122),u=n(97);e.exports=function(e){var t=s(e),n=l.f;if(n)for(var a,o=n(e),r=u.f,i=0;o.length>i;)r.call(e,a=o[i++])&&t.push(a);return t}},function(e,t,n){var a=n(149);e.exports=Array.isArray||function(e){return"Array"==a(e)}},function(e,t,n){var a=n(73),o=n(153).f,r={}.toString,i="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];e.exports.f=function(e){return i&&"[object Window]"==r.call(e)?function(e){try{return o(e)}catch(e){return i.slice()}}(e):o(a(e))}},function(e,t){},function(e,t,n){n(127)("asyncIterator")},function(e,t,n){n(127)("observable")},function(e,t,n){e.exports={default:n(398),__esModule:!0}},function(e,t,n){n(399),e.exports=n(63).Object.setPrototypeOf},function(e,t,n){var a=n(87);a(a.S,"Object",{setPrototypeOf:n(400).set})},function(e,t,o){var n=o(71),a=o(88),r=function(e,t){if(a(e),!n(t)&&null!==t)throw TypeError(t+": can't set as prototype!")};e.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(e,n,a){try{(a=o(144)(Function.call,o(154).f(Object.prototype,"__proto__").set,2))(e,[]),n=!(e instanceof Array)}catch(e){n=!0}return function(e,t){return r(e,t),n?e.__proto__=t:a(e,t),e}}({},!1):void 0),check:r}},function(e,t,n){e.exports={default:n(402),__esModule:!0}},function(e,t,n){n(403);var a=n(63).Object;e.exports=function(e,t){return a.create(e,t)}},function(e,t,n){var a=n(87);a(a.S,"Object",{create:n(124)})},function(e,t,n){"use strict"; +/** @license React v16.8.3 + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var c=n(155),a="function"==typeof Symbol&&Symbol.for,d=a?Symbol.for("react.element"):60103,u=a?Symbol.for("react.portal"):60106,o=a?Symbol.for("react.fragment"):60107,r=a?Symbol.for("react.strict_mode"):60108,i=a?Symbol.for("react.profiler"):60114,s=a?Symbol.for("react.provider"):60109,l=a?Symbol.for("react.context"):60110,f=a?Symbol.for("react.concurrent_mode"):60111,p=a?Symbol.for("react.forward_ref"):60112,h=a?Symbol.for("react.suspense"):60113,m=a?Symbol.for("react.memo"):60115,g=a?Symbol.for("react.lazy"):60116,y="function"==typeof Symbol&&Symbol.iterator;function _(e){for(var t=arguments.length-1,n="https://reactjs.org/docs/error-decoder.html?invariant="+e,a=0;a