diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 000000000..dd84ea782 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,38 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: '' +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Desktop (please complete the following information):** + - OS: [e.g. iOS] + - Browser [e.g. chrome, safari] + - Version [e.g. 22] + +**Smartphone (please complete the following information):** + - Device: [e.g. iPhone6] + - OS: [e.g. iOS8.1] + - Browser [e.g. stock browser, safari] + - Version [e.g. 22] + +**Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 000000000..bbcbbe7d6 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: '' +assignees: '' + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 000000000..a9dc7e5ad --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,228 @@ +# 贡献代码 + +欢迎您对MaxKey项目的贡献。 +我们诚挚的感谢你的贡献,这个文档描述了我们的工作方式和工作流程,开发者也可以同时参考官方的相关文档。 + +## Workflow + +MaxKey开发中使用到的几种模型在这个链接下载 [点我](https://github.com/MaxKeyTop/MaxKey/archive/master.zip). +之后是贡献代码的主要流程。 + +### Fork + +* MaxKey采用Pull Request的方式提交代码,禁止直接push,所有的代码都需要人工review。首先要fork一份MaxKey的代码 ["Fork" button](https://help.github.com/articles/fork-a-repo/). +* 跳转到[MaxKey](https://github.com/MaxKeyTop/MaxKey) GitHub首页,然后单击 `Fork` 按钮,生成自己目录下的仓库,比如 。 + +### Clone(克隆) +将远程仓库 clone 到本地: + +```bash +➜ git clone https://github.com/你的用户名/MaxKey +➜ cd MaxKey +``` + +### 创建本地分支 + +MaxKey 目前使用[Git流分支模型](http://nvie.com/posts/a-successful-git-branching-model/)进行开发,测试,发行和维护 + +所有的 feature 和 bug fix 的开发工作都应该在一个新的分支上完成,一般从 `develop` 分支上创建新分支。 + +使用 `git checkout -b` 创建并切换到新分支。 + +```bash +➜ git checkout -b my-cool-stuff +``` + +值得注意的是,在 checkout 之前,需要保持当前分支目录 clean,否则会把 untracked 的文件也带到新分支上,这可以通过 `git status` 查看。 + +### 使用 `pre-commit` 钩子 + +MaxKey 开发人员使用 [pre-commit](http://pre-commit.com/) 工具来管理 Git 预提交钩子。 在提交(commit)前自动检查一些基本事宜(如每个文件只有一个 EOL,Git 中不要添加大文件等)。 + +`pre-commit`测试是单元测试的一部分,不满足钩子的 PR 不能被提交到 MaxKey,首先安装并在当前目录运行它: + +```bash +pip install pre-commit +pre-commit -v -a +``` + + +## 开始开发 + +在本例中,我删除了 README.md 中的一行,并创建了一个新文件。 + +通过 `git status` 查看当前状态,这会提示当前目录的一些变化,同时也可以通过 `git diff` 查看文件具体被修改的内容。 + +```bash +➜ git status +On branch test +Changes not staged for commit: + (use "git add ..." to update what will be committed) + (use "git checkout -- ..." to discard changes in working directory) + + modified: README.md + +Untracked files: + (use "git add ..." to include in what will be committed) + + test + +no changes added to commit (use "git add" and/or "git commit -a") +``` + +## 构建 + +配置环境变量 +gradleSetEnv.bat + +set JAVA_HOME=D:\JavaIDE\jdk1.8.0_91 + +set GRADLE_HOME=D:\JavaIDE\gradle-5.4.1 + +启动构建 +gradleBuildRelease.bat + +构建结果 +构建包路径 + +MaxKey/build/maxkey-jars + +依赖包路径 + +MaxKey/build/maxkey-depjars + +具体开发配置参见 https://maxkey.top/zh/development.html + + +## 提交(commit) + +接下来我们取消对 README.md 文件的改变,然后提交新添加的 test 文件。 + +```bash +➜ git checkout -- README.md +➜ git status +On branch test +Untracked files: + (use "git add ..." to include in what will be committed) + + test + +nothing added to commit but untracked files present (use "git add" to track) +➜ git add test +``` + +Git 每次提交代码,都需要写提交说明,这可以让其他人知道这次提交做了哪些改变,这可以通过`git commit` 完成。 + +```bash +▶ pre-commit run -a -v +[remove-crlf] CRLF end-lines remover........................................Passed +[remove-tabs] Tabs remover..................................................Passed +[check-added-large-files] Check for added large files.......................Passed +[check-merge-conflict] Check for merge conflicts............................Passed +[check-symlinks] Check for broken symlinks..................................Passed +[detect-private-key] Detect Private Key.....................................Passed +[end-of-file-fixer] Fix End of Files........................................Passed +[trailing-whitespace] Trim Trailing Whitespace..............................Passed +[copyright] copyright.......................................................Passed +[clang-format] clang-format.................................................Passed +``` + +## 保持本地仓库最新 + +在准备发起 Pull Request 之前,需要同步原仓库()最新的代码。 + +首先通过 `git remote` 查看当前远程仓库的名字。 + +```bash +➜ git remote +origin +➜ git remote -v +origin https://github.com/USERNAME/MaxKey (fetch) +origin https://github.com/USERNAME/MaxKey (push) +``` + +这里 origin 是我们 clone 的远程仓库的名字,也就是自己用户名下的 MaxKey,接下来我们创建一个原始 MaxKey 仓库的远程主机,命名为 upstream。 + +```bash +➜ git remote add upstream https://github.com/MaxKeyTop/MaxKey +➜ git remote +origin +upstream +``` + +获取 upstream 的最新代码并更新当前分支。 + +```bash +➜ git fetch upstream +➜ git pull upstream develop +``` + +## Push 到远程仓库 + +将本地的修改推送到 GitHub 上,也就是 https://github.com/USERNAME/MaxKey。 + +```bash +# 推送到远程仓库 origin 的 my-cool-stuff 分支上 +➜ git push origin my-cool-stuff +``` + +## 建立 Issue 并完成 Pull Request + +建立一个 Issue 描述问题,并记录它的编号。 + +切换到所建分支,然后点击 `New pull request`。 + +在 PR 的描述说明中,填写 `resolve #Issue编号` 可以在这个 PR 被 merge 后,自动关闭对应的 Issue +> 具体请见 + + +## review + + + +## 删除远程分支 + +在 PR 被 merge 进主仓库后,我们可以在 PR 的页面删除远程仓库的分支。 + +也可以使用 `git push origin :分支名` 删除远程分支,如: + +```bash +➜ git push origin :my-cool-stuff +``` + +## 删除本地分支 + +最后,删除本地分支。 + +```bash +# 切换到 develop 分支 +➜ git checkout develop + +# 删除 my-cool-stuff 分支 +➜ git branch -D my-cool-stuff +``` + +至此,我们就完成了一次代码贡献的过程。 + +## 提交代码的一些约定 + +为了使评审人在评审代码时更好地专注于代码本身,请您每次提交代码时,遵守以下约定: + +1. 请保证单元测试能顺利通过。如果没过,说明提交的代码存在问题,评审人一般不做评审。 +2. 提交Pull Request前: + - 请注意commit的数量: + - 原因:如果仅仅修改一个文件但提交了十几个commit,每个commit只做了少量的修改,这会给评审人带来很大困扰。评审人需要逐一查看每个commit才能知道做了哪些修改,且不排除commit之间的修改存在相互覆盖的情况。 + - 建议:每次提交时,保持尽量少的commit,可以通过`git commit --amend`补充上次的commit。对已经Push到远程仓库的多个commit,可以参考[squash commits after push](http://stackoverflow.com/questions/5667884/how-to-squash-commits-in-git-after-they-have-been-pushed)。 + - 请注意每个commit的名称:应能反映当前commit的内容,不能太随意。 +3. 如果解决了某个Issue的问题,请在该Pull Request的**第一个**评论框中加上:`fix #issue_number`,这样当该Pull Request被合并后,会自动关闭对应的Issue。关键词包括:close, closes, closed, fix, fixes, fixed, resolve, resolves, resolved,请选择合适的词汇。详细可参考[Closing issues via commit messages](https://help.github.com/articles/closing-issues-via-commit-messages)。 + +此外,在回复评审人意见时,请您遵守以下约定: + +1. 评审人的每个意见都必须回复(这是开源社区的基本礼貌,别人帮了忙,应该说谢谢): + - 对评审意见同意且按其修改完的,给个简单的`Done`即可; + - 对评审意见不同意的,请给出您自己的反驳理由。 +2. 如果评审意见比较多: + - 请给出总体的修改情况。 + - 请采用[start a review](https://help.github.com/articles/reviewing-proposed-changes-in-a-pull-request/)进行回复,而非直接回复的方式。原因是每个回复都会发送一封邮件,会造成邮件灾难。 + + diff --git a/README.md b/README.md index 04f4236d9..d0755ca5b 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # +# 概述 + MaxKey(马克思的钥匙)单点登录认证系统(Single Sign On System),寓意是最大钥匙,是业界领先的企业级IAM身份管理和身份认证产品,支持OAuth 2.0/OpenID Connect、SAML 2.0、JWT、CAS、SCIM等标准协议,提供简单、标准、安全和开放的用户身份管理(IDM)、身份认证(AM)、单点登录(SSO)、RBAC权限管理和资源管理等。 官方网站 官方网站 | 官方网站二线 @@ -15,36 +17,36 @@ 主要功能: -1.所有应用系统共享一个身份认证系统 +1) 所有应用系统共享一个身份认证系统 -2.所有应用系统能够识别和提取ticket信息 +2) 所有应用系统能够识别和提取ticket信息 ------------- +# 产品特性 1. 标准认证协议: | 序号 | 协议 | 支持 | | --------| :----- | :----: | -| 1 | OAuth 2.0/OpenID Connect | 高 | -| 2 | SAML 2.0 | 高 | -| 3 | JWT | 高 | -| 4 | CAS | 高 | -| 5 | FormBased | 中 | -| 6 | TokenBased(Post/Cookie) | 中 | -| 7 | ExtendApi | 低 | -| 8 | EXT | 低 | +| 1.1 | OAuth 2.0/OpenID Connect | 高 | +| 1.2 | SAML 2.0 | 高 | +| 1.3 | JWT | 高 | +| 1.4 | CAS | 高 | +| 1.5 | FormBased | 中 | +| 1.6 | TokenBased(Post/Cookie) | 中 | +| 1.7 | ExtendApi | 低 | +| 1.8 | EXT | 低 | 2. 登录支持 | 序号 | 登录方式 | | --------| :----- | -| 1 | 动态验证码 字母/数字/算术 | -| 2 | 双因素认证 | -| 3 | 短信认证 腾讯云短信/阿里云短信/网易云信 | -| 4 | 登录易/Google/Microsoft Authenticator/FreeOTP/支持TOTP或者HOTP | -| 5 | Kerberos/SPNEGO/AD域| -| 6 | 社交账号 微信/QQ/微博/钉钉/Google/Facebook/其他 | +| 2.1 | 动态验证码 字母/数字/算术 | +| 2.2 | 双因素认证 | +| 2.3 | 短信认证 腾讯云短信/阿里云短信/网易云信 | +| 2.4 | 登录易/Google/Microsoft Authenticator/FreeOTP/支持TOTP或者HOTP | +| 2.5 | Kerberos/SPNEGO/AD域| +| 2.6 | 社交账号 微信/QQ/微博/钉钉/Google/Facebook/其他 | 3. 提供标准的认证接口以便于其他应用集成SSO,安全的移动接入,安全的API、第三方认证和互联网认证的整合。 @@ -59,8 +61,9 @@ 8. 许可证 Apache License, Version 2.0,开源免费。 ------------- + # 界面 + **MaxKey认证** 登录界面 @@ -80,21 +83,27 @@ 应用管理 ------------- + # 下载 当前版本百度网盘下载, 历史版本 | 版本 | 日期 | 下载地址 | 提取码 | | --------| :----- | :---- | :----: | -| v 2.2.0 RC2 | 2020/09/17 | 链接下载 | **saft** | +| v 2.2.0 GA | 2020/09/24 | 链接下载 | **0y9o** | # Roadmap -基于Excel批量机构和用户导入 +1.基于Excel批量机构和用户导入 -用户注册功能 +2.用户注册功能 -动态用户组实现(基于用户属性或机构) +3.动态用户组实现(基于用户属性或机构) + +4.主任职机构和兼职机构 + +5.零信任场景整合 + +6.MaxKey Cloud(微服务版)-2021年 diff --git a/ReleaseNotes.txt b/ReleaseNotes.txt index 0e6c63b74..dd17057ed 100644 --- a/ReleaseNotes.txt +++ b/ReleaseNotes.txt @@ -1,4 +1,30 @@ -MaxKey v 2.2.0 GA 2020/09/** +MaxKey v 2.3.0 GA 2020/11/** + *(MAXKEY-200901) 基于spring session的集群会话共享功能 + *(MAXKEY-200902) 单点注销功能,应用可以配置为NONE/BACK_CHANNEL/FRONT_CHANNEL三种方式,支持CAS/SAML/Default + *(MAXKEY-200903) 用户在线实时更新功能 + *(MAXKEY-200904) 批量Excel用户导入功能 + *(MAXKEY-200905) 用户注册功能 + *(MAXKEY-200906) 用户状态修改 + *(MAXKEY-200907) 用户详情显示问题 + *(MAXKEY-200908) 应用修改时数字大于4为长度格式化问题 + *(MAXKEY-200910) 注销后,点击重新登陆跳转问题 + *(MAXKEY-200911) 增加SP登录跳转功能,支持knox的认证 + *(MAXKEY-200912) 构建脚本的优化和更新 + *(MAXKEY-200913) 权限控制 RoleAdministrators + *(MAXKEY-200914) 社交账号登录优化 + *(MAXKEY-200915) 列表界面中未”选择“情况下,弹出界面错误 + *(MAXKEY-200916) jib(docker) 支持 ,感谢https://github.com/alanland + *(MAXKEY-200916) 登录过程的优化 + *(MAXKEY-200917) 认证的优化,支持@Principal的注入 + *(MAXKEY-200918) 应用单点登录时,用户访问权限控制 + *(MAXKEY-200920) 依赖jar引用、更新和升级 + druid 1.2.1 + JustAuth 1.15.8 + simple-http 1.0.3 + spring-session 2.3.1.RELEASE + druid-spring-boot-starter 1.2.1 + +MaxKey v 2.2.0 GA 2020/09/24 *(MAXKEY-200801) 官方网站内容调整,初步增加英文版支持,增加新闻、合作伙伴及与CAS等开源产品对比 *(MAXKEY-200802) 国际化I18N内容优化 *(MAXKEY-200803) 使用Passay增强密码策略,分离静态密码策略和动态密码策略 @@ -32,13 +58,27 @@ *(MAXKEY-200831) MySQL时间问题,参见https://dev.mysql.com/doc/refman/8.0/en/time-zone-support.html *(MAXKEY-200832) OAuth2 Password模式修复 *(MAXKEY-200833) MGT管理SAML上传问题、IDP元数据链接优化、主键生成修复、元数据参数配置调整 - *(MAXKEY-200834) MGT管理TOKENBASED令牌主键生成修复 - *(MAXKEY-200835) 依赖jar升级 + *(MAXKEY-200834) SAML 2添加多种NameId的支持,支持后缀的配置,NameId支持大小写转换 + *(MAXKEY-200835) MGT管理TOKENBASED令牌主键生成修复 + *(MAXKEY-200836) 依赖jar升级 + tomcat 9.0.38 passay 1.6.0 - springBoot 2.3.3.RELEASE - springSecurity 5.3.4.RELEASE - hibernate 6.1.5.Final + springBootVersion 2.3.4.RELEASE + springVersion 5.2.9.RELEASE + springSecurityVersion 5.4.0 + guava 29.0-jre + joda-time 2.10.6 + ehcache 3.9.0 + alibaba druid 1.1.24 + fastjson 1.2.73 jackson 2.11.2 + tink 1.4.0 + JustAuth 1.15.7 + nimbus-jose-jwt 9.0.1 + commons-lang3 3.11 + commons-io 2.8.0 + commons-codec 1.15 + hibernate 6.1.5.Final multiple-select-1.5.2 @@ -159,4 +199,4 @@ MaxKey v 1.2.0 GA 2020/01/18 *(MAXKEY-200105) 修复日志的输出 MaxKey v 1.0 GA 2019/12/06 - *(MAXKEY-191201) 基于SpringBoot重新构建1.0 GA \ No newline at end of file + *(MAXKEY-191201) 基于SpringBoot重新构建1.0 GA diff --git a/build.gradle b/build.gradle index 6a3f09988..39baba60c 100644 --- a/build.gradle +++ b/build.gradle @@ -32,11 +32,11 @@ allprojects { eclipse { /*第一次时请注释这段eclipse设置,可能报错*/ - jdt { - File f = file('.settings/org.eclipse.core.resources.prefs') - f.write('eclipse.preferences.version=1\n') - f.append('encoding/=UTF-8') //use UTF-8 - } +// jdt { +// File f = file('.settings/org.eclipse.core.resources.prefs') +// f.write('eclipse.preferences.version=1\n') +// f.append('encoding/=UTF-8') //use UTF-8 +// } /* @@ -131,16 +131,16 @@ subprojects { testCompile group: 'xmlunit', name: 'xmlunit', version: '1.6' //apache compile group: 'commons-beanutils', name: 'commons-beanutils', version: '1.9.3' - compile group: 'commons-codec', name: 'commons-codec', version: '1.14' + compile group: 'commons-codec', name: 'commons-codec', version: '1.15' compile group: 'commons-collections', name: 'commons-collections', version: '3.2.2' //compile group: 'org.apache.commons', name: 'commons-csv', version: '1.7' compile group: 'org.apache.commons', name: 'commons-dbcp2', version: '2.6.0' compile group: 'commons-dbutils', name: 'commons-dbutils', version: '1.7' compile group: 'org.apache.commons', name: 'commons-digester3', version: '3.2' compile group: 'commons-digester', name: 'commons-digester', version: '2.1' - compile group: 'commons-io', name: 'commons-io', version: '2.6' + compile group: 'commons-io', name: 'commons-io', version: '2.8.0' compile group: 'commons-lang', name: 'commons-lang', version: '2.6' - compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.9' + compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.11' compile group: 'commons-logging', name: 'commons-logging', version: '1.2' compile group: 'org.apache.commons', name: 'commons-pool2', version: '2.6.2' compile group: 'commons-httpclient', name: 'commons-httpclient', version: '3.1' @@ -209,19 +209,27 @@ subprojects { compile group: 'org.springframework.boot', name: 'spring-boot-starter-log4j2', version: "${springBootVersion}" compile group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: "${springBootVersion}" compile group: 'org.springframework.boot', name: 'spring-boot-starter-tomcat', version: "${springBootVersion}" + compile group: 'org.springframework.boot', name: 'spring-boot-starter-data-redis', version: "${springBootVersion}" testCompile group: 'org.springframework.boot', name: 'spring-boot-starter-test', version: "${springBootVersion}" + //spring-data + compile group: 'org.springframework.data', name: 'spring-data-commons', version: "${springDataVersion}" + compile group: 'org.springframework.data', name: 'spring-data-keyvalue', version: "${springDataVersion}" + compile group: 'org.springframework.data', name: 'spring-data-redis', version: "${springDataVersion}" + //spring-session + compile group: 'org.springframework.session', name: 'spring-session-core', version: "${springSessionVersion}" + compile group: 'org.springframework.session', name: 'spring-session-data-redis', version: "${springSessionVersion}" //saml compile group: 'org.opensaml', name: 'opensaml', version: '2.6.4' compile group: 'org.opensaml', name: 'openws', version: '1.5.4' compile group: 'org.opensaml', name: 'xmltooling', version: '1.4.4' //jose-jwt - compile group: 'com.nimbusds', name: 'nimbus-jose-jwt', version: '8.10' + compile group: 'com.nimbusds', name: 'nimbus-jose-jwt', version: '9.0.1' compile group: 'net.jcip', name: 'jcip-annotations', version: '1.0' compile group: 'net.minidev', name: 'json-smart', version: '2.3' compile group: 'net.minidev', name: 'asm', version: '1.0.2' //oauth third party JustAuth - compile group: 'com.xkcoding.http', name: 'simple-http', version: '1.0.2' - compile group: 'me.zhyd.oauth', name: 'JustAuth', version: '1.15.6' + compile group: 'com.xkcoding.http', name: 'simple-http', version: '1.0.3' + compile group: 'me.zhyd.oauth', name: 'JustAuth', version: '1.15.8' //common compile group: 'org.javassist', name: 'javassist', version: '3.23.0-GA' compile group: 'org.owasp.esapi', name: 'esapi', version: '2.2.0.0' @@ -243,7 +251,7 @@ subprojects { compile group: 'org.bouncycastle', name: 'bcpkix-jdk15on', version: "${bouncycastleVersion}" compile group: 'org.bouncycastle', name: 'bcprov-jdk15on', version: "${bouncycastleVersion}" compile group: 'org.bouncycastle', name: 'bcprov-ext-jdk15on', version: "${bouncycastleVersion}" - compile group: 'com.google.crypto.tink', name: 'tink', version: '1.2.2' + compile group: 'com.google.crypto.tink', name: 'tink', version: '1.4.0' //kaptcha compile group: 'com.jhlabs', name: 'filters', version: '2.0.235-1' compile group: 'com.github.penggle', name: 'kaptcha', version: '2.3.2' @@ -253,7 +261,7 @@ subprojects { compile group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: "${jacksonVersion}" compile group: 'com.fasterxml.jackson.core', name: 'jackson-annotations', version: "${jacksonVersion}" compile group: 'com.fasterxml', name: 'classmate', version: '1.5.0' - compile group: 'com.alibaba', name: 'fastjson', version: '1.2.66' + compile group: 'com.alibaba', name: 'fastjson', version: '1.2.74' //reactive compile group: 'org.reactivestreams', name: 'reactive-streams', version: '1.0.2' compile group: 'io.projectreactor', name: 'reactor-core', version: '3.2.10.RELEASE' @@ -262,10 +270,10 @@ subprojects { compile group: 'org.quartz-scheduler', name: 'quartz', version: '2.3.2' //database compile group: 'mysql', name: 'mysql-connector-java', version: '8.0.21' - compile group: 'com.alibaba', name: 'druid', version: '1.1.21' - compile group: 'com.alibaba', name: 'druid-spring-boot-starter', version: '1.1.21' - compile group: 'redis.clients', name: 'jedis', version: '3.2.0' - compile group: 'org.ehcache', name: 'ehcache', version: '3.8.1' + compile group: 'com.alibaba', name: 'druid', version: '1.2.1' + compile group: 'com.alibaba', name: 'druid-spring-boot-starter', version: '1.2.1' + compile group: 'redis.clients', name: 'jedis', version: '3.3.0' + compile group: 'org.ehcache', name: 'ehcache', version: '3.9.0' //mybatis compile group: 'org.mybatis', name: 'mybatis', version: '3.5.5' compile group: 'org.mybatis', name: 'mybatis-spring', version: '2.0.5' @@ -274,12 +282,12 @@ subprojects { compile group: 'org.hibernate', name: 'hibernate-validator-cdi', version: "${hibernateVersion}" compile group: 'org.hibernate.validator', name: 'hibernate-validator-annotation-processor', version: "${hibernateVersion}" //usefull - compile group: 'joda-time', name: 'joda-time', version: '2.10.5' + compile group: 'joda-time', name: 'joda-time', version: '2.10.6' compile group: 'org.yaml', name: 'snakeyaml', version: '1.26' compile group: 'net.sourceforge.nekohtml', name: 'nekohtml', version: '1.9.22' compile group: 'org.jdom', name: 'jdom', version: '2.0.2' compile group: 'com.google.zxing', name: 'core', version: '3.4.0' - compile group: 'com.google.guava', name: 'guava', version: '28.2-jre' + compile group: 'com.google.guava', name: 'guava', version: '29.0-jre' compile group: 'ognl', name: 'ognl', version: '3.2.14' compile group: 'cglib', name: 'cglib', version: '3.3.0' compile group: 'org.ow2.asm', name: 'asm', version: '7.3.1' @@ -300,8 +308,9 @@ subprojects { //腾讯云 compile group: 'com.tencentcloudapi', name: 'tencentcloud-sdk-java', version: '3.1.33' - //tomcat embed - compile group: 'org.apache.tomcat.embed', name: 'tomcat-embed-core', version: '9.0.36' + //tomcat embed Core Tomcat implementation + compile group: 'org.apache.tomcat.embed', name: 'tomcat-embed-core', version: '9.0.38' + //JULI logging implementation for embedded Tomcat compile group: 'org.apache.tomcat.embed', name: 'tomcat-embed-logging-juli', version: '8.5.2' //easyExcel diff --git a/style/checkstyle-rules.xml b/checkstyle/checkstyle-rules.xml similarity index 100% rename from style/checkstyle-rules.xml rename to checkstyle/checkstyle-rules.xml diff --git a/gradleIDETask.bat b/eclipsePluginApply.bat similarity index 94% rename from gradleIDETask.bat rename to eclipsePluginApply.bat index 966af2f3f..46239f1a1 100644 --- a/gradleIDETask.bat +++ b/eclipsePluginApply.bat @@ -1,4 +1,4 @@ -call gradleSetEnv.bat +call setEnvVars.bat set START_TIME="%date:~0,10% %time:~0,2%:%time:~3,5%" echo start time %START_TIME% diff --git a/gradleIDEClean.bat b/eclipsePluginClean.bat similarity index 94% rename from gradleIDEClean.bat rename to eclipsePluginClean.bat index 2a999526f..32c302791 100644 --- a/gradleIDEClean.bat +++ b/eclipsePluginClean.bat @@ -1,4 +1,4 @@ -call gradleSetEnv.bat +call setEnvVars.bat set START_TIME="%date:~0,10% %time:~0,2%:%time:~3,5%" echo start time %START_TIME% diff --git a/gradle.properties b/gradle.properties index 038b138c5..5b18a4f18 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,9 +4,11 @@ vendor =https://www.maxkey.top author =shimingxy #Version For use jar log4jVersion =2.13.3 -springVersion =5.2.8.RELEASE -springBootVersion =2.3.3.RELEASE -springSecurityVersion =5.3.4.RELEASE +springVersion =5.2.9.RELEASE +springBootVersion =2.3.4.RELEASE +springSecurityVersion =5.4.0 +springDataVersion =2.3.4.RELEASE +springSessionVersion =2.3.1.RELEASE hibernateVersion =6.1.5.Final slf4jVersion =1.7.30 jacksonVersion =2.11.2 diff --git a/gradleBuildClean.bat b/gradleBuildClean.bat deleted file mode 100644 index 65fcc9db1..000000000 --- a/gradleBuildClean.bat +++ /dev/null @@ -1,18 +0,0 @@ -call gradleSetEnv.bat - -set START_TIME="%date:~0,10% %time:~0,2%:%time:~3,5%" -echo start time %START_TIME% - -call %JAVA_HOME%/bin/java -version -call %GRADLE_HOME%/bin/gradle -version - -echo start clean . . . - -call %GRADLE_HOME%/bin/gradle clean - -set END_TIME="%date:~0,10% %time:~0,2%:%time:~3,5%" - -echo clean start at %START_TIME% complete at %END_TIME%. - -pause - diff --git a/maxkey-authentications/src/main/java/org/maxkey/authn/support/socialsignon/SocialSignOnEndpoint.java b/maxkey-authentications/src/main/java/org/maxkey/authn/support/socialsignon/SocialSignOnEndpoint.java index 88ca99181..97baac4b7 100644 --- a/maxkey-authentications/src/main/java/org/maxkey/authn/support/socialsignon/SocialSignOnEndpoint.java +++ b/maxkey-authentications/src/main/java/org/maxkey/authn/support/socialsignon/SocialSignOnEndpoint.java @@ -98,12 +98,20 @@ public class SocialSignOnEndpoint extends AbstractSocialSignOnEndpoint{ @RequestMapping(value={"/callback/{provider}"}, method = RequestMethod.GET) public ModelAndView callback(@PathVariable String provider ) { - this.provider=provider; - this.authCallback(); - _logger.debug(this.accountId); - SocialsAssociate socialSignOnUserToken =new SocialsAssociate(); - socialSignOnUserToken.setProvider(provider); - socialSignOnUserToken.setSocialuid(this.accountId); + + SocialsAssociate socialsAssociate = null; + //auth call back may exception + try { + this.provider=provider; + this.authCallback(); + _logger.debug(this.accountId); + socialsAssociate =new SocialsAssociate(); + socialsAssociate.setProvider(provider); + socialsAssociate.setSocialuid(this.accountId); + + }catch(Exception e) { + _logger.error("callback Exception ",e); + } //for login String socialSignOnType= ""; @@ -112,10 +120,10 @@ public class SocialSignOnEndpoint extends AbstractSocialSignOnEndpoint{ } if(socialSignOnType.equals(SOCIALSIGNON_TYPE.SOCIALSIGNON_TYPE_LOGON)||socialSignOnType.equals("")){ - socialSignOn(socialSignOnUserToken); + socialSignOn(socialsAssociate); return WebContext.redirect("/index"); }else{ - socialBind(socialSignOnUserToken); + socialBind(socialsAssociate); } if(WebContext.getAttribute(SOCIALSIGNON_SESSION_REDIRECT_URI)!=null){ @@ -126,38 +134,41 @@ public class SocialSignOnEndpoint extends AbstractSocialSignOnEndpoint{ } - public boolean socialBind(SocialsAssociate socialSignOnUserToken){ - socialSignOnUserToken.setSocialUserInfo(accountJsonString); - socialSignOnUserToken.setUid(WebContext.getUserInfo().getId()); - socialSignOnUserToken.setUsername(WebContext.getUserInfo().getUsername()); - //socialSignOnUserToken.setAccessToken(JsonUtils.object2Json(accessToken)); - //socialSignOnUserToken.setExAttribute(JsonUtils.object2Json(accessToken.getResponseObject())); - _logger.debug("Social Bind : "+socialSignOnUserToken); - this.socialsAssociateService.delete(socialSignOnUserToken); - this.socialsAssociateService.insert(socialSignOnUserToken); + public boolean socialBind(SocialsAssociate socialsAssociate){ + if(null == socialsAssociate) { + return false; + } + + socialsAssociate.setSocialUserInfo(accountJsonString); + socialsAssociate.setUid(WebContext.getUserInfo().getId()); + socialsAssociate.setUsername(WebContext.getUserInfo().getUsername()); + //socialsAssociate.setAccessToken(JsonUtils.object2Json(accessToken)); + //socialsAssociate.setExAttribute(JsonUtils.object2Json(accessToken.getResponseObject())); + _logger.debug("Social Bind : "+socialsAssociate); + this.socialsAssociateService.delete(socialsAssociate); + this.socialsAssociateService.insert(socialsAssociate); return true; } - public boolean socialSignOn(SocialsAssociate socialSignOnUserToken){ + public boolean socialSignOn(SocialsAssociate socialsAssociate){ - socialSignOnUserToken=this.socialsAssociateService.get(socialSignOnUserToken); + socialsAssociate=this.socialsAssociateService.get(socialsAssociate); - _logger.debug("callback SocialSignOn User Token : "+socialSignOnUserToken); - if(null !=socialSignOnUserToken){ - - _logger.debug("Social Sign On from "+socialSignOnUserToken.getProvider()+" mapping to user "+socialSignOnUserToken.getUsername()); - - authenticationProvider.trustAuthentication(socialSignOnUserToken.getUsername(), ConstantsLoginType.SOCIALSIGNON,this.socialSignOnProvider.getProviderName(),"xe00000004","success"); - //socialSignOnUserToken.setAccessToken(JsonUtils.object2Json(this.accessToken)); - socialSignOnUserToken.setSocialUserInfo(accountJsonString); - //socialSignOnUserToken.setExAttribute(JsonUtils.object2Json(accessToken.getResponseObject())); - - this.socialsAssociateService.update(socialSignOnUserToken); - - - }else{ - WebContext.getRequest().getSession().setAttribute(WebAttributes.AUTHENTICATION_EXCEPTION, new BadCredentialsException(WebContext.getI18nValue("login.error.social"))); + _logger.debug("Loaded SocialSignOn Socials Associate : "+socialsAssociate); + + if(null == socialsAssociate) { + WebContext.getRequest().getSession().setAttribute(WebAttributes.AUTHENTICATION_EXCEPTION, new BadCredentialsException(WebContext.getI18nValue("login.error.social"))); + return false; } + + _logger.debug("Social Sign On from "+socialsAssociate.getProvider()+" mapping to user "+socialsAssociate.getUsername()); + + authenticationProvider.trustAuthentication(socialsAssociate.getUsername(), ConstantsLoginType.SOCIALSIGNON,this.socialSignOnProvider.getProviderName(),"xe00000004","success"); + //socialsAssociate.setAccessToken(JsonUtils.object2Json(this.accessToken)); + socialsAssociate.setSocialUserInfo(accountJsonString); + //socialsAssociate.setExAttribute(JsonUtils.object2Json(accessToken.getResponseObject())); + + this.socialsAssociateService.update(socialsAssociate); return true; } } diff --git a/maxkey-core/src/main/java/org/maxkey/authn/AbstractAuthenticationProvider.java b/maxkey-core/src/main/java/org/maxkey/authn/AbstractAuthenticationProvider.java index 0138c10ea..6fbfec88e 100644 --- a/maxkey-core/src/main/java/org/maxkey/authn/AbstractAuthenticationProvider.java +++ b/maxkey-core/src/main/java/org/maxkey/authn/AbstractAuthenticationProvider.java @@ -17,6 +17,8 @@ package org.maxkey.authn; +import java.util.ArrayList; +import org.maxkey.authn.online.OnlineTicketServices; import org.maxkey.authn.realm.AbstractAuthenticationRealm; import org.maxkey.authn.support.rememberme.AbstractRemeberMeService; import org.maxkey.configuration.ApplicationConfig; @@ -34,7 +36,8 @@ import org.springframework.security.authentication.BadCredentialsException; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.AuthenticationException; - +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; /** * login Authentication abstract class. * @@ -60,12 +63,22 @@ public abstract class AbstractAuthenticationProvider { @Autowired @Qualifier("remeberMeService") protected AbstractRemeberMeService remeberMeService; + + @Autowired + @Qualifier("onlineTicketServices") + protected OnlineTicketServices onlineTicketServices; + + static ArrayList grantedAdministratorsAuthoritys = new ArrayList(); + + static { + grantedAdministratorsAuthoritys.add(new SimpleGrantedAuthority("ROLE_ADMINISTRATORS")); + } protected abstract String getProviderName(); - protected abstract Authentication doInternalAuthenticate(Authentication authentication); + protected abstract Authentication doInternalAuthenticate(LoginCredential authentication); - public abstract Authentication basicAuthenticate(Authentication authentication) ; + public abstract Authentication basicAuthenticate(LoginCredential authentication) ; public abstract Authentication trustAuthentication( String username, @@ -83,17 +96,18 @@ public abstract class AbstractAuthenticationProvider { * authenticate . * */ - public Authentication authenticate(Authentication authentication) + public Authentication authenticate(LoginCredential loginCredential) throws AuthenticationException { _logger.debug("Trying to authenticate user '{}' via {}", - authentication.getPrincipal(), getProviderName()); - + loginCredential.getPrincipal(), getProviderName()); + Authentication authentication = null; try { - authentication = doInternalAuthenticate(authentication); + authentication = doInternalAuthenticate(loginCredential); } catch (AuthenticationException e) { _logger.error("Failed to authenticate user {} via {}: {}", - new Object[] { - authentication.getPrincipal(), getProviderName(), e.getMessage() }); + new Object[] { loginCredential.getPrincipal(), + getProviderName(), + e.getMessage() }); WebContext.setAttribute( WebConstants.LOGIN_ERROR_SESSION_MESSAGE, e.getMessage()); } catch (Exception e) { @@ -116,7 +130,7 @@ public abstract class AbstractAuthenticationProvider { final Object firstSavedRequest = WebContext.getAttribute(WebConstants.FIRST_SAVED_REQUEST_PARAMETER); - + //change Session WebContext.getSession().invalidate(); WebContext.setAttribute( WebConstants.CURRENT_USER_SESSION_ID, WebContext.getSession().getId()); @@ -132,14 +146,7 @@ public abstract class AbstractAuthenticationProvider { WebContext.getSession().setAttribute( WebConstants.CURRENT_LOGIN_USER_PASSWORD_SET_TYPE, passwordSetType); - // create new authentication response containing the user and it's authorities - UsernamePasswordAuthenticationToken simpleUserAuthentication = - new UsernamePasswordAuthenticationToken( - userInfo.getUsername(), - authentication.getCredentials(), - authentication.getAuthorities() - ); - return simpleUserAuthentication; + return authentication; } /** @@ -251,6 +258,7 @@ public abstract class AbstractAuthenticationProvider { } else { _logger.debug("User Login. "); } + } return userInfo; @@ -310,4 +318,26 @@ public abstract class AbstractAuthenticationProvider { return true; } + public void setApplicationConfig(ApplicationConfig applicationConfig) { + this.applicationConfig = applicationConfig; + } + + public void setAuthenticationRealm(AbstractAuthenticationRealm authenticationRealm) { + this.authenticationRealm = authenticationRealm; + } + + public void setTfaOptAuthn(AbstractOptAuthn tfaOptAuthn) { + this.tfaOptAuthn = tfaOptAuthn; + } + + public void setRemeberMeService(AbstractRemeberMeService remeberMeService) { + this.remeberMeService = remeberMeService; + } + + public void setOnlineTicketServices(OnlineTicketServices onlineTicketServices) { + this.onlineTicketServices = onlineTicketServices; + } + + + } diff --git a/maxkey-core/src/main/java/org/maxkey/authn/BasicAuthentication.java b/maxkey-core/src/main/java/org/maxkey/authn/LoginCredential.java similarity index 71% rename from maxkey-core/src/main/java/org/maxkey/authn/BasicAuthentication.java rename to maxkey-core/src/main/java/org/maxkey/authn/LoginCredential.java index 2b2cd7756..87dee73cb 100644 --- a/maxkey-core/src/main/java/org/maxkey/authn/BasicAuthentication.java +++ b/maxkey-core/src/main/java/org/maxkey/authn/LoginCredential.java @@ -1,31 +1,17 @@ -/* - * Copyright [2020] [MaxKey of copyright http://www.maxkey.top] - * - * 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 org.maxkey.authn; import java.util.ArrayList; import java.util.Collection; + import org.springframework.security.core.Authentication; import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.authority.SimpleGrantedAuthority; - -public class BasicAuthentication implements Authentication { - private static final long serialVersionUID = -110742975439268030L; +public class LoginCredential implements Authentication { + + /** + * + */ + private static final long serialVersionUID = 3125709257481600320L; String username; String password; String sessionId; @@ -34,32 +20,29 @@ public class BasicAuthentication implements Authentication { String remeberMe; String authType; String jwtToken; + String onlineTicket; ArrayList grantedAuthority; boolean authenticated; + boolean roleAdministrators; /** * BasicAuthentication. */ - public BasicAuthentication() { - grantedAuthority = new ArrayList(); - grantedAuthority.add(new SimpleGrantedAuthority("ROLE_USER")); - grantedAuthority.add(new SimpleGrantedAuthority("ORDINARY_USER")); + public LoginCredential() { } /** * BasicAuthentication. */ - public BasicAuthentication(String username,String password,String authType) { + public LoginCredential(String username,String password,String authType) { this.username = username; this.password = password; this.authType = authType; - grantedAuthority = new ArrayList(); - grantedAuthority.add(new SimpleGrantedAuthority("ROLE_USER")); - grantedAuthority.add(new SimpleGrantedAuthority("ORDINARY_USER")); } + @Override public String getName() { - return "Basic Authentication"; + return "Login Credential"; } @Override @@ -166,6 +149,22 @@ public class BasicAuthentication implements Authentication { this.grantedAuthority = grantedAuthority; } + public String getOnlineTicket() { + return onlineTicket; + } + + public void setOnlineTicket(String onlineTicket) { + this.onlineTicket = onlineTicket; + } + + public boolean isRoleAdministrators() { + return roleAdministrators; + } + + public void setRoleAdministrators(boolean roleAdministrators) { + this.roleAdministrators = roleAdministrators; + } + @Override public String toString() { StringBuilder builder = new StringBuilder(); diff --git a/maxkey-core/src/main/java/org/maxkey/authn/RealmAuthenticationProvider.java b/maxkey-core/src/main/java/org/maxkey/authn/RealmAuthenticationProvider.java index ca66ae8e6..dd8a476fa 100644 --- a/maxkey-core/src/main/java/org/maxkey/authn/RealmAuthenticationProvider.java +++ b/maxkey-core/src/main/java/org/maxkey/authn/RealmAuthenticationProvider.java @@ -17,6 +17,9 @@ package org.maxkey.authn; +import java.util.ArrayList; + +import org.maxkey.authn.online.OnlineTicket; import org.maxkey.domain.UserInfo; import org.maxkey.web.WebConstants; import org.maxkey.web.WebContext; @@ -25,6 +28,7 @@ import org.slf4j.LoggerFactory; import org.springframework.security.authentication.BadCredentialsException; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; import org.springframework.security.web.authentication.WebAuthenticationDetails; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; @@ -44,46 +48,40 @@ public class RealmAuthenticationProvider extends AbstractAuthenticationProvider } @Override - protected Authentication doInternalAuthenticate(Authentication authentication) { - BasicAuthentication auth = (BasicAuthentication)authentication; + protected Authentication doInternalAuthenticate(LoginCredential loginCredential) { - _logger.debug("authentication " + auth); + _logger.debug("authentication " + loginCredential); - sessionValid(auth.getSessionId()); + sessionValid(loginCredential.getSessionId()); //jwtTokenValid(j_jwtToken); - authTypeValid(auth.getAuthType()); + authTypeValid(loginCredential.getAuthType()); - captchaValid(auth.getCaptcha(),auth.getAuthType()); + captchaValid(loginCredential.getCaptcha(),loginCredential.getAuthType()); - emptyPasswordValid(auth.getPassword()); + emptyPasswordValid(loginCredential.getPassword()); UserInfo userInfo = null; - emptyUsernameValid(auth.getUsername()); + emptyUsernameValid(loginCredential.getUsername()); - userInfo = loadUserInfo(auth.getUsername(),auth.getPassword()); + userInfo = loadUserInfo(loginCredential.getUsername(),loginCredential.getPassword()); - userinfoValid(userInfo, auth.getPassword()); + userinfoValid(userInfo, loginCredential.getPassword()); - tftcaptchaValid(auth.getOtpCaptcha(),auth.getAuthType(),userInfo); + tftcaptchaValid(loginCredential.getOtpCaptcha(),loginCredential.getAuthType(),userInfo); authenticationRealm.getPasswordPolicyValidator().passwordPolicyValid(userInfo); - authenticationRealm.passwordMatches(userInfo, auth.getPassword()); - authenticationRealm.grantAuthority(userInfo); - /* - * put userInfo to current session context - */ - WebContext.setUserInfo(userInfo); - - auth.setAuthenticated(true); - - if (auth.isAuthenticated() && applicationConfig.getLoginConfig().isRemeberMe()) { - if (auth.getRemeberMe() != null && auth.getRemeberMe().equals("remeberMe")) { + authenticationRealm.passwordMatches(userInfo, loginCredential.getPassword()); + + UsernamePasswordAuthenticationToken authenticationToken = setOnline(loginCredential,userInfo); + //RemeberMe Config check then set RemeberMe cookies + if (applicationConfig.getLoginConfig().isRemeberMe()) { + if (loginCredential.getRemeberMe() != null && loginCredential.getRemeberMe().equals("remeberMe")) { WebContext.getSession().setAttribute( - WebConstants.REMEBER_ME_SESSION,auth.getUsername()); + WebConstants.REMEBER_ME_SESSION,loginCredential.getUsername()); _logger.debug("do Remeber Me"); remeberMeService.createRemeberMe( userInfo.getUsername(), @@ -93,43 +91,24 @@ public class RealmAuthenticationProvider extends AbstractAuthenticationProvider ); } } - - UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = - new UsernamePasswordAuthenticationToken( - auth, - "PASSWORD", - authenticationRealm.grantAuthority(userInfo)); - usernamePasswordAuthenticationToken.setDetails( - new WebAuthenticationDetails(WebContext.getRequest())); - - return usernamePasswordAuthenticationToken; + + return authenticationToken; } @Override - public Authentication basicAuthenticate(Authentication authentication) { - BasicAuthentication basicAuth = (BasicAuthentication) authentication; - UserInfo loadeduserInfo = loadUserInfo(basicAuth.getUsername(), ""); + public Authentication basicAuthenticate(LoginCredential loginCredential) { + UserInfo loadeduserInfo = loadUserInfo(loginCredential.getUsername(), ""); if (loadeduserInfo != null) { - - authenticationRealm.passwordMatches(loadeduserInfo, basicAuth.getPassword()); + authenticationRealm.passwordMatches(loadeduserInfo, loginCredential.getPassword()); authenticationRealm.getPasswordPolicyValidator().passwordPolicyValid(loadeduserInfo); - WebContext.setUserInfo(loadeduserInfo); - - authentication.setAuthenticated(true); - - UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken( - authentication, "PASSWORD", authenticationRealm.grantAuthority(loadeduserInfo)); - - WebContext.setAuthentication(authenticationToken); - WebContext.setUserInfo(loadeduserInfo); - authenticationRealm.insertLoginHistory(loadeduserInfo, basicAuth.getAuthType(), "", "", "SUCCESS"); - - return authenticationToken; + authenticationRealm.insertLoginHistory(loadeduserInfo, loginCredential.getAuthType(), "", "", "SUCCESS"); + + return setOnline(loginCredential,loadeduserInfo); }else { String message = WebContext.getI18nValue("login.error.username"); - _logger.debug("login user " + basicAuth.getUsername() + " not in this System ." + message); + _logger.debug("login user " + loginCredential.getUsername() + " not in this System ." + message); throw new BadCredentialsException(WebContext.getI18nValue("login.error.username")); } } @@ -151,28 +130,71 @@ public class RealmAuthenticationProvider extends AbstractAuthenticationProvider String message) { UserInfo loadeduserInfo = loadUserInfo(username, ""); if (loadeduserInfo != null) { - WebContext.setUserInfo(loadeduserInfo); - BasicAuthentication authentication = new BasicAuthentication(); - authentication.setUsername(loadeduserInfo.getUsername()); - UsernamePasswordAuthenticationToken authenticationToken = - new UsernamePasswordAuthenticationToken( - authentication, - "PASSWORD", - authenticationRealm.grantAuthority(loadeduserInfo) - ); - - authentication.setAuthenticated(true); - WebContext.setAuthentication(authenticationToken); - WebContext.setUserInfo(loadeduserInfo); - + LoginCredential loginCredential = new LoginCredential(); + loginCredential.setUsername(loadeduserInfo.getUsername()); + authenticationRealm.insertLoginHistory(loadeduserInfo, type, provider, code, message); - return authenticationToken; + return setOnline(loginCredential,loadeduserInfo); }else { String i18nMessage = WebContext.getI18nValue("login.error.username"); _logger.debug("login user " + username + " not in this System ." + i18nMessage); throw new BadCredentialsException(WebContext.getI18nValue("login.error.username")); } } + + public UsernamePasswordAuthenticationToken setOnline(LoginCredential credential,UserInfo userInfo) { + //Online Tickit Id + String onlineTickitId = WebConstants.ONLINE_TICKET_PREFIX + "-" + java.util.UUID.randomUUID().toString().toLowerCase(); + _logger.debug("set online Tickit Cookie " + onlineTickitId + " on domain "+ this.applicationConfig.getBaseDomainName()); + + OnlineTicket onlineTicket = new OnlineTicket(onlineTickitId); + + + WebContext.setCookie(WebContext.getResponse(), + this.applicationConfig.getBaseDomainName(), + WebConstants.ONLINE_TICKET_NAME, + onlineTickitId, + 0); + + SigninPrincipal signinPrincipal = new SigninPrincipal(userInfo); + //set OnlineTicket + signinPrincipal.setOnlineTicket(onlineTicket); + ArrayList grantedAuthoritys = authenticationRealm.grantAuthority(userInfo); + signinPrincipal.setAuthenticated(true); + + for(GrantedAuthority administratorsAuthority : grantedAdministratorsAuthoritys) { + if(grantedAuthoritys.contains(administratorsAuthority)) { + signinPrincipal.setRoleAdministrators(true); + _logger.trace("ROLE ADMINISTRATORS Authentication ."); + } + } + _logger.debug("Granted Authority " + grantedAuthoritys); + + signinPrincipal.setGrantedAuthorityApps(authenticationRealm.queryAuthorizedApps(grantedAuthoritys)); + + UsernamePasswordAuthenticationToken authenticationToken = + new UsernamePasswordAuthenticationToken( + signinPrincipal, + "PASSWORD", + grantedAuthoritys + ); + + authenticationToken.setDetails( + new WebAuthenticationDetails(WebContext.getRequest())); + + onlineTicket.setAuthentication(authenticationToken); + + this.onlineTicketServices.store(onlineTickitId, onlineTicket); + + /* + * put userInfo to current session context + */ + WebContext.setAuthentication(authenticationToken); + + WebContext.setUserInfo(userInfo); + + return authenticationToken; + } } diff --git a/maxkey-core/src/main/java/org/maxkey/authn/SigninPrincipal.java b/maxkey-core/src/main/java/org/maxkey/authn/SigninPrincipal.java new file mode 100644 index 000000000..ff1e20d2d --- /dev/null +++ b/maxkey-core/src/main/java/org/maxkey/authn/SigninPrincipal.java @@ -0,0 +1,182 @@ +/* + * Copyright [2020] [MaxKey of copyright http://www.maxkey.top] + * + * 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 org.maxkey.authn; + +import java.util.ArrayList; +import java.util.Collection; + +import org.maxkey.authn.online.OnlineTicket; +import org.maxkey.domain.UserInfo; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; + + +public class SigninPrincipal implements UserDetails { + private static final long serialVersionUID = -110742975439268030L; + UserInfo userInfo; + + UserDetails userDetails; + + OnlineTicket onlineTicket; + ArrayList grantedAuthority; + ArrayList grantedAuthorityApps; + boolean authenticated; + boolean roleAdministrators; + + /** + * SigninPrincipal. + */ + public SigninPrincipal() { + } + + /** + * SigninPrincipal. + */ + public SigninPrincipal(UserInfo userInfo) { + this.userInfo = userInfo; + this.authenticated = true; + } + + /** + * SigninPrincipal. + */ + public SigninPrincipal(UserDetails userDetails) { + this.userDetails = userDetails; + this.authenticated = true; + } + + public UserInfo getUserInfo() { + return userInfo; + } + + public void setUserInfo(UserInfo userInfo) { + this.userInfo = userInfo; + } + + public boolean isAuthenticated() { + return authenticated; + } + + public void setAuthenticated(boolean authenticated) { + this.authenticated = authenticated; + } + + @Override + public Collection getAuthorities() { + return grantedAuthority; + } + + public ArrayList getGrantedAuthority() { + return grantedAuthority; + } + + public UserDetails getUserDetails() { + return userDetails; + } + + public void setUserDetails(UserDetails userDetails) { + this.userDetails = userDetails; + } + + public void setGrantedAuthority(ArrayList grantedAuthority) { + this.grantedAuthority = grantedAuthority; + } + + public OnlineTicket getOnlineTicket() { + return onlineTicket; + } + + public void setOnlineTicket(OnlineTicket onlineTicket) { + this.onlineTicket = onlineTicket; + } + + public boolean isRoleAdministrators() { + return roleAdministrators; + } + + public void setRoleAdministrators(boolean roleAdministrators) { + this.roleAdministrators = roleAdministrators; + } + + + @Override + public boolean isAccountNonExpired() { + return false; + } + + @Override + public boolean isAccountNonLocked() { + return false; + } + + @Override + public boolean isCredentialsNonExpired() { + return false; + } + + @Override + public boolean isEnabled() { + return false; + } + + public ArrayList getGrantedAuthorityApps() { + return grantedAuthorityApps; + } + + public void setGrantedAuthorityApps(ArrayList grantedAuthorityApps) { + this.grantedAuthorityApps = grantedAuthorityApps; + } + + @Override + public String getUsername() { + if(this.userInfo != null) { + return this.userInfo.getUsername(); + }else { + return this.userDetails.getUsername(); + } + } + + @Override + public String getPassword() { + if(this.userInfo != null) { + return this.userInfo.getPassword(); + }else { + return this.userDetails.getPassword(); + } + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("SigninPrincipal [userInfo="); + builder.append(userInfo); + builder.append(", onlineTicket="); + builder.append(onlineTicket); + builder.append(", grantedAuthority="); + builder.append(grantedAuthority); + builder.append(", authenticated="); + builder.append(authenticated); + builder.append(", roleAdministrators="); + builder.append(roleAdministrators); + builder.append("]"); + return builder.toString(); + } + + + +} diff --git a/maxkey-core/src/main/java/org/maxkey/authn/online/InMemoryOnlineTicketServices.java b/maxkey-core/src/main/java/org/maxkey/authn/online/InMemoryOnlineTicketServices.java new file mode 100644 index 000000000..12f14670f --- /dev/null +++ b/maxkey-core/src/main/java/org/maxkey/authn/online/InMemoryOnlineTicketServices.java @@ -0,0 +1,96 @@ +/* + * Copyright [2020] [MaxKey of copyright http://www.maxkey.top] + * + * 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 org.maxkey.authn.online; + +import java.time.Duration; +import java.time.LocalTime; + +import org.ehcache.UserManagedCache; +import org.ehcache.config.builders.ExpiryPolicyBuilder; +import org.ehcache.config.builders.UserManagedCacheBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +public class InMemoryOnlineTicketServices implements OnlineTicketServices{ + private static final Logger _logger = LoggerFactory.getLogger(InMemoryOnlineTicketServices.class); + + protected static UserManagedCache onlineTicketStore = + UserManagedCacheBuilder.newUserManagedCacheBuilder(String.class, OnlineTicket.class) + .withExpiry(ExpiryPolicyBuilder.timeToLiveExpiration(Duration.ofMinutes(30))) + .build(true); + + + public InMemoryOnlineTicketServices() { + super(); + } + + @Override + public void store(String ticketId, OnlineTicket ticket) { + onlineTicketStore.put(ticketId, ticket); + } + + @Override + public OnlineTicket remove(String ticketId) { + OnlineTicket ticket=onlineTicketStore.get(ticketId); + onlineTicketStore.remove(ticketId); + return ticket; + } + + @Override + public OnlineTicket get(String ticketId) { + OnlineTicket ticket=onlineTicketStore.get(ticketId); + return ticket; + } + + @Override + public void setValiditySeconds(int validitySeconds) { + onlineTicketStore = + UserManagedCacheBuilder. + newUserManagedCacheBuilder(String.class, OnlineTicket.class) + .withExpiry( + ExpiryPolicyBuilder.timeToLiveExpiration( + Duration.ofMinutes(validitySeconds/60)) + ) + .build(true); + + } + + @Override + public void refresh(String ticketId,LocalTime refreshTime) { + OnlineTicket onlineTicket = get(ticketId); + onlineTicket.setTicketTime(refreshTime); + store(ticketId , onlineTicket); + } + + @Override + public void refresh(String ticketId) { + OnlineTicket onlineTicket = get(ticketId); + + LocalTime currentTime = LocalTime.now(); + Duration duration = Duration.between(currentTime, onlineTicket.getTicketTime()); + + _logger.trace("OnlineTicket duration " + duration.getSeconds()); + + if(duration.getSeconds() > OnlineTicket.MAX_EXPIRY_DURATION) { + onlineTicket.setTicketTime(currentTime); + refresh(ticketId,currentTime); + } + } + +} diff --git a/maxkey-core/src/main/java/org/maxkey/authn/online/OnlineTicket.java b/maxkey-core/src/main/java/org/maxkey/authn/online/OnlineTicket.java new file mode 100644 index 000000000..b7f3ec225 --- /dev/null +++ b/maxkey-core/src/main/java/org/maxkey/authn/online/OnlineTicket.java @@ -0,0 +1,101 @@ +package org.maxkey.authn.online; + +import java.io.Serializable; +import java.time.LocalTime; +import java.util.HashMap; + +import org.maxkey.domain.apps.Apps; +import org.springframework.security.core.Authentication; + +public class OnlineTicket implements Serializable{ + + /** + * + */ + + public static final int MAX_EXPIRY_DURATION = 60 * 10; //default 10 minutes. + + private static final long serialVersionUID = 9008067569150338296L; + + public String ticketId; + + public LocalTime ticketTime; + + public Authentication authentication; + + private HashMap authorizedApps = new HashMap(); + + + public OnlineTicket(String ticketId) { + super(); + this.ticketId = ticketId; + this.ticketTime = LocalTime.now(); + } + + public OnlineTicket(String ticketId,Authentication authentication) { + super(); + this.ticketId = ticketId; + this.authentication = authentication; + this.ticketTime = LocalTime.now(); + } + + + + public String getTicketId() { + return ticketId; + } + + + + public void setTicketId(String ticketId) { + this.ticketId = ticketId; + } + + + public LocalTime getTicketTime() { + return ticketTime; + } + + public void setTicketTime(LocalTime ticketTime) { + this.ticketTime = ticketTime; + } + + public Authentication getAuthentication() { + return authentication; + } + + + + public void setAuthentication(Authentication authentication) { + this.authentication = authentication; + } + + + + public HashMap getAuthorizedApps() { + return authorizedApps; + } + + + + public void setAuthorizedApps(HashMap authorizedApps) { + this.authorizedApps = authorizedApps; + } + + public void setAuthorizedApp(Apps authorizedApp) { + this.authorizedApps.put(authorizedApp.getId(), authorizedApp); + } + + + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("OnlineTicket [ticketId="); + builder.append(ticketId); + builder.append("]"); + return builder.toString(); + } + + +} diff --git a/maxkey-core/src/main/java/org/maxkey/authn/online/OnlineTicketServices.java b/maxkey-core/src/main/java/org/maxkey/authn/online/OnlineTicketServices.java new file mode 100644 index 000000000..6f4aa6c96 --- /dev/null +++ b/maxkey-core/src/main/java/org/maxkey/authn/online/OnlineTicketServices.java @@ -0,0 +1,35 @@ +/* + * Copyright [2020] [MaxKey of copyright http://www.maxkey.top] + * + * 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 org.maxkey.authn.online; + +import java.time.LocalTime; + +public interface OnlineTicketServices { + + public void store(String ticketId, OnlineTicket ticket); + + public OnlineTicket remove(String ticket); + + public OnlineTicket get(String ticketId); + + public void refresh(String ticketId ,LocalTime refreshTime); + + public void refresh(String ticketId); + + public void setValiditySeconds(int validitySeconds); +} diff --git a/maxkey-core/src/main/java/org/maxkey/authn/online/RedisOnlineTicketServices.java b/maxkey-core/src/main/java/org/maxkey/authn/online/RedisOnlineTicketServices.java new file mode 100644 index 000000000..b849302a3 --- /dev/null +++ b/maxkey-core/src/main/java/org/maxkey/authn/online/RedisOnlineTicketServices.java @@ -0,0 +1,109 @@ +/* + * Copyright [2020] [MaxKey of copyright http://www.maxkey.top] + * + * 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 org.maxkey.authn.online; + +import java.time.Duration; +import java.time.LocalTime; + +import org.maxkey.persistence.redis.RedisConnection; +import org.maxkey.persistence.redis.RedisConnectionFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +public class RedisOnlineTicketServices implements OnlineTicketServices { + private static final Logger _logger = LoggerFactory.getLogger(RedisOnlineTicketServices.class); + + protected int serviceTicketValiditySeconds = 60 * 30; //default 30 minutes. + + RedisConnectionFactory connectionFactory; + + public static String PREFIX="REDIS_ONLINE_TICKET_"; + /** + * @param connectionFactory + */ + public RedisOnlineTicketServices(RedisConnectionFactory connectionFactory) { + super(); + this.connectionFactory = connectionFactory; + } + + /** + * + */ + public RedisOnlineTicketServices() { + + } + + public void setConnectionFactory(RedisConnectionFactory connectionFactory) { + this.connectionFactory = connectionFactory; + } + + @Override + public void store(String ticketId, OnlineTicket ticket) { + RedisConnection conn=connectionFactory.getConnection(); + conn.setexObject(PREFIX+ticketId, serviceTicketValiditySeconds, ticket); + conn.close(); + } + + @Override + public OnlineTicket remove(String ticketId) { + RedisConnection conn=connectionFactory.getConnection(); + OnlineTicket ticket = conn.getObject(PREFIX+ticketId); + conn.delete(PREFIX+ticketId); + conn.close(); + return ticket; + } + + @Override + public OnlineTicket get(String ticketId) { + RedisConnection conn=connectionFactory.getConnection(); + OnlineTicket ticket = conn.getObject(PREFIX+ticketId); + conn.close(); + return ticket; + } + + @Override + public void setValiditySeconds(int validitySeconds) { + this.serviceTicketValiditySeconds = validitySeconds; + + } + + @Override + public void refresh(String ticketId,LocalTime refreshTime) { + OnlineTicket onlineTicket = get(ticketId); + onlineTicket.setTicketTime(refreshTime); + store(ticketId , onlineTicket); + } + + @Override + public void refresh(String ticketId) { + OnlineTicket onlineTicket = get(ticketId); + + LocalTime currentTime = LocalTime.now(); + Duration duration = Duration.between(currentTime, onlineTicket.getTicketTime()); + + _logger.trace("OnlineTicket duration " + duration.getSeconds()); + + if(duration.getSeconds() > OnlineTicket.MAX_EXPIRY_DURATION) { + onlineTicket.setTicketTime(currentTime); + refresh(ticketId,currentTime); + } + } + + +} diff --git a/maxkey-core/src/main/java/org/maxkey/authn/realm/AbstractAuthenticationRealm.java b/maxkey-core/src/main/java/org/maxkey/authn/realm/AbstractAuthenticationRealm.java index 7a2b808f1..7237b6341 100644 --- a/maxkey-core/src/main/java/org/maxkey/authn/realm/AbstractAuthenticationRealm.java +++ b/maxkey-core/src/main/java/org/maxkey/authn/realm/AbstractAuthenticationRealm.java @@ -110,6 +110,16 @@ public abstract class AbstractAuthenticationRealm { public ArrayList grantAuthority(UserInfo userInfo) { return loginService.grantAuthority(userInfo); } + + /** + * grant Authority by grantedAuthoritys + * + * @param grantedAuthoritys + * @return ArrayList + */ + public ArrayList queryAuthorizedApps(ArrayList grantedAuthoritys) { + return loginService.queryAuthorizedApps(grantedAuthoritys); + } /** * login log write to log db diff --git a/maxkey-core/src/main/java/org/maxkey/autoconfigure/ApplicationAutoConfiguration.java b/maxkey-core/src/main/java/org/maxkey/autoconfigure/ApplicationAutoConfiguration.java index efaf5d026..befc64a36 100644 --- a/maxkey-core/src/main/java/org/maxkey/autoconfigure/ApplicationAutoConfiguration.java +++ b/maxkey-core/src/main/java/org/maxkey/autoconfigure/ApplicationAutoConfiguration.java @@ -27,10 +27,13 @@ import javax.sql.DataSource; import org.maxkey.authn.AbstractAuthenticationProvider; import org.maxkey.authn.RealmAuthenticationProvider; import org.maxkey.authn.SavedRequestAwareAuthenticationSuccessHandler; +import org.maxkey.authn.online.InMemoryOnlineTicketServices; +import org.maxkey.authn.online.OnlineTicketServices; +import org.maxkey.authn.online.RedisOnlineTicketServices; import org.maxkey.authn.support.rememberme.AbstractRemeberMeService; import org.maxkey.authn.support.rememberme.InMemoryRemeberMeService; -import org.maxkey.authn.support.rememberme.JdbcRemeberMeService; import org.maxkey.authn.support.rememberme.RedisRemeberMeService; +import org.maxkey.constants.ConstantsPersistence; import org.maxkey.constants.ConstantsProperties; import org.maxkey.crypto.keystore.KeyStoreLoader; import org.maxkey.crypto.password.LdapShaPasswordEncoder; @@ -189,21 +192,39 @@ public class ApplicationAutoConfiguration implements InitializingBean { @Value("${config.server.persistence}") int persistence, @Value("${config.login.remeberme.validity}") int validity, JdbcTemplate jdbcTemplate, - RedisConnectionFactory jedisConnectionFactory) { + RedisConnectionFactory redisConnFactory) { AbstractRemeberMeService remeberMeService = null; - if (persistence == 0) { + if (persistence == ConstantsPersistence.INMEMORY) { remeberMeService = new InMemoryRemeberMeService(); _logger.debug("InMemoryRemeberMeService"); - } else if (persistence == 1) { - remeberMeService = new JdbcRemeberMeService(jdbcTemplate); - _logger.debug("JdbcRemeberMeService"); - } else if (persistence == 2) { - remeberMeService = new RedisRemeberMeService(jedisConnectionFactory); + } else if (persistence == ConstantsPersistence.JDBC) { + //remeberMeService = new JdbcRemeberMeService(jdbcTemplate); + _logger.debug("JdbcRemeberMeService not support "); + } else if (persistence == ConstantsPersistence.REDIS) { + remeberMeService = new RedisRemeberMeService(redisConnFactory); _logger.debug("RedisRemeberMeService"); } return remeberMeService; } + @Bean(name = "onlineTicketServices") + public OnlineTicketServices onlineTicketServices( + @Value("${config.server.persistence}") int persistence, + JdbcTemplate jdbcTemplate, + RedisConnectionFactory redisConnFactory) { + OnlineTicketServices onlineTicketServices = null; + if (persistence == ConstantsPersistence.INMEMORY) { + onlineTicketServices = new InMemoryOnlineTicketServices(); + _logger.debug("InMemoryOnlineTicketServices"); + } else if (persistence == ConstantsPersistence.JDBC) { + _logger.debug("OnlineTicketServices not support "); + } else if (persistence == ConstantsPersistence.REDIS) { + onlineTicketServices = new RedisOnlineTicketServices(redisConnFactory); + _logger.debug("RedisOnlineTicketServices"); + } + return onlineTicketServices; + } + /** * keyStoreLoader . * @return diff --git a/maxkey-core/src/main/java/org/maxkey/autoconfigure/MvcAutoConfiguration.java b/maxkey-core/src/main/java/org/maxkey/autoconfigure/MvcAutoConfiguration.java index cea525eaf..63313f4cf 100644 --- a/maxkey-core/src/main/java/org/maxkey/autoconfigure/MvcAutoConfiguration.java +++ b/maxkey-core/src/main/java/org/maxkey/autoconfigure/MvcAutoConfiguration.java @@ -20,6 +20,9 @@ package org.maxkey.autoconfigure; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.List; + +import javax.servlet.Filter; + import org.maxkey.constants.ConstantsProperties; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -28,6 +31,7 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.web.server.ConfigurableWebServerFactory; import org.springframework.boot.web.server.ErrorPage; import org.springframework.boot.web.server.WebServerFactoryCustomizer; +import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; @@ -39,7 +43,9 @@ import org.springframework.http.converter.StringHttpMessageConverter; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.http.converter.xml.MarshallingHttpMessageConverter; import org.springframework.oxm.jaxb.Jaxb2Marshaller; +import org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter; import org.springframework.web.client.RestTemplate; +import org.springframework.web.filter.DelegatingFilterProxy; import org.springframework.web.multipart.commons.CommonsMultipartResolver; import org.springframework.web.servlet.i18n.CookieLocaleResolver; import org.springframework.web.servlet.i18n.LocaleChangeInterceptor; @@ -59,11 +65,11 @@ public class MvcAutoConfiguration implements InitializingBean { */ @Bean (name = "localeResolver") public CookieLocaleResolver cookieLocaleResolver( - @Value("${config.server.domain.sub:maxkey.top}")String subDomainName) { - _logger.debug("subDomainName " + subDomainName); + @Value("${config.server.domain:maxkey.top}")String domainName) { + _logger.debug("DomainName " + domainName); CookieLocaleResolver cookieLocaleResolver = new CookieLocaleResolver(); cookieLocaleResolver.setCookieName("maxkey_lang"); - cookieLocaleResolver.setCookieDomain(subDomainName); + cookieLocaleResolver.setCookieDomain(domainName); cookieLocaleResolver.setCookieMaxAge(604800); return cookieLocaleResolver; } @@ -244,6 +250,25 @@ public class MvcAutoConfiguration implements InitializingBean { }; } + @Bean + public SecurityContextHolderAwareRequestFilter securityContextHolderAwareRequestFilter() { + _logger.debug("securityContextHolderAwareRequestFilter init "); + return new SecurityContextHolderAwareRequestFilter(); + } + + @Bean + public FilterRegistrationBean delegatingFilterProxy() { + _logger.debug("delegatingFilterProxy init for /* "); + FilterRegistrationBean registrationBean = new FilterRegistrationBean(); + registrationBean.setFilter(new DelegatingFilterProxy("securityContextHolderAwareRequestFilter")); + registrationBean.addUrlPatterns("/*"); + //registrationBean. + registrationBean.setName("delegatingFilterProxy"); + registrationBean.setOrder(1); + + return registrationBean; + } + @Override public void afterPropertiesSet() throws Exception { // TODO Auto-generated method stub diff --git a/maxkey-core/src/main/java/org/maxkey/autoconfigure/RedisAutoConfiguration.java b/maxkey-core/src/main/java/org/maxkey/autoconfigure/RedisAutoConfiguration.java index 7c056b0ad..fd40a26f4 100644 --- a/maxkey-core/src/main/java/org/maxkey/autoconfigure/RedisAutoConfiguration.java +++ b/maxkey-core/src/main/java/org/maxkey/autoconfigure/RedisAutoConfiguration.java @@ -46,7 +46,7 @@ public class RedisAutoConfiguration implements InitializingBean { * @return RedisConnectionFactory */ @Bean - public RedisConnectionFactory redisConnectionFactory( + public RedisConnectionFactory redisConnFactory( @Value("${spring.redis.host}") String host, @Value("${spring.redis.port}") @@ -63,7 +63,7 @@ public class RedisAutoConfiguration implements InitializingBean { int maxIdle, @Value("${spring.redis.lettuce.pool.min-idle}") int minIdle) { - _logger.debug("RedisConnectionFactory init ."); + _logger.debug("redisConnFactory init ."); RedisConnectionFactory factory = new RedisConnectionFactory(); factory.setHostName(host); factory.setPort(port); diff --git a/maxkey-core/src/main/java/org/maxkey/autoconfigure/SessionRedisAutoConfiguration.java b/maxkey-core/src/main/java/org/maxkey/autoconfigure/SessionRedisAutoConfiguration.java new file mode 100644 index 000000000..29e27f2ac --- /dev/null +++ b/maxkey-core/src/main/java/org/maxkey/autoconfigure/SessionRedisAutoConfiguration.java @@ -0,0 +1,65 @@ +/* + * Copyright [2020] [MaxKey of copyright http://www.maxkey.top] + * + * 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 org.maxkey.autoconfigure; + +import org.maxkey.constants.ConstantsProperties; +import org.maxkey.persistence.redis.RedisConnectionFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.ObjectProvider; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; +import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession; +import org.springframework.session.web.http.CookieSerializer; +import org.springframework.session.web.http.DefaultCookieSerializer; + +@Configuration +@ConditionalOnProperty(value = "spring.session.store-type", havingValue = "redis", matchIfMissing = false) +@EnableRedisHttpSession +@PropertySource(ConstantsProperties.applicationPropertySource) +public class SessionRedisAutoConfiguration implements InitializingBean { + private static final Logger _logger = LoggerFactory.getLogger(SessionRedisAutoConfiguration.class); + + private final RedisConnectionFactory redisConnectionFactory; + + public SessionRedisAutoConfiguration(ObjectProvider redisConnectionFactory) { + this.redisConnectionFactory = redisConnectionFactory.getIfAvailable(); + } + + @Bean + public CookieSerializer cookieSerializer() { + _logger.debug("CookieSerializer Default ."); + DefaultCookieSerializer serializer = new DefaultCookieSerializer(); + serializer.setCookieName("JSESSIONID"); + serializer.setCookiePath("/"); + serializer.setDomainNamePattern("^.+?\\.(\\w+\\.[a-z]+)$"); + return serializer; + } + + + + + @Override + public void afterPropertiesSet() throws Exception { + // TODO Auto-generated method stub + + } +} diff --git a/maxkey-core/src/main/java/org/maxkey/configuration/ApplicationConfig.java b/maxkey-core/src/main/java/org/maxkey/configuration/ApplicationConfig.java index dee12d97f..bb57945b1 100644 --- a/maxkey-core/src/main/java/org/maxkey/configuration/ApplicationConfig.java +++ b/maxkey-core/src/main/java/org/maxkey/configuration/ApplicationConfig.java @@ -50,16 +50,16 @@ public class ApplicationConfig { @Autowired LoginConfig loginConfig; + @Value("${config.server.basedomain}") + String baseDomainName; + @Value("${config.server.domain}") String domainName; - @Value("${config.server.domain.sub}") - String subDomainName; - @Value("${config.server.name}") String serverName; - @Value("${config.server.prefix.uri}") + @Value("${config.server.uri}") String serverPrefix; @Value("${config.server.default.uri}") @@ -139,22 +139,15 @@ public class ApplicationConfig { */ public void setDomainName(String domainName) { this.domainName = domainName; - String[] domainSubStrings = domainName.split("\\."); - if (domainSubStrings.length >= 3) { - this.subDomainName = domainSubStrings[domainSubStrings.length - 2] + "." - + domainSubStrings[domainSubStrings.length - 1]; - _logger.debug("subDomainName " + subDomainName); - } else { - this.subDomainName = domainName; - } + } - public String getSubDomainName() { - return subDomainName; + public String getBaseDomainName() { + return baseDomainName; } - public void setSubDomainName(String subDomainName) { - this.subDomainName = subDomainName; + public void setBaseDomainName(String baseDomainName) { + this.baseDomainName = baseDomainName; } /** @@ -203,4 +196,35 @@ public class ApplicationConfig { this.maxKeyUri = maxKeyUri; } + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("ApplicationConfig [emailConfig="); + builder.append(emailConfig); + builder.append(", characterEncodingConfig="); + builder.append(characterEncodingConfig); + builder.append(", loginConfig="); + builder.append(loginConfig); + builder.append(", baseDomainName="); + builder.append(baseDomainName); + builder.append(", domainName="); + builder.append(domainName); + builder.append(", serverName="); + builder.append(serverName); + builder.append(", serverPrefix="); + builder.append(serverPrefix); + builder.append(", defaultUri="); + builder.append(defaultUri); + builder.append(", managementUri="); + builder.append(managementUri); + builder.append(", port="); + builder.append(port); + builder.append(", kafkaSupport="); + builder.append(kafkaSupport); + builder.append(", maxKeyUri="); + builder.append(maxKeyUri); + builder.append("]"); + return builder.toString(); + } + } diff --git a/maxkey-core/src/main/java/org/maxkey/configuration/CharacterEncodingConfig.java b/maxkey-core/src/main/java/org/maxkey/configuration/CharacterEncodingConfig.java index 788027fc7..a28c181e4 100644 --- a/maxkey-core/src/main/java/org/maxkey/configuration/CharacterEncodingConfig.java +++ b/maxkey-core/src/main/java/org/maxkey/configuration/CharacterEncodingConfig.java @@ -99,4 +99,17 @@ public class CharacterEncodingConfig { return null; } + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("CharacterEncodingConfig [fromCharSet="); + builder.append(fromCharSet); + builder.append(", toCharSet="); + builder.append(toCharSet); + builder.append(", encoding="); + builder.append(encoding); + builder.append("]"); + return builder.toString(); + } + } diff --git a/maxkey-core/src/main/java/org/maxkey/configuration/EmailConfig.java b/maxkey-core/src/main/java/org/maxkey/configuration/EmailConfig.java index a2a703354..9a4a508b8 100644 --- a/maxkey-core/src/main/java/org/maxkey/configuration/EmailConfig.java +++ b/maxkey-core/src/main/java/org/maxkey/configuration/EmailConfig.java @@ -127,4 +127,23 @@ public class EmailConfig { this.ssl = ssl; } + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("EmailConfig [username="); + builder.append(username); + builder.append(", password="); + builder.append(password); + builder.append(", smtpHost="); + builder.append(smtpHost); + builder.append(", port="); + builder.append(port); + builder.append(", ssl="); + builder.append(ssl); + builder.append(", sender="); + builder.append(sender); + builder.append("]"); + return builder.toString(); + } + } diff --git a/maxkey-core/src/main/java/org/maxkey/configuration/LoginConfig.java b/maxkey-core/src/main/java/org/maxkey/configuration/LoginConfig.java index 61500de84..c1b10f607 100644 --- a/maxkey-core/src/main/java/org/maxkey/configuration/LoginConfig.java +++ b/maxkey-core/src/main/java/org/maxkey/configuration/LoginConfig.java @@ -124,14 +124,23 @@ public class LoginConfig { @Override public String toString() { StringBuilder builder = new StringBuilder(); - builder - .append("LoginConfig [captcha=").append(captcha) - .append(", mfa=").append(mfa) - .append(", socialSignOn=").append(socialSignOn) - .append(", kerberos=").append(kerberos) - .append(", remeberMe=").append(remeberMe) - .append(", wsFederation=").append(wsFederation) - .append(", defaultUri=").append(defaultUri).append("]"); + builder.append("LoginConfig [captcha="); + builder.append(captcha); + builder.append(", captchaType="); + builder.append(captchaType); + builder.append(", mfa="); + builder.append(mfa); + builder.append(", socialSignOn="); + builder.append(socialSignOn); + builder.append(", kerberos="); + builder.append(kerberos); + builder.append(", remeberMe="); + builder.append(remeberMe); + builder.append(", wsFederation="); + builder.append(wsFederation); + builder.append(", defaultUri="); + builder.append(defaultUri); + builder.append("]"); return builder.toString(); } diff --git a/maxkey-core/src/main/java/org/maxkey/configuration/oidc/OIDCProviderMetadataDetails.java b/maxkey-core/src/main/java/org/maxkey/configuration/oidc/OIDCProviderMetadataDetails.java index 56a39a762..37d0f3ec3 100644 --- a/maxkey-core/src/main/java/org/maxkey/configuration/oidc/OIDCProviderMetadataDetails.java +++ b/maxkey-core/src/main/java/org/maxkey/configuration/oidc/OIDCProviderMetadataDetails.java @@ -18,6 +18,8 @@ package org.maxkey.configuration.oidc; import java.net.URI; +import java.util.Collection; +import java.util.Iterator; import java.util.Set; /** @@ -106,6 +108,44 @@ public class OIDCProviderMetadataDetails implements OIDCProviderMetadata { this.responseTypesSupported = responseTypesSupported; } + @Override + public String toString() { + final int maxLen = 4; + StringBuilder builder = new StringBuilder(); + builder.append("OIDCProviderMetadataDetails [issuer="); + builder.append(issuer); + builder.append(", authorizationEndpoint="); + builder.append(authorizationEndpoint); + builder.append(", tokenEndpoint="); + builder.append(tokenEndpoint); + builder.append(", userinfoEndpoint="); + builder.append(userinfoEndpoint); + builder.append(", jwksUri="); + builder.append(jwksUri); + builder.append(", registrationEndpoint="); + builder.append(registrationEndpoint); + builder.append(", scopesSupported="); + builder.append(scopesSupported != null ? toString(scopesSupported, maxLen) : null); + builder.append(", responseTypesSupported="); + builder.append(responseTypesSupported != null ? toString(responseTypesSupported, maxLen) : null); + builder.append("]"); + return builder.toString(); + } + + private String toString(Collection collection, int maxLen) { + StringBuilder builder = new StringBuilder(); + builder.append("["); + int i = 0; + for (Iterator iterator = collection.iterator(); iterator.hasNext() && i < maxLen; i++) { + if (i > 0) + builder.append(", "); + builder.append(iterator.next()); + } + builder.append("]"); + return builder.toString(); + } + // TODO: Complete remaining properties from // http://openid.net/specs/openid-connect-discovery-1_0.html#ProviderMetadata + } diff --git a/maxkey-core/src/main/java/org/maxkey/constants/ConstantsPersistence.java b/maxkey-core/src/main/java/org/maxkey/constants/ConstantsPersistence.java new file mode 100644 index 000000000..3a40a943b --- /dev/null +++ b/maxkey-core/src/main/java/org/maxkey/constants/ConstantsPersistence.java @@ -0,0 +1,33 @@ +/* + * Copyright [2020] [MaxKey of copyright http://www.maxkey.top] + * + * 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 org.maxkey.constants; + +/** + * PROTOCOLS. + * @author Crystal.Sea + * + */ +public final class ConstantsPersistence { + + public static final int INMEMORY = 0; + + public static final int JDBC = 1; + + public static final int REDIS = 2; + +} diff --git a/maxkey-core/src/main/java/org/maxkey/crypto/keystore/KeyStoreLoader.java b/maxkey-core/src/main/java/org/maxkey/crypto/keystore/KeyStoreLoader.java index 518e81d90..237406f13 100644 --- a/maxkey-core/src/main/java/org/maxkey/crypto/keystore/KeyStoreLoader.java +++ b/maxkey-core/src/main/java/org/maxkey/crypto/keystore/KeyStoreLoader.java @@ -119,4 +119,21 @@ public class KeyStoreLoader implements InitializingBean { return keystoreType; } + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("KeyStoreLoader [keyStore="); + builder.append(keyStore); + builder.append(", entityName="); + builder.append(entityName); + builder.append(", keystoreFile="); + builder.append(keystoreFile); + builder.append(", keystorePassword="); + builder.append(keystorePassword); + builder.append(", keystoreType="); + builder.append(keystoreType); + builder.append("]"); + return builder.toString(); + } + } diff --git a/maxkey-core/src/main/java/org/maxkey/crypto/password/opt/OneTimePassword.java b/maxkey-core/src/main/java/org/maxkey/crypto/password/opt/OneTimePassword.java index 4fbb8b5fb..ef0d49eb3 100644 --- a/maxkey-core/src/main/java/org/maxkey/crypto/password/opt/OneTimePassword.java +++ b/maxkey-core/src/main/java/org/maxkey/crypto/password/opt/OneTimePassword.java @@ -79,10 +79,19 @@ public class OneTimePassword implements Serializable { @Override public String toString() { StringBuilder builder = new StringBuilder(); - builder.append("OneTimePassword [id=").append(id) - .append(", type=").append(type).append(", token=").append(token) - .append(", username=").append(username).append(", receiver=").append(receiver) - .append(", createTime=").append(createTime).append("]"); + builder.append("OneTimePassword [id="); + builder.append(id); + builder.append(", type="); + builder.append(type); + builder.append(", token="); + builder.append(token); + builder.append(", username="); + builder.append(username); + builder.append(", receiver="); + builder.append(receiver); + builder.append(", createTime="); + builder.append(createTime); + builder.append("]"); return builder.toString(); } diff --git a/maxkey-core/src/main/java/org/maxkey/domain/ChangePassword.java b/maxkey-core/src/main/java/org/maxkey/domain/ChangePassword.java index e8a6a1778..524753987 100644 --- a/maxkey-core/src/main/java/org/maxkey/domain/ChangePassword.java +++ b/maxkey-core/src/main/java/org/maxkey/domain/ChangePassword.java @@ -165,14 +165,27 @@ public class ChangePassword extends JpaBaseDomain{ } - /* (non-Javadoc) - * @see java.lang.Object#toString() - */ @Override - public String toString() { - return "ChangePassword [uid=" + uid + ", username=" + username - + ", password=" + password + ", confirmpassword=" - + confirmpassword + ", decipherable=" + decipherable + "]"; - } + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("ChangePassword [id="); + builder.append(id); + builder.append(", uid="); + builder.append(uid); + builder.append(", username="); + builder.append(username); + builder.append(", displayName="); + builder.append(displayName); + builder.append(", oldPassword="); + builder.append(oldPassword); + builder.append(", password="); + builder.append(password); + builder.append(", confirmpassword="); + builder.append(confirmpassword); + builder.append(", decipherable="); + builder.append(decipherable); + builder.append("]"); + return builder.toString(); + } } diff --git a/maxkey-core/src/main/java/org/maxkey/domain/ExtraAttr.java b/maxkey-core/src/main/java/org/maxkey/domain/ExtraAttr.java index dbb177fc8..8d611817c 100644 --- a/maxkey-core/src/main/java/org/maxkey/domain/ExtraAttr.java +++ b/maxkey-core/src/main/java/org/maxkey/domain/ExtraAttr.java @@ -69,9 +69,18 @@ public class ExtraAttr { public void setType(String type) { this.type = type; } + @Override - public String toString() { - return "ExtraAttr [attr=" + attr + ", value=" + value + "]"; - } + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("ExtraAttr [attr="); + builder.append(attr); + builder.append(", type="); + builder.append(type); + builder.append(", value="); + builder.append(value); + builder.append("]"); + return builder.toString(); + } } diff --git a/maxkey-core/src/main/java/org/maxkey/domain/ExtraAttrs.java b/maxkey-core/src/main/java/org/maxkey/domain/ExtraAttrs.java index 338f4f79e..23d087d7b 100644 --- a/maxkey-core/src/main/java/org/maxkey/domain/ExtraAttrs.java +++ b/maxkey-core/src/main/java/org/maxkey/domain/ExtraAttrs.java @@ -109,9 +109,13 @@ public class ExtraAttrs { } @Override - public String toString() { - return "ExtraAttrs [extraAttrs=" + extraAttrs + "]"; - } + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("ExtraAttrs [extraAttrs="); + builder.append(extraAttrs); + builder.append("]"); + return builder.toString(); + } } diff --git a/maxkey-core/src/main/java/org/maxkey/domain/GroupMember.java b/maxkey-core/src/main/java/org/maxkey/domain/GroupMember.java index 1ec7983a1..f1531880e 100644 --- a/maxkey-core/src/main/java/org/maxkey/domain/GroupMember.java +++ b/maxkey-core/src/main/java/org/maxkey/domain/GroupMember.java @@ -164,11 +164,23 @@ public class GroupMember extends UserInfo implements Serializable{ @Override - public String toString() { - return "GroupMember [groupId=" + groupId + ", groupName=" + groupName - + ", memberId=" + memberId + ", memberName=" + memberName - + ", type=" + type + "]"; - } + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("GroupMember [id="); + builder.append(id); + builder.append(", groupId="); + builder.append(groupId); + builder.append(", groupName="); + builder.append(groupName); + builder.append(", memberId="); + builder.append(memberId); + builder.append(", memberName="); + builder.append(memberName); + builder.append(", type="); + builder.append(type); + builder.append("]"); + return builder.toString(); + } } diff --git a/maxkey-core/src/main/java/org/maxkey/domain/GroupPrivileges.java b/maxkey-core/src/main/java/org/maxkey/domain/GroupPrivileges.java index 6a87e310f..94022785b 100644 --- a/maxkey-core/src/main/java/org/maxkey/domain/GroupPrivileges.java +++ b/maxkey-core/src/main/java/org/maxkey/domain/GroupPrivileges.java @@ -102,13 +102,18 @@ public class GroupPrivileges extends Apps implements Serializable{ } - /* (non-Javadoc) - * @see java.lang.Object#toString() - */ @Override - public String toString() { - return "GroupApp [groupId=" + groupId + ", appId=" + appId + "]"; - } + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("GroupPrivileges [id="); + builder.append(id); + builder.append(", groupId="); + builder.append(groupId); + builder.append(", appId="); + builder.append(appId); + builder.append("]"); + return builder.toString(); + } } diff --git a/maxkey-core/src/main/java/org/maxkey/domain/Groups.java b/maxkey-core/src/main/java/org/maxkey/domain/Groups.java index ea5a476c1..020184d20 100644 --- a/maxkey-core/src/main/java/org/maxkey/domain/Groups.java +++ b/maxkey-core/src/main/java/org/maxkey/domain/Groups.java @@ -145,14 +145,29 @@ public class Groups extends JpaBaseDomain implements Serializable { this.status = status; } - /* - * (non-Javadoc) - * - * @see java.lang.Object#toString() - */ @Override public String toString() { - return "Groups [name=" + name + ", isdefault=" + isdefault + "]"; + StringBuilder builder = new StringBuilder(); + builder.append("Groups [id="); + builder.append(id); + builder.append(", name="); + builder.append(name); + builder.append(", isdefault="); + builder.append(isdefault); + builder.append(", description="); + builder.append(description); + builder.append(", createdBy="); + builder.append(createdBy); + builder.append(", createdDate="); + builder.append(createdDate); + builder.append(", modifiedBy="); + builder.append(modifiedBy); + builder.append(", modifiedDate="); + builder.append(modifiedDate); + builder.append(", status="); + builder.append(status); + builder.append("]"); + return builder.toString(); } } diff --git a/maxkey-core/src/main/java/org/maxkey/domain/HistoryLogin.java b/maxkey-core/src/main/java/org/maxkey/domain/HistoryLogin.java index e57142127..a8e3098b7 100644 --- a/maxkey-core/src/main/java/org/maxkey/domain/HistoryLogin.java +++ b/maxkey-core/src/main/java/org/maxkey/domain/HistoryLogin.java @@ -226,13 +226,47 @@ public class HistoryLogin extends JpaBaseDomain implements Serializable{ } @Override - public String toString() { - return "LoginHistory [id=" + id + ", sessionId=" + sessionId + ", uid=" + uid + ", username=" + username - + ", displayName=" + displayName + ", loginType=" + loginType + ", message=" + message + ", code=" - + code + ", provider=" + provider + ", sourceIp=" + sourceIp + ", browser=" + browser + ", platform=" - + platform + ", application=" + application + ", loginUrl=" + loginUrl + ", loginTime=" + loginTime - + ", logoutTime=" + logoutTime + ", startDate=" + startDate + ", endDate=" + endDate + "]"; - } + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("HistoryLogin [id="); + builder.append(id); + builder.append(", sessionId="); + builder.append(sessionId); + builder.append(", uid="); + builder.append(uid); + builder.append(", username="); + builder.append(username); + builder.append(", displayName="); + builder.append(displayName); + builder.append(", loginType="); + builder.append(loginType); + builder.append(", message="); + builder.append(message); + builder.append(", code="); + builder.append(code); + builder.append(", provider="); + builder.append(provider); + builder.append(", sourceIp="); + builder.append(sourceIp); + builder.append(", browser="); + builder.append(browser); + builder.append(", platform="); + builder.append(platform); + builder.append(", application="); + builder.append(application); + builder.append(", loginUrl="); + builder.append(loginUrl); + builder.append(", loginTime="); + builder.append(loginTime); + builder.append(", logoutTime="); + builder.append(logoutTime); + builder.append(", startDate="); + builder.append(startDate); + builder.append(", endDate="); + builder.append(endDate); + builder.append("]"); + return builder.toString(); + } } diff --git a/maxkey-core/src/main/java/org/maxkey/domain/HistoryLoginApps.java b/maxkey-core/src/main/java/org/maxkey/domain/HistoryLoginApps.java index 1f6b4527b..333dda388 100644 --- a/maxkey-core/src/main/java/org/maxkey/domain/HistoryLoginApps.java +++ b/maxkey-core/src/main/java/org/maxkey/domain/HistoryLoginApps.java @@ -210,14 +210,30 @@ public class HistoryLoginApps extends JpaBaseDomain { } - /* (non-Javadoc) - * @see java.lang.Object#toString() - */ @Override - public String toString() { - return "LoginAppsHistory [sessionId=" + sessionId + ", appId=" + appId - + ", appName=" + appName + ", uid=" + uid + ", username=" - + username + ", displayName=" + displayName + ", loginTime=" - + loginTime + "]"; - } + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("HistoryLoginApps [id="); + builder.append(id); + builder.append(", sessionId="); + builder.append(sessionId); + builder.append(", appId="); + builder.append(appId); + builder.append(", appName="); + builder.append(appName); + builder.append(", uid="); + builder.append(uid); + builder.append(", username="); + builder.append(username); + builder.append(", displayName="); + builder.append(displayName); + builder.append(", loginTime="); + builder.append(loginTime); + builder.append(", startDate="); + builder.append(startDate); + builder.append(", endDate="); + builder.append(endDate); + builder.append("]"); + return builder.toString(); + } } diff --git a/maxkey-core/src/main/java/org/maxkey/domain/HistoryLogs.java b/maxkey-core/src/main/java/org/maxkey/domain/HistoryLogs.java index b5f577721..fca5226cf 100644 --- a/maxkey-core/src/main/java/org/maxkey/domain/HistoryLogs.java +++ b/maxkey-core/src/main/java/org/maxkey/domain/HistoryLogs.java @@ -209,4 +209,39 @@ public class HistoryLogs extends JpaBaseDomain implements Serializable { this.endDate = endDate; } + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("HistoryLogs [id="); + builder.append(id); + builder.append(", serviceName="); + builder.append(serviceName); + builder.append(", message="); + builder.append(message); + builder.append(", content="); + builder.append(content); + builder.append(", messageType="); + builder.append(messageType); + builder.append(", operateType="); + builder.append(operateType); + builder.append(", username="); + builder.append(username); + builder.append(", code="); + builder.append(code); + builder.append(", createdBy="); + builder.append(createdBy); + builder.append(", createdDate="); + builder.append(createdDate); + builder.append(", modifiedBy="); + builder.append(modifiedBy); + builder.append(", modifiedDate="); + builder.append(modifiedDate); + builder.append(", startDate="); + builder.append(startDate); + builder.append(", endDate="); + builder.append(endDate); + builder.append("]"); + return builder.toString(); + } + } diff --git a/maxkey-core/src/main/java/org/maxkey/domain/Navigations.java b/maxkey-core/src/main/java/org/maxkey/domain/Navigations.java index e6521dc6b..103225b7a 100644 --- a/maxkey-core/src/main/java/org/maxkey/domain/Navigations.java +++ b/maxkey-core/src/main/java/org/maxkey/domain/Navigations.java @@ -162,13 +162,33 @@ public class Navigations extends JpaBaseDomain implements java.io.Serializable } @Override - public String toString() { - return "Navigations [name=" + name + ", url=" + url + ", type=" + type - + ", target=" + target + ", pId=" + pId + ", pName=" + pName - + ", xPath=" + xPath + ", hasChild=" + hasChild - +", visible=" + visible - + ", childNavs=" + childNavs + "]"; - } + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("Navigations [id="); + builder.append(id); + builder.append(", name="); + builder.append(name); + builder.append(", url="); + builder.append(url); + builder.append(", type="); + builder.append(type); + builder.append(", target="); + builder.append(target); + builder.append(", pId="); + builder.append(pId); + builder.append(", pName="); + builder.append(pName); + builder.append(", xPath="); + builder.append(xPath); + builder.append(", hasChild="); + builder.append(hasChild); + builder.append(", visible="); + builder.append(visible); + builder.append(", childNavs="); + builder.append(childNavs); + builder.append("]"); + return builder.toString(); + } diff --git a/maxkey-core/src/main/java/org/maxkey/domain/Organizations.java b/maxkey-core/src/main/java/org/maxkey/domain/Organizations.java index cf6317f73..df64c3113 100644 --- a/maxkey-core/src/main/java/org/maxkey/domain/Organizations.java +++ b/maxkey-core/src/main/java/org/maxkey/domain/Organizations.java @@ -289,13 +289,57 @@ public class Organizations extends JpaBaseDomain implements Serializable { @Override public String toString() { - return "Organizations [id=" + id + ", code=" + code + ", name=" + name + ", fullName=" + fullName - + ", parentId=" + parentId + ", parentName=" + parentName + ", type=" + type + ", codePath=" + codePath - + ", namePath=" + namePath + ", level=" + level + ", hasChild=" + hasChild + ", division=" + division - + ", country=" + country + ", region=" + region + ", locality=" + locality + ", street=" + street - + ", address=" + address + ", contact=" + contact + ", postalCode=" + postalCode + ", phone=" + phone - + ", fax=" + fax + ", email=" + email + ", sortIndex=" + sortIndex + ", description=" + description - + "]"; + StringBuilder builder = new StringBuilder(); + builder.append("Organizations [id="); + builder.append(id); + builder.append(", code="); + builder.append(code); + builder.append(", name="); + builder.append(name); + builder.append(", fullName="); + builder.append(fullName); + builder.append(", parentId="); + builder.append(parentId); + builder.append(", parentName="); + builder.append(parentName); + builder.append(", type="); + builder.append(type); + builder.append(", codePath="); + builder.append(codePath); + builder.append(", namePath="); + builder.append(namePath); + builder.append(", level="); + builder.append(level); + builder.append(", hasChild="); + builder.append(hasChild); + builder.append(", division="); + builder.append(division); + builder.append(", country="); + builder.append(country); + builder.append(", region="); + builder.append(region); + builder.append(", locality="); + builder.append(locality); + builder.append(", street="); + builder.append(street); + builder.append(", address="); + builder.append(address); + builder.append(", contact="); + builder.append(contact); + builder.append(", postalCode="); + builder.append(postalCode); + builder.append(", phone="); + builder.append(phone); + builder.append(", fax="); + builder.append(fax); + builder.append(", email="); + builder.append(email); + builder.append(", sortIndex="); + builder.append(sortIndex); + builder.append(", description="); + builder.append(description); + builder.append("]"); + return builder.toString(); } diff --git a/maxkey-core/src/main/java/org/maxkey/domain/PasswordPolicy.java b/maxkey-core/src/main/java/org/maxkey/domain/PasswordPolicy.java index 5f13eada9..7e1510bfa 100644 --- a/maxkey-core/src/main/java/org/maxkey/domain/PasswordPolicy.java +++ b/maxkey-core/src/main/java/org/maxkey/domain/PasswordPolicy.java @@ -385,11 +385,45 @@ public class PasswordPolicy extends JpaBaseDomain implements java.io.Serializabl @Override public String toString() { - return "PasswordPolicy [id=" + id + ", minLength=" + minLength + ", maxLength=" + maxLength + ", lowerCase=" - + lowerCase + ", upperCase=" + upperCase + ", digits=" + digits + ", specialChar=" + specialChar - + ", attempts=" + attempts + ", duration=" + duration + ", expiration=" + expiration + ", username=" - + username + ", history=" + history + ", dictionary=" + dictionary + ", alphabetical=" + alphabetical - + ", numerical=" + numerical + ", qwerty=" + qwerty + "]"; + StringBuilder builder = new StringBuilder(); + builder.append("PasswordPolicy [id="); + builder.append(id); + builder.append(", minLength="); + builder.append(minLength); + builder.append(", maxLength="); + builder.append(maxLength); + builder.append(", lowerCase="); + builder.append(lowerCase); + builder.append(", upperCase="); + builder.append(upperCase); + builder.append(", digits="); + builder.append(digits); + builder.append(", specialChar="); + builder.append(specialChar); + builder.append(", attempts="); + builder.append(attempts); + builder.append(", duration="); + builder.append(duration); + builder.append(", expiration="); + builder.append(expiration); + builder.append(", username="); + builder.append(username); + builder.append(", history="); + builder.append(history); + builder.append(", dictionary="); + builder.append(dictionary); + builder.append(", alphabetical="); + builder.append(alphabetical); + builder.append(", numerical="); + builder.append(numerical); + builder.append(", qwerty="); + builder.append(qwerty); + builder.append(", occurances="); + builder.append(occurances); + builder.append(", randomPasswordLength="); + builder.append(randomPasswordLength); + builder.append("]"); + return builder.toString(); } diff --git a/maxkey-core/src/main/java/org/maxkey/domain/Registration.java b/maxkey-core/src/main/java/org/maxkey/domain/Registration.java index 41bdf4e59..bb478b07c 100644 --- a/maxkey-core/src/main/java/org/maxkey/domain/Registration.java +++ b/maxkey-core/src/main/java/org/maxkey/domain/Registration.java @@ -162,16 +162,29 @@ public class Registration extends JpaBaseDomain{ this.firstName = firstName; } - /* (non-Javadoc) - * @see java.lang.Object#toString() - */ @Override - public String toString() { - return "Registration [loginName=" + loginName + ", workEmail=" - + workEmail + ", company=" + company + ", workPhone=" - + workPhone + ", nickName=" + nickName + ", lastName=" - + lastName + ", firstName=" + firstName + ", users=" + users - + "]"; - } + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("Registration [id="); + builder.append(id); + builder.append(", loginName="); + builder.append(loginName); + builder.append(", workEmail="); + builder.append(workEmail); + builder.append(", company="); + builder.append(company); + builder.append(", workPhone="); + builder.append(workPhone); + builder.append(", nickName="); + builder.append(nickName); + builder.append(", lastName="); + builder.append(lastName); + builder.append(", firstName="); + builder.append(firstName); + builder.append(", users="); + builder.append(users); + builder.append("]"); + return builder.toString(); + } } diff --git a/maxkey-core/src/main/java/org/maxkey/domain/Resources.java b/maxkey-core/src/main/java/org/maxkey/domain/Resources.java index 16b2700c2..94c0a7dc7 100644 --- a/maxkey-core/src/main/java/org/maxkey/domain/Resources.java +++ b/maxkey-core/src/main/java/org/maxkey/domain/Resources.java @@ -215,4 +215,47 @@ public class Resources extends JpaBaseDomain implements Serializable { this.sortIndex = sortIndex; } + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("Resources [id="); + builder.append(id); + builder.append(", name="); + builder.append(name); + builder.append(", sortIndex="); + builder.append(sortIndex); + builder.append(", appId="); + builder.append(appId); + builder.append(", appName="); + builder.append(appName); + builder.append(", parentId="); + builder.append(parentId); + builder.append(", parentName="); + builder.append(parentName); + builder.append(", resourceType="); + builder.append(resourceType); + builder.append(", resourceIcon="); + builder.append(resourceIcon); + builder.append(", resourceStyle="); + builder.append(resourceStyle); + builder.append(", resourceUrl="); + builder.append(resourceUrl); + builder.append(", resourceAction="); + builder.append(resourceAction); + builder.append(", status="); + builder.append(status); + builder.append(", description="); + builder.append(description); + builder.append(", createdBy="); + builder.append(createdBy); + builder.append(", createdDate="); + builder.append(createdDate); + builder.append(", modifiedBy="); + builder.append(modifiedBy); + builder.append(", modifiedDate="); + builder.append(modifiedDate); + builder.append("]"); + return builder.toString(); + } + } diff --git a/maxkey-core/src/main/java/org/maxkey/domain/RoleMember.java b/maxkey-core/src/main/java/org/maxkey/domain/RoleMember.java index 0268cdabb..f2cfec825 100644 --- a/maxkey-core/src/main/java/org/maxkey/domain/RoleMember.java +++ b/maxkey-core/src/main/java/org/maxkey/domain/RoleMember.java @@ -117,8 +117,21 @@ public class RoleMember extends UserInfo implements Serializable { @Override public String toString() { - return "RoleMember [id=" + id + ", roleId=" + roleId + ", roleName=" + roleName + ", memberId=" + memberId - + ", memberName=" + memberName + ", type=" + type + "]"; + StringBuilder builder = new StringBuilder(); + builder.append("RoleMember [id="); + builder.append(id); + builder.append(", roleId="); + builder.append(roleId); + builder.append(", roleName="); + builder.append(roleName); + builder.append(", memberId="); + builder.append(memberId); + builder.append(", memberName="); + builder.append(memberName); + builder.append(", type="); + builder.append(type); + builder.append("]"); + return builder.toString(); } } diff --git a/maxkey-core/src/main/java/org/maxkey/domain/RolePermissions.java b/maxkey-core/src/main/java/org/maxkey/domain/RolePermissions.java index c0f46d2a0..b6c726114 100644 --- a/maxkey-core/src/main/java/org/maxkey/domain/RolePermissions.java +++ b/maxkey-core/src/main/java/org/maxkey/domain/RolePermissions.java @@ -107,6 +107,23 @@ public class RolePermissions extends JpaBaseDomain implements Serializable { public String getUniqueId() { return appId + "_" + roleId + "_" + resourceId; } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("RolePermissions [id="); + builder.append(id); + builder.append(", appId="); + builder.append(appId); + builder.append(", roleId="); + builder.append(roleId); + builder.append(", resourceId="); + builder.append(resourceId); + builder.append(", status="); + builder.append(status); + builder.append("]"); + return builder.toString(); + } } diff --git a/maxkey-core/src/main/java/org/maxkey/domain/Roles.java b/maxkey-core/src/main/java/org/maxkey/domain/Roles.java index de3034bfb..17ea7b861 100644 --- a/maxkey-core/src/main/java/org/maxkey/domain/Roles.java +++ b/maxkey-core/src/main/java/org/maxkey/domain/Roles.java @@ -116,6 +116,29 @@ public class Roles extends JpaBaseDomain implements Serializable { public void setModifiedDate(String modifiedDate) { this.modifiedDate = modifiedDate; } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("Roles [id="); + builder.append(id); + builder.append(", name="); + builder.append(name); + builder.append(", status="); + builder.append(status); + builder.append(", description="); + builder.append(description); + builder.append(", createdBy="); + builder.append(createdBy); + builder.append(", createdDate="); + builder.append(createdDate); + builder.append(", modifiedBy="); + builder.append(modifiedBy); + builder.append(", modifiedDate="); + builder.append(modifiedDate); + builder.append("]"); + return builder.toString(); + } diff --git a/maxkey-core/src/main/java/org/maxkey/domain/Saml20Metadata.java b/maxkey-core/src/main/java/org/maxkey/domain/Saml20Metadata.java index 46e082f96..c19ffbeac 100644 --- a/maxkey-core/src/main/java/org/maxkey/domain/Saml20Metadata.java +++ b/maxkey-core/src/main/java/org/maxkey/domain/Saml20Metadata.java @@ -126,9 +126,27 @@ public class Saml20Metadata extends JpaBaseDomain implements Serializable { @Override public String toString() { - return "Saml20Metadata [orgName=" + orgName + ", orgDisplayName=" + orgDisplayName + ", orgURL=" + orgURL - + ", contactType=" + contactType + ", company=" + company + ", givenName=" + givenName + ", surName=" - + surName + ", emailAddress=" + emailAddress + ", telephoneNumber=" + telephoneNumber + "]"; + StringBuilder builder = new StringBuilder(); + builder.append("Saml20Metadata [orgName="); + builder.append(orgName); + builder.append(", orgDisplayName="); + builder.append(orgDisplayName); + builder.append(", orgURL="); + builder.append(orgURL); + builder.append(", contactType="); + builder.append(contactType); + builder.append(", company="); + builder.append(company); + builder.append(", givenName="); + builder.append(givenName); + builder.append(", surName="); + builder.append(surName); + builder.append(", emailAddress="); + builder.append(emailAddress); + builder.append(", telephoneNumber="); + builder.append(telephoneNumber); + builder.append("]"); + return builder.toString(); } } diff --git a/maxkey-core/src/main/java/org/maxkey/domain/UserInfo.java b/maxkey-core/src/main/java/org/maxkey/domain/UserInfo.java index 8a01a081e..ff1a1f224 100644 --- a/maxkey-core/src/main/java/org/maxkey/domain/UserInfo.java +++ b/maxkey-core/src/main/java/org/maxkey/domain/UserInfo.java @@ -247,6 +247,8 @@ public class UserInfo extends JpaBaseDomain { @Column String description; + + public static class ONLINE { // 在线 public static final int ONLINE = 1; @@ -1145,70 +1147,6 @@ public class UserInfo extends JpaBaseDomain { this.description = description; } - @Override - public String toString() { - return "UserInfo [username=" + username - + ", password=" + password + ", decipherable=" + decipherable - + ", sharedSecret=" + sharedSecret - + ", sharedCounter=" + sharedCounter + ", userType=" + userType - + ", windowsAccount=" + windowsAccount - + ", displayName=" + displayName + ", nickName=" + nickName - + ", nameZHSpell=" + nameZhSpell - + ", nameZHShortSpell=" + nameZhShortSpell - + ", givenName=" + givenName - + ", middleName=" + middleName + ", familyName=" + familyName - + ", honorificPrefix=" + honorificPrefix - + ", honorificSuffix=" + honorificSuffix - + ", formattedName=" + formattedName + ", married=" + married - + ", gender=" + gender + ", birthDate=" + birthDate - + ", pictureFile=" + pictureFile + ", idType=" - + idType + ", idCardNo=" + idCardNo + ", webSite=" + webSite - + ", startWorkDate=" + startWorkDate - + ", authnType=" + authnType + ", email=" + email - + ", emailVerified=" + emailVerified + ", mobile=" - + mobile + ", mobileVerified=" + mobileVerified - + ", passwordQuestion=" + passwordQuestion - + ", passwordAnswer=" + passwordAnswer + ", appLoginAuthnType=" + appLoginAuthnType - + ", appLoginPassword=" + appLoginPassword - + ", protectedApps=" + protectedApps + ", protectedAppsMap=" - + protectedAppsMap + ", passwordLastSetTime=" + passwordLastSetTime - + ", badPasswordCount=" - + badPasswordCount + ", unLockTime=" + unLockTime - + ", isLocked=" + isLocked + ", lastLoginTime=" - + lastLoginTime + ", lastLoginIp=" + lastLoginIp - + ", lastLogoffTime=" + lastLogoffTime - + ", passwordSetType=" + passwordSetType - + ", loginCount=" + loginCount + ", locale=" + locale - + ", timeZone=" + timeZone + ", preferredLanguage=" + preferredLanguage - + ", workCountry=" + workCountry - + ", workRegion=" + workRegion + ", workLocality=" + workLocality - + ", workStreetAddress=" - + workStreetAddress + ", workAddressFormatted=" + workAddressFormatted - + ", workEmail=" + workEmail - + ", workPhoneNumber=" + workPhoneNumber + ", workPostalCode=" + workPostalCode - + ", workFax=" + workFax - + ", homeCountry=" + homeCountry + ", homeRegion=" + homeRegion - + ", homeLocality=" + homeLocality - + ", homeStreetAddress=" + homeStreetAddress - + ", homeAddressFormatted=" + homeAddressFormatted - + ", homeEmail=" + homeEmail - + ", homePhoneNumber=" + homePhoneNumber + ", homePostalCode=" - + homePostalCode + ", homeFax=" + homeFax - + ", employeeNumber=" + employeeNumber + ", costCenter=" - + costCenter + ", organization=" + organization - + ", division=" + division + ", departmentId=" - + departmentId + ", department=" + department - + ", jobTitle=" + jobTitle + ", jobLevel=" + jobLevel - + ", managerId=" + managerId + ", manager=" + manager - + ", assistantId=" + assistantId + ", assistant=" - + assistant + ", entryDate=" + entryDate - + ", quitDate=" + quitDate + ", extraAttribute=" + extraAttribute - + ", extraAttributeName=" + extraAttributeName + ", extraAttributeValue=" - + extraAttributeValue + ", extraAttributeMap=" + extraAttributeMap - + ", online=" + online + ", ldapDn=" - + ldapDn + "]"; - } - /** * @return the createdBy */ @@ -1273,4 +1211,209 @@ public class UserInfo extends JpaBaseDomain { this.theme = theme; } + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("UserInfo [id="); + builder.append(id); + builder.append(", username="); + builder.append(username); + builder.append(", password="); + builder.append(password); + builder.append(", decipherable="); + builder.append(decipherable); + builder.append(", sharedSecret="); + builder.append(sharedSecret); + builder.append(", sharedCounter="); + builder.append(sharedCounter); + builder.append(", userType="); + builder.append(userType); + builder.append(", windowsAccount="); + builder.append(windowsAccount); + builder.append(", displayName="); + builder.append(displayName); + builder.append(", nickName="); + builder.append(nickName); + builder.append(", nameZhSpell="); + builder.append(nameZhSpell); + builder.append(", nameZhShortSpell="); + builder.append(nameZhShortSpell); + builder.append(", givenName="); + builder.append(givenName); + builder.append(", middleName="); + builder.append(middleName); + builder.append(", familyName="); + builder.append(familyName); + builder.append(", honorificPrefix="); + builder.append(honorificPrefix); + builder.append(", honorificSuffix="); + builder.append(honorificSuffix); + builder.append(", formattedName="); + builder.append(formattedName); + builder.append(", married="); + builder.append(married); + builder.append(", gender="); + builder.append(gender); + builder.append(", birthDate="); + builder.append(birthDate); + builder.append(", picture="); + builder.append(picture); + builder.append(", pictureFile="); + builder.append(pictureFile); + builder.append(", idType="); + builder.append(idType); + builder.append(", idCardNo="); + builder.append(idCardNo); + builder.append(", webSite="); + builder.append(webSite); + builder.append(", startWorkDate="); + builder.append(startWorkDate); + builder.append(", authnType="); + builder.append(authnType); + builder.append(", email="); + builder.append(email); + builder.append(", emailVerified="); + builder.append(emailVerified); + builder.append(", mobile="); + builder.append(mobile); + builder.append(", mobileVerified="); + builder.append(mobileVerified); + builder.append(", passwordQuestion="); + builder.append(passwordQuestion); + builder.append(", passwordAnswer="); + builder.append(passwordAnswer); + builder.append(", appLoginAuthnType="); + builder.append(appLoginAuthnType); + builder.append(", appLoginPassword="); + builder.append(appLoginPassword); + builder.append(", protectedApps="); + builder.append(protectedApps); + builder.append(", protectedAppsMap="); + builder.append(protectedAppsMap); + builder.append(", passwordLastSetTime="); + builder.append(passwordLastSetTime); + builder.append(", badPasswordCount="); + builder.append(badPasswordCount); + builder.append(", badPasswordTime="); + builder.append(badPasswordTime); + builder.append(", unLockTime="); + builder.append(unLockTime); + builder.append(", isLocked="); + builder.append(isLocked); + builder.append(", lastLoginTime="); + builder.append(lastLoginTime); + builder.append(", lastLoginIp="); + builder.append(lastLoginIp); + builder.append(", lastLogoffTime="); + builder.append(lastLogoffTime); + builder.append(", passwordSetType="); + builder.append(passwordSetType); + builder.append(", loginCount="); + builder.append(loginCount); + builder.append(", locale="); + builder.append(locale); + builder.append(", timeZone="); + builder.append(timeZone); + builder.append(", preferredLanguage="); + builder.append(preferredLanguage); + builder.append(", workCountry="); + builder.append(workCountry); + builder.append(", workRegion="); + builder.append(workRegion); + builder.append(", workLocality="); + builder.append(workLocality); + builder.append(", workStreetAddress="); + builder.append(workStreetAddress); + builder.append(", workAddressFormatted="); + builder.append(workAddressFormatted); + builder.append(", workEmail="); + builder.append(workEmail); + builder.append(", workPhoneNumber="); + builder.append(workPhoneNumber); + builder.append(", workPostalCode="); + builder.append(workPostalCode); + builder.append(", workFax="); + builder.append(workFax); + builder.append(", homeCountry="); + builder.append(homeCountry); + builder.append(", homeRegion="); + builder.append(homeRegion); + builder.append(", homeLocality="); + builder.append(homeLocality); + builder.append(", homeStreetAddress="); + builder.append(homeStreetAddress); + builder.append(", homeAddressFormatted="); + builder.append(homeAddressFormatted); + builder.append(", homeEmail="); + builder.append(homeEmail); + builder.append(", homePhoneNumber="); + builder.append(homePhoneNumber); + builder.append(", homePostalCode="); + builder.append(homePostalCode); + builder.append(", homeFax="); + builder.append(homeFax); + builder.append(", employeeNumber="); + builder.append(employeeNumber); + builder.append(", costCenter="); + builder.append(costCenter); + builder.append(", organization="); + builder.append(organization); + builder.append(", division="); + builder.append(division); + builder.append(", departmentId="); + builder.append(departmentId); + builder.append(", department="); + builder.append(department); + builder.append(", jobTitle="); + builder.append(jobTitle); + builder.append(", jobLevel="); + builder.append(jobLevel); + builder.append(", managerId="); + builder.append(managerId); + builder.append(", manager="); + builder.append(manager); + builder.append(", assistantId="); + builder.append(assistantId); + builder.append(", assistant="); + builder.append(assistant); + builder.append(", entryDate="); + builder.append(entryDate); + builder.append(", quitDate="); + builder.append(quitDate); + builder.append(", defineIm="); + builder.append(defineIm); + builder.append(", weixinFollow="); + builder.append(weixinFollow); + builder.append(", theme="); + builder.append(theme); + builder.append(", extraAttribute="); + builder.append(extraAttribute); + builder.append(", extraAttributeName="); + builder.append(extraAttributeName); + builder.append(", extraAttributeValue="); + builder.append(extraAttributeValue); + builder.append(", extraAttributeMap="); + builder.append(extraAttributeMap); + builder.append(", online="); + builder.append(online); + builder.append(", ldapDn="); + builder.append(ldapDn); + builder.append(", gridList="); + builder.append(gridList); + builder.append(", createdBy="); + builder.append(createdBy); + builder.append(", createdDate="); + builder.append(createdDate); + builder.append(", modifiedBy="); + builder.append(modifiedBy); + builder.append(", modifiedDate="); + builder.append(modifiedDate); + builder.append(", status="); + builder.append(status); + builder.append(", description="); + builder.append(description); + builder.append("]"); + return builder.toString(); + } + } diff --git a/maxkey-core/src/main/java/org/maxkey/domain/apps/Apps.java b/maxkey-core/src/main/java/org/maxkey/domain/apps/Apps.java index 901047520..cc6a89552 100644 --- a/maxkey-core/src/main/java/org/maxkey/domain/apps/Apps.java +++ b/maxkey-core/src/main/java/org/maxkey/domain/apps/Apps.java @@ -18,7 +18,6 @@ package org.maxkey.domain.apps; import java.io.Serializable; -import java.util.Arrays; import javax.persistence.Column; import javax.persistence.GeneratedValue; @@ -81,6 +80,10 @@ public class Apps extends JpaBaseDomain implements Serializable { private MultipartFile iconFile; @Column private int visible; + + + //引导方式 IDP OR SP,default is IDP + private String inducer; /* * vendor */ @@ -106,7 +109,10 @@ public class Apps extends JpaBaseDomain implements Serializable { private String principal; @Column private String credentials; - + @Column + private String logoutUrl; + @Column + private int logoutType; /* * extendAttr */ @@ -143,7 +149,12 @@ public class Apps extends JpaBaseDomain implements Serializable { protected String modifiedDate; @Column protected String description; + + + protected String loginDateTime; + protected String onlineTicket; + public Apps() { super(); isSignature = Boolean.FALSE; @@ -505,15 +516,118 @@ public class Apps extends JpaBaseDomain implements Serializable { public void setStatus(int status) { this.status = status; } + + public String getInducer() { + return inducer; + } + + public void setInducer(String inducer) { + this.inducer = inducer; + } + + + public String getLogoutUrl() { + return logoutUrl; + } + + public void setLogoutUrl(String logoutUrl) { + this.logoutUrl = logoutUrl; + } + + public int getLogoutType() { + return logoutType; + } + + public void setLogoutType(int logoutType) { + this.logoutType = logoutType; + } + + + public String getLoginDateTime() { + return loginDateTime; + } + + public void setLoginDateTime(String loginDateTime) { + this.loginDateTime = loginDateTime; + } + + public String getOnlineTicket() { + return onlineTicket; + } + + public void setOnlineTicket(String onlineTicket) { + this.onlineTicket = onlineTicket; + } @Override public String toString() { - return "Applications [name=" + name + ", loginUrl=" + loginUrl + ", category=" + category + ", protocol=" - + protocol + ", secret=" + secret + ", icon=" + Arrays.toString(icon) + ", iconFile=" + iconFile - + ", visible=" + visible + ", vendor=" + vendor + ", vendorUrl=" + vendorUrl + ", credential=" - + credential + ", sharedUsername=" + sharedUsername + ", sharedPassword=" + sharedPassword - + ", systemUserAttr=" + systemUserAttr + ", isExtendAttr=" + isExtendAttr + ", extendAttr=" + extendAttr - + ", isSignature=" + isSignature + "]"; + StringBuilder builder = new StringBuilder(); + builder.append("Apps [id="); + builder.append(id); + builder.append(", name="); + builder.append(name); + builder.append(", loginUrl="); + builder.append(loginUrl); + builder.append(", category="); + builder.append(category); + builder.append(", protocol="); + builder.append(protocol); + builder.append(", secret="); + builder.append(secret); + builder.append(", visible="); + builder.append(visible); + builder.append(", inducer="); + builder.append(inducer); + builder.append(", vendor="); + builder.append(vendor); + builder.append(", vendorUrl="); + builder.append(vendorUrl); + builder.append(", credential="); + builder.append(credential); + builder.append(", sharedUsername="); + builder.append(sharedUsername); + builder.append(", sharedPassword="); + builder.append(sharedPassword); + builder.append(", systemUserAttr="); + builder.append(systemUserAttr); + builder.append(", principal="); + builder.append(principal); + builder.append(", credentials="); + builder.append(credentials); + builder.append(", logoutUrl="); + builder.append(logoutUrl); + builder.append(", logoutType="); + builder.append(logoutType); + builder.append(", isExtendAttr="); + builder.append(isExtendAttr); + builder.append(", extendAttr="); + builder.append(extendAttr); + builder.append(", userPropertys="); + builder.append(userPropertys); + builder.append(", isSignature="); + builder.append(isSignature); + builder.append(", isAdapter="); + builder.append(isAdapter); + builder.append(", adapter="); + builder.append(adapter); + builder.append(", appUser="); + builder.append(appUser); + builder.append(", sortIndex="); + builder.append(sortIndex); + builder.append(", status="); + builder.append(status); + builder.append(", createdBy="); + builder.append(createdBy); + builder.append(", createdDate="); + builder.append(createdDate); + builder.append(", modifiedBy="); + builder.append(modifiedBy); + builder.append(", modifiedDate="); + builder.append(modifiedDate); + builder.append(", description="); + builder.append(description); + builder.append("]"); + return builder.toString(); } } diff --git a/maxkey-core/src/main/java/org/maxkey/domain/apps/AppsCasDetails.java b/maxkey-core/src/main/java/org/maxkey/domain/apps/AppsCasDetails.java index bf2ba4abb..7b143ac9f 100644 --- a/maxkey-core/src/main/java/org/maxkey/domain/apps/AppsCasDetails.java +++ b/maxkey-core/src/main/java/org/maxkey/domain/apps/AppsCasDetails.java @@ -61,7 +61,17 @@ public class AppsCasDetails extends Apps { this.callbackUrl = callbackUrl; } - - + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("AppsCasDetails [id="); + builder.append(id); + builder.append(", service="); + builder.append(service); + builder.append(", callbackUrl="); + builder.append(callbackUrl); + builder.append("]"); + return builder.toString(); + } } diff --git a/maxkey-core/src/main/java/org/maxkey/domain/apps/AppsDesktopDetails.java b/maxkey-core/src/main/java/org/maxkey/domain/apps/AppsDesktopDetails.java index 68f006adb..ac7dd5ff6 100644 --- a/maxkey-core/src/main/java/org/maxkey/domain/apps/AppsDesktopDetails.java +++ b/maxkey-core/src/main/java/org/maxkey/domain/apps/AppsDesktopDetails.java @@ -294,19 +294,35 @@ public class AppsDesktopDetails extends Apps { - /* (non-Javadoc) - * @see java.lang.Object#toString() - */ @Override - public String toString() { - return "DesktopDetails [programPath=" + programPath + ", parameter=" - + parameter + ", preUsername=" + preUsername - + ", usernameType=" + usernameType + ", usernameParameter=" - + usernameParameter + ", prePassword=" + prePassword - + ", passwordType=" + passwordType + ", passwordParameter=" - + passwordParameter + ", preSubmit=" + preSubmit - + ", submitType=" + submitType + ", submitKey=" + submitKey - + "]"; - } + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("AppsDesktopDetails [programPath="); + builder.append(programPath); + builder.append(", parameter="); + builder.append(parameter); + builder.append(", preUsername="); + builder.append(preUsername); + builder.append(", usernameType="); + builder.append(usernameType); + builder.append(", usernameParameter="); + builder.append(usernameParameter); + builder.append(", prePassword="); + builder.append(prePassword); + builder.append(", passwordType="); + builder.append(passwordType); + builder.append(", passwordParameter="); + builder.append(passwordParameter); + builder.append(", preSubmit="); + builder.append(preSubmit); + builder.append(", submitType="); + builder.append(submitType); + builder.append(", submitKey="); + builder.append(submitKey); + builder.append(", appUser="); + builder.append(appUser); + builder.append("]"); + return builder.toString(); + } } diff --git a/maxkey-core/src/main/java/org/maxkey/domain/apps/AppsFormBasedDetails.java b/maxkey-core/src/main/java/org/maxkey/domain/apps/AppsFormBasedDetails.java index a7e3eb548..a9393eb07 100644 --- a/maxkey-core/src/main/java/org/maxkey/domain/apps/AppsFormBasedDetails.java +++ b/maxkey-core/src/main/java/org/maxkey/domain/apps/AppsFormBasedDetails.java @@ -122,10 +122,20 @@ public class AppsFormBasedDetails extends Apps { @Override - public String toString() { - return "FormBasedDetails [redirectUri=" + redirectUri - + ", usernameMapping=" + usernameMapping + ", passwordMapping=" - + passwordMapping + ", authorizeView=" + authorizeView + "]"; - } + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("AppsFormBasedDetails [id="); + builder.append(id); + builder.append(", redirectUri="); + builder.append(redirectUri); + builder.append(", usernameMapping="); + builder.append(usernameMapping); + builder.append(", passwordMapping="); + builder.append(passwordMapping); + builder.append(", authorizeView="); + builder.append(authorizeView); + builder.append("]"); + return builder.toString(); + } } diff --git a/maxkey-core/src/main/java/org/maxkey/domain/apps/AppsOAuth20Details.java b/maxkey-core/src/main/java/org/maxkey/domain/apps/AppsOAuth20Details.java index d41541ff9..4c9a02058 100644 --- a/maxkey-core/src/main/java/org/maxkey/domain/apps/AppsOAuth20Details.java +++ b/maxkey-core/src/main/java/org/maxkey/domain/apps/AppsOAuth20Details.java @@ -328,18 +328,45 @@ public class AppsOAuth20Details extends Apps { return baseClientDetails; } - /* - * (non-Javadoc) - * - * @see java.lang.Object#toString() - */ @Override public String toString() { - return "OAuth20Details [clientId=" + clientId + ", clientSecret=" + clientSecret + ", scope=" + scope - + ", resourceIds=" + resourceIds + ", authorizedGrantTypes=" + authorizedGrantTypes - + ", registeredRedirectUris=" + registeredRedirectUris + ", authorities=" + authorities - + ", accessTokenValiditySeconds=" + accessTokenValiditySeconds + ", refreshTokenValiditySeconds=" - + refreshTokenValiditySeconds + "]"; + StringBuilder builder = new StringBuilder(); + builder.append("AppsOAuth20Details [clientId="); + builder.append(clientId); + builder.append(", clientSecret="); + builder.append(clientSecret); + builder.append(", scope="); + builder.append(scope); + builder.append(", resourceIds="); + builder.append(resourceIds); + builder.append(", authorizedGrantTypes="); + builder.append(authorizedGrantTypes); + builder.append(", registeredRedirectUris="); + builder.append(registeredRedirectUris); + builder.append(", authorities="); + builder.append(authorities); + builder.append(", accessTokenValiditySeconds="); + builder.append(accessTokenValiditySeconds); + builder.append(", refreshTokenValiditySeconds="); + builder.append(refreshTokenValiditySeconds); + builder.append(", approvalPrompt="); + builder.append(approvalPrompt); + builder.append(", idTokenSigningAlgorithm="); + builder.append(idTokenSigningAlgorithm); + builder.append(", idTokenEncryptedAlgorithm="); + builder.append(idTokenEncryptedAlgorithm); + builder.append(", idTokenEncryptionMethod="); + builder.append(idTokenEncryptionMethod); + builder.append(", userInfoSigningAlgorithm="); + builder.append(userInfoSigningAlgorithm); + builder.append(", userInfoEncryptedAlgorithm="); + builder.append(userInfoEncryptedAlgorithm); + builder.append(", userInfoEncryptionMethod="); + builder.append(userInfoEncryptionMethod); + builder.append(", jwksUri="); + builder.append(jwksUri); + builder.append("]"); + return builder.toString(); } } diff --git a/maxkey-core/src/main/java/org/maxkey/domain/apps/AppsSAML20Details.java b/maxkey-core/src/main/java/org/maxkey/domain/apps/AppsSAML20Details.java index b9a9dd4cf..7a5d29504 100644 --- a/maxkey-core/src/main/java/org/maxkey/domain/apps/AppsSAML20Details.java +++ b/maxkey-core/src/main/java/org/maxkey/domain/apps/AppsSAML20Details.java @@ -17,8 +17,6 @@ package org.maxkey.domain.apps; -import java.util.Arrays; - import javax.persistence.Column; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; @@ -93,6 +91,9 @@ public class AppsSAML20Details extends Apps { */ @Column private int nameIdConvert; + + @Column + private String nameIdSuffix; public static final class BindingType { public static final String Redirect_Post = "Redirect-Post"; @@ -326,18 +327,54 @@ public class AppsSAML20Details extends Apps { public void setDigestMethod(String digestMethod) { this.digestMethod = digestMethod; } + + public String getNameIdSuffix() { + return nameIdSuffix; + } + + public void setNameIdSuffix(String nameIdSuffix) { + this.nameIdSuffix = nameIdSuffix; + } @Override public String toString() { - final int maxLen = 40; - return "AppsSAML20Details [id=" + id + ", certIssuer=" + certIssuer + ", certSubject=" + certSubject - + ", certExpiration=" + certExpiration + ", signature=" + signature + ", keyStore=" - + (keyStore != null ? Arrays.toString(Arrays.copyOf(keyStore, Math.min(keyStore.length, maxLen))) - : null) - + ", entityId=" + entityId + ", spAcsUrl=" + spAcsUrl + ", issuer=" + issuer + ", audience=" + audience - + ", nameidFormat=" + nameidFormat + ", validityInterval=" + validityInterval + ", binding=" + binding - + ", encrypted=" + encrypted + ", certMetaFile=" + certMetaFile + ", fileType=" + fileType - + ", nameIdConvert=" + nameIdConvert + "]"; + StringBuilder builder = new StringBuilder(); + builder.append("AppsSAML20Details [id="); + builder.append(id); + builder.append(", certIssuer="); + builder.append(certIssuer); + builder.append(", certSubject="); + builder.append(certSubject); + builder.append(", certExpiration="); + builder.append(certExpiration); + builder.append(", signature="); + builder.append(signature); + builder.append(", digestMethod="); + builder.append(digestMethod); + builder.append(", entityId="); + builder.append(entityId); + builder.append(", spAcsUrl="); + builder.append(spAcsUrl); + builder.append(", issuer="); + builder.append(issuer); + builder.append(", audience="); + builder.append(audience); + builder.append(", nameidFormat="); + builder.append(nameidFormat); + builder.append(", validityInterval="); + builder.append(validityInterval); + builder.append(", binding="); + builder.append(binding); + builder.append(", encrypted="); + builder.append(encrypted); + builder.append(", fileType="); + builder.append(fileType); + builder.append(", nameIdConvert="); + builder.append(nameIdConvert); + builder.append(", nameIdSuffix="); + builder.append(nameIdSuffix); + builder.append("]"); + return builder.toString(); } diff --git a/maxkey-core/src/main/java/org/maxkey/domain/apps/AppsTokenBasedDetails.java b/maxkey-core/src/main/java/org/maxkey/domain/apps/AppsTokenBasedDetails.java index 5ba7943dc..0cd2faeab 100644 --- a/maxkey-core/src/main/java/org/maxkey/domain/apps/AppsTokenBasedDetails.java +++ b/maxkey-core/src/main/java/org/maxkey/domain/apps/AppsTokenBasedDetails.java @@ -137,9 +137,23 @@ public class AppsTokenBasedDetails extends Apps { @Override public String toString() { - return "AppsTokenBasedDetails [id=" + id + ", redirectUri=" + redirectUri + ", tokenType=" + tokenType - + ", cookieName=" + cookieName + ", algorithm=" + algorithm + ", algorithmKey=" + algorithmKey - + ", expires=" + expires + "]"; + StringBuilder builder = new StringBuilder(); + builder.append("AppsTokenBasedDetails [id="); + builder.append(id); + builder.append(", redirectUri="); + builder.append(redirectUri); + builder.append(", tokenType="); + builder.append(tokenType); + builder.append(", cookieName="); + builder.append(cookieName); + builder.append(", algorithm="); + builder.append(algorithm); + builder.append(", algorithmKey="); + builder.append(algorithmKey); + builder.append(", expires="); + builder.append(expires); + builder.append("]"); + return builder.toString(); } } diff --git a/maxkey-core/src/main/java/org/maxkey/domain/apps/UserApps.java b/maxkey-core/src/main/java/org/maxkey/domain/apps/UserApps.java index c9d7fe728..db6a0bc39 100644 --- a/maxkey-core/src/main/java/org/maxkey/domain/apps/UserApps.java +++ b/maxkey-core/src/main/java/org/maxkey/domain/apps/UserApps.java @@ -61,8 +61,15 @@ public class UserApps extends Apps { @Override public String toString() { - return "UserApplications [username=" + username - + ", userId=" + userId + ", displayName=" + displayName + "]"; + StringBuilder builder = new StringBuilder(); + builder.append("UserApps [username="); + builder.append(username); + builder.append(", userId="); + builder.append(userId); + builder.append(", displayName="); + builder.append(displayName); + builder.append("]"); + return builder.toString(); } } diff --git a/maxkey-core/src/main/java/org/maxkey/domain/apps/oauth2/provider/client/BaseClientDetails.java b/maxkey-core/src/main/java/org/maxkey/domain/apps/oauth2/provider/client/BaseClientDetails.java index 57cbb4864..cbe7328a7 100644 --- a/maxkey-core/src/main/java/org/maxkey/domain/apps/oauth2/provider/client/BaseClientDetails.java +++ b/maxkey-core/src/main/java/org/maxkey/domain/apps/oauth2/provider/client/BaseClientDetails.java @@ -461,16 +461,48 @@ public class BaseClientDetails implements ClientDetails { } @Override - public String toString() { - return "BaseClientDetails [clientId=" + clientId + ", clientSecret=" - + clientSecret + ", scope=" + scope + ", resourceIds=" - + resourceIds + ", authorizedGrantTypes=" - + authorizedGrantTypes + ", registeredRedirectUris=" - + registeredRedirectUris + ", authorities=" + authorities - + ", accessTokenValiditySeconds=" + accessTokenValiditySeconds - + ", refreshTokenValiditySeconds=" - + refreshTokenValiditySeconds + ", additionalInformation=" - + additionalInformation + "]"; - } + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("BaseClientDetails [clientId="); + builder.append(clientId); + builder.append(", clientSecret="); + builder.append(clientSecret); + builder.append(", scope="); + builder.append(scope); + builder.append(", resourceIds="); + builder.append(resourceIds); + builder.append(", authorizedGrantTypes="); + builder.append(authorizedGrantTypes); + builder.append(", registeredRedirectUris="); + builder.append(registeredRedirectUris); + builder.append(", autoApproveScopes="); + builder.append(autoApproveScopes); + builder.append(", authorities="); + builder.append(authorities); + builder.append(", accessTokenValiditySeconds="); + builder.append(accessTokenValiditySeconds); + builder.append(", refreshTokenValiditySeconds="); + builder.append(refreshTokenValiditySeconds); + builder.append(", additionalInformation="); + builder.append(additionalInformation); + builder.append(", idTokenSigningAlgorithm="); + builder.append(idTokenSigningAlgorithm); + builder.append(", idTokenEncryptedAlgorithm="); + builder.append(idTokenEncryptedAlgorithm); + builder.append(", idTokenEncryptionMethod="); + builder.append(idTokenEncryptionMethod); + builder.append(", userInfoSigningAlgorithm="); + builder.append(userInfoSigningAlgorithm); + builder.append(", userInfoEncryptedAlgorithm="); + builder.append(userInfoEncryptedAlgorithm); + builder.append(", userInfoEncryptionMethod="); + builder.append(userInfoEncryptionMethod); + builder.append(", jwksUri="); + builder.append(jwksUri); + builder.append(", approvalPrompt="); + builder.append(approvalPrompt); + builder.append("]"); + return builder.toString(); + } } diff --git a/maxkey-core/src/main/java/org/maxkey/persistence/db/LoginService.java b/maxkey-core/src/main/java/org/maxkey/persistence/db/LoginService.java index 2ae578a24..96524c9a6 100644 --- a/maxkey-core/src/main/java/org/maxkey/persistence/db/LoginService.java +++ b/maxkey-core/src/main/java/org/maxkey/persistence/db/LoginService.java @@ -56,6 +56,8 @@ public class LoginService { private static final String DEFAULT_USERINFO_SELECT_STATEMENT = "SELECT * FROM MXK_USERINFO WHERE USERNAME = ?"; + private static final String DEFAULT_MYAPPS_SELECT_STATEMENT = "SELECT DISTINCT APP.ID,APP.NAME FROM MXK_APPS APP,MXK_GROUP_PRIVILEGES GP,MXK_GROUPS G WHERE APP.ID=GP.APPID AND GP.GROUPID=G.ID AND G.ID IN(%s)"; + protected JdbcTemplate jdbcTemplate; public LoginService(){ @@ -151,6 +153,24 @@ public class LoginService { } } + public ArrayList queryAuthorizedApps(ArrayList grantedAuthoritys) { + String grantedAuthorityString="'ROLE_ALL_USER'"; + for(GrantedAuthority grantedAuthority : grantedAuthoritys) { + grantedAuthorityString += ",'"+ grantedAuthority.getAuthority()+"'"; + } + + ArrayList listAuthorizedApps = (ArrayList) jdbcTemplate.query( + String.format(DEFAULT_MYAPPS_SELECT_STATEMENT, grantedAuthorityString), + new RowMapper() { + public GrantedAuthority mapRow(ResultSet rs, int rowNum) throws SQLException { + return new SimpleGrantedAuthority(rs.getString("ID")); + } + }); + + _logger.debug("list Authorized Apps " + listAuthorizedApps); + return listAuthorizedApps; + } + public List queryGroups(UserInfo userInfo) { List listGroups = jdbcTemplate.query(GROUPS_SELECT_STATEMENT, new RowMapper() { public Groups mapRow(ResultSet rs, int rowNum) throws SQLException { @@ -174,9 +194,11 @@ public class LoginService { // query roles for user List listGroups = queryGroups(userInfo); - // set role for spring security + //set default roles ArrayList grantedAuthority = new ArrayList(); grantedAuthority.add(new SimpleGrantedAuthority("ROLE_USER")); + grantedAuthority.add(new SimpleGrantedAuthority("ROLE_ORDINARY_USER")); + grantedAuthority.add(new SimpleGrantedAuthority("ROLE_ALL_USER")); for (Groups group : listGroups) { grantedAuthority.add(new SimpleGrantedAuthority(group.getId())); } diff --git a/maxkey-core/src/main/java/org/maxkey/util/StringUtils.java b/maxkey-core/src/main/java/org/maxkey/util/StringUtils.java index a5ec40304..24fbbbc9a 100644 --- a/maxkey-core/src/main/java/org/maxkey/util/StringUtils.java +++ b/maxkey-core/src/main/java/org/maxkey/util/StringUtils.java @@ -24,6 +24,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.regex.Matcher; import java.util.regex.Pattern; public final class StringUtils { @@ -479,4 +480,42 @@ public final class StringUtils { } return null; } + + /** + * 验证是否为正确的邮箱号 + * + * @param email + * @return + */ + public static boolean isValidEmail(String email) { + // 1、\\w+表示@之前至少要输入一个匹配字母或数字或下划线 \\w 单词字符:[a-zA-Z_0-9] + // 2、(\\w+\\.)表示域名. 如新浪邮箱域名是sina.com.cn + // {1,3}表示可以出现一次或两次或者三次. + String reg = "\\w+@(\\w+\\.){1,3}\\w+"; + Pattern pattern = Pattern.compile(reg); + boolean flag = false; + if (email != null) { + Matcher matcher = pattern.matcher(email); + flag = matcher.matches(); + } + return flag; + } + /** + * 验证是否为手机号 + * + * @param mobileNo + * @return + */ + public static boolean isValidMobileNo(String mobileNo) { + // 1、(13[0-9])|(15[02789])|(18[679])|(17[0-9]) 13段 或者15段 18段17段的匹配 + // 2、\\d{8} 整数出现8次 + boolean flag = false; + Pattern p = Pattern.compile("^((13[0-9])|(14[0-9])|(15[0-9])|(16[0-9])|(17[0-9])|(18[0-9])|(19[0-9]))\\d{8}$"); + Matcher match = p.matcher(mobileNo); + if (mobileNo != null) { + flag = match.matches(); + } + return flag; + } + } diff --git a/maxkey-core/src/main/java/org/maxkey/web/InitializeContext.java b/maxkey-core/src/main/java/org/maxkey/web/InitializeContext.java index 1fdadb13f..7b6bd45a4 100644 --- a/maxkey-core/src/main/java/org/maxkey/web/InitializeContext.java +++ b/maxkey-core/src/main/java/org/maxkey/web/InitializeContext.java @@ -36,6 +36,7 @@ import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.context.support.WebApplicationContextUtils; /** @@ -57,7 +58,10 @@ public class InitializeContext extends HttpServlet { @Override public void init(ServletConfig config) throws ServletException { super.init(config); - + + _logger.info("SecurityContextHolder StrategyName " + SessionSecurityContextHolderStrategy.class.getCanonicalName()); + SecurityContextHolder.setStrategyName(SessionSecurityContextHolderStrategy.class.getCanonicalName()); + // List Environment Variables listEnvVars(); diff --git a/maxkey-core/src/main/java/org/maxkey/web/SessionSecurityContextHolderStrategy.java b/maxkey-core/src/main/java/org/maxkey/web/SessionSecurityContextHolderStrategy.java new file mode 100644 index 000000000..6fe41ecc9 --- /dev/null +++ b/maxkey-core/src/main/java/org/maxkey/web/SessionSecurityContextHolderStrategy.java @@ -0,0 +1,51 @@ +package org.maxkey.web; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolderStrategy; +import org.springframework.security.core.context.SecurityContextImpl; + +/** + * SecurityContext Session for Request , use SecurityContextHolderAwareRequestFilter + * @author Crystal.Sea + * + */ +public class SessionSecurityContextHolderStrategy implements SecurityContextHolderStrategy { + private static final Logger _logger = + LoggerFactory.getLogger(SessionSecurityContextHolderStrategy.class); + + @Override + public void clearContext() { + WebContext.removeAttribute(WebConstants.AUTHENTICATION); + } + + @Override + public SecurityContext getContext() { + SecurityContext ctx = createEmptyContext(); + Authentication authentication = null; + try { + authentication = (Authentication)WebContext.getAuthentication(); + if (authentication != null) { + ctx.setAuthentication(authentication); + } + }catch(Exception e) { + _logger.trace("a session ", e); + } + + + return ctx; + } + + @Override + public void setContext(SecurityContext context) { + WebContext.setAuthentication(context.getAuthentication()); + } + + @Override + public SecurityContext createEmptyContext() { + return new SecurityContextImpl(); + } + +} diff --git a/maxkey-core/src/main/java/org/maxkey/web/WebConstants.java b/maxkey-core/src/main/java/org/maxkey/web/WebConstants.java index 495066dd7..77cbe038d 100644 --- a/maxkey-core/src/main/java/org/maxkey/web/WebConstants.java +++ b/maxkey-core/src/main/java/org/maxkey/web/WebConstants.java @@ -71,8 +71,12 @@ public class WebConstants { public static final String AUTHENTICATION = "current_authentication"; - public static final String THEME_COOKIE_NAME = "maxkey_theme"; + public static final String THEME_COOKIE_NAME = "theme_value"; public static final String LOGIN_ERROR_SESSION_MESSAGE = "login_error_session_message_key"; + + public static final String ONLINE_TICKET_NAME = "online_ticket"; + + public static final String ONLINE_TICKET_PREFIX = "OT"; } diff --git a/maxkey-core/src/main/java/org/maxkey/web/WebContext.java b/maxkey-core/src/main/java/org/maxkey/web/WebContext.java index 394ff9db4..6886e57c0 100644 --- a/maxkey-core/src/main/java/org/maxkey/web/WebContext.java +++ b/maxkey-core/src/main/java/org/maxkey/web/WebContext.java @@ -154,6 +154,11 @@ public final class WebContext { return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); } + + public static HttpServletResponse getResponse() { + return ((ServletRequestAttributes) + RequestContextHolder.getRequestAttributes()).getResponse(); + } /** * get Http Context full Path. @@ -336,11 +341,14 @@ public final class WebContext { * @param time cookie的存在时间 */ public static HttpServletResponse setCookie( - HttpServletResponse response, String name, String value, int time) { + HttpServletResponse response, String domain ,String name, String value, int time) { // new一个Cookie对象,键值对为参数 Cookie cookie = new Cookie(name, value); // tomcat下多应用共享 cookie.setPath("/"); + if(domain != null) { + cookie.setDomain(domain); + } // 如果cookie的值中含有中文时,需要对cookie进行编码,不然会产生乱码 try { URLEncoder.encode(value, "utf-8"); @@ -348,7 +356,9 @@ public final class WebContext { e.printStackTrace(); } // 单位:秒 - cookie.setMaxAge(time); + if(time > 0) { + cookie.setMaxAge(time); + } // 将Cookie添加到Response中,使之生效 response.addCookie(cookie); // addCookie后,如果已经存在相同名字的cookie,则最新的覆盖旧的cookie return response; diff --git a/maxkey-core/src/main/java/org/maxkey/web/tag/ThemeTagDirective.java b/maxkey-core/src/main/java/org/maxkey/web/tag/ThemeTagDirective.java index ed943e211..a0c6a752f 100644 --- a/maxkey-core/src/main/java/org/maxkey/web/tag/ThemeTagDirective.java +++ b/maxkey-core/src/main/java/org/maxkey/web/tag/ThemeTagDirective.java @@ -76,7 +76,7 @@ public class ThemeTagDirective implements TemplateDirectiveModel { if (request.getAttribute(WebConstants.THEME_COOKIE_NAME) == null && null != WebContext.getUserInfo()) { request.setAttribute(WebConstants.THEME_COOKIE_NAME, "theme"); - WebContext.setCookie(response, + WebContext.setCookie(response, null, WebConstants.THEME_COOKIE_NAME, theme, ConstantsTimeInterval.ONE_WEEK); } diff --git a/maxkey-core/src/main/resources/messages/passwordpolicy_message.properties b/maxkey-core/src/main/resources/messages/passwordpolicy_message.properties index be4272ec4..9f3daca11 100644 --- a/maxkey-core/src/main/resources/messages/passwordpolicy_message.properties +++ b/maxkey-core/src/main/resources/messages/passwordpolicy_message.properties @@ -32,6 +32,7 @@ PasswordPolicy.OLD_PASSWORD_NOT_MATCH=\u539f\u5bc6\u7801\u4e0d\u5339\u914d. PasswordPolicy.CONFIRMPASSWORD_NOT_MATCH=\u65b0\u5bc6\u7801\u4e0e\u786e\u8ba4\u5bc6\u7801\u4e0d\u4e00\u81f4. PasswordPolicy.OLD_PASSWORD_MATCH=\u65b0\u5bc6\u7801\u4e0d\u80fd\u4e0e\u65e7\u5bc6\u7801\u4e00\u81f4. +#\u7528\u6237\u767b\u5f55\u9519\u8bef\u63d0\u9192 login.error.attempts={0}\u5c1d\u8bd5\u767b\u9646{1}\u6b21\u6570\u8fbe\u5230\u6700\u5927\u9650\u5236\uff0c\u8bf7\u7a0d\u540e\u518d\u767b\u9646. login.error.locked=\u7528\u6237\u88ab\u9501\u5b9a. login.error.inactive=\u7528\u6237\u975e\u6d3b\u52a8\u72b6\u6001. @@ -43,4 +44,5 @@ login.error.password.null=\u5bc6\u7801\u4e0d\u80fd\u4e3a\u7a7a. login.error.captcha=\u9a8c\u8bc1\u7801\u9519\u8bef\uff0c\u8bf7\u91cd\u65b0\u767b\u9646. login.error.authtype=\u767b\u5f55\u8ba4\u8bc1\u7c7b\u578b\u9519\u8bef. login.error.session=\u767b\u5f55\u4f1a\u8bdd\u5931\u6548\uff0c\u8bf7\u91cd\u65b0\u767b\u9646. +login.error.social=\u793e\u4ea4\u8d26\u53f7\u6388\u6743\u5931\u8d25\uff0c\u8bf7\u91cd\u8bd5. diff --git a/maxkey-core/src/main/resources/messages/passwordpolicy_message_en.properties b/maxkey-core/src/main/resources/messages/passwordpolicy_message_en.properties index dc1302c30..38c502ff5 100644 --- a/maxkey-core/src/main/resources/messages/passwordpolicy_message_en.properties +++ b/maxkey-core/src/main/resources/messages/passwordpolicy_message_en.properties @@ -32,6 +32,7 @@ PasswordPolicy.OLD_PASSWORD_NOT_MATCH=old password not match. PasswordPolicy.CONFIRMPASSWORD_NOT_MATCH=new password not match confirm password. PasswordPolicy.OLD_PASSWORD_MATCH=new password match old password. +#for user login login.error.attempts={0} login attempts the maximum number of {1} times, please login later. login.error.locked=The user is locked. login.error.inactive=User inactive state. @@ -42,4 +43,5 @@ login.error.email.null=email cannot be empty. login.error.password.null=Password cannot be empty. login.error.captcha=Verification code error, please login again. login.error.authtype=Login authentication type error. -login.error.session=Login session failed. Please login again. \ No newline at end of file +login.error.session=Login session failed. please login again. +login.error.social=Social login failed. please retry. \ No newline at end of file diff --git a/maxkey-core/src/main/resources/messages/passwordpolicy_message_zh_CN.properties b/maxkey-core/src/main/resources/messages/passwordpolicy_message_zh_CN.properties index 60025dbab..6d6034069 100644 --- a/maxkey-core/src/main/resources/messages/passwordpolicy_message_zh_CN.properties +++ b/maxkey-core/src/main/resources/messages/passwordpolicy_message_zh_CN.properties @@ -32,6 +32,7 @@ PasswordPolicy.OLD_PASSWORD_NOT_MATCH=\u539f\u5bc6\u7801\u4e0d\u5339\u914d. PasswordPolicy.CONFIRMPASSWORD_NOT_MATCH=\u65b0\u5bc6\u7801\u4e0e\u786e\u8ba4\u5bc6\u7801\u4e0d\u4e00\u81f4. PasswordPolicy.OLD_PASSWORD_MATCH=\u65b0\u5bc6\u7801\u4e0d\u80fd\u4e0e\u65e7\u5bc6\u7801\u4e00\u81f4. +#\u7528\u6237\u767b\u5f55\u9519\u8bef\u63d0\u9192 login.error.attempts={0}\u5c1d\u8bd5\u767b\u9646{1}\u6b21\u6570\u8fbe\u5230\u6700\u5927\u9650\u5236\uff0c\u8bf7\u7a0d\u540e\u518d\u767b\u9646. login.error.locked=\u7528\u6237\u88ab\u9501\u5b9a. login.error.inactive=\u7528\u6237\u975e\u6d3b\u52a8\u72b6\u6001. @@ -42,4 +43,5 @@ login.error.email.null=\u767b\u5f55\u90ae\u7bb1\u4e0d\u80fd\u4e3a\u7a7a. login.error.password.null=\u5bc6\u7801\u4e0d\u80fd\u4e3a\u7a7a. login.error.captcha=\u9a8c\u8bc1\u7801\u9519\u8bef\uff0c\u8bf7\u91cd\u65b0\u767b\u9646. login.error.authtype=\u767b\u5f55\u8ba4\u8bc1\u7c7b\u578b\u9519\u8bef. -login.error.session=\u767b\u5f55\u4f1a\u8bdd\u5931\u6548\uff0c\u8bf7\u91cd\u65b0\u767b\u9646. \ No newline at end of file +login.error.session=\u767b\u5f55\u4f1a\u8bdd\u5931\u6548\uff0c\u8bf7\u91cd\u65b0\u767b\u9646. +login.error.social=\u793e\u4ea4\u8d26\u53f7\u6388\u6743\u5931\u8d25\uff0c\u8bf7\u91cd\u8bd5. \ No newline at end of file diff --git a/maxkey-persistence/src/main/java/org/maxkey/persistence/mapper/UserInfoMapper.java b/maxkey-persistence/src/main/java/org/maxkey/persistence/mapper/UserInfoMapper.java index 3791a7c97..93f360f61 100644 --- a/maxkey-persistence/src/main/java/org/maxkey/persistence/mapper/UserInfoMapper.java +++ b/maxkey-persistence/src/main/java/org/maxkey/persistence/mapper/UserInfoMapper.java @@ -60,7 +60,7 @@ public interface UserInfoMapper extends IJpaBaseMapper{ public int updateProfile(UserInfo userInfo); - @Select("SELECT * FROM USERINFO WHERE EMAIL = #{value} OR MOBILE= #{value}") + @Select("SELECT * FROM MXK_USERINFO WHERE EMAIL = #{value} OR MOBILE= #{value}") public UserInfo queryUserInfoByEmailMobile(String emailMobile); } diff --git a/maxkey-persistence/src/main/resources/org/maxkey/persistence/mapper/xml/mysql/AppsMapper.xml b/maxkey-persistence/src/main/resources/org/maxkey/persistence/mapper/xml/mysql/AppsMapper.xml index e5c2d680e..d4d49d4c4 100644 --- a/maxkey-persistence/src/main/resources/org/maxkey/persistence/mapper/xml/mysql/AppsMapper.xml +++ b/maxkey-persistence/src/main/resources/org/maxkey/persistence/mapper/xml/mysql/AppsMapper.xml @@ -158,29 +158,24 @@ SELECT DISTINCT APP.* FROM - MXK_APPS APP,MXK_GROUP_PRIVILEGES GP + MXK_APPS APP,MXK_GROUP_PRIVILEGES GP,MXK_GROUPS G WHERE APP.ID=GP.APPID - AND GP.GROUPID IN( - SELECT - G.ID - FROM - `MXK_GROUPS` G - WHERE - G.ID='ALL_USER_GROUP' - OR G.ID IN( + AND GP.GROUPID=G.ID + AND ( + G.ID='ROLE_ALL_USER' + OR G.ID IN( SELECT GM.GROUPID FROM MXK_GROUP_MEMBER GM,MXK_USERINFO U - WHERE 1 = 1 + WHERE GM.MEMBERID = U.ID AND U.ID = #{userId} AND U.USERNAME = #{username} - AND GM.MEMBERID = U.ID ) ) diff --git a/maxkey-persistence/src/test/resources/application.properties b/maxkey-persistence/src/test/resources/application.properties index 502977fef..9de09bf7d 100644 --- a/maxkey-persistence/src/test/resources/application.properties +++ b/maxkey-persistence/src/test/resources/application.properties @@ -24,7 +24,7 @@ spring.servlet.multipart.max-file-size=4194304 #server.servlet.encoding.force=true #datasource spring.datasource.username=root -spring.datasource.password=maxkey +spring.datasource.password=root spring.datasource.url=jdbc:mysql://localhost/maxkey?autoReconnect=true&characterEncoding=UTF-8&serverTimezone=UTC spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.type=com.alibaba.druid.pool.DruidDataSource diff --git a/maxkey-protocols/maxkey-protocol-authorize/src/main/java/org/maxkey/authz/endpoint/OnlineTicketEndpoint.java b/maxkey-protocols/maxkey-protocol-authorize/src/main/java/org/maxkey/authz/endpoint/OnlineTicketEndpoint.java new file mode 100644 index 000000000..d0ffbc9cc --- /dev/null +++ b/maxkey-protocols/maxkey-protocol-authorize/src/main/java/org/maxkey/authz/endpoint/OnlineTicketEndpoint.java @@ -0,0 +1,27 @@ +package org.maxkey.authz.endpoint; + +import org.maxkey.authn.online.OnlineTicket; +import org.maxkey.authn.online.OnlineTicketServices; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +@Controller +@RequestMapping(value={"/onlineticket"}) +public class OnlineTicketEndpoint { + + @Autowired + @Qualifier("onlineTicketServices") + protected OnlineTicketServices onlineTicketServices; + + @ResponseBody + @RequestMapping(value="/validate") + public String ticketValidate( + @RequestParam(value ="ticket",required = true) String ticket) { + OnlineTicket onlineTicket = onlineTicketServices.get(ticket); + return onlineTicket == null ? "" :onlineTicket.getTicketId(); + } +} diff --git a/maxkey-protocols/maxkey-protocol-authorize/src/main/java/org/maxkey/authz/endpoint/adapter/AbstractAuthorizeAdapter.java b/maxkey-protocols/maxkey-protocol-authorize/src/main/java/org/maxkey/authz/endpoint/adapter/AbstractAuthorizeAdapter.java index 46598de04..723bf1678 100644 --- a/maxkey-protocols/maxkey-protocol-authorize/src/main/java/org/maxkey/authz/endpoint/adapter/AbstractAuthorizeAdapter.java +++ b/maxkey-protocols/maxkey-protocol-authorize/src/main/java/org/maxkey/authz/endpoint/adapter/AbstractAuthorizeAdapter.java @@ -19,6 +19,7 @@ package org.maxkey.authz.endpoint.adapter; import java.io.UnsupportedEncodingException; import org.apache.commons.codec.binary.Hex; +import org.maxkey.authn.SigninPrincipal; import org.maxkey.constants.Boolean; import org.maxkey.crypto.Base64Utils; import org.maxkey.crypto.ReciprocalUtils; @@ -39,7 +40,7 @@ public abstract class AbstractAuthorizeAdapter { public abstract ModelAndView authorize(UserInfo userInfo,Object app,String data,ModelAndView modelAndView); - public abstract String generateInfo(UserInfo userInfo,Object app); + public abstract String generateInfo(SigninPrincipal authentication,UserInfo userInfo,Object app); public String sign(String data,Apps app){ if(Boolean.isTrue(app.getIsSignature())){ diff --git a/maxkey-protocols/maxkey-protocol-authorize/src/main/java/org/maxkey/authz/singlelogout/DefaultSingleLogout.java b/maxkey-protocols/maxkey-protocol-authorize/src/main/java/org/maxkey/authz/singlelogout/DefaultSingleLogout.java new file mode 100644 index 000000000..66101c81b --- /dev/null +++ b/maxkey-protocols/maxkey-protocol-authorize/src/main/java/org/maxkey/authz/singlelogout/DefaultSingleLogout.java @@ -0,0 +1,25 @@ +package org.maxkey.authz.singlelogout; + +import java.util.HashMap; +import java.util.UUID; + +import org.maxkey.authn.SigninPrincipal; +import org.maxkey.domain.apps.Apps; +import org.maxkey.util.DateUtils; +import org.springframework.security.core.Authentication; + +public class DefaultSingleLogout extends SingleLogout{ + + @Override + public void sendRequest(Authentication authentication,Apps logoutApp) { + HashMap logoutParameters = new HashMap(); + logoutParameters.put("id", UUID.randomUUID().toString()); + logoutParameters.put("principal", authentication.getName()); + logoutParameters.put("request", "logoutRequest"); + logoutParameters.put("issueInstant", DateUtils.getCurrentDateAsString(DateUtils.FORMAT_DATE_ISO_TIMESTAMP)); + logoutParameters.put("ticket", ((SigninPrincipal)authentication.getPrincipal()).getOnlineTicket().getTicketId()); + postMessage(logoutApp.getLogoutUrl(),logoutParameters); + + } + +} diff --git a/maxkey-protocols/maxkey-protocol-authorize/src/main/java/org/maxkey/authz/singlelogout/LogoutType.java b/maxkey-protocols/maxkey-protocol-authorize/src/main/java/org/maxkey/authz/singlelogout/LogoutType.java new file mode 100644 index 000000000..dc853b23e --- /dev/null +++ b/maxkey-protocols/maxkey-protocol-authorize/src/main/java/org/maxkey/authz/singlelogout/LogoutType.java @@ -0,0 +1,18 @@ +package org.maxkey.authz.singlelogout; + +public class LogoutType { + + /** + * For no SLO. + */ + public static int NONE = 0; + /** + * For back channel SLO. + */ + public static int BACK_CHANNEL = 1; + /** + * For front channel SLO. + */ + public static int FRONT_CHANNEL = 2; + +} diff --git a/maxkey-protocols/maxkey-protocol-authorize/src/main/java/org/maxkey/authz/singlelogout/SamlSingleLogout.java b/maxkey-protocols/maxkey-protocol-authorize/src/main/java/org/maxkey/authz/singlelogout/SamlSingleLogout.java new file mode 100644 index 000000000..b3f84f49a --- /dev/null +++ b/maxkey-protocols/maxkey-protocol-authorize/src/main/java/org/maxkey/authz/singlelogout/SamlSingleLogout.java @@ -0,0 +1,46 @@ +package org.maxkey.authz.singlelogout; + +import java.util.HashMap; +import java.util.UUID; + +import org.maxkey.domain.apps.Apps; +import org.maxkey.util.DateUtils; +import org.springframework.security.core.Authentication; + +/** + * SamlSingleLogout + * https://apereo.github.io/cas/6.2.x/installation/Logout-Single-Signout.html + * @author Crystal.Sea + * + */ +public class SamlSingleLogout extends SingleLogout{ + + /** + * The parameter name that contains the logout request. + */ + public static final String LOGOUT_REQUEST_PARAMETER = "logoutRequest"; + + public static final String logoutRequestMessage= + "%s" + + "%s"; + + @Override + public void sendRequest(Authentication authentication,Apps logoutApp) { + String requestMessage = String.format(logoutRequestMessage, + UUID.randomUUID().toString(), + DateUtils.getCurrentDateAsString(DateUtils.FORMAT_DATE_ISO_TIMESTAMP), + authentication.getName(), + logoutApp.getOnlineTicket() + ); + + HashMap logoutParameters = new HashMap(); + logoutParameters.put(LOGOUT_REQUEST_PARAMETER, requestMessage); + postMessage(logoutApp.getLogoutUrl(),logoutParameters); + } + + public SamlSingleLogout() { + super(); + } + +} diff --git a/maxkey-protocols/maxkey-protocol-authorize/src/main/java/org/maxkey/authz/singlelogout/SingleLogout.java b/maxkey-protocols/maxkey-protocol-authorize/src/main/java/org/maxkey/authz/singlelogout/SingleLogout.java new file mode 100644 index 000000000..6557dafdf --- /dev/null +++ b/maxkey-protocols/maxkey-protocol-authorize/src/main/java/org/maxkey/authz/singlelogout/SingleLogout.java @@ -0,0 +1,101 @@ +package org.maxkey.authz.singlelogout; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import org.apache.http.HttpEntity; +import org.apache.http.NameValuePair; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.util.EntityUtils; +import org.maxkey.domain.apps.Apps; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.security.core.Authentication; + +public abstract class SingleLogout { + private static final Logger _logger = LoggerFactory.getLogger(SingleLogout.class); + + public abstract void sendRequest(Authentication authentication,Apps logoutApp) ; + + public void postMessage(String url,Map paramMap) { + // 创建httpClient实例 + CloseableHttpClient httpClient = HttpClients.createDefault(); + CloseableHttpResponse httpResponse = null; + // 创建httpPost远程连接实例 + HttpPost httpPost = new HttpPost(url); + // 配置请求参数实例 + RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(35000)// 设置连接主机服务超时时间 + .setConnectionRequestTimeout(35000)// 设置连接请求超时时间 + .setSocketTimeout(60000)// 设置读取数据连接超时时间 + .build(); + // 为httpPost实例设置配置 + httpPost.setConfig(requestConfig); + // 设置请求头 + httpPost.addHeader("Content-Type", "application/x-www-form-urlencoded"); + // 封装post请求参数 + if (null != paramMap && paramMap.size() > 0) { + List nvps = new ArrayList(); + // 通过map集成entrySet方法获取entity + Set> entrySet = paramMap.entrySet(); + // 循环遍历,获取迭代器 + Iterator> iterator = entrySet.iterator(); + while (iterator.hasNext()) { + Entry mapEntry = iterator.next(); + _logger.debug("Name " + mapEntry.getKey() + " , Value " +mapEntry.getValue()); + nvps.add(new BasicNameValuePair(mapEntry.getKey(), mapEntry.getValue().toString())); + } + + // 为httpPost设置封装好的请求参数 + try { + httpPost.setEntity(new UrlEncodedFormEntity(nvps, "UTF-8")); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + } + + + try { + _logger.debug("Post URL " + url + " , Post Message \n" + + httpPost.getEntity().toString() + ); + // httpClient对象执行post请求,并返回响应参数对象 + httpResponse = httpClient.execute(httpPost); + // 从响应对象中获取响应内容 + HttpEntity entity = httpResponse.getEntity(); + _logger.debug("Http Response StatusCode " + + httpResponse.getStatusLine().getStatusCode()+ + " , Content " +EntityUtils.toString(entity) + ); + } catch (Exception e) { + e.printStackTrace(); + } finally { + // 关闭资源 + if (null != httpResponse) { + try { + httpResponse.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (null != httpClient) { + try { + httpClient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } +} diff --git a/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/Cas10AuthorizeEndpoint.java b/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/Cas10AuthorizeEndpoint.java index 00fc8d606..b10e0787a 100644 --- a/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/Cas10AuthorizeEndpoint.java +++ b/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/Cas10AuthorizeEndpoint.java @@ -23,7 +23,7 @@ package org.maxkey.authz.cas.endpoint; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.maxkey.authn.BasicAuthentication; +import org.maxkey.authn.SigninPrincipal; import org.maxkey.authz.cas.endpoint.response.Service10ResponseBuilder; import org.maxkey.authz.cas.endpoint.ticket.CasConstants; import org.maxkey.authz.cas.endpoint.ticket.Ticket; @@ -86,21 +86,29 @@ renew [OPTIONAL] - if this parameter is set, ticket validation will only succeed @RequestParam(value = CasConstants.PARAMETER.SERVICE) String service, @RequestParam(value = CasConstants.PARAMETER.RENEW,required=false) String renew ){ + _logger.debug("serviceValidate " + + " ticket " + ticket + +" , service " + service + +" , renew " + renew + ); + Ticket storedTicket=null; try { storedTicket = ticketServices.consumeTicket(ticket); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); + _logger.error("consume Ticket error " , e); } if(storedTicket!=null){ - String principal=((BasicAuthentication)storedTicket.getAuthentication().getPrincipal()).getUsername(); + String principal=((SigninPrincipal)storedTicket.getAuthentication().getPrincipal()).getUsername(); _logger.debug("principal "+principal); return new Service10ResponseBuilder().success() .setUser(principal) .serviceResponseBuilder(); }else{ + _logger.debug("Ticket not found ."); return new Service10ResponseBuilder().failure() .serviceResponseBuilder(); } diff --git a/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/Cas20AuthorizeEndpoint.java b/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/Cas20AuthorizeEndpoint.java index 1a8a3f40c..ef097f527 100644 --- a/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/Cas20AuthorizeEndpoint.java +++ b/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/Cas20AuthorizeEndpoint.java @@ -23,7 +23,7 @@ package org.maxkey.authz.cas.endpoint; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.maxkey.authn.BasicAuthentication; +import org.maxkey.authn.SigninPrincipal; import org.maxkey.authz.cas.endpoint.response.ProxyServiceResponseBuilder; import org.maxkey.authz.cas.endpoint.response.ServiceResponseBuilder; import org.maxkey.authz.cas.endpoint.ticket.CasConstants; @@ -173,7 +173,14 @@ For all error codes, it is RECOMMENDED that CAS provide a more detailed message @RequestParam(value = CasConstants.PARAMETER.PROXY_CALLBACK_URL,required=false) String pgtUrl, @RequestParam(value = CasConstants.PARAMETER.RENEW,required=false) String renew, @RequestParam(value = CasConstants.PARAMETER.FORMAT,required=false,defaultValue=CasConstants.FORMAT_TYPE.XML) String format){ - + _logger.debug("serviceValidate " + + " ticket " + ticket + +" , service " + service + +" , pgtUrl " + pgtUrl + +" , renew " + renew + +" , format " + format + ); + setContentType(request,response,format); Ticket storedTicket=null; @@ -186,14 +193,15 @@ For all error codes, it is RECOMMENDED that CAS provide a more detailed message ServiceResponseBuilder serviceResponseBuilder=new ServiceResponseBuilder(); if(storedTicket!=null){ - String principal=((BasicAuthentication)storedTicket.getAuthentication().getPrincipal()).getUsername(); + SigninPrincipal authentication = ((SigninPrincipal)storedTicket.getAuthentication().getPrincipal()); + String principal=authentication.getUsername(); _logger.debug("principal "+principal); serviceResponseBuilder.success().setUser(principal); if(Boolean.isTrue(storedTicket.getCasDetails().getIsAdapter())){ AbstractAuthorizeAdapter adapter =(AbstractAuthorizeAdapter)Instance.newInstance(storedTicket.getCasDetails().getAdapter()); UserInfo userInfo = (UserInfo) userInfoService.loadByUsername(principal); - adapter.generateInfo(userInfo, serviceResponseBuilder); + adapter.generateInfo(authentication,userInfo, serviceResponseBuilder); } }else{ serviceResponseBuilder.failure() @@ -274,7 +282,13 @@ Response on ticket validation failure: @RequestParam(value = CasConstants.PARAMETER.PROXY_CALLBACK_URL,required=false) String pgtUrl, @RequestParam(value = CasConstants.PARAMETER.RENEW,required=false) String renew, @RequestParam(value = CasConstants.PARAMETER.FORMAT,required=false,defaultValue=CasConstants.FORMAT_TYPE.XML) String format){ - + _logger.debug("proxyValidate " + + " ticket " + ticket + +" , service " + service + +" , pgtUrl " + pgtUrl + +" , renew " + renew + +" , format " + format + ); setContentType(request,response,format); Ticket storedTicket=null; @@ -358,7 +372,11 @@ For all error codes, it is RECOMMENDED that CAS provide a more detailed message @RequestParam(value = CasConstants.PARAMETER.PROXY_GRANTING_TICKET) String pgt, @RequestParam(value = CasConstants.PARAMETER.TARGET_SERVICE) String targetService, @RequestParam(value = CasConstants.PARAMETER.FORMAT,required=false,defaultValue=CasConstants.FORMAT_TYPE.XML) String format){ - + _logger.debug("proxy " + + " pgt " + pgt + +" , targetService " + targetService + +" , format " + format + ); setContentType(request,response,format); ProxyServiceResponseBuilder proxyServiceResponseBuilder=new ProxyServiceResponseBuilder(); diff --git a/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/Cas30AuthorizeEndpoint.java b/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/Cas30AuthorizeEndpoint.java index 6bb2dda98..c2a98afdd 100644 --- a/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/Cas30AuthorizeEndpoint.java +++ b/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/Cas30AuthorizeEndpoint.java @@ -23,7 +23,7 @@ package org.maxkey.authz.cas.endpoint; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.maxkey.authn.BasicAuthentication; +import org.maxkey.authn.SigninPrincipal; import org.maxkey.authz.cas.endpoint.response.ServiceResponseBuilder; import org.maxkey.authz.cas.endpoint.ticket.CasConstants; import org.maxkey.authz.cas.endpoint.ticket.Ticket; @@ -57,7 +57,14 @@ public class Cas30AuthorizeEndpoint extends CasBaseAuthorizeEndpoint{ @RequestParam(value = CasConstants.PARAMETER.PROXY_CALLBACK_URL,required=false) String pgtUrl, @RequestParam(value = CasConstants.PARAMETER.RENEW,required=false) String renew, @RequestParam(value = CasConstants.PARAMETER.FORMAT,required=false,defaultValue=CasConstants.FORMAT_TYPE.XML) String format){ - + _logger.debug("serviceValidate " + + " ticket " + ticket + +" , service " + service + +" , pgtUrl " + pgtUrl + +" , renew " + renew + +" , format " + format + ); + setContentType(request,response,format); Ticket storedTicket=null; @@ -69,13 +76,14 @@ public class Cas30AuthorizeEndpoint extends CasBaseAuthorizeEndpoint{ ServiceResponseBuilder serviceResponseBuilder=new ServiceResponseBuilder(); if(storedTicket!=null){ - String principal=((BasicAuthentication)storedTicket.getAuthentication().getPrincipal()).getUsername(); + SigninPrincipal authentication = ((SigninPrincipal)storedTicket.getAuthentication().getPrincipal()); + String principal=authentication.getUsername(); serviceResponseBuilder.success().setUser(principal); if(Boolean.isTrue(storedTicket.getCasDetails().getIsAdapter())){ AbstractAuthorizeAdapter adapter =(AbstractAuthorizeAdapter)Instance.newInstance(storedTicket.getCasDetails().getAdapter()); UserInfo userInfo = (UserInfo) userInfoService.loadByUsername(principal); - adapter.generateInfo(userInfo, serviceResponseBuilder); + adapter.generateInfo(authentication,userInfo, serviceResponseBuilder); } }else{ serviceResponseBuilder.failure() @@ -96,7 +104,13 @@ public class Cas30AuthorizeEndpoint extends CasBaseAuthorizeEndpoint{ @RequestParam(value = CasConstants.PARAMETER.PROXY_CALLBACK_URL,required=false) String pgtUrl, @RequestParam(value = CasConstants.PARAMETER.RENEW,required=false) String renew, @RequestParam(value = CasConstants.PARAMETER.FORMAT,required=false,defaultValue=CasConstants.FORMAT_TYPE.XML) String format){ - + _logger.debug("proxyValidate " + + " ticket " + ticket + +" , service " + service + +" , pgtUrl " + pgtUrl + +" , renew " + renew + +" , format " + format + ); setContentType(request,response,format); Ticket storedTicket=null; @@ -108,13 +122,14 @@ public class Cas30AuthorizeEndpoint extends CasBaseAuthorizeEndpoint{ ServiceResponseBuilder serviceResponseBuilder=new ServiceResponseBuilder(); if(storedTicket!=null){ - String principal=((BasicAuthentication)storedTicket.getAuthentication().getPrincipal()).getUsername(); + SigninPrincipal authentication = ((SigninPrincipal)storedTicket.getAuthentication().getPrincipal()); + String principal=authentication.getUsername(); serviceResponseBuilder.success().setUser(principal); if(Boolean.isTrue(storedTicket.getCasDetails().getIsAdapter())){ AbstractAuthorizeAdapter adapter =(AbstractAuthorizeAdapter)Instance.newInstance(storedTicket.getCasDetails().getAdapter()); UserInfo userInfo = (UserInfo) userInfoService.loadByUsername(principal); - adapter.generateInfo(userInfo, serviceResponseBuilder); + adapter.generateInfo(authentication,userInfo, serviceResponseBuilder); } }else{ serviceResponseBuilder.failure() diff --git a/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/CasAuthorizeEndpoint.java b/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/CasAuthorizeEndpoint.java index 8390b702a..34e3c444b 100644 --- a/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/CasAuthorizeEndpoint.java +++ b/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/CasAuthorizeEndpoint.java @@ -20,19 +20,26 @@ */ package org.maxkey.authz.cas.endpoint; +import java.security.Principal; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.maxkey.authn.SigninPrincipal; +import org.maxkey.authn.online.OnlineTicket; import org.maxkey.authz.cas.endpoint.ticket.CasConstants; import org.maxkey.authz.cas.endpoint.ticket.ServiceTicketImpl; import org.maxkey.authz.endpoint.AuthorizeBaseEndpoint; +import org.maxkey.authz.singlelogout.LogoutType; import org.maxkey.domain.apps.AppsCasDetails; import org.maxkey.web.WebConstants; import org.maxkey.web.WebContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; @@ -89,10 +96,12 @@ public class CasAuthorizeEndpoint extends CasBaseAuthorizeEndpoint{ } @RequestMapping("/authz/cas/granting") - public ModelAndView grantingTicket( + public ModelAndView grantingTicket(Principal principal, + @AuthenticationPrincipal Object user, HttpServletRequest request, HttpServletResponse response){ + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); AppsCasDetails casDetails=(AppsCasDetails)WebContext.getAttribute(CasConstants.PARAMETER.ENDPOINT_CAS_DETAILS); ServiceTicketImpl serviceTicket=new ServiceTicketImpl(WebContext.getAuthentication(),casDetails); @@ -103,6 +112,10 @@ public class CasAuthorizeEndpoint extends CasBaseAuthorizeEndpoint{ callbackUrl.append("?"); } + if(callbackUrl.indexOf("&") != -1) { + callbackUrl.append("&"); + } + //append ticket callbackUrl.append(CasConstants.PARAMETER.TICKET).append("=").append(ticket); @@ -121,6 +134,15 @@ public class CasAuthorizeEndpoint extends CasBaseAuthorizeEndpoint{ } } + if(casDetails.getLogoutType()==LogoutType.BACK_CHANNEL) { + String onlineTicketId = ((SigninPrincipal)WebContext.getAuthentication().getPrincipal()).getOnlineTicket().getTicketId(); + OnlineTicket onlineTicket = onlineTicketServices.get(onlineTicketId); + //set cas ticket as OnlineTicketId + casDetails.setOnlineTicket(ticket); + onlineTicket.setAuthorizedApp(casDetails); + onlineTicketServices.store(onlineTicketId, onlineTicket); + } + _logger.debug("redirect to CAS Client URL " + callbackUrl); return WebContext.redirect(callbackUrl.toString()); diff --git a/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/CasBaseAuthorizeEndpoint.java b/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/CasBaseAuthorizeEndpoint.java index 10d14c929..6d1519a96 100644 --- a/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/CasBaseAuthorizeEndpoint.java +++ b/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/CasBaseAuthorizeEndpoint.java @@ -20,6 +20,7 @@ package org.maxkey.authz.cas.endpoint; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.maxkey.authn.online.OnlineTicketServices; import org.maxkey.authz.cas.endpoint.ticket.CasConstants; import org.maxkey.authz.cas.endpoint.ticket.service.TicketServices; import org.maxkey.authz.endpoint.AuthorizeBaseEndpoint; @@ -50,6 +51,10 @@ public class CasBaseAuthorizeEndpoint extends AuthorizeBaseEndpoint{ @Qualifier("casTicketGrantingTicketServices") protected TicketServices casTicketGrantingTicketServices; + @Autowired + @Qualifier("onlineTicketServices") + protected OnlineTicketServices onlineTicketServices; + public void setContentType( HttpServletRequest request, diff --git a/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/CasRestV1Endpoint.java b/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/CasRestV1Endpoint.java index 18fc9367b..1483b0f17 100644 --- a/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/CasRestV1Endpoint.java +++ b/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/CasRestV1Endpoint.java @@ -24,7 +24,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.maxkey.authn.AbstractAuthenticationProvider; -import org.maxkey.authn.BasicAuthentication; +import org.maxkey.authn.LoginCredential; import org.maxkey.authz.cas.endpoint.response.ServiceResponseBuilder; import org.maxkey.authz.cas.endpoint.ticket.CasConstants; import org.maxkey.authz.cas.endpoint.ticket.ServiceTicketImpl; @@ -75,9 +75,9 @@ public class CasRestV1Endpoint extends CasBaseAuthorizeEndpoint{ throw new BadCredentialsException("No credentials are provided or extracted to authenticate the REST request"); } - BasicAuthentication authentication =new BasicAuthentication(username,password,"CASREST"); + LoginCredential loginCredential =new LoginCredential(username,password,"CASREST"); - authenticationProvider.basicAuthenticate(authentication); + authenticationProvider.basicAuthenticate(loginCredential); TicketGrantingTicketImpl ticketGrantingTicket=new TicketGrantingTicketImpl("Random",WebContext.getAuthentication(),null); @@ -178,9 +178,9 @@ public class CasRestV1Endpoint extends CasBaseAuthorizeEndpoint{ throw new BadCredentialsException("No credentials are provided or extracted to authenticate the REST request"); } - BasicAuthentication authentication =new BasicAuthentication(username,password,"CASREST"); + LoginCredential loginCredential =new LoginCredential(username,password,"CASREST"); - authenticationProvider.basicAuthenticate(authentication); + authenticationProvider.basicAuthenticate(loginCredential); UserInfo userInfo =WebContext.getUserInfo(); TicketGrantingTicketImpl ticketGrantingTicket=new TicketGrantingTicketImpl("Random",WebContext.getAuthentication(),null); diff --git a/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/adapter/CasDefaultAdapter.java b/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/adapter/CasDefaultAdapter.java index aea864035..6b10e7ff3 100644 --- a/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/adapter/CasDefaultAdapter.java +++ b/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/adapter/CasDefaultAdapter.java @@ -20,9 +20,11 @@ package org.maxkey.authz.cas.endpoint.adapter; import java.io.UnsupportedEncodingException; import org.apache.commons.codec.binary.Base64; +import org.maxkey.authn.SigninPrincipal; import org.maxkey.authz.cas.endpoint.response.ServiceResponseBuilder; import org.maxkey.authz.endpoint.adapter.AbstractAuthorizeAdapter; import org.maxkey.domain.UserInfo; +import org.maxkey.web.WebConstants; import org.springframework.web.servlet.ModelAndView; public class CasDefaultAdapter extends AbstractAuthorizeAdapter { @@ -46,7 +48,7 @@ public class CasDefaultAdapter extends AbstractAuthorizeAdapter { } @Override - public String generateInfo(UserInfo userInfo, Object serviceResponseObject) { + public String generateInfo(SigninPrincipal authentication,UserInfo userInfo, Object serviceResponseObject) { ServiceResponseBuilder serviceResponseBuilder=(ServiceResponseBuilder)serviceResponseObject; //for user serviceResponseBuilder.setAttribute("uid", userInfo.getId()); @@ -65,6 +67,7 @@ public class CasDefaultAdapter extends AbstractAuthorizeAdapter { serviceResponseBuilder.setAttribute("departmentId", userInfo.getDepartmentId()); serviceResponseBuilder.setAttribute("workRegion",base64Attr(userInfo.getWorkRegion())); + serviceResponseBuilder.setAttribute(WebConstants.ONLINE_TICKET_NAME,authentication.getOnlineTicket().getTicketId()); return null; } diff --git a/maxkey-protocols/maxkey-protocol-desktop/src/main/java/org/maxkey/authz/desktop/endpoint/DesktopAuthorizeEndpoint.java b/maxkey-protocols/maxkey-protocol-desktop/src/main/java/org/maxkey/authz/desktop/endpoint/DesktopAuthorizeEndpoint.java index ddd496195..1600f3f9e 100644 --- a/maxkey-protocols/maxkey-protocol-desktop/src/main/java/org/maxkey/authz/desktop/endpoint/DesktopAuthorizeEndpoint.java +++ b/maxkey-protocols/maxkey-protocol-desktop/src/main/java/org/maxkey/authz/desktop/endpoint/DesktopAuthorizeEndpoint.java @@ -22,6 +22,7 @@ package org.maxkey.authz.desktop.endpoint; import javax.servlet.http.HttpServletRequest; +import org.maxkey.authn.SigninPrincipal; import org.maxkey.authz.desktop.endpoint.adapter.DesktopDefaultAdapter; import org.maxkey.authz.endpoint.AuthorizeBaseEndpoint; import org.maxkey.authz.endpoint.adapter.AbstractAuthorizeAdapter; @@ -74,7 +75,9 @@ public class DesktopAuthorizeEndpoint extends AuthorizeBaseEndpoint{ adapter =(AbstractAuthorizeAdapter)defaultDesktopAdapter; } - String paramString=adapter.generateInfo(WebContext.getUserInfo(), desktopDetails); + String paramString=adapter.generateInfo( + (SigninPrincipal)WebContext.getAuthentication().getPrincipal(), + WebContext.getUserInfo(), desktopDetails); String encryptParamString=adapter.encrypt(paramString, null, null); diff --git a/maxkey-protocols/maxkey-protocol-desktop/src/main/java/org/maxkey/authz/desktop/endpoint/adapter/DesktopDefaultAdapter.java b/maxkey-protocols/maxkey-protocol-desktop/src/main/java/org/maxkey/authz/desktop/endpoint/adapter/DesktopDefaultAdapter.java index 27e4bc7aa..20bed547b 100644 --- a/maxkey-protocols/maxkey-protocol-desktop/src/main/java/org/maxkey/authz/desktop/endpoint/adapter/DesktopDefaultAdapter.java +++ b/maxkey-protocols/maxkey-protocol-desktop/src/main/java/org/maxkey/authz/desktop/endpoint/adapter/DesktopDefaultAdapter.java @@ -19,6 +19,7 @@ package org.maxkey.authz.desktop.endpoint.adapter; import java.util.HashMap; +import org.maxkey.authn.SigninPrincipal; import org.maxkey.authz.endpoint.adapter.AbstractAuthorizeAdapter; import org.maxkey.crypto.HexUtils; import org.maxkey.domain.UserInfo; @@ -33,7 +34,7 @@ import org.springframework.web.servlet.ModelAndView; public class DesktopDefaultAdapter extends AbstractAuthorizeAdapter { final static Logger _logger = LoggerFactory.getLogger(DesktopDefaultAdapter.class); @Override - public String generateInfo(UserInfo userInfo,Object app) { + public String generateInfo(SigninPrincipal authentication,UserInfo userInfo,Object app) { AppsDesktopDetails details=(AppsDesktopDetails)app; String parameter=details.getParameter()==null?"":details.getParameter(); diff --git a/maxkey-protocols/maxkey-protocol-desktop/src/main/java/org/maxkey/authz/desktop/endpoint/adapter/DesktopQQAdapter.java b/maxkey-protocols/maxkey-protocol-desktop/src/main/java/org/maxkey/authz/desktop/endpoint/adapter/DesktopQQAdapter.java index a5ca0c215..334797e76 100644 --- a/maxkey-protocols/maxkey-protocol-desktop/src/main/java/org/maxkey/authz/desktop/endpoint/adapter/DesktopQQAdapter.java +++ b/maxkey-protocols/maxkey-protocol-desktop/src/main/java/org/maxkey/authz/desktop/endpoint/adapter/DesktopQQAdapter.java @@ -19,6 +19,7 @@ package org.maxkey.authz.desktop.endpoint.adapter; import java.util.HashMap; +import org.maxkey.authn.SigninPrincipal; import org.maxkey.authz.endpoint.adapter.AbstractAuthorizeAdapter; import org.maxkey.crypto.HexUtils; import org.maxkey.domain.UserInfo; @@ -33,7 +34,7 @@ import org.springframework.web.servlet.ModelAndView; public class DesktopQQAdapter extends AbstractAuthorizeAdapter { final static Logger _logger = LoggerFactory.getLogger(DesktopQQAdapter.class); @Override - public String generateInfo(UserInfo userInfo,Object app) { + public String generateInfo(SigninPrincipal authentication,UserInfo userInfo,Object app) { AppsDesktopDetails details=(AppsDesktopDetails)app; String parameter=details.getParameter()==null?"":details.getParameter(); diff --git a/maxkey-protocols/maxkey-protocol-extendapi/src/main/java/org/maxkey/authz/exapi/endpoint/adapter/ExtendApiQQExmailDefaultAdapter.java b/maxkey-protocols/maxkey-protocol-extendapi/src/main/java/org/maxkey/authz/exapi/endpoint/adapter/ExtendApiQQExmailDefaultAdapter.java index b791f7caa..577d51e78 100644 --- a/maxkey-protocols/maxkey-protocol-extendapi/src/main/java/org/maxkey/authz/exapi/endpoint/adapter/ExtendApiQQExmailDefaultAdapter.java +++ b/maxkey-protocols/maxkey-protocol-extendapi/src/main/java/org/maxkey/authz/exapi/endpoint/adapter/ExtendApiQQExmailDefaultAdapter.java @@ -19,6 +19,7 @@ package org.maxkey.authz.exapi.endpoint.adapter; import java.util.HashMap; +import org.maxkey.authn.SigninPrincipal; import org.maxkey.authz.endpoint.adapter.AbstractAuthorizeAdapter; import org.maxkey.client.oauth.OAuthClient; import org.maxkey.client.oauth.model.Token; @@ -38,7 +39,7 @@ public class ExtendApiQQExmailDefaultAdapter extends AbstractAuthorizeAdapter { static String authkey_uri="http://openapi.exmail.qq.com:12211/openapi/mail/authkey"; @Override - public String generateInfo(UserInfo userInfo,Object app) { + public String generateInfo(SigninPrincipal authentication,UserInfo userInfo,Object app) { return null; } diff --git a/maxkey-protocols/maxkey-protocol-formbased/src/main/java/org/maxkey/authz/formbased/endpoint/adapter/FormBasedDefaultAdapter.java b/maxkey-protocols/maxkey-protocol-formbased/src/main/java/org/maxkey/authz/formbased/endpoint/adapter/FormBasedDefaultAdapter.java index f7ca7534a..a98458c9c 100644 --- a/maxkey-protocols/maxkey-protocol-formbased/src/main/java/org/maxkey/authz/formbased/endpoint/adapter/FormBasedDefaultAdapter.java +++ b/maxkey-protocols/maxkey-protocol-formbased/src/main/java/org/maxkey/authz/formbased/endpoint/adapter/FormBasedDefaultAdapter.java @@ -17,6 +17,7 @@ package org.maxkey.authz.formbased.endpoint.adapter; +import org.maxkey.authn.SigninPrincipal; import org.maxkey.authz.endpoint.adapter.AbstractAuthorizeAdapter; import org.maxkey.constants.Boolean; import org.maxkey.crypto.DigestUtils; @@ -27,7 +28,7 @@ import org.springframework.web.servlet.ModelAndView; public class FormBasedDefaultAdapter extends AbstractAuthorizeAdapter { @Override - public String generateInfo(UserInfo userInfo,Object app) { + public String generateInfo(SigninPrincipal authentication,UserInfo userInfo,Object app) { return null; } diff --git a/maxkey-protocols/maxkey-protocol-formbased/src/main/java/org/maxkey/authz/formbased/endpoint/adapter/FormBasedNetease163EmailAdapter.java b/maxkey-protocols/maxkey-protocol-formbased/src/main/java/org/maxkey/authz/formbased/endpoint/adapter/FormBasedNetease163EmailAdapter.java index 976506e43..31211e230 100644 --- a/maxkey-protocols/maxkey-protocol-formbased/src/main/java/org/maxkey/authz/formbased/endpoint/adapter/FormBasedNetease163EmailAdapter.java +++ b/maxkey-protocols/maxkey-protocol-formbased/src/main/java/org/maxkey/authz/formbased/endpoint/adapter/FormBasedNetease163EmailAdapter.java @@ -17,6 +17,7 @@ package org.maxkey.authz.formbased.endpoint.adapter; +import org.maxkey.authn.SigninPrincipal; import org.maxkey.authz.endpoint.adapter.AbstractAuthorizeAdapter; import org.maxkey.constants.Boolean; import org.maxkey.domain.UserInfo; @@ -26,7 +27,7 @@ import org.springframework.web.servlet.ModelAndView; public class FormBasedNetease163EmailAdapter extends AbstractAuthorizeAdapter { @Override - public String generateInfo(UserInfo userInfo,Object app) { + public String generateInfo(SigninPrincipal authentication,UserInfo userInfo,Object app) { return null; } diff --git a/maxkey-protocols/maxkey-protocol-formbased/src/main/java/org/maxkey/authz/formbased/endpoint/adapter/FormBasedNeteaseNoteYoudaoAdapter.java b/maxkey-protocols/maxkey-protocol-formbased/src/main/java/org/maxkey/authz/formbased/endpoint/adapter/FormBasedNeteaseNoteYoudaoAdapter.java index 0a181e51f..48c648710 100644 --- a/maxkey-protocols/maxkey-protocol-formbased/src/main/java/org/maxkey/authz/formbased/endpoint/adapter/FormBasedNeteaseNoteYoudaoAdapter.java +++ b/maxkey-protocols/maxkey-protocol-formbased/src/main/java/org/maxkey/authz/formbased/endpoint/adapter/FormBasedNeteaseNoteYoudaoAdapter.java @@ -19,6 +19,7 @@ package org.maxkey.authz.formbased.endpoint.adapter; import java.util.Date; +import org.maxkey.authn.SigninPrincipal; import org.maxkey.authz.endpoint.adapter.AbstractAuthorizeAdapter; import org.maxkey.crypto.DigestUtils; import org.maxkey.domain.UserInfo; @@ -28,7 +29,7 @@ import org.springframework.web.servlet.ModelAndView; public class FormBasedNeteaseNoteYoudaoAdapter extends AbstractAuthorizeAdapter { @Override - public String generateInfo(UserInfo userInfo,Object app) { + public String generateInfo(SigninPrincipal authentication,UserInfo userInfo,Object app) { return null; } diff --git a/maxkey-protocols/maxkey-protocol-formbased/src/main/java/org/maxkey/authz/formbased/endpoint/adapter/FormBasedRedirectAdapter.java b/maxkey-protocols/maxkey-protocol-formbased/src/main/java/org/maxkey/authz/formbased/endpoint/adapter/FormBasedRedirectAdapter.java index 5aca476a3..8cc6a7d00 100644 --- a/maxkey-protocols/maxkey-protocol-formbased/src/main/java/org/maxkey/authz/formbased/endpoint/adapter/FormBasedRedirectAdapter.java +++ b/maxkey-protocols/maxkey-protocol-formbased/src/main/java/org/maxkey/authz/formbased/endpoint/adapter/FormBasedRedirectAdapter.java @@ -17,6 +17,7 @@ package org.maxkey.authz.formbased.endpoint.adapter; +import org.maxkey.authn.SigninPrincipal; import org.maxkey.authz.endpoint.adapter.AbstractAuthorizeAdapter; import org.maxkey.constants.Boolean; import org.maxkey.crypto.DigestUtils; @@ -28,7 +29,7 @@ import org.springframework.web.servlet.ModelAndView; public class FormBasedRedirectAdapter extends AbstractAuthorizeAdapter { @Override - public String generateInfo(UserInfo userInfo,Object app) { + public String generateInfo(SigninPrincipal authentication,UserInfo userInfo,Object app) { return null; } diff --git a/maxkey-protocols/maxkey-protocol-oauth-2.0/src/main/java/org/maxkey/authz/oauth2/provider/approval/controller/OAuth20AccessConfirmationController.java b/maxkey-protocols/maxkey-protocol-oauth-2.0/src/main/java/org/maxkey/authz/oauth2/provider/approval/controller/OAuth20AccessConfirmationController.java index 1c1169173..4a7f690c2 100644 --- a/maxkey-protocols/maxkey-protocol-oauth-2.0/src/main/java/org/maxkey/authz/oauth2/provider/approval/controller/OAuth20AccessConfirmationController.java +++ b/maxkey-protocols/maxkey-protocol-oauth-2.0/src/main/java/org/maxkey/authz/oauth2/provider/approval/controller/OAuth20AccessConfirmationController.java @@ -20,7 +20,7 @@ package org.maxkey.authz.oauth2.provider.approval.controller; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; -import org.maxkey.authn.BasicAuthentication; +import org.maxkey.authn.SigninPrincipal; import org.maxkey.authz.endpoint.AuthorizeBaseEndpoint; import org.maxkey.authz.oauth2.common.util.OAuth2Utils; import org.maxkey.authz.oauth2.provider.AuthorizationRequest; @@ -102,7 +102,7 @@ public class OAuth20AccessConfirmationController { scopes.put(OAuth2Utils.SCOPE_PREFIX + scope, "false"); } String principal = - ((BasicAuthentication) WebContext.getAuthentication().getPrincipal()).getUsername(); + ((SigninPrincipal) WebContext.getAuthentication().getPrincipal()).getUsername(); for (Approval approval : approvalStore.getApprovals(principal, client.getClientId())) { if (clientAuth.getScope().contains(approval.getScope())) { scopes.put(OAuth2Utils.SCOPE_PREFIX + approval.getScope(), diff --git a/maxkey-protocols/maxkey-protocol-oauth-2.0/src/main/java/org/maxkey/authz/oauth2/provider/endpoint/AuthorizationEndpoint.java b/maxkey-protocols/maxkey-protocol-oauth-2.0/src/main/java/org/maxkey/authz/oauth2/provider/endpoint/AuthorizationEndpoint.java index 2ddb8be20..1665a48d8 100644 --- a/maxkey-protocols/maxkey-protocol-oauth-2.0/src/main/java/org/maxkey/authz/oauth2/provider/endpoint/AuthorizationEndpoint.java +++ b/maxkey-protocols/maxkey-protocol-oauth-2.0/src/main/java/org/maxkey/authz/oauth2/provider/endpoint/AuthorizationEndpoint.java @@ -129,7 +129,7 @@ public class AuthorizationEndpoint extends AbstractEndpoint { @RequestMapping(value = "/oauth/v20/authorize", method = RequestMethod.GET) public ModelAndView authorize(Map model, @RequestParam Map parameters, SessionStatus sessionStatus) { - Principal principal=(Principal)WebContext.getAuthentication().getPrincipal(); + Principal principal=(Principal)WebContext.getAuthentication(); // Pull out the authorization request first, using the OAuth2RequestFactory. All further logic should // query off of the authorization request instead of referring back to the parameters map. The contents of the // parameters map will be stored without change in the AuthorizationRequest object once it is created. @@ -208,7 +208,7 @@ public class AuthorizationEndpoint extends AbstractEndpoint { @RequestMapping(value = "/oauth/v20/authorize", method = RequestMethod.POST, params = OAuth2Utils.USER_OAUTH_APPROVAL) public View approveOrDeny(@RequestParam Map approvalParameters, Map model, SessionStatus sessionStatus) { - Principal principal=(Principal)WebContext.getAuthentication().getPrincipal(); + Principal principal=(Principal)WebContext.getAuthentication(); if (!(principal instanceof Authentication)) { sessionStatus.setComplete(); throw new InsufficientAuthenticationException( diff --git a/maxkey-protocols/maxkey-protocol-oauth-2.0/src/main/java/org/maxkey/authz/oauth2/provider/endpoint/TokenEndpoint.java b/maxkey-protocols/maxkey-protocol-oauth-2.0/src/main/java/org/maxkey/authz/oauth2/provider/endpoint/TokenEndpoint.java index af9084427..f76868e96 100644 --- a/maxkey-protocols/maxkey-protocol-oauth-2.0/src/main/java/org/maxkey/authz/oauth2/provider/endpoint/TokenEndpoint.java +++ b/maxkey-protocols/maxkey-protocol-oauth-2.0/src/main/java/org/maxkey/authz/oauth2/provider/endpoint/TokenEndpoint.java @@ -23,6 +23,7 @@ import java.util.HashSet; import java.util.Map; import java.util.Set; +import org.maxkey.authn.SigninPrincipal; import org.maxkey.authz.oauth2.common.OAuth2AccessToken; import org.maxkey.authz.oauth2.common.exceptions.InvalidClientException; import org.maxkey.authz.oauth2.common.exceptions.InvalidGrantException; @@ -41,6 +42,7 @@ import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.authentication.InsufficientAuthenticationException; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.stereotype.Controller; import org.springframework.util.StringUtils; @@ -98,9 +100,6 @@ public class TokenEndpoint extends AbstractEndpoint { Object principal = WebContext.getAuthentication(); - if(parameters.get("code") != null) { - principal=WebContext.getAuthentication().getPrincipal(); - } if (!(principal instanceof Authentication)) { throw new InsufficientAuthenticationException( "There is no client authentication. Try adding an appropriate authentication filter."); @@ -174,6 +173,9 @@ public class TokenEndpoint extends AbstractEndpoint { // Might be a client and user combined authentication clientId = ((OAuth2Authentication) client).getOAuth2Request().getClientId(); } + if (client instanceof UsernamePasswordAuthenticationToken) { + clientId = ((SigninPrincipal)client.getPrincipal()).getUsername(); + } return clientId; } diff --git a/maxkey-protocols/maxkey-protocol-oauth-2.0/src/main/java/org/maxkey/authz/oauth2/provider/endpoint/TokenEndpointAuthenticationFilter.java b/maxkey-protocols/maxkey-protocol-oauth-2.0/src/main/java/org/maxkey/authz/oauth2/provider/endpoint/TokenEndpointAuthenticationFilter.java index 4d0273fa4..4b3633ae2 100644 --- a/maxkey-protocols/maxkey-protocol-oauth-2.0/src/main/java/org/maxkey/authz/oauth2/provider/endpoint/TokenEndpointAuthenticationFilter.java +++ b/maxkey-protocols/maxkey-protocol-oauth-2.0/src/main/java/org/maxkey/authz/oauth2/provider/endpoint/TokenEndpointAuthenticationFilter.java @@ -33,7 +33,7 @@ import javax.servlet.http.HttpServletResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.maxkey.authn.BasicAuthentication; +import org.maxkey.authn.SigninPrincipal; import org.maxkey.authz.oauth2.common.util.OAuth2Utils; import org.maxkey.authz.oauth2.provider.AuthorizationRequest; import org.maxkey.authz.oauth2.provider.OAuth2Authentication; @@ -136,8 +136,7 @@ public class TokenEndpointAuthenticationFilter implements Filter { usernamepassword(request,response); }else { Authentication authentication=ClientCredentials(request,response); - BasicAuthentication auth =new BasicAuthentication(); - auth.setUsername(((User)authentication.getPrincipal()).getUsername()); + SigninPrincipal auth =new SigninPrincipal((User)authentication.getPrincipal()); auth.setAuthenticated(true); UsernamePasswordAuthenticationToken simpleUserAuthentication = new UsernamePasswordAuthenticationToken(auth, authentication.getCredentials(), authentication.getAuthorities()); WebContext.setAuthentication(simpleUserAuthentication); diff --git a/maxkey-protocols/maxkey-protocol-oauth-2.0/src/main/java/org/maxkey/authz/oauth2/provider/userinfo/endpoint/OAuthDefaultUserInfoAdapter.java b/maxkey-protocols/maxkey-protocol-oauth-2.0/src/main/java/org/maxkey/authz/oauth2/provider/userinfo/endpoint/OAuthDefaultUserInfoAdapter.java index 1e11943fd..64690b17a 100644 --- a/maxkey-protocols/maxkey-protocol-oauth-2.0/src/main/java/org/maxkey/authz/oauth2/provider/userinfo/endpoint/OAuthDefaultUserInfoAdapter.java +++ b/maxkey-protocols/maxkey-protocol-oauth-2.0/src/main/java/org/maxkey/authz/oauth2/provider/userinfo/endpoint/OAuthDefaultUserInfoAdapter.java @@ -19,16 +19,18 @@ package org.maxkey.authz.oauth2.provider.userinfo.endpoint; import java.util.HashMap; +import org.maxkey.authn.SigninPrincipal; import org.maxkey.authz.endpoint.adapter.AbstractAuthorizeAdapter; import org.maxkey.domain.UserInfo; import org.maxkey.util.JsonUtils; import org.maxkey.util.StringGenerator; +import org.maxkey.web.WebConstants; import org.springframework.web.servlet.ModelAndView; public class OAuthDefaultUserInfoAdapter extends AbstractAuthorizeAdapter { @Override - public String generateInfo(UserInfo userInfo,Object app) { + public String generateInfo(SigninPrincipal authentication,UserInfo userInfo,Object app) { HashMap beanMap = new HashMap(); beanMap.put("randomId",(new StringGenerator()).uuidGenerate()); beanMap.put("uid", userInfo.getId()); @@ -43,6 +45,7 @@ public class OAuthDefaultUserInfoAdapter extends AbstractAuthorizeAdapter { beanMap.put("title", userInfo.getJobTitle()); beanMap.put("state", userInfo.getWorkRegion()); beanMap.put("gender", userInfo.getGender()); + beanMap.put(WebConstants.ONLINE_TICKET_NAME, authentication.getOnlineTicket().getTicketId()); String info= JsonUtils.object2Json(beanMap); diff --git a/maxkey-protocols/maxkey-protocol-oauth-2.0/src/main/java/org/maxkey/authz/oauth2/provider/userinfo/endpoint/UserInfoEndpoint.java b/maxkey-protocols/maxkey-protocol-oauth-2.0/src/main/java/org/maxkey/authz/oauth2/provider/userinfo/endpoint/UserInfoEndpoint.java index 3f7c36152..75c08452d 100644 --- a/maxkey-protocols/maxkey-protocol-oauth-2.0/src/main/java/org/maxkey/authz/oauth2/provider/userinfo/endpoint/UserInfoEndpoint.java +++ b/maxkey-protocols/maxkey-protocol-oauth-2.0/src/main/java/org/maxkey/authz/oauth2/provider/userinfo/endpoint/UserInfoEndpoint.java @@ -26,6 +26,7 @@ import java.util.UUID; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.maxkey.authn.SigninPrincipal; import org.maxkey.authz.endpoint.adapter.AbstractAuthorizeAdapter; import org.maxkey.authz.oauth2.common.exceptions.OAuth2Exception; import org.maxkey.authz.oauth2.provider.ClientDetailsService; @@ -46,7 +47,7 @@ import org.maxkey.persistence.service.UserInfoService; import org.maxkey.util.Instance; import org.maxkey.util.JsonUtils; import org.maxkey.util.StringGenerator; - +import org.maxkey.web.WebConstants; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -122,7 +123,7 @@ public class UserInfoEndpoint { try{ oAuth2Authentication = oauth20tokenServices.loadAuthentication(access_token); - principal=oAuth2Authentication.getPrincipal().toString(); + principal=((SigninPrincipal)oAuth2Authentication.getUserAuthentication().getPrincipal()).getUsername(); String client_id= oAuth2Authentication.getOAuth2Request().getClientId(); UserInfo userInfo=queryUserInfo(principal); @@ -134,8 +135,10 @@ public class UserInfoEndpoint { }else{ adapter =(AbstractAuthorizeAdapter)defaultOAuthUserInfoAdapter; } - - String jsonData=adapter.generateInfo(userInfo, app); + + String jsonData=adapter.generateInfo( + (SigninPrincipal)oAuth2Authentication.getUserAuthentication().getPrincipal(), + userInfo, app); return jsonData; }catch(OAuth2Exception e){ HashMapauthzException=new HashMap(); @@ -161,7 +164,7 @@ public class UserInfoEndpoint { try{ oAuth2Authentication = oauth20tokenServices.loadAuthentication(access_token); - principal=oAuth2Authentication.getPrincipal().toString(); + principal=((SigninPrincipal)oAuth2Authentication.getPrincipal()).getUsername(); Setscopes=oAuth2Authentication.getOAuth2Request().getScope(); ClientDetails clientDetails = clientDetailsService.loadClientByClientId(oAuth2Authentication.getOAuth2Request().getClientId()); @@ -170,8 +173,11 @@ public class UserInfoEndpoint { String userJson=""; Builder jwtClaimsSetBuilder= new JWTClaimsSet.Builder(); + SigninPrincipal authentication = (SigninPrincipal)oAuth2Authentication.getUserAuthentication().getPrincipal(); + jwtClaimsSetBuilder.claim("sub", userInfo.getId()); - + jwtClaimsSetBuilder.claim(WebConstants.ONLINE_TICKET_NAME, authentication.getOnlineTicket().getTicketId()); + if(scopes.contains("profile")){ jwtClaimsSetBuilder.claim("name", userInfo.getUsername()); jwtClaimsSetBuilder.claim("preferred_username", userInfo.getDisplayName()); diff --git a/maxkey-protocols/maxkey-protocol-saml-2.0/src/main/java/org/maxkey/authz/saml20/provider/endpoint/AssertionEndpoint.java b/maxkey-protocols/maxkey-protocol-saml-2.0/src/main/java/org/maxkey/authz/saml20/provider/endpoint/AssertionEndpoint.java index ba581fcde..d5fbf98c9 100644 --- a/maxkey-protocols/maxkey-protocol-saml-2.0/src/main/java/org/maxkey/authz/saml20/provider/endpoint/AssertionEndpoint.java +++ b/maxkey-protocols/maxkey-protocol-saml-2.0/src/main/java/org/maxkey/authz/saml20/provider/endpoint/AssertionEndpoint.java @@ -22,11 +22,14 @@ import java.util.HashMap; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.maxkey.authn.SigninPrincipal; import org.maxkey.authz.saml.common.AuthnRequestInfo; import org.maxkey.authz.saml.common.EndpointGenerator; import org.maxkey.authz.saml20.binding.BindingAdapter; import org.maxkey.authz.saml20.provider.xml.AuthnResponseGenerator; import org.maxkey.domain.apps.AppsSAML20Details; +import org.maxkey.web.WebConstants; +import org.maxkey.web.WebContext; import org.opensaml.saml2.core.Response; import org.opensaml.saml2.metadata.Endpoint; import org.opensaml.ws.message.encoder.MessageEncodingException; @@ -70,6 +73,8 @@ public class AssertionEndpoint { logger.debug("AuthnRequestInfo: {}", authnRequestInfo); HashMap attributeMap=new HashMap(); + attributeMap.put(WebConstants.ONLINE_TICKET_NAME, ((SigninPrincipal)WebContext.getAuthentication().getPrincipal()).getOnlineTicket().getTicketId()); + //saml20Details Response authResponse = authnResponseGenerator.generateAuthnResponse( saml20Details, diff --git a/maxkey-protocols/maxkey-protocol-saml-2.0/src/main/java/org/maxkey/authz/saml20/provider/xml/AssertionGenerator.java b/maxkey-protocols/maxkey-protocol-saml-2.0/src/main/java/org/maxkey/authz/saml20/provider/xml/AssertionGenerator.java index 925c6b3d1..2a0076c2f 100644 --- a/maxkey-protocols/maxkey-protocol-saml-2.0/src/main/java/org/maxkey/authz/saml20/provider/xml/AssertionGenerator.java +++ b/maxkey-protocols/maxkey-protocol-saml-2.0/src/main/java/org/maxkey/authz/saml20/provider/xml/AssertionGenerator.java @@ -85,6 +85,7 @@ public class AssertionGenerator { Assertion assertion = new AssertionBuilder().buildObject();; //Subject Subject subject = subjectGenerator.generateSubject( + saml20Details, assertionConsumerURL, inResponseTo, validInSeconds); diff --git a/maxkey-protocols/maxkey-protocol-saml-2.0/src/main/java/org/maxkey/authz/saml20/provider/xml/SubjectGenerator.java b/maxkey-protocols/maxkey-protocol-saml-2.0/src/main/java/org/maxkey/authz/saml20/provider/xml/SubjectGenerator.java index 7cd02dd7e..cf23e5965 100644 --- a/maxkey-protocols/maxkey-protocol-saml-2.0/src/main/java/org/maxkey/authz/saml20/provider/xml/SubjectGenerator.java +++ b/maxkey-protocols/maxkey-protocol-saml-2.0/src/main/java/org/maxkey/authz/saml20/provider/xml/SubjectGenerator.java @@ -19,7 +19,10 @@ package org.maxkey.authz.saml20.provider.xml; +import org.apache.commons.lang3.StringUtils; import org.maxkey.authz.saml.service.TimeService; +import org.maxkey.domain.UserInfo; +import org.maxkey.domain.apps.AppsSAML20Details; import org.maxkey.web.WebContext; import org.opensaml.saml2.core.NameID; import org.opensaml.saml2.core.NameIDType; @@ -41,12 +44,54 @@ public class SubjectGenerator { this.timeService = timeService; } - public Subject generateSubject( + public Subject generateSubject( AppsSAML20Details saml20Details, String assertionConsumerURL, String inResponseTo, int validInSeconds) { + UserInfo userInfo = WebContext.getUserInfo(); + String nameIdValue = userInfo.getUsername(); + if(saml20Details.getNameidFormat().equalsIgnoreCase("persistent")) { + + }else if(saml20Details.getNameidFormat().equalsIgnoreCase("transient")) { + + }else if(saml20Details.getNameidFormat().equalsIgnoreCase("unspecified")) { + + }else if(saml20Details.getNameidFormat().equalsIgnoreCase("emailAddress")) { + if(userInfo.getEmail()!=null && !userInfo.getEmail().equals("")) { + nameIdValue = userInfo.getEmail(); + } + }else if(saml20Details.getNameidFormat().equalsIgnoreCase("X509SubjectName")) { + + }else if(saml20Details.getNameidFormat().equalsIgnoreCase("WindowsDomainQualifiedName")) { + if(userInfo.getWindowsAccount()!=null && !userInfo.getWindowsAccount().equals("")) { + nameIdValue = userInfo.getWindowsAccount(); + } + }else if(saml20Details.getNameidFormat().equalsIgnoreCase("entity")) { + + }else if(saml20Details.getNameidFormat().equalsIgnoreCase("custom")) { + + }else if(saml20Details.getNameidFormat().equalsIgnoreCase("Mobile")) { + if(userInfo.getMobile()!=null && !userInfo.getMobile().equals("")) { + nameIdValue = userInfo.getMobile(); + } + }else if(saml20Details.getNameidFormat().equalsIgnoreCase("EmployeeNumber")) { + if(userInfo.getEmployeeNumber()!=null && !userInfo.getEmployeeNumber().equals("")) { + nameIdValue = userInfo.getEmployeeNumber(); + } + } + + if(!StringUtils.isEmpty(saml20Details.getNameIdSuffix())) { + nameIdValue = nameIdValue + saml20Details.getNameIdSuffix(); + } + + if(saml20Details.getNameIdConvert()==0) { + + }else if(saml20Details.getNameIdConvert()==1) { + nameIdValue = nameIdValue.toUpperCase(); + }else if(saml20Details.getNameIdConvert()==1) { + nameIdValue = nameIdValue.toLowerCase(); + } - String nameIdValue =WebContext.getUserInfo().getUsername(); NameID nameID =builderNameID(nameIdValue,assertionConsumerURL); Subject subject =builderSubject(nameID); diff --git a/maxkey-protocols/maxkey-protocol-tokenbased/src/main/java/org/maxkey/authz/token/endpoint/TokenBasedAuthorizeEndpoint.java b/maxkey-protocols/maxkey-protocol-tokenbased/src/main/java/org/maxkey/authz/token/endpoint/TokenBasedAuthorizeEndpoint.java index 05f340207..313aa970a 100644 --- a/maxkey-protocols/maxkey-protocol-tokenbased/src/main/java/org/maxkey/authz/token/endpoint/TokenBasedAuthorizeEndpoint.java +++ b/maxkey-protocols/maxkey-protocol-tokenbased/src/main/java/org/maxkey/authz/token/endpoint/TokenBasedAuthorizeEndpoint.java @@ -24,6 +24,7 @@ import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.maxkey.authn.SigninPrincipal; import org.maxkey.authz.endpoint.AuthorizeBaseEndpoint; import org.maxkey.authz.endpoint.adapter.AbstractAuthorizeAdapter; import org.maxkey.authz.token.endpoint.adapter.TokenBasedDefaultAdapter; @@ -82,6 +83,7 @@ public class TokenBasedAuthorizeEndpoint extends AuthorizeBaseEndpoint{ } String tokenData=adapter.generateInfo( + (SigninPrincipal)WebContext.getAuthentication().getPrincipal(), WebContext.getUserInfo(), tokenBasedDetails); @@ -117,17 +119,17 @@ public class TokenBasedAuthorizeEndpoint extends AuthorizeBaseEndpoint{ cookie.setPath("/"); // - //cookie.setDomain("."+applicationConfig.getSubDomainName()); + //cookie.setDomain("."+applicationConfig.getBaseDomainName()); //tomcat 8.5 - cookie.setDomain(applicationConfig.getDomainName()); + cookie.setDomain(applicationConfig.getBaseDomainName()); - _logger.debug("Sub Domain Name : "+"."+applicationConfig.getDomainName()); + _logger.debug("Sub Domain Name : "+"."+applicationConfig.getBaseDomainName()); response.addCookie(cookie); - if(tokenBasedDetails.getRedirectUri().indexOf(applicationConfig.getDomainName())>-1){ + if(tokenBasedDetails.getRedirectUri().indexOf(applicationConfig.getBaseDomainName())>-1){ return WebContext.redirect(tokenBasedDetails.getRedirectUri()); }else{ - _logger.error(tokenBasedDetails.getRedirectUri()+" not in domain "+applicationConfig.getDomainName()); + _logger.error(tokenBasedDetails.getRedirectUri()+" not in domain "+applicationConfig.getBaseDomainName()); return null; } } diff --git a/maxkey-protocols/maxkey-protocol-tokenbased/src/main/java/org/maxkey/authz/token/endpoint/adapter/TokenBasedDefaultAdapter.java b/maxkey-protocols/maxkey-protocol-tokenbased/src/main/java/org/maxkey/authz/token/endpoint/adapter/TokenBasedDefaultAdapter.java index 87c2233b9..ffb0f36cc 100644 --- a/maxkey-protocols/maxkey-protocol-tokenbased/src/main/java/org/maxkey/authz/token/endpoint/adapter/TokenBasedDefaultAdapter.java +++ b/maxkey-protocols/maxkey-protocol-tokenbased/src/main/java/org/maxkey/authz/token/endpoint/adapter/TokenBasedDefaultAdapter.java @@ -20,12 +20,14 @@ package org.maxkey.authz.token.endpoint.adapter; import java.util.Date; import java.util.HashMap; +import org.maxkey.authn.SigninPrincipal; import org.maxkey.authz.endpoint.adapter.AbstractAuthorizeAdapter; import org.maxkey.domain.UserInfo; import org.maxkey.domain.apps.AppsTokenBasedDetails; import org.maxkey.util.DateUtils; import org.maxkey.util.JsonUtils; import org.maxkey.util.StringGenerator; +import org.maxkey.web.WebConstants; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.servlet.ModelAndView; @@ -33,7 +35,7 @@ import org.springframework.web.servlet.ModelAndView; public class TokenBasedDefaultAdapter extends AbstractAuthorizeAdapter { final static Logger _logger = LoggerFactory.getLogger(TokenBasedDefaultAdapter.class); @Override - public String generateInfo(UserInfo userInfo,Object app) { + public String generateInfo(SigninPrincipal authentication,UserInfo userInfo,Object app) { AppsTokenBasedDetails details=(AppsTokenBasedDetails)app; HashMap beanMap=new HashMap(); @@ -70,6 +72,7 @@ public class TokenBasedDefaultAdapter extends AbstractAuthorizeAdapter { } beanMap.put("displayName", userInfo.getDisplayName()); + beanMap.put(WebConstants.ONLINE_TICKET_NAME, authentication.getOnlineTicket().getTicketId()); /* * use UTC date time format diff --git a/maxkey-protocols/maxkey-protocol-tokenbased/src/main/java/org/maxkey/authz/token/endpoint/adapter/TokenBasedJWTAdapter.java b/maxkey-protocols/maxkey-protocol-tokenbased/src/main/java/org/maxkey/authz/token/endpoint/adapter/TokenBasedJWTAdapter.java index ff890dd4f..1f46a07b7 100644 --- a/maxkey-protocols/maxkey-protocol-tokenbased/src/main/java/org/maxkey/authz/token/endpoint/adapter/TokenBasedJWTAdapter.java +++ b/maxkey-protocols/maxkey-protocol-tokenbased/src/main/java/org/maxkey/authz/token/endpoint/adapter/TokenBasedJWTAdapter.java @@ -22,12 +22,14 @@ import java.util.Date; import java.util.UUID; import org.joda.time.DateTime; +import org.maxkey.authn.SigninPrincipal; import org.maxkey.authz.endpoint.adapter.AbstractAuthorizeAdapter; import org.maxkey.configuration.oidc.OIDCProviderMetadata; import org.maxkey.crypto.jwt.signer.service.JwtSigningAndValidationService; import org.maxkey.domain.UserInfo; import org.maxkey.domain.apps.Apps; import org.maxkey.domain.apps.AppsTokenBasedDetails; +import org.maxkey.web.WebConstants; import org.maxkey.web.WebContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,7 +45,7 @@ import com.nimbusds.jwt.SignedJWT; public class TokenBasedJWTAdapter extends AbstractAuthorizeAdapter { final static Logger _logger = LoggerFactory.getLogger(TokenBasedJWTAdapter.class); @Override - public String generateInfo(UserInfo userInfo,Object app) { + public String generateInfo(SigninPrincipal authentication,UserInfo userInfo,Object app) { AppsTokenBasedDetails details=(AppsTokenBasedDetails)app; @@ -67,6 +69,7 @@ public class TokenBasedJWTAdapter extends AbstractAuthorizeAdapter { .claim("user_id", userInfo.getId()) .claim("external_id", userInfo.getId()) .claim("locale", userInfo.getLocale()) + .claim(WebConstants.ONLINE_TICKET_NAME, authentication.getOnlineTicket()) .claim("kid", jwtSignerService.getDefaultSignerKeyId()) .build(); diff --git a/maxkey-protocols/maxkey-protocol-tokenbased/src/main/java/org/maxkey/authz/token/endpoint/adapter/TokenBasedJWTHS256Adapter.java b/maxkey-protocols/maxkey-protocol-tokenbased/src/main/java/org/maxkey/authz/token/endpoint/adapter/TokenBasedJWTHS256Adapter.java index 6429a5495..358ee4441 100644 --- a/maxkey-protocols/maxkey-protocol-tokenbased/src/main/java/org/maxkey/authz/token/endpoint/adapter/TokenBasedJWTHS256Adapter.java +++ b/maxkey-protocols/maxkey-protocol-tokenbased/src/main/java/org/maxkey/authz/token/endpoint/adapter/TokenBasedJWTHS256Adapter.java @@ -22,6 +22,7 @@ import java.util.Date; import java.util.UUID; import org.joda.time.DateTime; +import org.maxkey.authn.SigninPrincipal; import org.maxkey.authz.endpoint.adapter.AbstractAuthorizeAdapter; import org.maxkey.configuration.oidc.OIDCProviderMetadata; import org.maxkey.crypto.ReciprocalUtils; @@ -30,6 +31,7 @@ import org.maxkey.crypto.jwt.signer.service.impl.SymmetricSigningAndValidationSe import org.maxkey.domain.UserInfo; import org.maxkey.domain.apps.Apps; import org.maxkey.domain.apps.AppsTokenBasedDetails; +import org.maxkey.web.WebConstants; import org.maxkey.web.WebContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -47,7 +49,7 @@ public class TokenBasedJWTHS256Adapter extends AbstractAuthorizeAdapter { private SymmetricSigningAndValidationServiceBuilder symmetricJwtSignerServiceBuilder=new SymmetricSigningAndValidationServiceBuilder(); @Override - public String generateInfo(UserInfo userInfo,Object app) { + public String generateInfo(SigninPrincipal authentication,UserInfo userInfo,Object app) { AppsTokenBasedDetails details=(AppsTokenBasedDetails)app; OIDCProviderMetadata providerMetadata= (OIDCProviderMetadata)WebContext.getBean("oidcProviderMetadata"); @@ -67,6 +69,7 @@ public class TokenBasedJWTHS256Adapter extends AbstractAuthorizeAdapter { .claim("email", userInfo.getWorkEmail()) .claim("name", userInfo.getUsername()) .claim("user_id", userInfo.getId()) + .claim(WebConstants.ONLINE_TICKET_NAME, authentication.getOnlineTicket()) .claim("external_id", userInfo.getId()) .claim("locale", userInfo.getLocale()) .claim("kid", "SYMMETRIC-KEY") diff --git a/maxkey-protocols/maxkey-protocol-tokenbased/src/main/java/org/maxkey/authz/token/endpoint/adapter/TokenBasedSimpleAdapter.java b/maxkey-protocols/maxkey-protocol-tokenbased/src/main/java/org/maxkey/authz/token/endpoint/adapter/TokenBasedSimpleAdapter.java index c1c4e5ea9..5dfaa6b91 100644 --- a/maxkey-protocols/maxkey-protocol-tokenbased/src/main/java/org/maxkey/authz/token/endpoint/adapter/TokenBasedSimpleAdapter.java +++ b/maxkey-protocols/maxkey-protocol-tokenbased/src/main/java/org/maxkey/authz/token/endpoint/adapter/TokenBasedSimpleAdapter.java @@ -19,6 +19,7 @@ package org.maxkey.authz.token.endpoint.adapter; import java.util.Date; +import org.maxkey.authn.SigninPrincipal; import org.maxkey.authz.endpoint.adapter.AbstractAuthorizeAdapter; import org.maxkey.domain.UserInfo; import org.maxkey.domain.apps.AppsTokenBasedDetails; @@ -30,7 +31,7 @@ import org.springframework.web.servlet.ModelAndView; public class TokenBasedSimpleAdapter extends AbstractAuthorizeAdapter { final static Logger _logger = LoggerFactory.getLogger(TokenBasedSimpleAdapter.class); @Override - public String generateInfo(UserInfo userInfo,Object app) { + public String generateInfo(SigninPrincipal authentication,UserInfo userInfo,Object app) { AppsTokenBasedDetails details=(AppsTokenBasedDetails)app; String tokenUsername = userInfo.getUsername(); diff --git a/maxkey-web-manage/build.gradle b/maxkey-web-manage/build.gradle index 2c4995fc8..01b4321b9 100644 --- a/maxkey-web-manage/build.gradle +++ b/maxkey-web-manage/build.gradle @@ -1,3 +1,16 @@ +buildscript { + repositories { + jcenter() + } + dependencies { + } +} + +plugins { + id 'com.google.cloud.tools.jib' version '2.6.0' + id 'org.springframework.boot' version '2.3.4.RELEASE' +} + description = "maxkey-web-manage" // Apply the java plugin to add support for Java @@ -7,13 +20,18 @@ apply plugin: 'java' //apply plugin: 'com.bmuschko.tomcat-base' //apply plugin: 'com.bmuschko.tomcat' -buildscript { - repositories { - jcenter() - } - dependencies { - //classpath "com.bmuschko:gradle-tomcat-plugin:2.2.3" - } +jib { + from { + image = 'adoptopenjdk:11-jre-openj9' + } + to { + image = "maxkey/maxkey-web-manage" + tags = ["${project.version}".toString(), 'latest'] + } + container { + jvmFlags = ['-Dfile.encoding=utf-8', '-Dserver.port=80'] + ports = ['80'] + } } dependencies { diff --git a/maxkey-web-manage/src/main/java/org/maxkey/web/contorller/GroupMemberController.java b/maxkey-web-manage/src/main/java/org/maxkey/web/contorller/GroupMemberController.java index 1db2b69ed..fba994a73 100644 --- a/maxkey-web-manage/src/main/java/org/maxkey/web/contorller/GroupMemberController.java +++ b/maxkey-web-manage/src/main/java/org/maxkey/web/contorller/GroupMemberController.java @@ -87,7 +87,7 @@ public class GroupMemberController { @ResponseBody public JpaPageResults queryMemberInGroup(@ModelAttribute("groupMember") GroupMember groupMember) { _logger.debug("groupMember : "+groupMember); - if(groupMember.getGroupId()==null||groupMember.getGroupId().equals("")||groupMember.getGroupId().equals("ALL_USER_GROUP")){ + if(groupMember.getGroupId()==null||groupMember.getGroupId().equals("")||groupMember.getGroupId().equals("ROLE_ALL_USER")){ return groupMemberService.queryPageResults("allMemberInGroup",groupMember); }else{ return groupMemberService.queryPageResults("memberInGroup",groupMember); diff --git a/maxkey-web-manage/src/main/java/org/maxkey/web/contorller/UserInfoController.java b/maxkey-web-manage/src/main/java/org/maxkey/web/contorller/UserInfoController.java index 9c28808d7..4168a0daf 100644 --- a/maxkey-web-manage/src/main/java/org/maxkey/web/contorller/UserInfoController.java +++ b/maxkey-web-manage/src/main/java/org/maxkey/web/contorller/UserInfoController.java @@ -196,116 +196,5 @@ public class UserInfoController { * @return */ - @RequestMapping(value = "/update") - public ModelAndView updateUsers(@Valid @ModelAttribute("userInfo") UserInfo userInfo, BindingResult result) { - _logger.debug(userInfo.toString()); - if (result.hasErrors()) { - // new Message(WebContext.getValidErrorText(),result); - } - _logger.info(userInfo.getExtraAttributeName()); - _logger.info(userInfo.getExtraAttributeValue()); - //userInfo.setNameZHShortSpell(StringUtils.hanYu2Pinyin(userInfo.getDisplayName(), true)); - //userInfo.setNameZHSpell(StringUtils.hanYu2Pinyin(userInfo.getDisplayName(), false)); - convertExtraAttribute(userInfo); - _logger.info(userInfo.getExtraAttribute()); - if (userInfoService.update(userInfo)) { - new Message(WebContext.getI18nValue(ConstantsOperateMessage.UPDATE_SUCCESS), userInfo, MessageType.success, OperateType.add, MessageScope.DB); - - } - new Message(WebContext.getI18nValue(ConstantsOperateMessage.UPDATE_ERROR), MessageType.error); - return WebContext.forward("forwardUpdate/" + userInfo.getId()); - } - - - - /** - * 批量删除用户 - * - * @param id - * @return - */ - @ResponseBody - @RequestMapping(value = "/batchDelete") - public Message batchDeleteUsers(@RequestParam("id") String id) { - _logger.debug(id); - if (userInfoService.batchDelete(StringUtils.string2List(id, ","))) { - return new Message(WebContext.getI18nValue(ConstantsOperateMessage.DELETE_SUCCESS), MessageType.success); - - } else { - return new Message(WebContext.getI18nValue(ConstantsOperateMessage.DELETE_ERROR), MessageType.error); - } - } - - /** - * 根据用户id删除用户 - * - * @param id - * @return - */ - @ResponseBody - @RequestMapping(value = "/delete") - public Message deleteUsersById(@RequestParam("id") String id) { - _logger.debug(id); - if (userInfoService.batchDelete(StringUtils.string2List(id, ","))) { - //provisioningPrepare.prepare(userInfo, OPERATEACTION.DELETE_ACTION); - return new Message(WebContext.getI18nValue(ConstantsOperateMessage.DELETE_SUCCESS), MessageType.success); - } else { - return new Message(WebContext.getI18nValue(ConstantsOperateMessage.DELETE_ERROR), MessageType.error); - } - } - - protected void convertExtraAttribute(UserInfo userInfo) { - if (userInfo.getExtraAttributeValue() != null) { - String[] extraAttributeLabel = userInfo.getExtraAttributeName().split(","); - String[] extraAttributeValue = userInfo.getExtraAttributeValue().split(","); - Map extraAttributeMap = new HashMap(); - for (int i = 0; i < extraAttributeLabel.length; i++) { - extraAttributeMap.put(extraAttributeLabel[i], extraAttributeValue[i]); - } - String extraAttribute = JsonUtils.object2Json(extraAttributeMap); - userInfo.setExtraAttribute(extraAttribute); - } - } - - @RequestMapping(value = {"/forwardChangePassword/{id}"}) - public ModelAndView forwardChangePassword(@PathVariable("id") String id) { - ModelAndView modelAndView = new ModelAndView("/userinfo/changePassword"); - UserInfo userInfo = userInfoService.get(id); - - modelAndView.addObject("model", userInfo); - return modelAndView; - } - - @ResponseBody - @RequestMapping(value = "/changePassword") - public Message changePassword(@ModelAttribute("userInfo") UserInfo userInfo) { - _logger.debug(userInfo.getId()); - if (userInfoService.changePassword(userInfo)) { - return new Message(WebContext.getI18nValue(ConstantsOperateMessage.UPDATE_SUCCESS), MessageType.success); - - } else { - return new Message(WebContext.getI18nValue(ConstantsOperateMessage.UPDATE_ERROR), MessageType.error); - } - } - - @InitBinder - public void binder(WebDataBinder binder) { - binder.registerCustomEditor(String.class, new PropertyEditorSupport() { - @Override - public void setAsText(String value) { - if (StringUtils.isNullOrBlank(value)) { - setValue(null); - } else { - setValue(value); - } - } - - - }); - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); - dateFormat.setLenient(false); - binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true)); - } - } diff --git a/maxkey-web-manage/src/main/java/org/maxkey/web/endpoint/LoginEndpoint.java b/maxkey-web-manage/src/main/java/org/maxkey/web/endpoint/LoginEndpoint.java index 16448b67f..8cd8efa30 100644 --- a/maxkey-web-manage/src/main/java/org/maxkey/web/endpoint/LoginEndpoint.java +++ b/maxkey-web-manage/src/main/java/org/maxkey/web/endpoint/LoginEndpoint.java @@ -21,7 +21,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.maxkey.authn.AbstractAuthenticationProvider; -import org.maxkey.authn.BasicAuthentication; +import org.maxkey.authn.LoginCredential; import org.maxkey.authn.support.jwt.JwtLoginService; import org.maxkey.authn.support.rememberme.AbstractRemeberMeService; import org.maxkey.configuration.ApplicationConfig; @@ -110,12 +110,12 @@ public class LoginEndpoint { } @RequestMapping(value={"/logon.do"}) - public ModelAndView logon(@ModelAttribute("authentication") BasicAuthentication authentication) { + public ModelAndView logon(@ModelAttribute("loginCredential") LoginCredential loginCredential) { if(WebContext.isAuthenticated()){ return WebContext.redirect("/main"); }else{ - authenticationProvider.authenticate(authentication); + authenticationProvider.authenticate(loginCredential); return WebContext.redirect("/login"); } } diff --git a/maxkey-web-manage/src/main/java/org/maxkey/web/interceptor/PermissionAdapter.java b/maxkey-web-manage/src/main/java/org/maxkey/web/interceptor/PermissionAdapter.java index 7870981eb..337e44f65 100644 --- a/maxkey-web-manage/src/main/java/org/maxkey/web/interceptor/PermissionAdapter.java +++ b/maxkey-web-manage/src/main/java/org/maxkey/web/interceptor/PermissionAdapter.java @@ -23,13 +23,13 @@ import javax.servlet.RequestDispatcher; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.maxkey.authn.SigninPrincipal; import org.maxkey.configuration.ApplicationConfig; import org.maxkey.web.WebContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.context.annotation.Configuration; import org.springframework.stereotype.Component; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; /** @@ -48,6 +48,7 @@ public class PermissionAdapter extends HandlerInterceptorAdapter { private ApplicationConfig applicationConfig; static ConcurrentHashMapnavigationsMap=null; + /* * 请求前处理 * (non-Javadoc) @@ -58,13 +59,21 @@ public class PermissionAdapter extends HandlerInterceptorAdapter { _logger.trace("PermissionAdapter preHandle"); //判断用户是否登录 - if(WebContext.getAuthentication()==null||WebContext.getAuthentication().getAuthorities()==null){//判断用户和角色,判断用户是否登录用户 - _logger.trace("No Authentication ... forward to /login"); - RequestDispatcher dispatcher = request.getRequestDispatcher("/login"); - dispatcher.forward(request, response); - return false; - } - + if(WebContext.getAuthentication()==null + ||WebContext.getAuthentication().getAuthorities()==null){//判断用户和角色,判断用户是否登录用户 + _logger.trace("No Authentication ... forward to /login"); + RequestDispatcher dispatcher = request.getRequestDispatcher("/login"); + dispatcher.forward(request, response); + return false; + } + + //非管理员用户直接注销 + if (!((SigninPrincipal) WebContext.getAuthentication().getPrincipal()).isRoleAdministrators()) { + _logger.debug("Not ADMINISTRATORS Authentication ."); + RequestDispatcher dispatcher = request.getRequestDispatcher("/logout"); + dispatcher.forward(request, response); + return false; + } boolean hasAccess=true; diff --git a/maxkey-web-manage/src/main/resources/application.properties b/maxkey-web-manage/src/main/resources/application.properties index d38371454..a29a9c02a 100644 --- a/maxkey-web-manage/src/main/resources/application.properties +++ b/maxkey-web-manage/src/main/resources/application.properties @@ -2,7 +2,7 @@ #application application.title=MaxKey application.name=MaxKey-Mgt -application.formatted-version=v2.2.0 GA +application.formatted-version=v2.3.0 GA #server config #server port server.port=9521 @@ -33,6 +33,7 @@ spring.redis.jedis.pool.max-wait=1000 spring.redis.jedis.pool.max-idle=200 spring.redis.lettuce.pool.max-active=-1 spring.redis.lettuce.pool.min-idle=0 + #mail spring.mail.default-encoding=utf-8 spring.mail.host=smtp.163.com @@ -61,7 +62,15 @@ spring.messages.encoding=UTF-8 #main spring.main.banner-mode=log spring.main.allow-bean-definition-overriding=true - +# Session store type. +spring.session.store-type=none +#spring.session.store-type=redis +# Session timeout. If a duration suffix is not specified, seconds is used. +#server.servlet.session.timeout=1800 +# Sessions flush mode. +#spring.session.redis.flush-mode=on_save +# Namespace for keys used to store sessions. +#spring.session.redis.namespace=spring:session ###########\u3010Kafka\u96c6\u7fa4\u3011########### spring.kafka.bootstrap-servers=localhost:9092 ###########\u3010\u521d\u59cb\u5316\u751f\u4ea7\u8005\u914d\u7f6e\u3011########### diff --git a/maxkey-web-manage/src/main/resources/maxkey.properties b/maxkey-web-manage/src/main/resources/maxkey.properties index cdb334e45..d3a21d1e4 100644 --- a/maxkey-web-manage/src/main/resources/maxkey.properties +++ b/maxkey-web-manage/src/main/resources/maxkey.properties @@ -2,13 +2,13 @@ # MaxKey Management ############################################################################ # domain name configuration -config.server.domain=maxkey.top -config.server.domain.sub=sso.${config.server.domain} -config.server.name=http://${config.server.domain.sub} -config.server.prefix.uri=${config.server.name}:9521/maxkey-mgt +config.server.basedomain=maxkey.top +config.server.domain=sso.${config.server.basedomain} +config.server.name=http://${config.server.domain} +config.server.uri=${config.server.name}:9521/maxkey-mgt #default.uri -config.server.default.uri=${config.server.prefix.uri}/main -config.maxkey.uri=https://${config.server.domain.sub}/maxkey +config.server.default.uri=${config.server.uri}/main +config.maxkey.uri=https://${config.server.domain}/maxkey #InMemory 0 , Redis 2 config.server.persistence=0 #identity @@ -62,7 +62,7 @@ config.saml.v20.sp.keystore=classpath\:config/samlClientKeystore.jks config.saml.v20.sp.issuing.entity.id=client.maxkey.org ############################################################################ -config.oidc.metadata.issuer=https://${config.server.domain.sub}/maxkey +config.oidc.metadata.issuer=https://${config.server.domain}/maxkey config.oidc.metadata.authorizationEndpoint=${config.server.name}/maxkey/oauth/v20/authorize config.oidc.metadata.tokenEndpoint=${config.server.name}/maxkey/oauth/v20/token config.oidc.metadata.userinfoEndpoint=${config.server.name}/maxkey/api/connect/userinfo diff --git a/maxkey-web-manage/src/main/resources/messages/message.properties b/maxkey-web-manage/src/main/resources/messages/message.properties index 4a34cebc4..a2aefdb54 100644 --- a/maxkey-web-manage/src/main/resources/messages/message.properties +++ b/maxkey-web-manage/src/main/resources/messages/message.properties @@ -6,7 +6,7 @@ global.change.language.zh=\u4e2d\u6587 global.text.welcome=\u6b22\u8fce\u60a8 global.text.manage=\u7ba1\u7406 global.text.copyright=\u7248\u6743\u6240\u6709 -global.text.copyright.content=Copyright 2018-2020 +global.text.copyright.content=Copyright 2020 global.text.copyright.license=Licensed under the Apache License, Version 2.0 global.text.logout=\u9000\u51fa global.logout.tip=\u6ce8\u9500\u6210\u529f @@ -192,6 +192,11 @@ userinfo.homeFax=\u5bb6\u5ead\u4f20\u771f userinfo.homePhoneNumber=\u5bb6\u5ead\u7535\u8bdd userinfo.homeEmail=\u5bb6\u5ead\u90ae\u7bb1 userinfo.ims=\u5373\u65f6\u901a\u8baf +userinfo.status=\u7528\u6237\u72b6\u6001 +userinfo.status.active=\u5728\u518c\u4eba\u5458 +userinfo.status.withdrawn=\u79bb\u804c\u4eba\u5458 +userinfo.status.inactive=\u505c\u85aa\u7559\u804c\u4eba\u5458 +userinfo.status.retiree=\u9000\u4f11\u4eba\u5458 userinfo.authnType=\u767b\u5f55\u65b9\u5f0f userinfo.authnType.authnType.1=\u666e\u901a\u767b\u5f55 @@ -275,6 +280,11 @@ apps.visible.all=\u6240\u6709\u7528\u6237 apps.visible.internet=\u5185\u90e8\u7528\u6237 apps.visible.intranet=\u5916\u90e8\u7528\u6237 apps.loginUrl=\u767b\u5f55\u5730\u5740 +apps.logoutUrl=\u6ce8\u9500\u5730\u5740 +apps.logoutType=\u6ce8\u9500\u65b9\u5f0f +apps.logoutType.none=\u65e0 +apps.logoutType.back_channel=\u540e\u53f0 +apps.logoutType.front_channel=\u524d\u53f0 apps.credential=\u51ed\u8bc1\u7c7b\u578b apps.credential.user-defined=\u7528\u6237\u81ea\u5b9a\u4e49 apps.credential.shared=\u5e94\u7528\u5171\u4eab diff --git a/maxkey-web-manage/src/main/resources/messages/message_en.properties b/maxkey-web-manage/src/main/resources/messages/message_en.properties index 14cf45677..8f8962726 100644 --- a/maxkey-web-manage/src/main/resources/messages/message_en.properties +++ b/maxkey-web-manage/src/main/resources/messages/message_en.properties @@ -6,7 +6,7 @@ global.change.language.zh=\u4e2d\u6587 global.text.welcome=Welcome global.text.manage=Manage global.text.copyright=CopyRight -global.text.copyright.content=Copyright 2018-2020 +global.text.copyright.content=Copyright 2020 global.text.copyright.license=Licensed under the Apache License, Version 2.0 global.text.logout=Logout global.logout.tip=Logout Tip @@ -192,6 +192,11 @@ userinfo.homeFax=homeFax userinfo.homePhoneNumber=homePhoneNumber userinfo.homeEmail=homeEmail userinfo.ims=IMS +userinfo.status=userStatus +userinfo.status.active=active +userinfo.status.withdrawn=withdrawn +userinfo.status.inactive=inactive +userinfo.status.retiree=retiree userinfo.authnType=AuthenticationType userinfo.authnType.authnType.1=General login @@ -275,6 +280,11 @@ apps.visible.all=All apps.visible.internet=Internet apps.visible.intranet=Intranet apps.loginUrl=loginUrl +apps.logoutUrl=logoutUrl +apps.logoutType=logoutType +apps.logoutType.none=NONE +apps.logoutType.back_channel=BACK_CHANNEL +apps.logoutType.front_channel=FRONT_CHANNEL apps.credential=credential apps.credential.user-defined=user-defined apps.credential.shared=shared diff --git a/maxkey-web-manage/src/main/resources/messages/message_zh_CN.properties b/maxkey-web-manage/src/main/resources/messages/message_zh_CN.properties index 4a34cebc4..a2aefdb54 100644 --- a/maxkey-web-manage/src/main/resources/messages/message_zh_CN.properties +++ b/maxkey-web-manage/src/main/resources/messages/message_zh_CN.properties @@ -6,7 +6,7 @@ global.change.language.zh=\u4e2d\u6587 global.text.welcome=\u6b22\u8fce\u60a8 global.text.manage=\u7ba1\u7406 global.text.copyright=\u7248\u6743\u6240\u6709 -global.text.copyright.content=Copyright 2018-2020 +global.text.copyright.content=Copyright 2020 global.text.copyright.license=Licensed under the Apache License, Version 2.0 global.text.logout=\u9000\u51fa global.logout.tip=\u6ce8\u9500\u6210\u529f @@ -192,6 +192,11 @@ userinfo.homeFax=\u5bb6\u5ead\u4f20\u771f userinfo.homePhoneNumber=\u5bb6\u5ead\u7535\u8bdd userinfo.homeEmail=\u5bb6\u5ead\u90ae\u7bb1 userinfo.ims=\u5373\u65f6\u901a\u8baf +userinfo.status=\u7528\u6237\u72b6\u6001 +userinfo.status.active=\u5728\u518c\u4eba\u5458 +userinfo.status.withdrawn=\u79bb\u804c\u4eba\u5458 +userinfo.status.inactive=\u505c\u85aa\u7559\u804c\u4eba\u5458 +userinfo.status.retiree=\u9000\u4f11\u4eba\u5458 userinfo.authnType=\u767b\u5f55\u65b9\u5f0f userinfo.authnType.authnType.1=\u666e\u901a\u767b\u5f55 @@ -275,6 +280,11 @@ apps.visible.all=\u6240\u6709\u7528\u6237 apps.visible.internet=\u5185\u90e8\u7528\u6237 apps.visible.intranet=\u5916\u90e8\u7528\u6237 apps.loginUrl=\u767b\u5f55\u5730\u5740 +apps.logoutUrl=\u6ce8\u9500\u5730\u5740 +apps.logoutType=\u6ce8\u9500\u65b9\u5f0f +apps.logoutType.none=\u65e0 +apps.logoutType.back_channel=\u540e\u53f0 +apps.logoutType.front_channel=\u524d\u53f0 apps.credential=\u51ed\u8bc1\u7c7b\u578b apps.credential.user-defined=\u7528\u6237\u81ea\u5b9a\u4e49 apps.credential.shared=\u5e94\u7528\u5171\u4eab diff --git a/maxkey-web-manage/src/main/resources/templates/views/apps/appAddCommon.ftl b/maxkey-web-manage/src/main/resources/templates/views/apps/appAddCommon.ftl index 7294b9786..bd3260f5d 100644 --- a/maxkey-web-manage/src/main/resources/templates/views/apps/appAddCommon.ftl +++ b/maxkey-web-manage/src/main/resources/templates/views/apps/appAddCommon.ftl @@ -29,6 +29,20 @@ + + <@locale code="apps.logoutUrl"/>: + + + + <@locale code="apps.logoutType"/> + + + + <@locale code="apps.protocol"/>: diff --git a/maxkey-web-manage/src/main/resources/templates/views/apps/appUpdateCommon.ftl b/maxkey-web-manage/src/main/resources/templates/views/apps/appUpdateCommon.ftl index 10dbd0346..09bebb1c6 100644 --- a/maxkey-web-manage/src/main/resources/templates/views/apps/appUpdateCommon.ftl +++ b/maxkey-web-manage/src/main/resources/templates/views/apps/appUpdateCommon.ftl @@ -29,6 +29,20 @@ + + <@locale code="apps.logoutUrl"/>: + + + + <@locale code="apps.logoutType"/> + + + + <@locale code="apps.protocol"/>: diff --git a/maxkey-web-manage/src/main/resources/templates/views/apps/basic/appUpdate.ftl b/maxkey-web-manage/src/main/resources/templates/views/apps/basic/appUpdate.ftl index 56b63a9e1..a50a9bfa5 100644 --- a/maxkey-web-manage/src/main/resources/templates/views/apps/basic/appUpdate.ftl +++ b/maxkey-web-manage/src/main/resources/templates/views/apps/basic/appUpdate.ftl @@ -4,6 +4,7 @@ <#include "../../layout/header.ftl"/> <#include "../../layout/common.cssjs.ftl"/> <#include "../appCommonHead.ftl"/> + <#setting number_format="#">
<#include "../../layout/header.ftl"/> <#include "../../layout/common.cssjs.ftl"/> + <#setting number_format="#"> + + + + + + + + + + + + + + + + + + + + + + + + + +
<@locale code="userinfo.displayName" /> : + + + +
<@locale code="userinfo.username" /> : + + +
<@locale code="userinfo.status" />: + +
+ + "/> + +
+
+ + \ No newline at end of file diff --git a/maxkey-web-manage/src/main/resources/templates/views/userinfo/userAdd.ftl b/maxkey-web-manage/src/main/resources/templates/views/userinfo/userAdd.ftl index 877ecaa38..8bf02a700 100644 --- a/maxkey-web-manage/src/main/resources/templates/views/userinfo/userAdd.ftl +++ b/maxkey-web-manage/src/main/resources/templates/views/userinfo/userAdd.ftl @@ -51,7 +51,8 @@ <@locale code="userinfo.username" />: - + + <@locale code="login.text.password" />: diff --git a/maxkey-web-manage/src/main/resources/templates/views/userinfo/userUpdate.ftl b/maxkey-web-manage/src/main/resources/templates/views/userinfo/userUpdate.ftl index 279ab0e9d..7ed13697e 100644 --- a/maxkey-web-manage/src/main/resources/templates/views/userinfo/userUpdate.ftl +++ b/maxkey-web-manage/src/main/resources/templates/views/userinfo/userUpdate.ftl @@ -64,15 +64,15 @@ @@ -127,8 +127,8 @@ <@locale code="userinfo.gender" />: <@locale code="userinfo.birthDate" />: @@ -146,126 +146,125 @@ <@locale code="userinfo.preferredLanguage" />: <@locale code="userinfo.timeZone" />: @@ -390,11 +389,11 @@ <@locale code="userinfo.idtype" />: @@ -409,11 +408,11 @@ <@locale code="userinfo.married" />: <@locale code="userinfo.startWorkDate" />: diff --git a/maxkey-web-manage/src/main/resources/templates/views/userinfo/usersList.ftl b/maxkey-web-manage/src/main/resources/templates/views/userinfo/usersList.ftl index 80c5de74a..51d83e67f 100644 --- a/maxkey-web-manage/src/main/resources/templates/views/userinfo/usersList.ftl +++ b/maxkey-web-manage/src/main/resources/templates/views/userinfo/usersList.ftl @@ -136,9 +136,13 @@ $(function () { } );//end tree - $("#changepwdBtn").on("click",function(){ - $("#changepwdBtnHidden").attr("wurl","<@base/>/userinfo/forwardChangePassword/"+$.dataGridSelRowsData("#datagrid")[0].id); - $("#changepwdBtnHidden").click(); + $("#changepwdBtn").on("click",function(){ + if($.dataGridSelRowsData("#datagrid")[0]==null){ + $.alert({content:$.platform.messages.select.alertText}); + return; + } + $("#changepwdBtnHidden").attr("wurl","<@base/>/userinfo/forwardChangePassword/"+$.dataGridSelRowsData("#datagrid")[0].id); + $("#changepwdBtnHidden").click(); }); }); diff --git a/maxkey-web-maxkey/build.gradle b/maxkey-web-maxkey/build.gradle index c07b84378..e85e69277 100644 --- a/maxkey-web-maxkey/build.gradle +++ b/maxkey-web-maxkey/build.gradle @@ -1,3 +1,16 @@ +buildscript { + repositories { + jcenter() + } + dependencies { + } +} + +plugins { + id 'com.google.cloud.tools.jib' version '2.6.0' + id 'org.springframework.boot' version '2.3.4.RELEASE' +} + description = "maxkey-web-maxkey" // Apply the java plugin to add support for Java @@ -7,15 +20,21 @@ apply plugin: 'java' //apply plugin: 'com.bmuschko.tomcat-base' //apply plugin: 'com.bmuschko.tomcat' -buildscript { - repositories { - jcenter() - } - dependencies { - //classpath "com.bmuschko:gradle-tomcat-plugin:2.2.3" - } +jib { + from { + image = 'adoptopenjdk:11-jre-openj9' + } + to { + image = "maxkey/maxkey-web-maxkey" + tags = ["${project.version}".toString(), 'latest'] + } + container { + jvmFlags = ['-Dfile.encoding=utf-8', '-Dserver.port=80'] + ports = ['80'] + } } -dependencies { + +dependencies { compile project(":maxkey-core") compile project(":maxkey-persistence") diff --git a/maxkey-web-maxkey/src/main/java/org/maxkey/MaxKeyMvcConfig.java b/maxkey-web-maxkey/src/main/java/org/maxkey/MaxKeyMvcConfig.java index 798bf2edb..db1732049 100644 --- a/maxkey-web-maxkey/src/main/java/org/maxkey/MaxKeyMvcConfig.java +++ b/maxkey-web-maxkey/src/main/java/org/maxkey/MaxKeyMvcConfig.java @@ -41,6 +41,7 @@ import org.springframework.web.servlet.i18n.LocaleChangeInterceptor; @PropertySource(ConstantsProperties.maxKeyPropertySource) public class MaxKeyMvcConfig implements WebMvcConfigurer { private static final Logger _logger = LoggerFactory.getLogger(MaxKeyMvcConfig.class); + @Autowired PermissionAdapter permissionAdapter; @@ -119,6 +120,10 @@ public class MaxKeyMvcConfig implements WebMvcConfigurer { //OAuth .addPathPatterns("/oauth/v20/authorize") .addPathPatterns("/oauth/v20/authorize/*") + + //online ticket Validate + .excludePathPatterns("/onlineticket/ticketValidate") + .excludePathPatterns("/onlineticket/ticketValidate/*") ; _logger.debug("add PermissionAdapter"); diff --git a/maxkey-web-maxkey/src/main/java/org/maxkey/autoconfigure/CasAutoConfiguration.java b/maxkey-web-maxkey/src/main/java/org/maxkey/autoconfigure/CasAutoConfiguration.java index dfe2b45a0..1210939de 100644 --- a/maxkey-web-maxkey/src/main/java/org/maxkey/autoconfigure/CasAutoConfiguration.java +++ b/maxkey-web-maxkey/src/main/java/org/maxkey/autoconfigure/CasAutoConfiguration.java @@ -19,10 +19,10 @@ package org.maxkey.autoconfigure; import org.maxkey.authz.cas.endpoint.ticket.service.InMemoryTicketGrantingTicketServices; import org.maxkey.authz.cas.endpoint.ticket.service.InMemoryTicketServices; -import org.maxkey.authz.cas.endpoint.ticket.service.JdbcTicketServices; import org.maxkey.authz.cas.endpoint.ticket.service.RedisTicketGrantingTicketServices; import org.maxkey.authz.cas.endpoint.ticket.service.RedisTicketServices; import org.maxkey.authz.cas.endpoint.ticket.service.TicketServices; +import org.maxkey.constants.ConstantsPersistence; import org.maxkey.constants.ConstantsProperties; import org.maxkey.persistence.redis.RedisConnectionFactory; import org.slf4j.Logger; @@ -54,16 +54,16 @@ public class CasAutoConfiguration implements InitializingBean { @Value("${config.server.persistence}") int persistence, @Value("${config.login.remeberme.validity}") int validity, JdbcTemplate jdbcTemplate, - RedisConnectionFactory jedisConnectionFactory) { + RedisConnectionFactory redisConnFactory) { TicketServices casTicketServices = null; - if (persistence == 0) { + if (persistence == ConstantsPersistence.INMEMORY) { casTicketServices = new InMemoryTicketServices(); _logger.debug("InMemoryTicketServices"); - } else if (persistence == 1) { - casTicketServices = new JdbcTicketServices(jdbcTemplate); - _logger.debug("JdbcTicketServices"); - } else if (persistence == 2) { - casTicketServices = new RedisTicketServices(jedisConnectionFactory); + } else if (persistence == ConstantsPersistence.JDBC) { + //casTicketServices = new JdbcTicketServices(jdbcTemplate); + _logger.debug("JdbcTicketServices not support "); + } else if (persistence == ConstantsPersistence.REDIS) { + casTicketServices = new RedisTicketServices(redisConnFactory); _logger.debug("RedisTicketServices"); } return casTicketServices; @@ -80,17 +80,17 @@ public class CasAutoConfiguration implements InitializingBean { @Value("${config.server.persistence}") int persistence, @Value("${config.login.remeberme.validity}") int validity, JdbcTemplate jdbcTemplate, - RedisConnectionFactory jedisConnectionFactory) { + RedisConnectionFactory redisConnFactory) { TicketServices casTicketServices = null; - if (persistence == 0) { + if (persistence == ConstantsPersistence.INMEMORY) { casTicketServices = new InMemoryTicketGrantingTicketServices(); _logger.debug("InMemoryTicketGrantingTicketServices"); - } else if (persistence == 1) { + } else if (persistence == ConstantsPersistence.JDBC) { // - //casTicketServices = new JdbcTicketServices(jdbcTemplate); - _logger.debug("JdbcTicketServices not support "); - } else if (persistence == 2) { - casTicketServices = new RedisTicketGrantingTicketServices(jedisConnectionFactory); + //casTicketServices = new JdbcTicketGrantingTicketServices(jdbcTemplate); + _logger.debug("JdbcTicketGrantingTicketServices not support "); + } else if (persistence == ConstantsPersistence.REDIS) { + casTicketServices = new RedisTicketGrantingTicketServices(redisConnFactory); _logger.debug("RedisTicketServices"); } return casTicketServices; diff --git a/maxkey-web-maxkey/src/main/java/org/maxkey/autoconfigure/Oauth20AutoConfiguration.java b/maxkey-web-maxkey/src/main/java/org/maxkey/autoconfigure/Oauth20AutoConfiguration.java index 8652cf34b..277f1d5b2 100644 --- a/maxkey-web-maxkey/src/main/java/org/maxkey/autoconfigure/Oauth20AutoConfiguration.java +++ b/maxkey-web-maxkey/src/main/java/org/maxkey/autoconfigure/Oauth20AutoConfiguration.java @@ -34,18 +34,17 @@ import org.maxkey.authz.oauth2.provider.client.ClientDetailsUserDetailsService; import org.maxkey.authz.oauth2.provider.client.JdbcClientDetailsService; import org.maxkey.authz.oauth2.provider.code.AuthorizationCodeServices; import org.maxkey.authz.oauth2.provider.code.InMemoryAuthorizationCodeServices; -import org.maxkey.authz.oauth2.provider.code.JdbcAuthorizationCodeServices; import org.maxkey.authz.oauth2.provider.code.RedisAuthorizationCodeServices; import org.maxkey.authz.oauth2.provider.endpoint.TokenEndpointAuthenticationFilter; import org.maxkey.authz.oauth2.provider.request.DefaultOAuth2RequestFactory; import org.maxkey.authz.oauth2.provider.token.TokenStore; import org.maxkey.authz.oauth2.provider.token.DefaultTokenServices; import org.maxkey.authz.oauth2.provider.token.store.InMemoryTokenStore; -import org.maxkey.authz.oauth2.provider.token.store.JdbcTokenStore; import org.maxkey.authz.oauth2.provider.token.store.JwtAccessTokenConverter; import org.maxkey.authz.oauth2.provider.token.store.RedisTokenStore; import org.maxkey.authz.oidc.idtoken.OIDCIdTokenEnhancer; import org.maxkey.configuration.oidc.OIDCProviderMetadataDetails; +import org.maxkey.constants.ConstantsPersistence; import org.maxkey.constants.ConstantsProperties; import org.maxkey.crypto.jose.keystore.JWKSetKeyStore; import org.maxkey.crypto.jwt.encryption.service.impl.DefaultJwtEncryptionAndDecryptionService; @@ -107,7 +106,7 @@ public class Oauth20AutoConfiguration implements InitializingBean { URI tokenEndpoint, @Value("${config.oidc.metadata.userinfoEndpoint}") URI userinfoEndpoint) { - _logger.debug("RedisConnectionFactory init ."); + _logger.debug("OIDCProviderMetadataDetails init ."); OIDCProviderMetadataDetails oidcProviderMetadata = new OIDCProviderMetadataDetails(); oidcProviderMetadata.setIssuer(issuer); oidcProviderMetadata.setAuthorizationEndpoint(authorizationEndpoint); @@ -213,16 +212,16 @@ public class Oauth20AutoConfiguration implements InitializingBean { public AuthorizationCodeServices oauth20AuthorizationCodeServices( @Value("${config.server.persistence}") int persistence, JdbcTemplate jdbcTemplate, - RedisConnectionFactory jedisConnectionFactory) { + RedisConnectionFactory redisConnFactory) { AuthorizationCodeServices authorizationCodeServices = null; - if (persistence == 0) { + if (persistence == ConstantsPersistence.INMEMORY) { authorizationCodeServices = new InMemoryAuthorizationCodeServices(); _logger.debug("InMemoryAuthorizationCodeServices"); - } else if (persistence == 1) { - authorizationCodeServices = new JdbcAuthorizationCodeServices(jdbcTemplate); - _logger.debug("JdbcAuthorizationCodeServices"); - } else if (persistence == 2) { - authorizationCodeServices = new RedisAuthorizationCodeServices(jedisConnectionFactory); + } else if (persistence == ConstantsPersistence.JDBC) { + //authorizationCodeServices = new JdbcAuthorizationCodeServices(jdbcTemplate); + _logger.debug("JdbcAuthorizationCodeServices not support "); + } else if (persistence == ConstantsPersistence.REDIS) { + authorizationCodeServices = new RedisAuthorizationCodeServices(redisConnFactory); _logger.debug("RedisAuthorizationCodeServices"); } return authorizationCodeServices; @@ -237,16 +236,16 @@ public class Oauth20AutoConfiguration implements InitializingBean { public TokenStore oauth20TokenStore( @Value("${config.server.persistence}") int persistence, JdbcTemplate jdbcTemplate, - RedisConnectionFactory jedisConnectionFactory) { + RedisConnectionFactory redisConnFactory) { TokenStore tokenStore = null; - if (persistence == 0) { + if (persistence == ConstantsPersistence.INMEMORY) { tokenStore = new InMemoryTokenStore(); _logger.debug("InMemoryTokenStore"); - } else if (persistence == 1) { - tokenStore = new JdbcTokenStore(jdbcTemplate); - _logger.debug("JdbcTokenStore"); - } else if (persistence == 2) { - tokenStore = new RedisTokenStore(jedisConnectionFactory); + } else if (persistence == ConstantsPersistence.JDBC) { + //tokenStore = new JdbcTokenStore(jdbcTemplate); + _logger.debug("JdbcTokenStore not support "); + } else if (persistence == ConstantsPersistence.REDIS) { + tokenStore = new RedisTokenStore(redisConnFactory); _logger.debug("RedisTokenStore"); } return tokenStore; diff --git a/maxkey-web-maxkey/src/main/java/org/maxkey/web/contorller/AppListController.java b/maxkey-web-maxkey/src/main/java/org/maxkey/web/contorller/AppListController.java index 278f797f2..ee5c52197 100644 --- a/maxkey-web-maxkey/src/main/java/org/maxkey/web/contorller/AppListController.java +++ b/maxkey-web-maxkey/src/main/java/org/maxkey/web/contorller/AppListController.java @@ -17,6 +17,7 @@ package org.maxkey.web.contorller; +import java.security.Principal; import java.util.List; import org.maxkey.constants.ConstantsOperateMessage; import org.maxkey.constants.ConstantsProtocols; @@ -67,7 +68,7 @@ public class AppListController { */ @RequestMapping(value = { "/appList" }) public ModelAndView appList( - @RequestParam(value = "gridList", required = false) String gridList) { + @RequestParam(value = "gridList", required = false) String gridList,Principal principal) { ModelAndView modelAndView = new ModelAndView("main/appList"); userInfoService.updateGridList(gridList); modelAndView.addObject("appList", queryAccessableApps()); diff --git a/maxkey-web-maxkey/src/main/java/org/maxkey/web/contorller/SafeController.java b/maxkey-web-maxkey/src/main/java/org/maxkey/web/contorller/SafeController.java index c85a53a73..197c8ff1a 100644 --- a/maxkey-web-maxkey/src/main/java/org/maxkey/web/contorller/SafeController.java +++ b/maxkey-web-maxkey/src/main/java/org/maxkey/web/contorller/SafeController.java @@ -176,7 +176,7 @@ public class SafeController { userInfo.setEmail(email); userInfo.setTheme(theme); - WebContext.setCookie(response, WebConstants.THEME_COOKIE_NAME, theme, ConstantsTimeInterval.ONE_WEEK); + WebContext.setCookie(response,null, WebConstants.THEME_COOKIE_NAME, theme, ConstantsTimeInterval.ONE_WEEK); userInfoService.changeEmail(userInfo); diff --git a/maxkey-web-maxkey/src/main/java/org/maxkey/web/endpoint/LoginEndpoint.java b/maxkey-web-maxkey/src/main/java/org/maxkey/web/endpoint/LoginEndpoint.java index c6fc47ed2..f7940da63 100644 --- a/maxkey-web-maxkey/src/main/java/org/maxkey/web/endpoint/LoginEndpoint.java +++ b/maxkey-web-maxkey/src/main/java/org/maxkey/web/endpoint/LoginEndpoint.java @@ -25,18 +25,20 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.maxkey.authn.AbstractAuthenticationProvider; -import org.maxkey.authn.BasicAuthentication; +import org.maxkey.authn.LoginCredential; import org.maxkey.authn.support.kerberos.KerberosService; import org.maxkey.authn.support.rememberme.AbstractRemeberMeService; import org.maxkey.authn.support.socialsignon.service.SocialSignOnProviderService; import org.maxkey.authn.support.wsfederation.WsFederationConstants; import org.maxkey.configuration.ApplicationConfig; +import org.maxkey.constants.ConstantsStatus; import org.maxkey.crypto.password.opt.AbstractOptAuthn; import org.maxkey.domain.UserInfo; import org.maxkey.persistence.service.UserInfoService; import org.maxkey.util.StringUtils; import org.maxkey.web.WebConstants; import org.maxkey.web.WebContext; +import org.maxkey.web.message.Message; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -182,9 +184,9 @@ public class LoginEndpoint { public ModelAndView logon( HttpServletRequest request, HttpServletResponse response, - @ModelAttribute("authentication") BasicAuthentication authentication) throws ServletException, IOException { + @ModelAttribute("loginCredential") LoginCredential loginCredential) throws ServletException, IOException { - authenticationProvider.authenticate(authentication); + authenticationProvider.authenticate(loginCredential); if (WebContext.isAuthenticated()) { return WebContext.redirect("/forwardindex"); @@ -222,4 +224,51 @@ public class LoginEndpoint { return "fail"; } + + /** + * view register + * @return + */ + @RequestMapping(value={"/register"}) + public ModelAndView register(HttpServletRequest request,HttpServletResponse response) { + + _logger.debug("LoginController /register."); + ModelAndView modelAndView = new ModelAndView("registration/register"); + Object loginErrorMessage=WebContext.getAttribute(WebConstants.LOGIN_ERROR_SESSION_MESSAGE); + modelAndView.addObject("loginErrorMessage", loginErrorMessage==null?"":loginErrorMessage); + WebContext.removeAttribute(WebConstants.LOGIN_ERROR_SESSION_MESSAGE); + return modelAndView; + } + + @RequestMapping(value={"/registeron"}) + @ResponseBody + public Message registeron(UserInfo userInfo,@RequestParam String emailMobile) throws ServletException, IOException { + if(StringUtils.isNullOrBlank(emailMobile)) { + return new Message(WebContext.getI18nValue("register.emailMobile.error"),"1"); + } + if(StringUtils.isValidEmail(emailMobile)) { + userInfo.setEmail(emailMobile); + } + if(StringUtils.isValidMobileNo(emailMobile)) { + userInfo.setMobile(emailMobile); + } + if(!(StringUtils.isValidEmail(emailMobile)||StringUtils.isValidMobileNo(emailMobile))) { + return new Message(WebContext.getI18nValue("register.emailMobile.error"),"1"); + } + UserInfo temp=userInfoService.queryUserInfoByEmailMobile(emailMobile); + if(temp!=null) { + return new Message(WebContext.getI18nValue("register.emailMobile.exist"),"1"); + } + + temp=userInfoService.loadByUsername(userInfo.getUsername()); + if(temp!=null) { + return new Message(WebContext.getI18nValue("register.user.error"),"1"); + } + userInfo.setStatus(ConstantsStatus.ACTIVE); + if(userInfoService.insert(userInfo)) { + return new Message(WebContext.getI18nValue("login.text.register.success"),"0"); + } + return new Message(WebContext.getI18nValue("login.text.register.error"),"1"); + + } } diff --git a/maxkey-web-maxkey/src/main/java/org/maxkey/web/endpoint/LogoutEndpoint.java b/maxkey-web-maxkey/src/main/java/org/maxkey/web/endpoint/LogoutEndpoint.java index 031cb20a4..2b1b867b5 100644 --- a/maxkey-web-maxkey/src/main/java/org/maxkey/web/endpoint/LogoutEndpoint.java +++ b/maxkey-web-maxkey/src/main/java/org/maxkey/web/endpoint/LogoutEndpoint.java @@ -17,11 +17,23 @@ package org.maxkey.web.endpoint; +import java.util.Iterator; +import java.util.Set; +import java.util.Map.Entry; + import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; - +import org.maxkey.authn.SigninPrincipal; +import org.maxkey.authn.online.OnlineTicket; +import org.maxkey.authn.online.OnlineTicketServices; import org.maxkey.authn.realm.AbstractAuthenticationRealm; +import org.maxkey.authz.singlelogout.SamlSingleLogout; +import org.maxkey.authz.singlelogout.DefaultSingleLogout; +import org.maxkey.authz.singlelogout.LogoutType; +import org.maxkey.authz.singlelogout.SingleLogout; import org.maxkey.configuration.ApplicationConfig; +import org.maxkey.constants.ConstantsProtocols; +import org.maxkey.domain.apps.Apps; import org.maxkey.web.WebConstants; import org.maxkey.web.WebContext; import org.slf4j.Logger; @@ -49,6 +61,10 @@ public class LogoutEndpoint { @Autowired ApplicationConfig applicationConfig; + @Autowired + @Qualifier("onlineTicketServices") + protected OnlineTicketServices onlineTicketServices; + @RequestMapping(value={"/logout"}) public ModelAndView logout( HttpServletRequest request, @@ -81,11 +97,37 @@ public class LogoutEndpoint { } } + //not start with http or https + if(reLoginUrl!=null && !reLoginUrl.toLowerCase().startsWith("http")) { + reLoginUrl=WebContext.getHttpContextPath()+"/"+reLoginUrl; + } + _logger.debug("re Login URL : "+ reLoginUrl); modelAndView.addObject("reloginUrl",reLoginUrl); + String onlineTicketId = ((SigninPrincipal)WebContext.getAuthentication().getPrincipal()).getOnlineTicket().getTicketId(); + OnlineTicket onlineTicket = onlineTicketServices.get(onlineTicketId); + + Set> entrySet = onlineTicket.getAuthorizedApps().entrySet(); + + Iterator> iterator = entrySet.iterator(); + while (iterator.hasNext()) { + Entry mapEntry = iterator.next(); + _logger.debug("App Id : "+ mapEntry.getKey()+ " , " +mapEntry.getValue()); + if( mapEntry.getValue().getLogoutType() == LogoutType.BACK_CHANNEL){ + SingleLogout singleLogout; + if(mapEntry.getValue().getProtocol().equalsIgnoreCase(ConstantsProtocols.CAS)) { + singleLogout =new SamlSingleLogout(); + }else { + singleLogout = new DefaultSingleLogout(); + } + singleLogout.sendRequest(onlineTicket.getAuthentication(), mapEntry.getValue()); + } + } + onlineTicketServices.remove(onlineTicketId); request.getSession().invalidate(); SecurityContextHolder.clearContext(); + modelAndView.setViewName(viewName); return modelAndView; } diff --git a/maxkey-web-maxkey/src/main/java/org/maxkey/web/interceptor/HistoryLoginAppAdapter.java b/maxkey-web-maxkey/src/main/java/org/maxkey/web/interceptor/HistoryLoginAppAdapter.java index 1e6d0f1ce..dabf42c60 100644 --- a/maxkey-web-maxkey/src/main/java/org/maxkey/web/interceptor/HistoryLoginAppAdapter.java +++ b/maxkey-web-maxkey/src/main/java/org/maxkey/web/interceptor/HistoryLoginAppAdapter.java @@ -19,6 +19,8 @@ package org.maxkey.web.interceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; + +import org.maxkey.authn.SigninPrincipal; import org.maxkey.authz.endpoint.AuthorizeBaseEndpoint; import org.maxkey.domain.HistoryLoginApps; import org.maxkey.domain.UserInfo; @@ -31,6 +33,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.stereotype.Component; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; @@ -46,6 +50,28 @@ public class HistoryLoginAppAdapter extends HandlerInterceptorAdapter { @Qualifier("appsService") protected AppsService appsService; + /** + * 判断应用访问权限 + */ + @Override + public boolean preHandle(HttpServletRequest request, + HttpServletResponse response, Object handler) + throws Exception { + _logger.debug("preHandle"); + final Apps app = (Apps)WebContext.getAttribute(AuthorizeBaseEndpoint.class.getName()); + Authentication authentication = WebContext.getAuthentication(); + if(authentication.getPrincipal() instanceof SigninPrincipal) { + SigninPrincipal signinPrincipal = (SigninPrincipal)authentication.getPrincipal() ; + if(signinPrincipal.getGrantedAuthorityApps().contains(new SimpleGrantedAuthority(app.getId()))) { + _logger.trace("preHandle have authority access " + app); + return true; + } + } + _logger.debug("preHandle not have authority access " + app); + return false; + } + + /** * postHandle . * @see org.springframework.web.servlet.handler.HandlerInterceptorAdapter#preHandle( diff --git a/maxkey-web-maxkey/src/main/java/org/maxkey/web/interceptor/PermissionAdapter.java b/maxkey-web-maxkey/src/main/java/org/maxkey/web/interceptor/PermissionAdapter.java index 44af6fd74..56d5fd007 100644 --- a/maxkey-web-maxkey/src/main/java/org/maxkey/web/interceptor/PermissionAdapter.java +++ b/maxkey-web-maxkey/src/main/java/org/maxkey/web/interceptor/PermissionAdapter.java @@ -23,6 +23,9 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.maxkey.authn.SavedRequestAwareAuthenticationSuccessHandler; +import org.maxkey.authn.SigninPrincipal; +import org.maxkey.authn.online.OnlineTicket; +import org.maxkey.authn.online.OnlineTicketServices; import org.maxkey.configuration.ApplicationConfig; import org.maxkey.constants.ConstantsPasswordSetType; import org.maxkey.web.WebConstants; @@ -31,6 +34,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.security.core.Authentication; import org.springframework.security.web.savedrequest.HttpSessionRequestCache; import org.springframework.security.web.savedrequest.RequestCache; import org.springframework.security.web.savedrequest.SavedRequest; @@ -57,6 +61,10 @@ public class PermissionAdapter extends HandlerInterceptorAdapter { SavedRequestAwareAuthenticationSuccessHandler savedRequestSuccessHandler; static ConcurrentHashMap navigationsMap = null; + + @Autowired + @Qualifier("onlineTicketServices") + protected OnlineTicketServices onlineTicketServices; /* * 请求前处理 (non-Javadoc) @@ -96,11 +104,12 @@ public class PermissionAdapter extends HandlerInterceptorAdapter { } } + Authentication authentication = WebContext.getAuthentication(); //save first protected url SavedRequest firstSavedRequest = (SavedRequest)WebContext.getAttribute(WebConstants.FIRST_SAVED_REQUEST_PARAMETER); // 判断用户是否登录, 判断用户和角色,判断用户是否登录用户 - if (WebContext.getAuthentication() == null - || WebContext.getAuthentication().getAuthorities() == null) { + if (authentication == null + || authentication.getAuthorities() == null) { //保存未认证的请求信息 if(firstSavedRequest==null){ RequestCache requestCache = new HttpSessionRequestCache(); @@ -119,14 +128,20 @@ public class PermissionAdapter extends HandlerInterceptorAdapter { return false; } + //认证完成,跳转到未认证请求 if(firstSavedRequest!=null) { - savedRequestSuccessHandler.onAuthenticationSuccess(request, response, WebContext.getAuthentication()); + savedRequestSuccessHandler.onAuthenticationSuccess(request, response, authentication); WebContext.removeAttribute(WebConstants.FIRST_SAVED_REQUEST_PARAMETER); } boolean hasAccess = true; - + + if(authentication.getPrincipal() instanceof SigninPrincipal) { + SigninPrincipal signinPrincipal = (SigninPrincipal)authentication.getPrincipal(); + OnlineTicket onlineTicket = signinPrincipal.getOnlineTicket(); + onlineTicketServices.refresh(onlineTicket.getTicketId()); + } /* * boolean preHandler = super.preHandle(request, response, handler); * diff --git a/maxkey-web-maxkey/src/main/resources/application.properties b/maxkey-web-maxkey/src/main/resources/application.properties index 19283591a..be21d463b 100644 --- a/maxkey-web-maxkey/src/main/resources/application.properties +++ b/maxkey-web-maxkey/src/main/resources/application.properties @@ -2,26 +2,29 @@ #application application.title=MaxKey application.name=MaxKey -application.formatted-version=v2.2.0 GA -#server config -#spring.profiles.active=dev +application.formatted-version=v2.3.0 GA + #server port #server.port=80 server.port=443 + #ssl server.ssl.key-store=maxkeyserver.keystore server.ssl.key-alias=maxkey server.ssl.enabled=true server.ssl.key-store-password=maxkey server.ssl.key-store-type=JKS + #web app context path server.servlet.context-path=/maxkey spring.servlet.multipart.enabled=true spring.servlet.multipart.max-file-size=4194304 + #encoding #server.servlet.encoding.charset=UTF-8 #server.servlet.encoding.enabled=true #server.servlet.encoding.force=true + #datasource spring.datasource.username=root spring.datasource.password=maxkey @@ -32,6 +35,7 @@ spring.datasource.type=com.alibaba.druid.pool.DruidDataSource mybatis.type-aliases-package=org.maxkey.domain,org.maxkey.domain.apps, mybatis.mapper-locations=classpath*:/org/maxkey/persistence/mapper/xml/mysql/*.xml mybatis.table-column-escape=true + #redis spring.redis.host=127.0.0.1 spring.redis.port=6379 @@ -41,6 +45,7 @@ spring.redis.jedis.pool.max-wait=1000 spring.redis.jedis.pool.max-idle=200 spring.redis.lettuce.pool.max-active=-1 spring.redis.lettuce.pool.min-idle=0 + #mail spring.mail.default-encoding=utf-8 spring.mail.host=smtp.163.com @@ -52,6 +57,7 @@ spring.mail.properties.ssl=true spring.mail.properties.sender=maxkey@163.com spring.mail.properties.mailotp.message.subject=MaxKey One Time PassWord spring.mail.properties.mailotp.message.template={0} You Token is {1} , it validity in {2} minutes. + #for freemarker spring.freemarker.template-loader-path=classpath:/templates/views spring.freemarker.cache=false @@ -62,13 +68,25 @@ spring.freemarker.expose-request-attributes=false spring.freemarker.expose-session-attributes=false spring.freemarker.request-context-attribute=request spring.freemarker.suffix=.ftl + #static resources spring.mvc.static-path-pattern=/static/** spring.messages.basename=classpath:messages/message spring.messages.encoding=UTF-8 + #main spring.main.banner-mode=log spring.main.allow-bean-definition-overriding=true + +# Session store type. +spring.session.store-type=none +#spring.session.store-type=redis +# Session timeout. If a duration suffix is not specified, seconds is used. +#server.servlet.session.timeout=1800 +# Sessions flush mode. +#spring.session.redis.flush-mode=on_save +# Namespace for keys used to store sessions. +#spring.session.redis.namespace=spring:session ###########\u3010Kafka\u96c6\u7fa4\u3011########### spring.kafka.bootstrap-servers=localhost:9092 diff --git a/maxkey-web-maxkey/src/main/resources/maxkey.properties b/maxkey-web-maxkey/src/main/resources/maxkey.properties index f975af854..dea771bd1 100644 --- a/maxkey-web-maxkey/src/main/resources/maxkey.properties +++ b/maxkey-web-maxkey/src/main/resources/maxkey.properties @@ -2,12 +2,12 @@ # MaxKey ############################################################################ # domain name configuration -config.server.domain=maxkey.top -config.server.domain.sub=sso.${config.server.domain} -config.server.name=https://${config.server.domain.sub} -config.server.prefix.uri=${config.server.name}/maxkey +config.server.basedomain=maxkey.top +config.server.domain=sso.${config.server.basedomain} +config.server.name=https://${config.server.domain} +config.server.uri=${config.server.name}/maxkey #default.uri -config.server.default.uri=${config.server.prefix.uri}/maxkey/appList +config.server.default.uri=${config.server.uri}/maxkey/appList config.server.management.uri=${config.server.name}:9521/maxkey-mgt/login #InMemory 0 , Redis 2 config.server.persistence=0 diff --git a/maxkey-web-maxkey/src/main/resources/messages/message.properties b/maxkey-web-maxkey/src/main/resources/messages/message.properties index 9d0d30b0e..b61220633 100644 --- a/maxkey-web-maxkey/src/main/resources/messages/message.properties +++ b/maxkey-web-maxkey/src/main/resources/messages/message.properties @@ -6,7 +6,7 @@ global.change.language.zh=\u4e2d\u6587 global.text.welcome=\u6b22\u8fce\u60a8 global.text.manage=\u7ba1\u7406 global.text.copyright=\u7248\u6743\u6240\u6709 -global.text.copyright.content=Copyright 2018-2020 +global.text.copyright.content=Copyright 2020 global.text.copyright.license=Licensed under the Apache License, Version 2.0 global.text.logout=\u9000\u51fa global.logout.tip=\u6ce8\u9500\u6210\u529f @@ -53,6 +53,12 @@ login.button.login=\u767b\u5f55 login.text.currenttime=\u65f6    \u95f4 login.text.otherlogins=\u5176\u4ed6\u767b\u5f55\u65b9\u5f0f login.text.register=\u7528\u6237\u6ce8\u518c +login.text.register.success=\u6ce8\u518c\u6210\u529f +login.text.register.error=\u6ce8\u518c\u5931\u8d25 + +register.user.error=\u767b\u9646\u8d26\u53f7\u5df2\u5b58\u5728 +register.emailMobile.error=\u90ae\u7bb1\u6216\u624b\u673a\u683c\u5f0f\u9519\u8bef +register.emailMobile.exist=\u90ae\u7bb1\u6216\u624b\u673a\u5df2\u5b58\u5728 login.password.expired=\u5bc6\u7801\u8fc7\u671f login.password.expired.tip=\u5bc6\u7801\u8fc7\u671f\uff0c\u8bf7\u4fee\u6539\u5bc6\u7801 diff --git a/maxkey-web-maxkey/src/main/resources/messages/message_en.properties b/maxkey-web-maxkey/src/main/resources/messages/message_en.properties index 26d34fdf7..643a13a52 100644 --- a/maxkey-web-maxkey/src/main/resources/messages/message_en.properties +++ b/maxkey-web-maxkey/src/main/resources/messages/message_en.properties @@ -6,7 +6,7 @@ global.change.language.zh=\u4e2d\u6587 global.text.welcome=Welcome global.text.manage=Manage global.text.copyright=CopyRight -global.text.copyright.content=Copyright 2018-2020 +global.text.copyright.content=Copyright 2020 global.text.copyright.license=Licensed under the Apache License, Version 2.0 global.text.logout=Logout global.logout.tip=Tip @@ -53,6 +53,11 @@ login.button.login=Login login.text.currenttime=CurrentTime login.text.otherlogins=OtherLogins login.text.register=Register +login.text.register.success=Register successful +login.text.register.error=Register error +register.user.error=username exist +register.emailMobile.error=email or mobile error +register.emailMobile.exist=email or mobile exist login.password.expired=Password Expired login.password.expired.tip=Password expired, please change password diff --git a/maxkey-web-maxkey/src/main/resources/messages/message_zh_CN.properties b/maxkey-web-maxkey/src/main/resources/messages/message_zh_CN.properties index 9d0d30b0e..b61220633 100644 --- a/maxkey-web-maxkey/src/main/resources/messages/message_zh_CN.properties +++ b/maxkey-web-maxkey/src/main/resources/messages/message_zh_CN.properties @@ -6,7 +6,7 @@ global.change.language.zh=\u4e2d\u6587 global.text.welcome=\u6b22\u8fce\u60a8 global.text.manage=\u7ba1\u7406 global.text.copyright=\u7248\u6743\u6240\u6709 -global.text.copyright.content=Copyright 2018-2020 +global.text.copyright.content=Copyright 2020 global.text.copyright.license=Licensed under the Apache License, Version 2.0 global.text.logout=\u9000\u51fa global.logout.tip=\u6ce8\u9500\u6210\u529f @@ -53,6 +53,12 @@ login.button.login=\u767b\u5f55 login.text.currenttime=\u65f6    \u95f4 login.text.otherlogins=\u5176\u4ed6\u767b\u5f55\u65b9\u5f0f login.text.register=\u7528\u6237\u6ce8\u518c +login.text.register.success=\u6ce8\u518c\u6210\u529f +login.text.register.error=\u6ce8\u518c\u5931\u8d25 + +register.user.error=\u767b\u9646\u8d26\u53f7\u5df2\u5b58\u5728 +register.emailMobile.error=\u90ae\u7bb1\u6216\u624b\u673a\u683c\u5f0f\u9519\u8bef +register.emailMobile.exist=\u90ae\u7bb1\u6216\u624b\u673a\u5df2\u5b58\u5728 login.password.expired=\u5bc6\u7801\u8fc7\u671f login.password.expired.tip=\u5bc6\u7801\u8fc7\u671f\uff0c\u8bf7\u4fee\u6539\u5bc6\u7801 diff --git a/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/HELP-US-OUT.txt b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/HELP-US-OUT.txt new file mode 100644 index 000000000..83d083dd7 --- /dev/null +++ b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/HELP-US-OUT.txt @@ -0,0 +1,7 @@ +I hope you love Font Awesome. If you've found it useful, please do me a favor and check out my latest project, +Fort Awesome (https://fortawesome.com). It makes it easy to put the perfect icons on your website. Choose from our awesome, +comprehensive icon sets or copy and paste your own. + +Please. Check it out. + +-Dave Gandy diff --git a/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/css/font-awesome.css b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/css/font-awesome.css new file mode 100644 index 000000000..ee906a819 --- /dev/null +++ b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/css/font-awesome.css @@ -0,0 +1,2337 @@ +/*! + * Font Awesome 4.7.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.7.0'); + src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.7.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 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); +} +.fa-rotate-180 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; + -webkit-transform: rotate(180deg); + -ms-transform: rotate(180deg); + transform: rotate(180deg); +} +.fa-rotate-270 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; + -webkit-transform: rotate(270deg); + -ms-transform: rotate(270deg); + transform: rotate(270deg); +} +.fa-flip-horizontal { + -ms-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 { + -ms-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-pp: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-resistance: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: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"; +} +.fa-gitlab:before { + content: "\f296"; +} +.fa-wpbeginner:before { + content: "\f297"; +} +.fa-wpforms:before { + content: "\f298"; +} +.fa-envira:before { + content: "\f299"; +} +.fa-universal-access:before { + content: "\f29a"; +} +.fa-wheelchair-alt:before { + content: "\f29b"; +} +.fa-question-circle-o:before { + content: "\f29c"; +} +.fa-blind:before { + content: "\f29d"; +} +.fa-audio-description:before { + content: "\f29e"; +} +.fa-volume-control-phone:before { + content: "\f2a0"; +} +.fa-braille:before { + content: "\f2a1"; +} +.fa-assistive-listening-systems:before { + content: "\f2a2"; +} +.fa-asl-interpreting:before, +.fa-american-sign-language-interpreting:before { + content: "\f2a3"; +} +.fa-deafness:before, +.fa-hard-of-hearing:before, +.fa-deaf:before { + content: "\f2a4"; +} +.fa-glide:before { + content: "\f2a5"; +} +.fa-glide-g:before { + content: "\f2a6"; +} +.fa-signing:before, +.fa-sign-language:before { + content: "\f2a7"; +} +.fa-low-vision:before { + content: "\f2a8"; +} +.fa-viadeo:before { + content: "\f2a9"; +} +.fa-viadeo-square:before { + content: "\f2aa"; +} +.fa-snapchat:before { + content: "\f2ab"; +} +.fa-snapchat-ghost:before { + content: "\f2ac"; +} +.fa-snapchat-square:before { + content: "\f2ad"; +} +.fa-pied-piper:before { + content: "\f2ae"; +} +.fa-first-order:before { + content: "\f2b0"; +} +.fa-yoast:before { + content: "\f2b1"; +} +.fa-themeisle:before { + content: "\f2b2"; +} +.fa-google-plus-circle:before, +.fa-google-plus-official:before { + content: "\f2b3"; +} +.fa-fa:before, +.fa-font-awesome:before { + content: "\f2b4"; +} +.fa-handshake-o:before { + content: "\f2b5"; +} +.fa-envelope-open:before { + content: "\f2b6"; +} +.fa-envelope-open-o:before { + content: "\f2b7"; +} +.fa-linode:before { + content: "\f2b8"; +} +.fa-address-book:before { + content: "\f2b9"; +} +.fa-address-book-o:before { + content: "\f2ba"; +} +.fa-vcard:before, +.fa-address-card:before { + content: "\f2bb"; +} +.fa-vcard-o:before, +.fa-address-card-o:before { + content: "\f2bc"; +} +.fa-user-circle:before { + content: "\f2bd"; +} +.fa-user-circle-o:before { + content: "\f2be"; +} +.fa-user-o:before { + content: "\f2c0"; +} +.fa-id-badge:before { + content: "\f2c1"; +} +.fa-drivers-license:before, +.fa-id-card:before { + content: "\f2c2"; +} +.fa-drivers-license-o:before, +.fa-id-card-o:before { + content: "\f2c3"; +} +.fa-quora:before { + content: "\f2c4"; +} +.fa-free-code-camp:before { + content: "\f2c5"; +} +.fa-telegram:before { + content: "\f2c6"; +} +.fa-thermometer-4:before, +.fa-thermometer:before, +.fa-thermometer-full:before { + content: "\f2c7"; +} +.fa-thermometer-3:before, +.fa-thermometer-three-quarters:before { + content: "\f2c8"; +} +.fa-thermometer-2:before, +.fa-thermometer-half:before { + content: "\f2c9"; +} +.fa-thermometer-1:before, +.fa-thermometer-quarter:before { + content: "\f2ca"; +} +.fa-thermometer-0:before, +.fa-thermometer-empty:before { + content: "\f2cb"; +} +.fa-shower:before { + content: "\f2cc"; +} +.fa-bathtub:before, +.fa-s15:before, +.fa-bath:before { + content: "\f2cd"; +} +.fa-podcast:before { + content: "\f2ce"; +} +.fa-window-maximize:before { + content: "\f2d0"; +} +.fa-window-minimize:before { + content: "\f2d1"; +} +.fa-window-restore:before { + content: "\f2d2"; +} +.fa-times-rectangle:before, +.fa-window-close:before { + content: "\f2d3"; +} +.fa-times-rectangle-o:before, +.fa-window-close-o:before { + content: "\f2d4"; +} +.fa-bandcamp:before { + content: "\f2d5"; +} +.fa-grav:before { + content: "\f2d6"; +} +.fa-etsy:before { + content: "\f2d7"; +} +.fa-imdb:before { + content: "\f2d8"; +} +.fa-ravelry:before { + content: "\f2d9"; +} +.fa-eercast:before { + content: "\f2da"; +} +.fa-microchip:before { + content: "\f2db"; +} +.fa-snowflake-o:before { + content: "\f2dc"; +} +.fa-superpowers:before { + content: "\f2dd"; +} +.fa-wpexplorer:before { + content: "\f2de"; +} +.fa-meetup:before { + content: "\f2e0"; +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} +.sr-only-focusable:active, +.sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; +} diff --git a/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/css/font-awesome.min.css b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/css/font-awesome.min.css new file mode 100644 index 000000000..540440ce8 --- /dev/null +++ b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/css/font-awesome.min.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.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}.fa-lg{font-size:1.33333333em;line-height:.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:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;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}.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{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-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{-ms-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:#fff}.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-pp: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-resistance: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: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"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} diff --git a/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/fonts/FontAwesome.otf b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/fonts/FontAwesome.otf new file mode 100644 index 000000000..401ec0f36 Binary files /dev/null and b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/fonts/FontAwesome.otf differ diff --git a/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/fonts/fontawesome-webfont.eot b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/fonts/fontawesome-webfont.eot new file mode 100644 index 000000000..e9f60ca95 Binary files /dev/null and b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/fonts/fontawesome-webfont.eot differ diff --git a/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/fonts/fontawesome-webfont.svg b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/fonts/fontawesome-webfont.svg new file mode 100644 index 000000000..855c845e5 --- /dev/null +++ b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/fonts/fontawesome-webfont.ttf b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/fonts/fontawesome-webfont.ttf new file mode 100644 index 000000000..35acda2fa Binary files /dev/null and b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/fonts/fontawesome-webfont.ttf differ diff --git a/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/fonts/fontawesome-webfont.woff b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/fonts/fontawesome-webfont.woff new file mode 100644 index 000000000..400014a4b Binary files /dev/null and b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/fonts/fontawesome-webfont.woff differ diff --git a/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/fonts/fontawesome-webfont.woff2 b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/fonts/fontawesome-webfont.woff2 new file mode 100644 index 000000000..4d13fc604 Binary files /dev/null and b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/fonts/fontawesome-webfont.woff2 differ diff --git a/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/less/animated.less b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/less/animated.less new file mode 100644 index 000000000..66ad52a5b --- /dev/null +++ b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/less/animated.less @@ -0,0 +1,34 @@ +// Animated Icons +// -------------------------- + +.@{fa-css-prefix}-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; +} + +.@{fa-css-prefix}-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); + } +} diff --git a/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/less/bordered-pulled.less b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/less/bordered-pulled.less new file mode 100644 index 000000000..f1c8ad75f --- /dev/null +++ b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/less/bordered-pulled.less @@ -0,0 +1,25 @@ +// Bordered & Pulled +// ------------------------- + +.@{fa-css-prefix}-border { + padding: .2em .25em .15em; + border: solid .08em @fa-border-color; + border-radius: .1em; +} + +.@{fa-css-prefix}-pull-left { float: left; } +.@{fa-css-prefix}-pull-right { float: right; } + +.@{fa-css-prefix} { + &.@{fa-css-prefix}-pull-left { margin-right: .3em; } + &.@{fa-css-prefix}-pull-right { margin-left: .3em; } +} + +/* Deprecated as of 4.4.0 */ +.pull-right { float: right; } +.pull-left { float: left; } + +.@{fa-css-prefix} { + &.pull-left { margin-right: .3em; } + &.pull-right { margin-left: .3em; } +} diff --git a/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/less/core.less b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/less/core.less new file mode 100644 index 000000000..c577ac84a --- /dev/null +++ b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/less/core.less @@ -0,0 +1,12 @@ +// Base Class Definition +// ------------------------- + +.@{fa-css-prefix} { + display: inline-block; + font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration + font-size: inherit; // can't have font-size inherit on line above, so need to override + text-rendering: auto; // optimizelegibility throws things off #1094 + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + +} diff --git a/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/less/fixed-width.less b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/less/fixed-width.less new file mode 100644 index 000000000..110289f2f --- /dev/null +++ b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/less/fixed-width.less @@ -0,0 +1,6 @@ +// Fixed Width Icons +// ------------------------- +.@{fa-css-prefix}-fw { + width: (18em / 14); + text-align: center; +} diff --git a/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/less/font-awesome.less b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/less/font-awesome.less new file mode 100644 index 000000000..c3677def3 --- /dev/null +++ b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/less/font-awesome.less @@ -0,0 +1,18 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ + +@import "variables.less"; +@import "mixins.less"; +@import "path.less"; +@import "core.less"; +@import "larger.less"; +@import "fixed-width.less"; +@import "list.less"; +@import "bordered-pulled.less"; +@import "animated.less"; +@import "rotated-flipped.less"; +@import "stacked.less"; +@import "icons.less"; +@import "screen-reader.less"; diff --git a/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/less/icons.less b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/less/icons.less new file mode 100644 index 000000000..159d60042 --- /dev/null +++ b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/less/icons.less @@ -0,0 +1,789 @@ +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ + +.@{fa-css-prefix}-glass:before { content: @fa-var-glass; } +.@{fa-css-prefix}-music:before { content: @fa-var-music; } +.@{fa-css-prefix}-search:before { content: @fa-var-search; } +.@{fa-css-prefix}-envelope-o:before { content: @fa-var-envelope-o; } +.@{fa-css-prefix}-heart:before { content: @fa-var-heart; } +.@{fa-css-prefix}-star:before { content: @fa-var-star; } +.@{fa-css-prefix}-star-o:before { content: @fa-var-star-o; } +.@{fa-css-prefix}-user:before { content: @fa-var-user; } +.@{fa-css-prefix}-film:before { content: @fa-var-film; } +.@{fa-css-prefix}-th-large:before { content: @fa-var-th-large; } +.@{fa-css-prefix}-th:before { content: @fa-var-th; } +.@{fa-css-prefix}-th-list:before { content: @fa-var-th-list; } +.@{fa-css-prefix}-check:before { content: @fa-var-check; } +.@{fa-css-prefix}-remove:before, +.@{fa-css-prefix}-close:before, +.@{fa-css-prefix}-times:before { content: @fa-var-times; } +.@{fa-css-prefix}-search-plus:before { content: @fa-var-search-plus; } +.@{fa-css-prefix}-search-minus:before { content: @fa-var-search-minus; } +.@{fa-css-prefix}-power-off:before { content: @fa-var-power-off; } +.@{fa-css-prefix}-signal:before { content: @fa-var-signal; } +.@{fa-css-prefix}-gear:before, +.@{fa-css-prefix}-cog:before { content: @fa-var-cog; } +.@{fa-css-prefix}-trash-o:before { content: @fa-var-trash-o; } +.@{fa-css-prefix}-home:before { content: @fa-var-home; } +.@{fa-css-prefix}-file-o:before { content: @fa-var-file-o; } +.@{fa-css-prefix}-clock-o:before { content: @fa-var-clock-o; } +.@{fa-css-prefix}-road:before { content: @fa-var-road; } +.@{fa-css-prefix}-download:before { content: @fa-var-download; } +.@{fa-css-prefix}-arrow-circle-o-down:before { content: @fa-var-arrow-circle-o-down; } +.@{fa-css-prefix}-arrow-circle-o-up:before { content: @fa-var-arrow-circle-o-up; } +.@{fa-css-prefix}-inbox:before { content: @fa-var-inbox; } +.@{fa-css-prefix}-play-circle-o:before { content: @fa-var-play-circle-o; } +.@{fa-css-prefix}-rotate-right:before, +.@{fa-css-prefix}-repeat:before { content: @fa-var-repeat; } +.@{fa-css-prefix}-refresh:before { content: @fa-var-refresh; } +.@{fa-css-prefix}-list-alt:before { content: @fa-var-list-alt; } +.@{fa-css-prefix}-lock:before { content: @fa-var-lock; } +.@{fa-css-prefix}-flag:before { content: @fa-var-flag; } +.@{fa-css-prefix}-headphones:before { content: @fa-var-headphones; } +.@{fa-css-prefix}-volume-off:before { content: @fa-var-volume-off; } +.@{fa-css-prefix}-volume-down:before { content: @fa-var-volume-down; } +.@{fa-css-prefix}-volume-up:before { content: @fa-var-volume-up; } +.@{fa-css-prefix}-qrcode:before { content: @fa-var-qrcode; } +.@{fa-css-prefix}-barcode:before { content: @fa-var-barcode; } +.@{fa-css-prefix}-tag:before { content: @fa-var-tag; } +.@{fa-css-prefix}-tags:before { content: @fa-var-tags; } +.@{fa-css-prefix}-book:before { content: @fa-var-book; } +.@{fa-css-prefix}-bookmark:before { content: @fa-var-bookmark; } +.@{fa-css-prefix}-print:before { content: @fa-var-print; } +.@{fa-css-prefix}-camera:before { content: @fa-var-camera; } +.@{fa-css-prefix}-font:before { content: @fa-var-font; } +.@{fa-css-prefix}-bold:before { content: @fa-var-bold; } +.@{fa-css-prefix}-italic:before { content: @fa-var-italic; } +.@{fa-css-prefix}-text-height:before { content: @fa-var-text-height; } +.@{fa-css-prefix}-text-width:before { content: @fa-var-text-width; } +.@{fa-css-prefix}-align-left:before { content: @fa-var-align-left; } +.@{fa-css-prefix}-align-center:before { content: @fa-var-align-center; } +.@{fa-css-prefix}-align-right:before { content: @fa-var-align-right; } +.@{fa-css-prefix}-align-justify:before { content: @fa-var-align-justify; } +.@{fa-css-prefix}-list:before { content: @fa-var-list; } +.@{fa-css-prefix}-dedent:before, +.@{fa-css-prefix}-outdent:before { content: @fa-var-outdent; } +.@{fa-css-prefix}-indent:before { content: @fa-var-indent; } +.@{fa-css-prefix}-video-camera:before { content: @fa-var-video-camera; } +.@{fa-css-prefix}-photo:before, +.@{fa-css-prefix}-image:before, +.@{fa-css-prefix}-picture-o:before { content: @fa-var-picture-o; } +.@{fa-css-prefix}-pencil:before { content: @fa-var-pencil; } +.@{fa-css-prefix}-map-marker:before { content: @fa-var-map-marker; } +.@{fa-css-prefix}-adjust:before { content: @fa-var-adjust; } +.@{fa-css-prefix}-tint:before { content: @fa-var-tint; } +.@{fa-css-prefix}-edit:before, +.@{fa-css-prefix}-pencil-square-o:before { content: @fa-var-pencil-square-o; } +.@{fa-css-prefix}-share-square-o:before { content: @fa-var-share-square-o; } +.@{fa-css-prefix}-check-square-o:before { content: @fa-var-check-square-o; } +.@{fa-css-prefix}-arrows:before { content: @fa-var-arrows; } +.@{fa-css-prefix}-step-backward:before { content: @fa-var-step-backward; } +.@{fa-css-prefix}-fast-backward:before { content: @fa-var-fast-backward; } +.@{fa-css-prefix}-backward:before { content: @fa-var-backward; } +.@{fa-css-prefix}-play:before { content: @fa-var-play; } +.@{fa-css-prefix}-pause:before { content: @fa-var-pause; } +.@{fa-css-prefix}-stop:before { content: @fa-var-stop; } +.@{fa-css-prefix}-forward:before { content: @fa-var-forward; } +.@{fa-css-prefix}-fast-forward:before { content: @fa-var-fast-forward; } +.@{fa-css-prefix}-step-forward:before { content: @fa-var-step-forward; } +.@{fa-css-prefix}-eject:before { content: @fa-var-eject; } +.@{fa-css-prefix}-chevron-left:before { content: @fa-var-chevron-left; } +.@{fa-css-prefix}-chevron-right:before { content: @fa-var-chevron-right; } +.@{fa-css-prefix}-plus-circle:before { content: @fa-var-plus-circle; } +.@{fa-css-prefix}-minus-circle:before { content: @fa-var-minus-circle; } +.@{fa-css-prefix}-times-circle:before { content: @fa-var-times-circle; } +.@{fa-css-prefix}-check-circle:before { content: @fa-var-check-circle; } +.@{fa-css-prefix}-question-circle:before { content: @fa-var-question-circle; } +.@{fa-css-prefix}-info-circle:before { content: @fa-var-info-circle; } +.@{fa-css-prefix}-crosshairs:before { content: @fa-var-crosshairs; } +.@{fa-css-prefix}-times-circle-o:before { content: @fa-var-times-circle-o; } +.@{fa-css-prefix}-check-circle-o:before { content: @fa-var-check-circle-o; } +.@{fa-css-prefix}-ban:before { content: @fa-var-ban; } +.@{fa-css-prefix}-arrow-left:before { content: @fa-var-arrow-left; } +.@{fa-css-prefix}-arrow-right:before { content: @fa-var-arrow-right; } +.@{fa-css-prefix}-arrow-up:before { content: @fa-var-arrow-up; } +.@{fa-css-prefix}-arrow-down:before { content: @fa-var-arrow-down; } +.@{fa-css-prefix}-mail-forward:before, +.@{fa-css-prefix}-share:before { content: @fa-var-share; } +.@{fa-css-prefix}-expand:before { content: @fa-var-expand; } +.@{fa-css-prefix}-compress:before { content: @fa-var-compress; } +.@{fa-css-prefix}-plus:before { content: @fa-var-plus; } +.@{fa-css-prefix}-minus:before { content: @fa-var-minus; } +.@{fa-css-prefix}-asterisk:before { content: @fa-var-asterisk; } +.@{fa-css-prefix}-exclamation-circle:before { content: @fa-var-exclamation-circle; } +.@{fa-css-prefix}-gift:before { content: @fa-var-gift; } +.@{fa-css-prefix}-leaf:before { content: @fa-var-leaf; } +.@{fa-css-prefix}-fire:before { content: @fa-var-fire; } +.@{fa-css-prefix}-eye:before { content: @fa-var-eye; } +.@{fa-css-prefix}-eye-slash:before { content: @fa-var-eye-slash; } +.@{fa-css-prefix}-warning:before, +.@{fa-css-prefix}-exclamation-triangle:before { content: @fa-var-exclamation-triangle; } +.@{fa-css-prefix}-plane:before { content: @fa-var-plane; } +.@{fa-css-prefix}-calendar:before { content: @fa-var-calendar; } +.@{fa-css-prefix}-random:before { content: @fa-var-random; } +.@{fa-css-prefix}-comment:before { content: @fa-var-comment; } +.@{fa-css-prefix}-magnet:before { content: @fa-var-magnet; } +.@{fa-css-prefix}-chevron-up:before { content: @fa-var-chevron-up; } +.@{fa-css-prefix}-chevron-down:before { content: @fa-var-chevron-down; } +.@{fa-css-prefix}-retweet:before { content: @fa-var-retweet; } +.@{fa-css-prefix}-shopping-cart:before { content: @fa-var-shopping-cart; } +.@{fa-css-prefix}-folder:before { content: @fa-var-folder; } +.@{fa-css-prefix}-folder-open:before { content: @fa-var-folder-open; } +.@{fa-css-prefix}-arrows-v:before { content: @fa-var-arrows-v; } +.@{fa-css-prefix}-arrows-h:before { content: @fa-var-arrows-h; } +.@{fa-css-prefix}-bar-chart-o:before, +.@{fa-css-prefix}-bar-chart:before { content: @fa-var-bar-chart; } +.@{fa-css-prefix}-twitter-square:before { content: @fa-var-twitter-square; } +.@{fa-css-prefix}-facebook-square:before { content: @fa-var-facebook-square; } +.@{fa-css-prefix}-camera-retro:before { content: @fa-var-camera-retro; } +.@{fa-css-prefix}-key:before { content: @fa-var-key; } +.@{fa-css-prefix}-gears:before, +.@{fa-css-prefix}-cogs:before { content: @fa-var-cogs; } +.@{fa-css-prefix}-comments:before { content: @fa-var-comments; } +.@{fa-css-prefix}-thumbs-o-up:before { content: @fa-var-thumbs-o-up; } +.@{fa-css-prefix}-thumbs-o-down:before { content: @fa-var-thumbs-o-down; } +.@{fa-css-prefix}-star-half:before { content: @fa-var-star-half; } +.@{fa-css-prefix}-heart-o:before { content: @fa-var-heart-o; } +.@{fa-css-prefix}-sign-out:before { content: @fa-var-sign-out; } +.@{fa-css-prefix}-linkedin-square:before { content: @fa-var-linkedin-square; } +.@{fa-css-prefix}-thumb-tack:before { content: @fa-var-thumb-tack; } +.@{fa-css-prefix}-external-link:before { content: @fa-var-external-link; } +.@{fa-css-prefix}-sign-in:before { content: @fa-var-sign-in; } +.@{fa-css-prefix}-trophy:before { content: @fa-var-trophy; } +.@{fa-css-prefix}-github-square:before { content: @fa-var-github-square; } +.@{fa-css-prefix}-upload:before { content: @fa-var-upload; } +.@{fa-css-prefix}-lemon-o:before { content: @fa-var-lemon-o; } +.@{fa-css-prefix}-phone:before { content: @fa-var-phone; } +.@{fa-css-prefix}-square-o:before { content: @fa-var-square-o; } +.@{fa-css-prefix}-bookmark-o:before { content: @fa-var-bookmark-o; } +.@{fa-css-prefix}-phone-square:before { content: @fa-var-phone-square; } +.@{fa-css-prefix}-twitter:before { content: @fa-var-twitter; } +.@{fa-css-prefix}-facebook-f:before, +.@{fa-css-prefix}-facebook:before { content: @fa-var-facebook; } +.@{fa-css-prefix}-github:before { content: @fa-var-github; } +.@{fa-css-prefix}-unlock:before { content: @fa-var-unlock; } +.@{fa-css-prefix}-credit-card:before { content: @fa-var-credit-card; } +.@{fa-css-prefix}-feed:before, +.@{fa-css-prefix}-rss:before { content: @fa-var-rss; } +.@{fa-css-prefix}-hdd-o:before { content: @fa-var-hdd-o; } +.@{fa-css-prefix}-bullhorn:before { content: @fa-var-bullhorn; } +.@{fa-css-prefix}-bell:before { content: @fa-var-bell; } +.@{fa-css-prefix}-certificate:before { content: @fa-var-certificate; } +.@{fa-css-prefix}-hand-o-right:before { content: @fa-var-hand-o-right; } +.@{fa-css-prefix}-hand-o-left:before { content: @fa-var-hand-o-left; } +.@{fa-css-prefix}-hand-o-up:before { content: @fa-var-hand-o-up; } +.@{fa-css-prefix}-hand-o-down:before { content: @fa-var-hand-o-down; } +.@{fa-css-prefix}-arrow-circle-left:before { content: @fa-var-arrow-circle-left; } +.@{fa-css-prefix}-arrow-circle-right:before { content: @fa-var-arrow-circle-right; } +.@{fa-css-prefix}-arrow-circle-up:before { content: @fa-var-arrow-circle-up; } +.@{fa-css-prefix}-arrow-circle-down:before { content: @fa-var-arrow-circle-down; } +.@{fa-css-prefix}-globe:before { content: @fa-var-globe; } +.@{fa-css-prefix}-wrench:before { content: @fa-var-wrench; } +.@{fa-css-prefix}-tasks:before { content: @fa-var-tasks; } +.@{fa-css-prefix}-filter:before { content: @fa-var-filter; } +.@{fa-css-prefix}-briefcase:before { content: @fa-var-briefcase; } +.@{fa-css-prefix}-arrows-alt:before { content: @fa-var-arrows-alt; } +.@{fa-css-prefix}-group:before, +.@{fa-css-prefix}-users:before { content: @fa-var-users; } +.@{fa-css-prefix}-chain:before, +.@{fa-css-prefix}-link:before { content: @fa-var-link; } +.@{fa-css-prefix}-cloud:before { content: @fa-var-cloud; } +.@{fa-css-prefix}-flask:before { content: @fa-var-flask; } +.@{fa-css-prefix}-cut:before, +.@{fa-css-prefix}-scissors:before { content: @fa-var-scissors; } +.@{fa-css-prefix}-copy:before, +.@{fa-css-prefix}-files-o:before { content: @fa-var-files-o; } +.@{fa-css-prefix}-paperclip:before { content: @fa-var-paperclip; } +.@{fa-css-prefix}-save:before, +.@{fa-css-prefix}-floppy-o:before { content: @fa-var-floppy-o; } +.@{fa-css-prefix}-square:before { content: @fa-var-square; } +.@{fa-css-prefix}-navicon:before, +.@{fa-css-prefix}-reorder:before, +.@{fa-css-prefix}-bars:before { content: @fa-var-bars; } +.@{fa-css-prefix}-list-ul:before { content: @fa-var-list-ul; } +.@{fa-css-prefix}-list-ol:before { content: @fa-var-list-ol; } +.@{fa-css-prefix}-strikethrough:before { content: @fa-var-strikethrough; } +.@{fa-css-prefix}-underline:before { content: @fa-var-underline; } +.@{fa-css-prefix}-table:before { content: @fa-var-table; } +.@{fa-css-prefix}-magic:before { content: @fa-var-magic; } +.@{fa-css-prefix}-truck:before { content: @fa-var-truck; } +.@{fa-css-prefix}-pinterest:before { content: @fa-var-pinterest; } +.@{fa-css-prefix}-pinterest-square:before { content: @fa-var-pinterest-square; } +.@{fa-css-prefix}-google-plus-square:before { content: @fa-var-google-plus-square; } +.@{fa-css-prefix}-google-plus:before { content: @fa-var-google-plus; } +.@{fa-css-prefix}-money:before { content: @fa-var-money; } +.@{fa-css-prefix}-caret-down:before { content: @fa-var-caret-down; } +.@{fa-css-prefix}-caret-up:before { content: @fa-var-caret-up; } +.@{fa-css-prefix}-caret-left:before { content: @fa-var-caret-left; } +.@{fa-css-prefix}-caret-right:before { content: @fa-var-caret-right; } +.@{fa-css-prefix}-columns:before { content: @fa-var-columns; } +.@{fa-css-prefix}-unsorted:before, +.@{fa-css-prefix}-sort:before { content: @fa-var-sort; } +.@{fa-css-prefix}-sort-down:before, +.@{fa-css-prefix}-sort-desc:before { content: @fa-var-sort-desc; } +.@{fa-css-prefix}-sort-up:before, +.@{fa-css-prefix}-sort-asc:before { content: @fa-var-sort-asc; } +.@{fa-css-prefix}-envelope:before { content: @fa-var-envelope; } +.@{fa-css-prefix}-linkedin:before { content: @fa-var-linkedin; } +.@{fa-css-prefix}-rotate-left:before, +.@{fa-css-prefix}-undo:before { content: @fa-var-undo; } +.@{fa-css-prefix}-legal:before, +.@{fa-css-prefix}-gavel:before { content: @fa-var-gavel; } +.@{fa-css-prefix}-dashboard:before, +.@{fa-css-prefix}-tachometer:before { content: @fa-var-tachometer; } +.@{fa-css-prefix}-comment-o:before { content: @fa-var-comment-o; } +.@{fa-css-prefix}-comments-o:before { content: @fa-var-comments-o; } +.@{fa-css-prefix}-flash:before, +.@{fa-css-prefix}-bolt:before { content: @fa-var-bolt; } +.@{fa-css-prefix}-sitemap:before { content: @fa-var-sitemap; } +.@{fa-css-prefix}-umbrella:before { content: @fa-var-umbrella; } +.@{fa-css-prefix}-paste:before, +.@{fa-css-prefix}-clipboard:before { content: @fa-var-clipboard; } +.@{fa-css-prefix}-lightbulb-o:before { content: @fa-var-lightbulb-o; } +.@{fa-css-prefix}-exchange:before { content: @fa-var-exchange; } +.@{fa-css-prefix}-cloud-download:before { content: @fa-var-cloud-download; } +.@{fa-css-prefix}-cloud-upload:before { content: @fa-var-cloud-upload; } +.@{fa-css-prefix}-user-md:before { content: @fa-var-user-md; } +.@{fa-css-prefix}-stethoscope:before { content: @fa-var-stethoscope; } +.@{fa-css-prefix}-suitcase:before { content: @fa-var-suitcase; } +.@{fa-css-prefix}-bell-o:before { content: @fa-var-bell-o; } +.@{fa-css-prefix}-coffee:before { content: @fa-var-coffee; } +.@{fa-css-prefix}-cutlery:before { content: @fa-var-cutlery; } +.@{fa-css-prefix}-file-text-o:before { content: @fa-var-file-text-o; } +.@{fa-css-prefix}-building-o:before { content: @fa-var-building-o; } +.@{fa-css-prefix}-hospital-o:before { content: @fa-var-hospital-o; } +.@{fa-css-prefix}-ambulance:before { content: @fa-var-ambulance; } +.@{fa-css-prefix}-medkit:before { content: @fa-var-medkit; } +.@{fa-css-prefix}-fighter-jet:before { content: @fa-var-fighter-jet; } +.@{fa-css-prefix}-beer:before { content: @fa-var-beer; } +.@{fa-css-prefix}-h-square:before { content: @fa-var-h-square; } +.@{fa-css-prefix}-plus-square:before { content: @fa-var-plus-square; } +.@{fa-css-prefix}-angle-double-left:before { content: @fa-var-angle-double-left; } +.@{fa-css-prefix}-angle-double-right:before { content: @fa-var-angle-double-right; } +.@{fa-css-prefix}-angle-double-up:before { content: @fa-var-angle-double-up; } +.@{fa-css-prefix}-angle-double-down:before { content: @fa-var-angle-double-down; } +.@{fa-css-prefix}-angle-left:before { content: @fa-var-angle-left; } +.@{fa-css-prefix}-angle-right:before { content: @fa-var-angle-right; } +.@{fa-css-prefix}-angle-up:before { content: @fa-var-angle-up; } +.@{fa-css-prefix}-angle-down:before { content: @fa-var-angle-down; } +.@{fa-css-prefix}-desktop:before { content: @fa-var-desktop; } +.@{fa-css-prefix}-laptop:before { content: @fa-var-laptop; } +.@{fa-css-prefix}-tablet:before { content: @fa-var-tablet; } +.@{fa-css-prefix}-mobile-phone:before, +.@{fa-css-prefix}-mobile:before { content: @fa-var-mobile; } +.@{fa-css-prefix}-circle-o:before { content: @fa-var-circle-o; } +.@{fa-css-prefix}-quote-left:before { content: @fa-var-quote-left; } +.@{fa-css-prefix}-quote-right:before { content: @fa-var-quote-right; } +.@{fa-css-prefix}-spinner:before { content: @fa-var-spinner; } +.@{fa-css-prefix}-circle:before { content: @fa-var-circle; } +.@{fa-css-prefix}-mail-reply:before, +.@{fa-css-prefix}-reply:before { content: @fa-var-reply; } +.@{fa-css-prefix}-github-alt:before { content: @fa-var-github-alt; } +.@{fa-css-prefix}-folder-o:before { content: @fa-var-folder-o; } +.@{fa-css-prefix}-folder-open-o:before { content: @fa-var-folder-open-o; } +.@{fa-css-prefix}-smile-o:before { content: @fa-var-smile-o; } +.@{fa-css-prefix}-frown-o:before { content: @fa-var-frown-o; } +.@{fa-css-prefix}-meh-o:before { content: @fa-var-meh-o; } +.@{fa-css-prefix}-gamepad:before { content: @fa-var-gamepad; } +.@{fa-css-prefix}-keyboard-o:before { content: @fa-var-keyboard-o; } +.@{fa-css-prefix}-flag-o:before { content: @fa-var-flag-o; } +.@{fa-css-prefix}-flag-checkered:before { content: @fa-var-flag-checkered; } +.@{fa-css-prefix}-terminal:before { content: @fa-var-terminal; } +.@{fa-css-prefix}-code:before { content: @fa-var-code; } +.@{fa-css-prefix}-mail-reply-all:before, +.@{fa-css-prefix}-reply-all:before { content: @fa-var-reply-all; } +.@{fa-css-prefix}-star-half-empty:before, +.@{fa-css-prefix}-star-half-full:before, +.@{fa-css-prefix}-star-half-o:before { content: @fa-var-star-half-o; } +.@{fa-css-prefix}-location-arrow:before { content: @fa-var-location-arrow; } +.@{fa-css-prefix}-crop:before { content: @fa-var-crop; } +.@{fa-css-prefix}-code-fork:before { content: @fa-var-code-fork; } +.@{fa-css-prefix}-unlink:before, +.@{fa-css-prefix}-chain-broken:before { content: @fa-var-chain-broken; } +.@{fa-css-prefix}-question:before { content: @fa-var-question; } +.@{fa-css-prefix}-info:before { content: @fa-var-info; } +.@{fa-css-prefix}-exclamation:before { content: @fa-var-exclamation; } +.@{fa-css-prefix}-superscript:before { content: @fa-var-superscript; } +.@{fa-css-prefix}-subscript:before { content: @fa-var-subscript; } +.@{fa-css-prefix}-eraser:before { content: @fa-var-eraser; } +.@{fa-css-prefix}-puzzle-piece:before { content: @fa-var-puzzle-piece; } +.@{fa-css-prefix}-microphone:before { content: @fa-var-microphone; } +.@{fa-css-prefix}-microphone-slash:before { content: @fa-var-microphone-slash; } +.@{fa-css-prefix}-shield:before { content: @fa-var-shield; } +.@{fa-css-prefix}-calendar-o:before { content: @fa-var-calendar-o; } +.@{fa-css-prefix}-fire-extinguisher:before { content: @fa-var-fire-extinguisher; } +.@{fa-css-prefix}-rocket:before { content: @fa-var-rocket; } +.@{fa-css-prefix}-maxcdn:before { content: @fa-var-maxcdn; } +.@{fa-css-prefix}-chevron-circle-left:before { content: @fa-var-chevron-circle-left; } +.@{fa-css-prefix}-chevron-circle-right:before { content: @fa-var-chevron-circle-right; } +.@{fa-css-prefix}-chevron-circle-up:before { content: @fa-var-chevron-circle-up; } +.@{fa-css-prefix}-chevron-circle-down:before { content: @fa-var-chevron-circle-down; } +.@{fa-css-prefix}-html5:before { content: @fa-var-html5; } +.@{fa-css-prefix}-css3:before { content: @fa-var-css3; } +.@{fa-css-prefix}-anchor:before { content: @fa-var-anchor; } +.@{fa-css-prefix}-unlock-alt:before { content: @fa-var-unlock-alt; } +.@{fa-css-prefix}-bullseye:before { content: @fa-var-bullseye; } +.@{fa-css-prefix}-ellipsis-h:before { content: @fa-var-ellipsis-h; } +.@{fa-css-prefix}-ellipsis-v:before { content: @fa-var-ellipsis-v; } +.@{fa-css-prefix}-rss-square:before { content: @fa-var-rss-square; } +.@{fa-css-prefix}-play-circle:before { content: @fa-var-play-circle; } +.@{fa-css-prefix}-ticket:before { content: @fa-var-ticket; } +.@{fa-css-prefix}-minus-square:before { content: @fa-var-minus-square; } +.@{fa-css-prefix}-minus-square-o:before { content: @fa-var-minus-square-o; } +.@{fa-css-prefix}-level-up:before { content: @fa-var-level-up; } +.@{fa-css-prefix}-level-down:before { content: @fa-var-level-down; } +.@{fa-css-prefix}-check-square:before { content: @fa-var-check-square; } +.@{fa-css-prefix}-pencil-square:before { content: @fa-var-pencil-square; } +.@{fa-css-prefix}-external-link-square:before { content: @fa-var-external-link-square; } +.@{fa-css-prefix}-share-square:before { content: @fa-var-share-square; } +.@{fa-css-prefix}-compass:before { content: @fa-var-compass; } +.@{fa-css-prefix}-toggle-down:before, +.@{fa-css-prefix}-caret-square-o-down:before { content: @fa-var-caret-square-o-down; } +.@{fa-css-prefix}-toggle-up:before, +.@{fa-css-prefix}-caret-square-o-up:before { content: @fa-var-caret-square-o-up; } +.@{fa-css-prefix}-toggle-right:before, +.@{fa-css-prefix}-caret-square-o-right:before { content: @fa-var-caret-square-o-right; } +.@{fa-css-prefix}-euro:before, +.@{fa-css-prefix}-eur:before { content: @fa-var-eur; } +.@{fa-css-prefix}-gbp:before { content: @fa-var-gbp; } +.@{fa-css-prefix}-dollar:before, +.@{fa-css-prefix}-usd:before { content: @fa-var-usd; } +.@{fa-css-prefix}-rupee:before, +.@{fa-css-prefix}-inr:before { content: @fa-var-inr; } +.@{fa-css-prefix}-cny:before, +.@{fa-css-prefix}-rmb:before, +.@{fa-css-prefix}-yen:before, +.@{fa-css-prefix}-jpy:before { content: @fa-var-jpy; } +.@{fa-css-prefix}-ruble:before, +.@{fa-css-prefix}-rouble:before, +.@{fa-css-prefix}-rub:before { content: @fa-var-rub; } +.@{fa-css-prefix}-won:before, +.@{fa-css-prefix}-krw:before { content: @fa-var-krw; } +.@{fa-css-prefix}-bitcoin:before, +.@{fa-css-prefix}-btc:before { content: @fa-var-btc; } +.@{fa-css-prefix}-file:before { content: @fa-var-file; } +.@{fa-css-prefix}-file-text:before { content: @fa-var-file-text; } +.@{fa-css-prefix}-sort-alpha-asc:before { content: @fa-var-sort-alpha-asc; } +.@{fa-css-prefix}-sort-alpha-desc:before { content: @fa-var-sort-alpha-desc; } +.@{fa-css-prefix}-sort-amount-asc:before { content: @fa-var-sort-amount-asc; } +.@{fa-css-prefix}-sort-amount-desc:before { content: @fa-var-sort-amount-desc; } +.@{fa-css-prefix}-sort-numeric-asc:before { content: @fa-var-sort-numeric-asc; } +.@{fa-css-prefix}-sort-numeric-desc:before { content: @fa-var-sort-numeric-desc; } +.@{fa-css-prefix}-thumbs-up:before { content: @fa-var-thumbs-up; } +.@{fa-css-prefix}-thumbs-down:before { content: @fa-var-thumbs-down; } +.@{fa-css-prefix}-youtube-square:before { content: @fa-var-youtube-square; } +.@{fa-css-prefix}-youtube:before { content: @fa-var-youtube; } +.@{fa-css-prefix}-xing:before { content: @fa-var-xing; } +.@{fa-css-prefix}-xing-square:before { content: @fa-var-xing-square; } +.@{fa-css-prefix}-youtube-play:before { content: @fa-var-youtube-play; } +.@{fa-css-prefix}-dropbox:before { content: @fa-var-dropbox; } +.@{fa-css-prefix}-stack-overflow:before { content: @fa-var-stack-overflow; } +.@{fa-css-prefix}-instagram:before { content: @fa-var-instagram; } +.@{fa-css-prefix}-flickr:before { content: @fa-var-flickr; } +.@{fa-css-prefix}-adn:before { content: @fa-var-adn; } +.@{fa-css-prefix}-bitbucket:before { content: @fa-var-bitbucket; } +.@{fa-css-prefix}-bitbucket-square:before { content: @fa-var-bitbucket-square; } +.@{fa-css-prefix}-tumblr:before { content: @fa-var-tumblr; } +.@{fa-css-prefix}-tumblr-square:before { content: @fa-var-tumblr-square; } +.@{fa-css-prefix}-long-arrow-down:before { content: @fa-var-long-arrow-down; } +.@{fa-css-prefix}-long-arrow-up:before { content: @fa-var-long-arrow-up; } +.@{fa-css-prefix}-long-arrow-left:before { content: @fa-var-long-arrow-left; } +.@{fa-css-prefix}-long-arrow-right:before { content: @fa-var-long-arrow-right; } +.@{fa-css-prefix}-apple:before { content: @fa-var-apple; } +.@{fa-css-prefix}-windows:before { content: @fa-var-windows; } +.@{fa-css-prefix}-android:before { content: @fa-var-android; } +.@{fa-css-prefix}-linux:before { content: @fa-var-linux; } +.@{fa-css-prefix}-dribbble:before { content: @fa-var-dribbble; } +.@{fa-css-prefix}-skype:before { content: @fa-var-skype; } +.@{fa-css-prefix}-foursquare:before { content: @fa-var-foursquare; } +.@{fa-css-prefix}-trello:before { content: @fa-var-trello; } +.@{fa-css-prefix}-female:before { content: @fa-var-female; } +.@{fa-css-prefix}-male:before { content: @fa-var-male; } +.@{fa-css-prefix}-gittip:before, +.@{fa-css-prefix}-gratipay:before { content: @fa-var-gratipay; } +.@{fa-css-prefix}-sun-o:before { content: @fa-var-sun-o; } +.@{fa-css-prefix}-moon-o:before { content: @fa-var-moon-o; } +.@{fa-css-prefix}-archive:before { content: @fa-var-archive; } +.@{fa-css-prefix}-bug:before { content: @fa-var-bug; } +.@{fa-css-prefix}-vk:before { content: @fa-var-vk; } +.@{fa-css-prefix}-weibo:before { content: @fa-var-weibo; } +.@{fa-css-prefix}-renren:before { content: @fa-var-renren; } +.@{fa-css-prefix}-pagelines:before { content: @fa-var-pagelines; } +.@{fa-css-prefix}-stack-exchange:before { content: @fa-var-stack-exchange; } +.@{fa-css-prefix}-arrow-circle-o-right:before { content: @fa-var-arrow-circle-o-right; } +.@{fa-css-prefix}-arrow-circle-o-left:before { content: @fa-var-arrow-circle-o-left; } +.@{fa-css-prefix}-toggle-left:before, +.@{fa-css-prefix}-caret-square-o-left:before { content: @fa-var-caret-square-o-left; } +.@{fa-css-prefix}-dot-circle-o:before { content: @fa-var-dot-circle-o; } +.@{fa-css-prefix}-wheelchair:before { content: @fa-var-wheelchair; } +.@{fa-css-prefix}-vimeo-square:before { content: @fa-var-vimeo-square; } +.@{fa-css-prefix}-turkish-lira:before, +.@{fa-css-prefix}-try:before { content: @fa-var-try; } +.@{fa-css-prefix}-plus-square-o:before { content: @fa-var-plus-square-o; } +.@{fa-css-prefix}-space-shuttle:before { content: @fa-var-space-shuttle; } +.@{fa-css-prefix}-slack:before { content: @fa-var-slack; } +.@{fa-css-prefix}-envelope-square:before { content: @fa-var-envelope-square; } +.@{fa-css-prefix}-wordpress:before { content: @fa-var-wordpress; } +.@{fa-css-prefix}-openid:before { content: @fa-var-openid; } +.@{fa-css-prefix}-institution:before, +.@{fa-css-prefix}-bank:before, +.@{fa-css-prefix}-university:before { content: @fa-var-university; } +.@{fa-css-prefix}-mortar-board:before, +.@{fa-css-prefix}-graduation-cap:before { content: @fa-var-graduation-cap; } +.@{fa-css-prefix}-yahoo:before { content: @fa-var-yahoo; } +.@{fa-css-prefix}-google:before { content: @fa-var-google; } +.@{fa-css-prefix}-reddit:before { content: @fa-var-reddit; } +.@{fa-css-prefix}-reddit-square:before { content: @fa-var-reddit-square; } +.@{fa-css-prefix}-stumbleupon-circle:before { content: @fa-var-stumbleupon-circle; } +.@{fa-css-prefix}-stumbleupon:before { content: @fa-var-stumbleupon; } +.@{fa-css-prefix}-delicious:before { content: @fa-var-delicious; } +.@{fa-css-prefix}-digg:before { content: @fa-var-digg; } +.@{fa-css-prefix}-pied-piper-pp:before { content: @fa-var-pied-piper-pp; } +.@{fa-css-prefix}-pied-piper-alt:before { content: @fa-var-pied-piper-alt; } +.@{fa-css-prefix}-drupal:before { content: @fa-var-drupal; } +.@{fa-css-prefix}-joomla:before { content: @fa-var-joomla; } +.@{fa-css-prefix}-language:before { content: @fa-var-language; } +.@{fa-css-prefix}-fax:before { content: @fa-var-fax; } +.@{fa-css-prefix}-building:before { content: @fa-var-building; } +.@{fa-css-prefix}-child:before { content: @fa-var-child; } +.@{fa-css-prefix}-paw:before { content: @fa-var-paw; } +.@{fa-css-prefix}-spoon:before { content: @fa-var-spoon; } +.@{fa-css-prefix}-cube:before { content: @fa-var-cube; } +.@{fa-css-prefix}-cubes:before { content: @fa-var-cubes; } +.@{fa-css-prefix}-behance:before { content: @fa-var-behance; } +.@{fa-css-prefix}-behance-square:before { content: @fa-var-behance-square; } +.@{fa-css-prefix}-steam:before { content: @fa-var-steam; } +.@{fa-css-prefix}-steam-square:before { content: @fa-var-steam-square; } +.@{fa-css-prefix}-recycle:before { content: @fa-var-recycle; } +.@{fa-css-prefix}-automobile:before, +.@{fa-css-prefix}-car:before { content: @fa-var-car; } +.@{fa-css-prefix}-cab:before, +.@{fa-css-prefix}-taxi:before { content: @fa-var-taxi; } +.@{fa-css-prefix}-tree:before { content: @fa-var-tree; } +.@{fa-css-prefix}-spotify:before { content: @fa-var-spotify; } +.@{fa-css-prefix}-deviantart:before { content: @fa-var-deviantart; } +.@{fa-css-prefix}-soundcloud:before { content: @fa-var-soundcloud; } +.@{fa-css-prefix}-database:before { content: @fa-var-database; } +.@{fa-css-prefix}-file-pdf-o:before { content: @fa-var-file-pdf-o; } +.@{fa-css-prefix}-file-word-o:before { content: @fa-var-file-word-o; } +.@{fa-css-prefix}-file-excel-o:before { content: @fa-var-file-excel-o; } +.@{fa-css-prefix}-file-powerpoint-o:before { content: @fa-var-file-powerpoint-o; } +.@{fa-css-prefix}-file-photo-o:before, +.@{fa-css-prefix}-file-picture-o:before, +.@{fa-css-prefix}-file-image-o:before { content: @fa-var-file-image-o; } +.@{fa-css-prefix}-file-zip-o:before, +.@{fa-css-prefix}-file-archive-o:before { content: @fa-var-file-archive-o; } +.@{fa-css-prefix}-file-sound-o:before, +.@{fa-css-prefix}-file-audio-o:before { content: @fa-var-file-audio-o; } +.@{fa-css-prefix}-file-movie-o:before, +.@{fa-css-prefix}-file-video-o:before { content: @fa-var-file-video-o; } +.@{fa-css-prefix}-file-code-o:before { content: @fa-var-file-code-o; } +.@{fa-css-prefix}-vine:before { content: @fa-var-vine; } +.@{fa-css-prefix}-codepen:before { content: @fa-var-codepen; } +.@{fa-css-prefix}-jsfiddle:before { content: @fa-var-jsfiddle; } +.@{fa-css-prefix}-life-bouy:before, +.@{fa-css-prefix}-life-buoy:before, +.@{fa-css-prefix}-life-saver:before, +.@{fa-css-prefix}-support:before, +.@{fa-css-prefix}-life-ring:before { content: @fa-var-life-ring; } +.@{fa-css-prefix}-circle-o-notch:before { content: @fa-var-circle-o-notch; } +.@{fa-css-prefix}-ra:before, +.@{fa-css-prefix}-resistance:before, +.@{fa-css-prefix}-rebel:before { content: @fa-var-rebel; } +.@{fa-css-prefix}-ge:before, +.@{fa-css-prefix}-empire:before { content: @fa-var-empire; } +.@{fa-css-prefix}-git-square:before { content: @fa-var-git-square; } +.@{fa-css-prefix}-git:before { content: @fa-var-git; } +.@{fa-css-prefix}-y-combinator-square:before, +.@{fa-css-prefix}-yc-square:before, +.@{fa-css-prefix}-hacker-news:before { content: @fa-var-hacker-news; } +.@{fa-css-prefix}-tencent-weibo:before { content: @fa-var-tencent-weibo; } +.@{fa-css-prefix}-qq:before { content: @fa-var-qq; } +.@{fa-css-prefix}-wechat:before, +.@{fa-css-prefix}-weixin:before { content: @fa-var-weixin; } +.@{fa-css-prefix}-send:before, +.@{fa-css-prefix}-paper-plane:before { content: @fa-var-paper-plane; } +.@{fa-css-prefix}-send-o:before, +.@{fa-css-prefix}-paper-plane-o:before { content: @fa-var-paper-plane-o; } +.@{fa-css-prefix}-history:before { content: @fa-var-history; } +.@{fa-css-prefix}-circle-thin:before { content: @fa-var-circle-thin; } +.@{fa-css-prefix}-header:before { content: @fa-var-header; } +.@{fa-css-prefix}-paragraph:before { content: @fa-var-paragraph; } +.@{fa-css-prefix}-sliders:before { content: @fa-var-sliders; } +.@{fa-css-prefix}-share-alt:before { content: @fa-var-share-alt; } +.@{fa-css-prefix}-share-alt-square:before { content: @fa-var-share-alt-square; } +.@{fa-css-prefix}-bomb:before { content: @fa-var-bomb; } +.@{fa-css-prefix}-soccer-ball-o:before, +.@{fa-css-prefix}-futbol-o:before { content: @fa-var-futbol-o; } +.@{fa-css-prefix}-tty:before { content: @fa-var-tty; } +.@{fa-css-prefix}-binoculars:before { content: @fa-var-binoculars; } +.@{fa-css-prefix}-plug:before { content: @fa-var-plug; } +.@{fa-css-prefix}-slideshare:before { content: @fa-var-slideshare; } +.@{fa-css-prefix}-twitch:before { content: @fa-var-twitch; } +.@{fa-css-prefix}-yelp:before { content: @fa-var-yelp; } +.@{fa-css-prefix}-newspaper-o:before { content: @fa-var-newspaper-o; } +.@{fa-css-prefix}-wifi:before { content: @fa-var-wifi; } +.@{fa-css-prefix}-calculator:before { content: @fa-var-calculator; } +.@{fa-css-prefix}-paypal:before { content: @fa-var-paypal; } +.@{fa-css-prefix}-google-wallet:before { content: @fa-var-google-wallet; } +.@{fa-css-prefix}-cc-visa:before { content: @fa-var-cc-visa; } +.@{fa-css-prefix}-cc-mastercard:before { content: @fa-var-cc-mastercard; } +.@{fa-css-prefix}-cc-discover:before { content: @fa-var-cc-discover; } +.@{fa-css-prefix}-cc-amex:before { content: @fa-var-cc-amex; } +.@{fa-css-prefix}-cc-paypal:before { content: @fa-var-cc-paypal; } +.@{fa-css-prefix}-cc-stripe:before { content: @fa-var-cc-stripe; } +.@{fa-css-prefix}-bell-slash:before { content: @fa-var-bell-slash; } +.@{fa-css-prefix}-bell-slash-o:before { content: @fa-var-bell-slash-o; } +.@{fa-css-prefix}-trash:before { content: @fa-var-trash; } +.@{fa-css-prefix}-copyright:before { content: @fa-var-copyright; } +.@{fa-css-prefix}-at:before { content: @fa-var-at; } +.@{fa-css-prefix}-eyedropper:before { content: @fa-var-eyedropper; } +.@{fa-css-prefix}-paint-brush:before { content: @fa-var-paint-brush; } +.@{fa-css-prefix}-birthday-cake:before { content: @fa-var-birthday-cake; } +.@{fa-css-prefix}-area-chart:before { content: @fa-var-area-chart; } +.@{fa-css-prefix}-pie-chart:before { content: @fa-var-pie-chart; } +.@{fa-css-prefix}-line-chart:before { content: @fa-var-line-chart; } +.@{fa-css-prefix}-lastfm:before { content: @fa-var-lastfm; } +.@{fa-css-prefix}-lastfm-square:before { content: @fa-var-lastfm-square; } +.@{fa-css-prefix}-toggle-off:before { content: @fa-var-toggle-off; } +.@{fa-css-prefix}-toggle-on:before { content: @fa-var-toggle-on; } +.@{fa-css-prefix}-bicycle:before { content: @fa-var-bicycle; } +.@{fa-css-prefix}-bus:before { content: @fa-var-bus; } +.@{fa-css-prefix}-ioxhost:before { content: @fa-var-ioxhost; } +.@{fa-css-prefix}-angellist:before { content: @fa-var-angellist; } +.@{fa-css-prefix}-cc:before { content: @fa-var-cc; } +.@{fa-css-prefix}-shekel:before, +.@{fa-css-prefix}-sheqel:before, +.@{fa-css-prefix}-ils:before { content: @fa-var-ils; } +.@{fa-css-prefix}-meanpath:before { content: @fa-var-meanpath; } +.@{fa-css-prefix}-buysellads:before { content: @fa-var-buysellads; } +.@{fa-css-prefix}-connectdevelop:before { content: @fa-var-connectdevelop; } +.@{fa-css-prefix}-dashcube:before { content: @fa-var-dashcube; } +.@{fa-css-prefix}-forumbee:before { content: @fa-var-forumbee; } +.@{fa-css-prefix}-leanpub:before { content: @fa-var-leanpub; } +.@{fa-css-prefix}-sellsy:before { content: @fa-var-sellsy; } +.@{fa-css-prefix}-shirtsinbulk:before { content: @fa-var-shirtsinbulk; } +.@{fa-css-prefix}-simplybuilt:before { content: @fa-var-simplybuilt; } +.@{fa-css-prefix}-skyatlas:before { content: @fa-var-skyatlas; } +.@{fa-css-prefix}-cart-plus:before { content: @fa-var-cart-plus; } +.@{fa-css-prefix}-cart-arrow-down:before { content: @fa-var-cart-arrow-down; } +.@{fa-css-prefix}-diamond:before { content: @fa-var-diamond; } +.@{fa-css-prefix}-ship:before { content: @fa-var-ship; } +.@{fa-css-prefix}-user-secret:before { content: @fa-var-user-secret; } +.@{fa-css-prefix}-motorcycle:before { content: @fa-var-motorcycle; } +.@{fa-css-prefix}-street-view:before { content: @fa-var-street-view; } +.@{fa-css-prefix}-heartbeat:before { content: @fa-var-heartbeat; } +.@{fa-css-prefix}-venus:before { content: @fa-var-venus; } +.@{fa-css-prefix}-mars:before { content: @fa-var-mars; } +.@{fa-css-prefix}-mercury:before { content: @fa-var-mercury; } +.@{fa-css-prefix}-intersex:before, +.@{fa-css-prefix}-transgender:before { content: @fa-var-transgender; } +.@{fa-css-prefix}-transgender-alt:before { content: @fa-var-transgender-alt; } +.@{fa-css-prefix}-venus-double:before { content: @fa-var-venus-double; } +.@{fa-css-prefix}-mars-double:before { content: @fa-var-mars-double; } +.@{fa-css-prefix}-venus-mars:before { content: @fa-var-venus-mars; } +.@{fa-css-prefix}-mars-stroke:before { content: @fa-var-mars-stroke; } +.@{fa-css-prefix}-mars-stroke-v:before { content: @fa-var-mars-stroke-v; } +.@{fa-css-prefix}-mars-stroke-h:before { content: @fa-var-mars-stroke-h; } +.@{fa-css-prefix}-neuter:before { content: @fa-var-neuter; } +.@{fa-css-prefix}-genderless:before { content: @fa-var-genderless; } +.@{fa-css-prefix}-facebook-official:before { content: @fa-var-facebook-official; } +.@{fa-css-prefix}-pinterest-p:before { content: @fa-var-pinterest-p; } +.@{fa-css-prefix}-whatsapp:before { content: @fa-var-whatsapp; } +.@{fa-css-prefix}-server:before { content: @fa-var-server; } +.@{fa-css-prefix}-user-plus:before { content: @fa-var-user-plus; } +.@{fa-css-prefix}-user-times:before { content: @fa-var-user-times; } +.@{fa-css-prefix}-hotel:before, +.@{fa-css-prefix}-bed:before { content: @fa-var-bed; } +.@{fa-css-prefix}-viacoin:before { content: @fa-var-viacoin; } +.@{fa-css-prefix}-train:before { content: @fa-var-train; } +.@{fa-css-prefix}-subway:before { content: @fa-var-subway; } +.@{fa-css-prefix}-medium:before { content: @fa-var-medium; } +.@{fa-css-prefix}-yc:before, +.@{fa-css-prefix}-y-combinator:before { content: @fa-var-y-combinator; } +.@{fa-css-prefix}-optin-monster:before { content: @fa-var-optin-monster; } +.@{fa-css-prefix}-opencart:before { content: @fa-var-opencart; } +.@{fa-css-prefix}-expeditedssl:before { content: @fa-var-expeditedssl; } +.@{fa-css-prefix}-battery-4:before, +.@{fa-css-prefix}-battery:before, +.@{fa-css-prefix}-battery-full:before { content: @fa-var-battery-full; } +.@{fa-css-prefix}-battery-3:before, +.@{fa-css-prefix}-battery-three-quarters:before { content: @fa-var-battery-three-quarters; } +.@{fa-css-prefix}-battery-2:before, +.@{fa-css-prefix}-battery-half:before { content: @fa-var-battery-half; } +.@{fa-css-prefix}-battery-1:before, +.@{fa-css-prefix}-battery-quarter:before { content: @fa-var-battery-quarter; } +.@{fa-css-prefix}-battery-0:before, +.@{fa-css-prefix}-battery-empty:before { content: @fa-var-battery-empty; } +.@{fa-css-prefix}-mouse-pointer:before { content: @fa-var-mouse-pointer; } +.@{fa-css-prefix}-i-cursor:before { content: @fa-var-i-cursor; } +.@{fa-css-prefix}-object-group:before { content: @fa-var-object-group; } +.@{fa-css-prefix}-object-ungroup:before { content: @fa-var-object-ungroup; } +.@{fa-css-prefix}-sticky-note:before { content: @fa-var-sticky-note; } +.@{fa-css-prefix}-sticky-note-o:before { content: @fa-var-sticky-note-o; } +.@{fa-css-prefix}-cc-jcb:before { content: @fa-var-cc-jcb; } +.@{fa-css-prefix}-cc-diners-club:before { content: @fa-var-cc-diners-club; } +.@{fa-css-prefix}-clone:before { content: @fa-var-clone; } +.@{fa-css-prefix}-balance-scale:before { content: @fa-var-balance-scale; } +.@{fa-css-prefix}-hourglass-o:before { content: @fa-var-hourglass-o; } +.@{fa-css-prefix}-hourglass-1:before, +.@{fa-css-prefix}-hourglass-start:before { content: @fa-var-hourglass-start; } +.@{fa-css-prefix}-hourglass-2:before, +.@{fa-css-prefix}-hourglass-half:before { content: @fa-var-hourglass-half; } +.@{fa-css-prefix}-hourglass-3:before, +.@{fa-css-prefix}-hourglass-end:before { content: @fa-var-hourglass-end; } +.@{fa-css-prefix}-hourglass:before { content: @fa-var-hourglass; } +.@{fa-css-prefix}-hand-grab-o:before, +.@{fa-css-prefix}-hand-rock-o:before { content: @fa-var-hand-rock-o; } +.@{fa-css-prefix}-hand-stop-o:before, +.@{fa-css-prefix}-hand-paper-o:before { content: @fa-var-hand-paper-o; } +.@{fa-css-prefix}-hand-scissors-o:before { content: @fa-var-hand-scissors-o; } +.@{fa-css-prefix}-hand-lizard-o:before { content: @fa-var-hand-lizard-o; } +.@{fa-css-prefix}-hand-spock-o:before { content: @fa-var-hand-spock-o; } +.@{fa-css-prefix}-hand-pointer-o:before { content: @fa-var-hand-pointer-o; } +.@{fa-css-prefix}-hand-peace-o:before { content: @fa-var-hand-peace-o; } +.@{fa-css-prefix}-trademark:before { content: @fa-var-trademark; } +.@{fa-css-prefix}-registered:before { content: @fa-var-registered; } +.@{fa-css-prefix}-creative-commons:before { content: @fa-var-creative-commons; } +.@{fa-css-prefix}-gg:before { content: @fa-var-gg; } +.@{fa-css-prefix}-gg-circle:before { content: @fa-var-gg-circle; } +.@{fa-css-prefix}-tripadvisor:before { content: @fa-var-tripadvisor; } +.@{fa-css-prefix}-odnoklassniki:before { content: @fa-var-odnoklassniki; } +.@{fa-css-prefix}-odnoklassniki-square:before { content: @fa-var-odnoklassniki-square; } +.@{fa-css-prefix}-get-pocket:before { content: @fa-var-get-pocket; } +.@{fa-css-prefix}-wikipedia-w:before { content: @fa-var-wikipedia-w; } +.@{fa-css-prefix}-safari:before { content: @fa-var-safari; } +.@{fa-css-prefix}-chrome:before { content: @fa-var-chrome; } +.@{fa-css-prefix}-firefox:before { content: @fa-var-firefox; } +.@{fa-css-prefix}-opera:before { content: @fa-var-opera; } +.@{fa-css-prefix}-internet-explorer:before { content: @fa-var-internet-explorer; } +.@{fa-css-prefix}-tv:before, +.@{fa-css-prefix}-television:before { content: @fa-var-television; } +.@{fa-css-prefix}-contao:before { content: @fa-var-contao; } +.@{fa-css-prefix}-500px:before { content: @fa-var-500px; } +.@{fa-css-prefix}-amazon:before { content: @fa-var-amazon; } +.@{fa-css-prefix}-calendar-plus-o:before { content: @fa-var-calendar-plus-o; } +.@{fa-css-prefix}-calendar-minus-o:before { content: @fa-var-calendar-minus-o; } +.@{fa-css-prefix}-calendar-times-o:before { content: @fa-var-calendar-times-o; } +.@{fa-css-prefix}-calendar-check-o:before { content: @fa-var-calendar-check-o; } +.@{fa-css-prefix}-industry:before { content: @fa-var-industry; } +.@{fa-css-prefix}-map-pin:before { content: @fa-var-map-pin; } +.@{fa-css-prefix}-map-signs:before { content: @fa-var-map-signs; } +.@{fa-css-prefix}-map-o:before { content: @fa-var-map-o; } +.@{fa-css-prefix}-map:before { content: @fa-var-map; } +.@{fa-css-prefix}-commenting:before { content: @fa-var-commenting; } +.@{fa-css-prefix}-commenting-o:before { content: @fa-var-commenting-o; } +.@{fa-css-prefix}-houzz:before { content: @fa-var-houzz; } +.@{fa-css-prefix}-vimeo:before { content: @fa-var-vimeo; } +.@{fa-css-prefix}-black-tie:before { content: @fa-var-black-tie; } +.@{fa-css-prefix}-fonticons:before { content: @fa-var-fonticons; } +.@{fa-css-prefix}-reddit-alien:before { content: @fa-var-reddit-alien; } +.@{fa-css-prefix}-edge:before { content: @fa-var-edge; } +.@{fa-css-prefix}-credit-card-alt:before { content: @fa-var-credit-card-alt; } +.@{fa-css-prefix}-codiepie:before { content: @fa-var-codiepie; } +.@{fa-css-prefix}-modx:before { content: @fa-var-modx; } +.@{fa-css-prefix}-fort-awesome:before { content: @fa-var-fort-awesome; } +.@{fa-css-prefix}-usb:before { content: @fa-var-usb; } +.@{fa-css-prefix}-product-hunt:before { content: @fa-var-product-hunt; } +.@{fa-css-prefix}-mixcloud:before { content: @fa-var-mixcloud; } +.@{fa-css-prefix}-scribd:before { content: @fa-var-scribd; } +.@{fa-css-prefix}-pause-circle:before { content: @fa-var-pause-circle; } +.@{fa-css-prefix}-pause-circle-o:before { content: @fa-var-pause-circle-o; } +.@{fa-css-prefix}-stop-circle:before { content: @fa-var-stop-circle; } +.@{fa-css-prefix}-stop-circle-o:before { content: @fa-var-stop-circle-o; } +.@{fa-css-prefix}-shopping-bag:before { content: @fa-var-shopping-bag; } +.@{fa-css-prefix}-shopping-basket:before { content: @fa-var-shopping-basket; } +.@{fa-css-prefix}-hashtag:before { content: @fa-var-hashtag; } +.@{fa-css-prefix}-bluetooth:before { content: @fa-var-bluetooth; } +.@{fa-css-prefix}-bluetooth-b:before { content: @fa-var-bluetooth-b; } +.@{fa-css-prefix}-percent:before { content: @fa-var-percent; } +.@{fa-css-prefix}-gitlab:before { content: @fa-var-gitlab; } +.@{fa-css-prefix}-wpbeginner:before { content: @fa-var-wpbeginner; } +.@{fa-css-prefix}-wpforms:before { content: @fa-var-wpforms; } +.@{fa-css-prefix}-envira:before { content: @fa-var-envira; } +.@{fa-css-prefix}-universal-access:before { content: @fa-var-universal-access; } +.@{fa-css-prefix}-wheelchair-alt:before { content: @fa-var-wheelchair-alt; } +.@{fa-css-prefix}-question-circle-o:before { content: @fa-var-question-circle-o; } +.@{fa-css-prefix}-blind:before { content: @fa-var-blind; } +.@{fa-css-prefix}-audio-description:before { content: @fa-var-audio-description; } +.@{fa-css-prefix}-volume-control-phone:before { content: @fa-var-volume-control-phone; } +.@{fa-css-prefix}-braille:before { content: @fa-var-braille; } +.@{fa-css-prefix}-assistive-listening-systems:before { content: @fa-var-assistive-listening-systems; } +.@{fa-css-prefix}-asl-interpreting:before, +.@{fa-css-prefix}-american-sign-language-interpreting:before { content: @fa-var-american-sign-language-interpreting; } +.@{fa-css-prefix}-deafness:before, +.@{fa-css-prefix}-hard-of-hearing:before, +.@{fa-css-prefix}-deaf:before { content: @fa-var-deaf; } +.@{fa-css-prefix}-glide:before { content: @fa-var-glide; } +.@{fa-css-prefix}-glide-g:before { content: @fa-var-glide-g; } +.@{fa-css-prefix}-signing:before, +.@{fa-css-prefix}-sign-language:before { content: @fa-var-sign-language; } +.@{fa-css-prefix}-low-vision:before { content: @fa-var-low-vision; } +.@{fa-css-prefix}-viadeo:before { content: @fa-var-viadeo; } +.@{fa-css-prefix}-viadeo-square:before { content: @fa-var-viadeo-square; } +.@{fa-css-prefix}-snapchat:before { content: @fa-var-snapchat; } +.@{fa-css-prefix}-snapchat-ghost:before { content: @fa-var-snapchat-ghost; } +.@{fa-css-prefix}-snapchat-square:before { content: @fa-var-snapchat-square; } +.@{fa-css-prefix}-pied-piper:before { content: @fa-var-pied-piper; } +.@{fa-css-prefix}-first-order:before { content: @fa-var-first-order; } +.@{fa-css-prefix}-yoast:before { content: @fa-var-yoast; } +.@{fa-css-prefix}-themeisle:before { content: @fa-var-themeisle; } +.@{fa-css-prefix}-google-plus-circle:before, +.@{fa-css-prefix}-google-plus-official:before { content: @fa-var-google-plus-official; } +.@{fa-css-prefix}-fa:before, +.@{fa-css-prefix}-font-awesome:before { content: @fa-var-font-awesome; } +.@{fa-css-prefix}-handshake-o:before { content: @fa-var-handshake-o; } +.@{fa-css-prefix}-envelope-open:before { content: @fa-var-envelope-open; } +.@{fa-css-prefix}-envelope-open-o:before { content: @fa-var-envelope-open-o; } +.@{fa-css-prefix}-linode:before { content: @fa-var-linode; } +.@{fa-css-prefix}-address-book:before { content: @fa-var-address-book; } +.@{fa-css-prefix}-address-book-o:before { content: @fa-var-address-book-o; } +.@{fa-css-prefix}-vcard:before, +.@{fa-css-prefix}-address-card:before { content: @fa-var-address-card; } +.@{fa-css-prefix}-vcard-o:before, +.@{fa-css-prefix}-address-card-o:before { content: @fa-var-address-card-o; } +.@{fa-css-prefix}-user-circle:before { content: @fa-var-user-circle; } +.@{fa-css-prefix}-user-circle-o:before { content: @fa-var-user-circle-o; } +.@{fa-css-prefix}-user-o:before { content: @fa-var-user-o; } +.@{fa-css-prefix}-id-badge:before { content: @fa-var-id-badge; } +.@{fa-css-prefix}-drivers-license:before, +.@{fa-css-prefix}-id-card:before { content: @fa-var-id-card; } +.@{fa-css-prefix}-drivers-license-o:before, +.@{fa-css-prefix}-id-card-o:before { content: @fa-var-id-card-o; } +.@{fa-css-prefix}-quora:before { content: @fa-var-quora; } +.@{fa-css-prefix}-free-code-camp:before { content: @fa-var-free-code-camp; } +.@{fa-css-prefix}-telegram:before { content: @fa-var-telegram; } +.@{fa-css-prefix}-thermometer-4:before, +.@{fa-css-prefix}-thermometer:before, +.@{fa-css-prefix}-thermometer-full:before { content: @fa-var-thermometer-full; } +.@{fa-css-prefix}-thermometer-3:before, +.@{fa-css-prefix}-thermometer-three-quarters:before { content: @fa-var-thermometer-three-quarters; } +.@{fa-css-prefix}-thermometer-2:before, +.@{fa-css-prefix}-thermometer-half:before { content: @fa-var-thermometer-half; } +.@{fa-css-prefix}-thermometer-1:before, +.@{fa-css-prefix}-thermometer-quarter:before { content: @fa-var-thermometer-quarter; } +.@{fa-css-prefix}-thermometer-0:before, +.@{fa-css-prefix}-thermometer-empty:before { content: @fa-var-thermometer-empty; } +.@{fa-css-prefix}-shower:before { content: @fa-var-shower; } +.@{fa-css-prefix}-bathtub:before, +.@{fa-css-prefix}-s15:before, +.@{fa-css-prefix}-bath:before { content: @fa-var-bath; } +.@{fa-css-prefix}-podcast:before { content: @fa-var-podcast; } +.@{fa-css-prefix}-window-maximize:before { content: @fa-var-window-maximize; } +.@{fa-css-prefix}-window-minimize:before { content: @fa-var-window-minimize; } +.@{fa-css-prefix}-window-restore:before { content: @fa-var-window-restore; } +.@{fa-css-prefix}-times-rectangle:before, +.@{fa-css-prefix}-window-close:before { content: @fa-var-window-close; } +.@{fa-css-prefix}-times-rectangle-o:before, +.@{fa-css-prefix}-window-close-o:before { content: @fa-var-window-close-o; } +.@{fa-css-prefix}-bandcamp:before { content: @fa-var-bandcamp; } +.@{fa-css-prefix}-grav:before { content: @fa-var-grav; } +.@{fa-css-prefix}-etsy:before { content: @fa-var-etsy; } +.@{fa-css-prefix}-imdb:before { content: @fa-var-imdb; } +.@{fa-css-prefix}-ravelry:before { content: @fa-var-ravelry; } +.@{fa-css-prefix}-eercast:before { content: @fa-var-eercast; } +.@{fa-css-prefix}-microchip:before { content: @fa-var-microchip; } +.@{fa-css-prefix}-snowflake-o:before { content: @fa-var-snowflake-o; } +.@{fa-css-prefix}-superpowers:before { content: @fa-var-superpowers; } +.@{fa-css-prefix}-wpexplorer:before { content: @fa-var-wpexplorer; } +.@{fa-css-prefix}-meetup:before { content: @fa-var-meetup; } diff --git a/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/less/larger.less b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/less/larger.less new file mode 100644 index 000000000..c9d646770 --- /dev/null +++ b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/less/larger.less @@ -0,0 +1,13 @@ +// Icon Sizes +// ------------------------- + +/* makes the font 33% larger relative to the icon container */ +.@{fa-css-prefix}-lg { + font-size: (4em / 3); + line-height: (3em / 4); + vertical-align: -15%; +} +.@{fa-css-prefix}-2x { font-size: 2em; } +.@{fa-css-prefix}-3x { font-size: 3em; } +.@{fa-css-prefix}-4x { font-size: 4em; } +.@{fa-css-prefix}-5x { font-size: 5em; } diff --git a/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/less/list.less b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/less/list.less new file mode 100644 index 000000000..0b440382f --- /dev/null +++ b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/less/list.less @@ -0,0 +1,19 @@ +// List Icons +// ------------------------- + +.@{fa-css-prefix}-ul { + padding-left: 0; + margin-left: @fa-li-width; + list-style-type: none; + > li { position: relative; } +} +.@{fa-css-prefix}-li { + position: absolute; + left: -@fa-li-width; + width: @fa-li-width; + top: (2em / 14); + text-align: center; + &.@{fa-css-prefix}-lg { + left: (-@fa-li-width + (4em / 14)); + } +} diff --git a/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/less/mixins.less b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/less/mixins.less new file mode 100644 index 000000000..beef231d0 --- /dev/null +++ b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/less/mixins.less @@ -0,0 +1,60 @@ +// Mixins +// -------------------------- + +.fa-icon() { + display: inline-block; + font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration + font-size: inherit; // can't have font-size inherit on line above, so need to override + text-rendering: auto; // optimizelegibility throws things off #1094 + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + +} + +.fa-icon-rotate(@degrees, @rotation) { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation})"; + -webkit-transform: rotate(@degrees); + -ms-transform: rotate(@degrees); + transform: rotate(@degrees); +} + +.fa-icon-flip(@horiz, @vert, @rotation) { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation}, mirror=1)"; + -webkit-transform: scale(@horiz, @vert); + -ms-transform: scale(@horiz, @vert); + transform: scale(@horiz, @vert); +} + + +// Only display content to screen readers. A la Bootstrap 4. +// +// See: http://a11yproject.com/posts/how-to-hide-content/ + +.sr-only() { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0,0,0,0); + border: 0; +} + +// Use in conjunction with .sr-only to only display content when it's focused. +// +// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 +// +// Credit: HTML5 Boilerplate + +.sr-only-focusable() { + &:active, + &:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; + } +} diff --git a/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/less/path.less b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/less/path.less new file mode 100644 index 000000000..835be41f8 --- /dev/null +++ b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/less/path.less @@ -0,0 +1,15 @@ +/* FONT PATH + * -------------------------- */ + +@font-face { + font-family: 'FontAwesome'; + src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}'); + src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'), + url('@{fa-font-path}/fontawesome-webfont.woff2?v=@{fa-version}') format('woff2'), + url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'), + url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'), + url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg'); + // src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts + font-weight: normal; + font-style: normal; +} diff --git a/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/less/rotated-flipped.less b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/less/rotated-flipped.less new file mode 100644 index 000000000..f6ba81475 --- /dev/null +++ b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/less/rotated-flipped.less @@ -0,0 +1,20 @@ +// Rotated & Flipped Icons +// ------------------------- + +.@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); } +.@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); } +.@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); } + +.@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); } +.@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); } + +// Hook for IE8-9 +// ------------------------- + +:root .@{fa-css-prefix}-rotate-90, +:root .@{fa-css-prefix}-rotate-180, +:root .@{fa-css-prefix}-rotate-270, +:root .@{fa-css-prefix}-flip-horizontal, +:root .@{fa-css-prefix}-flip-vertical { + filter: none; +} diff --git a/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/less/screen-reader.less b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/less/screen-reader.less new file mode 100644 index 000000000..11c188196 --- /dev/null +++ b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/less/screen-reader.less @@ -0,0 +1,5 @@ +// Screen Readers +// ------------------------- + +.sr-only { .sr-only(); } +.sr-only-focusable { .sr-only-focusable(); } diff --git a/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/less/stacked.less b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/less/stacked.less new file mode 100644 index 000000000..fc53fb0e7 --- /dev/null +++ b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/less/stacked.less @@ -0,0 +1,20 @@ +// Stacked Icons +// ------------------------- + +.@{fa-css-prefix}-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; +} +.@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center; +} +.@{fa-css-prefix}-stack-1x { line-height: inherit; } +.@{fa-css-prefix}-stack-2x { font-size: 2em; } +.@{fa-css-prefix}-inverse { color: @fa-inverse; } diff --git a/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/less/variables.less b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/less/variables.less new file mode 100644 index 000000000..7ddbbc011 --- /dev/null +++ b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/less/variables.less @@ -0,0 +1,800 @@ +// Variables +// -------------------------- + +@fa-font-path: "../fonts"; +@fa-font-size-base: 14px; +@fa-line-height-base: 1; +//@fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.7.0/fonts"; // for referencing Bootstrap CDN font files directly +@fa-css-prefix: fa; +@fa-version: "4.7.0"; +@fa-border-color: #eee; +@fa-inverse: #fff; +@fa-li-width: (30em / 14); + +@fa-var-500px: "\f26e"; +@fa-var-address-book: "\f2b9"; +@fa-var-address-book-o: "\f2ba"; +@fa-var-address-card: "\f2bb"; +@fa-var-address-card-o: "\f2bc"; +@fa-var-adjust: "\f042"; +@fa-var-adn: "\f170"; +@fa-var-align-center: "\f037"; +@fa-var-align-justify: "\f039"; +@fa-var-align-left: "\f036"; +@fa-var-align-right: "\f038"; +@fa-var-amazon: "\f270"; +@fa-var-ambulance: "\f0f9"; +@fa-var-american-sign-language-interpreting: "\f2a3"; +@fa-var-anchor: "\f13d"; +@fa-var-android: "\f17b"; +@fa-var-angellist: "\f209"; +@fa-var-angle-double-down: "\f103"; +@fa-var-angle-double-left: "\f100"; +@fa-var-angle-double-right: "\f101"; +@fa-var-angle-double-up: "\f102"; +@fa-var-angle-down: "\f107"; +@fa-var-angle-left: "\f104"; +@fa-var-angle-right: "\f105"; +@fa-var-angle-up: "\f106"; +@fa-var-apple: "\f179"; +@fa-var-archive: "\f187"; +@fa-var-area-chart: "\f1fe"; +@fa-var-arrow-circle-down: "\f0ab"; +@fa-var-arrow-circle-left: "\f0a8"; +@fa-var-arrow-circle-o-down: "\f01a"; +@fa-var-arrow-circle-o-left: "\f190"; +@fa-var-arrow-circle-o-right: "\f18e"; +@fa-var-arrow-circle-o-up: "\f01b"; +@fa-var-arrow-circle-right: "\f0a9"; +@fa-var-arrow-circle-up: "\f0aa"; +@fa-var-arrow-down: "\f063"; +@fa-var-arrow-left: "\f060"; +@fa-var-arrow-right: "\f061"; +@fa-var-arrow-up: "\f062"; +@fa-var-arrows: "\f047"; +@fa-var-arrows-alt: "\f0b2"; +@fa-var-arrows-h: "\f07e"; +@fa-var-arrows-v: "\f07d"; +@fa-var-asl-interpreting: "\f2a3"; +@fa-var-assistive-listening-systems: "\f2a2"; +@fa-var-asterisk: "\f069"; +@fa-var-at: "\f1fa"; +@fa-var-audio-description: "\f29e"; +@fa-var-automobile: "\f1b9"; +@fa-var-backward: "\f04a"; +@fa-var-balance-scale: "\f24e"; +@fa-var-ban: "\f05e"; +@fa-var-bandcamp: "\f2d5"; +@fa-var-bank: "\f19c"; +@fa-var-bar-chart: "\f080"; +@fa-var-bar-chart-o: "\f080"; +@fa-var-barcode: "\f02a"; +@fa-var-bars: "\f0c9"; +@fa-var-bath: "\f2cd"; +@fa-var-bathtub: "\f2cd"; +@fa-var-battery: "\f240"; +@fa-var-battery-0: "\f244"; +@fa-var-battery-1: "\f243"; +@fa-var-battery-2: "\f242"; +@fa-var-battery-3: "\f241"; +@fa-var-battery-4: "\f240"; +@fa-var-battery-empty: "\f244"; +@fa-var-battery-full: "\f240"; +@fa-var-battery-half: "\f242"; +@fa-var-battery-quarter: "\f243"; +@fa-var-battery-three-quarters: "\f241"; +@fa-var-bed: "\f236"; +@fa-var-beer: "\f0fc"; +@fa-var-behance: "\f1b4"; +@fa-var-behance-square: "\f1b5"; +@fa-var-bell: "\f0f3"; +@fa-var-bell-o: "\f0a2"; +@fa-var-bell-slash: "\f1f6"; +@fa-var-bell-slash-o: "\f1f7"; +@fa-var-bicycle: "\f206"; +@fa-var-binoculars: "\f1e5"; +@fa-var-birthday-cake: "\f1fd"; +@fa-var-bitbucket: "\f171"; +@fa-var-bitbucket-square: "\f172"; +@fa-var-bitcoin: "\f15a"; +@fa-var-black-tie: "\f27e"; +@fa-var-blind: "\f29d"; +@fa-var-bluetooth: "\f293"; +@fa-var-bluetooth-b: "\f294"; +@fa-var-bold: "\f032"; +@fa-var-bolt: "\f0e7"; +@fa-var-bomb: "\f1e2"; +@fa-var-book: "\f02d"; +@fa-var-bookmark: "\f02e"; +@fa-var-bookmark-o: "\f097"; +@fa-var-braille: "\f2a1"; +@fa-var-briefcase: "\f0b1"; +@fa-var-btc: "\f15a"; +@fa-var-bug: "\f188"; +@fa-var-building: "\f1ad"; +@fa-var-building-o: "\f0f7"; +@fa-var-bullhorn: "\f0a1"; +@fa-var-bullseye: "\f140"; +@fa-var-bus: "\f207"; +@fa-var-buysellads: "\f20d"; +@fa-var-cab: "\f1ba"; +@fa-var-calculator: "\f1ec"; +@fa-var-calendar: "\f073"; +@fa-var-calendar-check-o: "\f274"; +@fa-var-calendar-minus-o: "\f272"; +@fa-var-calendar-o: "\f133"; +@fa-var-calendar-plus-o: "\f271"; +@fa-var-calendar-times-o: "\f273"; +@fa-var-camera: "\f030"; +@fa-var-camera-retro: "\f083"; +@fa-var-car: "\f1b9"; +@fa-var-caret-down: "\f0d7"; +@fa-var-caret-left: "\f0d9"; +@fa-var-caret-right: "\f0da"; +@fa-var-caret-square-o-down: "\f150"; +@fa-var-caret-square-o-left: "\f191"; +@fa-var-caret-square-o-right: "\f152"; +@fa-var-caret-square-o-up: "\f151"; +@fa-var-caret-up: "\f0d8"; +@fa-var-cart-arrow-down: "\f218"; +@fa-var-cart-plus: "\f217"; +@fa-var-cc: "\f20a"; +@fa-var-cc-amex: "\f1f3"; +@fa-var-cc-diners-club: "\f24c"; +@fa-var-cc-discover: "\f1f2"; +@fa-var-cc-jcb: "\f24b"; +@fa-var-cc-mastercard: "\f1f1"; +@fa-var-cc-paypal: "\f1f4"; +@fa-var-cc-stripe: "\f1f5"; +@fa-var-cc-visa: "\f1f0"; +@fa-var-certificate: "\f0a3"; +@fa-var-chain: "\f0c1"; +@fa-var-chain-broken: "\f127"; +@fa-var-check: "\f00c"; +@fa-var-check-circle: "\f058"; +@fa-var-check-circle-o: "\f05d"; +@fa-var-check-square: "\f14a"; +@fa-var-check-square-o: "\f046"; +@fa-var-chevron-circle-down: "\f13a"; +@fa-var-chevron-circle-left: "\f137"; +@fa-var-chevron-circle-right: "\f138"; +@fa-var-chevron-circle-up: "\f139"; +@fa-var-chevron-down: "\f078"; +@fa-var-chevron-left: "\f053"; +@fa-var-chevron-right: "\f054"; +@fa-var-chevron-up: "\f077"; +@fa-var-child: "\f1ae"; +@fa-var-chrome: "\f268"; +@fa-var-circle: "\f111"; +@fa-var-circle-o: "\f10c"; +@fa-var-circle-o-notch: "\f1ce"; +@fa-var-circle-thin: "\f1db"; +@fa-var-clipboard: "\f0ea"; +@fa-var-clock-o: "\f017"; +@fa-var-clone: "\f24d"; +@fa-var-close: "\f00d"; +@fa-var-cloud: "\f0c2"; +@fa-var-cloud-download: "\f0ed"; +@fa-var-cloud-upload: "\f0ee"; +@fa-var-cny: "\f157"; +@fa-var-code: "\f121"; +@fa-var-code-fork: "\f126"; +@fa-var-codepen: "\f1cb"; +@fa-var-codiepie: "\f284"; +@fa-var-coffee: "\f0f4"; +@fa-var-cog: "\f013"; +@fa-var-cogs: "\f085"; +@fa-var-columns: "\f0db"; +@fa-var-comment: "\f075"; +@fa-var-comment-o: "\f0e5"; +@fa-var-commenting: "\f27a"; +@fa-var-commenting-o: "\f27b"; +@fa-var-comments: "\f086"; +@fa-var-comments-o: "\f0e6"; +@fa-var-compass: "\f14e"; +@fa-var-compress: "\f066"; +@fa-var-connectdevelop: "\f20e"; +@fa-var-contao: "\f26d"; +@fa-var-copy: "\f0c5"; +@fa-var-copyright: "\f1f9"; +@fa-var-creative-commons: "\f25e"; +@fa-var-credit-card: "\f09d"; +@fa-var-credit-card-alt: "\f283"; +@fa-var-crop: "\f125"; +@fa-var-crosshairs: "\f05b"; +@fa-var-css3: "\f13c"; +@fa-var-cube: "\f1b2"; +@fa-var-cubes: "\f1b3"; +@fa-var-cut: "\f0c4"; +@fa-var-cutlery: "\f0f5"; +@fa-var-dashboard: "\f0e4"; +@fa-var-dashcube: "\f210"; +@fa-var-database: "\f1c0"; +@fa-var-deaf: "\f2a4"; +@fa-var-deafness: "\f2a4"; +@fa-var-dedent: "\f03b"; +@fa-var-delicious: "\f1a5"; +@fa-var-desktop: "\f108"; +@fa-var-deviantart: "\f1bd"; +@fa-var-diamond: "\f219"; +@fa-var-digg: "\f1a6"; +@fa-var-dollar: "\f155"; +@fa-var-dot-circle-o: "\f192"; +@fa-var-download: "\f019"; +@fa-var-dribbble: "\f17d"; +@fa-var-drivers-license: "\f2c2"; +@fa-var-drivers-license-o: "\f2c3"; +@fa-var-dropbox: "\f16b"; +@fa-var-drupal: "\f1a9"; +@fa-var-edge: "\f282"; +@fa-var-edit: "\f044"; +@fa-var-eercast: "\f2da"; +@fa-var-eject: "\f052"; +@fa-var-ellipsis-h: "\f141"; +@fa-var-ellipsis-v: "\f142"; +@fa-var-empire: "\f1d1"; +@fa-var-envelope: "\f0e0"; +@fa-var-envelope-o: "\f003"; +@fa-var-envelope-open: "\f2b6"; +@fa-var-envelope-open-o: "\f2b7"; +@fa-var-envelope-square: "\f199"; +@fa-var-envira: "\f299"; +@fa-var-eraser: "\f12d"; +@fa-var-etsy: "\f2d7"; +@fa-var-eur: "\f153"; +@fa-var-euro: "\f153"; +@fa-var-exchange: "\f0ec"; +@fa-var-exclamation: "\f12a"; +@fa-var-exclamation-circle: "\f06a"; +@fa-var-exclamation-triangle: "\f071"; +@fa-var-expand: "\f065"; +@fa-var-expeditedssl: "\f23e"; +@fa-var-external-link: "\f08e"; +@fa-var-external-link-square: "\f14c"; +@fa-var-eye: "\f06e"; +@fa-var-eye-slash: "\f070"; +@fa-var-eyedropper: "\f1fb"; +@fa-var-fa: "\f2b4"; +@fa-var-facebook: "\f09a"; +@fa-var-facebook-f: "\f09a"; +@fa-var-facebook-official: "\f230"; +@fa-var-facebook-square: "\f082"; +@fa-var-fast-backward: "\f049"; +@fa-var-fast-forward: "\f050"; +@fa-var-fax: "\f1ac"; +@fa-var-feed: "\f09e"; +@fa-var-female: "\f182"; +@fa-var-fighter-jet: "\f0fb"; +@fa-var-file: "\f15b"; +@fa-var-file-archive-o: "\f1c6"; +@fa-var-file-audio-o: "\f1c7"; +@fa-var-file-code-o: "\f1c9"; +@fa-var-file-excel-o: "\f1c3"; +@fa-var-file-image-o: "\f1c5"; +@fa-var-file-movie-o: "\f1c8"; +@fa-var-file-o: "\f016"; +@fa-var-file-pdf-o: "\f1c1"; +@fa-var-file-photo-o: "\f1c5"; +@fa-var-file-picture-o: "\f1c5"; +@fa-var-file-powerpoint-o: "\f1c4"; +@fa-var-file-sound-o: "\f1c7"; +@fa-var-file-text: "\f15c"; +@fa-var-file-text-o: "\f0f6"; +@fa-var-file-video-o: "\f1c8"; +@fa-var-file-word-o: "\f1c2"; +@fa-var-file-zip-o: "\f1c6"; +@fa-var-files-o: "\f0c5"; +@fa-var-film: "\f008"; +@fa-var-filter: "\f0b0"; +@fa-var-fire: "\f06d"; +@fa-var-fire-extinguisher: "\f134"; +@fa-var-firefox: "\f269"; +@fa-var-first-order: "\f2b0"; +@fa-var-flag: "\f024"; +@fa-var-flag-checkered: "\f11e"; +@fa-var-flag-o: "\f11d"; +@fa-var-flash: "\f0e7"; +@fa-var-flask: "\f0c3"; +@fa-var-flickr: "\f16e"; +@fa-var-floppy-o: "\f0c7"; +@fa-var-folder: "\f07b"; +@fa-var-folder-o: "\f114"; +@fa-var-folder-open: "\f07c"; +@fa-var-folder-open-o: "\f115"; +@fa-var-font: "\f031"; +@fa-var-font-awesome: "\f2b4"; +@fa-var-fonticons: "\f280"; +@fa-var-fort-awesome: "\f286"; +@fa-var-forumbee: "\f211"; +@fa-var-forward: "\f04e"; +@fa-var-foursquare: "\f180"; +@fa-var-free-code-camp: "\f2c5"; +@fa-var-frown-o: "\f119"; +@fa-var-futbol-o: "\f1e3"; +@fa-var-gamepad: "\f11b"; +@fa-var-gavel: "\f0e3"; +@fa-var-gbp: "\f154"; +@fa-var-ge: "\f1d1"; +@fa-var-gear: "\f013"; +@fa-var-gears: "\f085"; +@fa-var-genderless: "\f22d"; +@fa-var-get-pocket: "\f265"; +@fa-var-gg: "\f260"; +@fa-var-gg-circle: "\f261"; +@fa-var-gift: "\f06b"; +@fa-var-git: "\f1d3"; +@fa-var-git-square: "\f1d2"; +@fa-var-github: "\f09b"; +@fa-var-github-alt: "\f113"; +@fa-var-github-square: "\f092"; +@fa-var-gitlab: "\f296"; +@fa-var-gittip: "\f184"; +@fa-var-glass: "\f000"; +@fa-var-glide: "\f2a5"; +@fa-var-glide-g: "\f2a6"; +@fa-var-globe: "\f0ac"; +@fa-var-google: "\f1a0"; +@fa-var-google-plus: "\f0d5"; +@fa-var-google-plus-circle: "\f2b3"; +@fa-var-google-plus-official: "\f2b3"; +@fa-var-google-plus-square: "\f0d4"; +@fa-var-google-wallet: "\f1ee"; +@fa-var-graduation-cap: "\f19d"; +@fa-var-gratipay: "\f184"; +@fa-var-grav: "\f2d6"; +@fa-var-group: "\f0c0"; +@fa-var-h-square: "\f0fd"; +@fa-var-hacker-news: "\f1d4"; +@fa-var-hand-grab-o: "\f255"; +@fa-var-hand-lizard-o: "\f258"; +@fa-var-hand-o-down: "\f0a7"; +@fa-var-hand-o-left: "\f0a5"; +@fa-var-hand-o-right: "\f0a4"; +@fa-var-hand-o-up: "\f0a6"; +@fa-var-hand-paper-o: "\f256"; +@fa-var-hand-peace-o: "\f25b"; +@fa-var-hand-pointer-o: "\f25a"; +@fa-var-hand-rock-o: "\f255"; +@fa-var-hand-scissors-o: "\f257"; +@fa-var-hand-spock-o: "\f259"; +@fa-var-hand-stop-o: "\f256"; +@fa-var-handshake-o: "\f2b5"; +@fa-var-hard-of-hearing: "\f2a4"; +@fa-var-hashtag: "\f292"; +@fa-var-hdd-o: "\f0a0"; +@fa-var-header: "\f1dc"; +@fa-var-headphones: "\f025"; +@fa-var-heart: "\f004"; +@fa-var-heart-o: "\f08a"; +@fa-var-heartbeat: "\f21e"; +@fa-var-history: "\f1da"; +@fa-var-home: "\f015"; +@fa-var-hospital-o: "\f0f8"; +@fa-var-hotel: "\f236"; +@fa-var-hourglass: "\f254"; +@fa-var-hourglass-1: "\f251"; +@fa-var-hourglass-2: "\f252"; +@fa-var-hourglass-3: "\f253"; +@fa-var-hourglass-end: "\f253"; +@fa-var-hourglass-half: "\f252"; +@fa-var-hourglass-o: "\f250"; +@fa-var-hourglass-start: "\f251"; +@fa-var-houzz: "\f27c"; +@fa-var-html5: "\f13b"; +@fa-var-i-cursor: "\f246"; +@fa-var-id-badge: "\f2c1"; +@fa-var-id-card: "\f2c2"; +@fa-var-id-card-o: "\f2c3"; +@fa-var-ils: "\f20b"; +@fa-var-image: "\f03e"; +@fa-var-imdb: "\f2d8"; +@fa-var-inbox: "\f01c"; +@fa-var-indent: "\f03c"; +@fa-var-industry: "\f275"; +@fa-var-info: "\f129"; +@fa-var-info-circle: "\f05a"; +@fa-var-inr: "\f156"; +@fa-var-instagram: "\f16d"; +@fa-var-institution: "\f19c"; +@fa-var-internet-explorer: "\f26b"; +@fa-var-intersex: "\f224"; +@fa-var-ioxhost: "\f208"; +@fa-var-italic: "\f033"; +@fa-var-joomla: "\f1aa"; +@fa-var-jpy: "\f157"; +@fa-var-jsfiddle: "\f1cc"; +@fa-var-key: "\f084"; +@fa-var-keyboard-o: "\f11c"; +@fa-var-krw: "\f159"; +@fa-var-language: "\f1ab"; +@fa-var-laptop: "\f109"; +@fa-var-lastfm: "\f202"; +@fa-var-lastfm-square: "\f203"; +@fa-var-leaf: "\f06c"; +@fa-var-leanpub: "\f212"; +@fa-var-legal: "\f0e3"; +@fa-var-lemon-o: "\f094"; +@fa-var-level-down: "\f149"; +@fa-var-level-up: "\f148"; +@fa-var-life-bouy: "\f1cd"; +@fa-var-life-buoy: "\f1cd"; +@fa-var-life-ring: "\f1cd"; +@fa-var-life-saver: "\f1cd"; +@fa-var-lightbulb-o: "\f0eb"; +@fa-var-line-chart: "\f201"; +@fa-var-link: "\f0c1"; +@fa-var-linkedin: "\f0e1"; +@fa-var-linkedin-square: "\f08c"; +@fa-var-linode: "\f2b8"; +@fa-var-linux: "\f17c"; +@fa-var-list: "\f03a"; +@fa-var-list-alt: "\f022"; +@fa-var-list-ol: "\f0cb"; +@fa-var-list-ul: "\f0ca"; +@fa-var-location-arrow: "\f124"; +@fa-var-lock: "\f023"; +@fa-var-long-arrow-down: "\f175"; +@fa-var-long-arrow-left: "\f177"; +@fa-var-long-arrow-right: "\f178"; +@fa-var-long-arrow-up: "\f176"; +@fa-var-low-vision: "\f2a8"; +@fa-var-magic: "\f0d0"; +@fa-var-magnet: "\f076"; +@fa-var-mail-forward: "\f064"; +@fa-var-mail-reply: "\f112"; +@fa-var-mail-reply-all: "\f122"; +@fa-var-male: "\f183"; +@fa-var-map: "\f279"; +@fa-var-map-marker: "\f041"; +@fa-var-map-o: "\f278"; +@fa-var-map-pin: "\f276"; +@fa-var-map-signs: "\f277"; +@fa-var-mars: "\f222"; +@fa-var-mars-double: "\f227"; +@fa-var-mars-stroke: "\f229"; +@fa-var-mars-stroke-h: "\f22b"; +@fa-var-mars-stroke-v: "\f22a"; +@fa-var-maxcdn: "\f136"; +@fa-var-meanpath: "\f20c"; +@fa-var-medium: "\f23a"; +@fa-var-medkit: "\f0fa"; +@fa-var-meetup: "\f2e0"; +@fa-var-meh-o: "\f11a"; +@fa-var-mercury: "\f223"; +@fa-var-microchip: "\f2db"; +@fa-var-microphone: "\f130"; +@fa-var-microphone-slash: "\f131"; +@fa-var-minus: "\f068"; +@fa-var-minus-circle: "\f056"; +@fa-var-minus-square: "\f146"; +@fa-var-minus-square-o: "\f147"; +@fa-var-mixcloud: "\f289"; +@fa-var-mobile: "\f10b"; +@fa-var-mobile-phone: "\f10b"; +@fa-var-modx: "\f285"; +@fa-var-money: "\f0d6"; +@fa-var-moon-o: "\f186"; +@fa-var-mortar-board: "\f19d"; +@fa-var-motorcycle: "\f21c"; +@fa-var-mouse-pointer: "\f245"; +@fa-var-music: "\f001"; +@fa-var-navicon: "\f0c9"; +@fa-var-neuter: "\f22c"; +@fa-var-newspaper-o: "\f1ea"; +@fa-var-object-group: "\f247"; +@fa-var-object-ungroup: "\f248"; +@fa-var-odnoklassniki: "\f263"; +@fa-var-odnoklassniki-square: "\f264"; +@fa-var-opencart: "\f23d"; +@fa-var-openid: "\f19b"; +@fa-var-opera: "\f26a"; +@fa-var-optin-monster: "\f23c"; +@fa-var-outdent: "\f03b"; +@fa-var-pagelines: "\f18c"; +@fa-var-paint-brush: "\f1fc"; +@fa-var-paper-plane: "\f1d8"; +@fa-var-paper-plane-o: "\f1d9"; +@fa-var-paperclip: "\f0c6"; +@fa-var-paragraph: "\f1dd"; +@fa-var-paste: "\f0ea"; +@fa-var-pause: "\f04c"; +@fa-var-pause-circle: "\f28b"; +@fa-var-pause-circle-o: "\f28c"; +@fa-var-paw: "\f1b0"; +@fa-var-paypal: "\f1ed"; +@fa-var-pencil: "\f040"; +@fa-var-pencil-square: "\f14b"; +@fa-var-pencil-square-o: "\f044"; +@fa-var-percent: "\f295"; +@fa-var-phone: "\f095"; +@fa-var-phone-square: "\f098"; +@fa-var-photo: "\f03e"; +@fa-var-picture-o: "\f03e"; +@fa-var-pie-chart: "\f200"; +@fa-var-pied-piper: "\f2ae"; +@fa-var-pied-piper-alt: "\f1a8"; +@fa-var-pied-piper-pp: "\f1a7"; +@fa-var-pinterest: "\f0d2"; +@fa-var-pinterest-p: "\f231"; +@fa-var-pinterest-square: "\f0d3"; +@fa-var-plane: "\f072"; +@fa-var-play: "\f04b"; +@fa-var-play-circle: "\f144"; +@fa-var-play-circle-o: "\f01d"; +@fa-var-plug: "\f1e6"; +@fa-var-plus: "\f067"; +@fa-var-plus-circle: "\f055"; +@fa-var-plus-square: "\f0fe"; +@fa-var-plus-square-o: "\f196"; +@fa-var-podcast: "\f2ce"; +@fa-var-power-off: "\f011"; +@fa-var-print: "\f02f"; +@fa-var-product-hunt: "\f288"; +@fa-var-puzzle-piece: "\f12e"; +@fa-var-qq: "\f1d6"; +@fa-var-qrcode: "\f029"; +@fa-var-question: "\f128"; +@fa-var-question-circle: "\f059"; +@fa-var-question-circle-o: "\f29c"; +@fa-var-quora: "\f2c4"; +@fa-var-quote-left: "\f10d"; +@fa-var-quote-right: "\f10e"; +@fa-var-ra: "\f1d0"; +@fa-var-random: "\f074"; +@fa-var-ravelry: "\f2d9"; +@fa-var-rebel: "\f1d0"; +@fa-var-recycle: "\f1b8"; +@fa-var-reddit: "\f1a1"; +@fa-var-reddit-alien: "\f281"; +@fa-var-reddit-square: "\f1a2"; +@fa-var-refresh: "\f021"; +@fa-var-registered: "\f25d"; +@fa-var-remove: "\f00d"; +@fa-var-renren: "\f18b"; +@fa-var-reorder: "\f0c9"; +@fa-var-repeat: "\f01e"; +@fa-var-reply: "\f112"; +@fa-var-reply-all: "\f122"; +@fa-var-resistance: "\f1d0"; +@fa-var-retweet: "\f079"; +@fa-var-rmb: "\f157"; +@fa-var-road: "\f018"; +@fa-var-rocket: "\f135"; +@fa-var-rotate-left: "\f0e2"; +@fa-var-rotate-right: "\f01e"; +@fa-var-rouble: "\f158"; +@fa-var-rss: "\f09e"; +@fa-var-rss-square: "\f143"; +@fa-var-rub: "\f158"; +@fa-var-ruble: "\f158"; +@fa-var-rupee: "\f156"; +@fa-var-s15: "\f2cd"; +@fa-var-safari: "\f267"; +@fa-var-save: "\f0c7"; +@fa-var-scissors: "\f0c4"; +@fa-var-scribd: "\f28a"; +@fa-var-search: "\f002"; +@fa-var-search-minus: "\f010"; +@fa-var-search-plus: "\f00e"; +@fa-var-sellsy: "\f213"; +@fa-var-send: "\f1d8"; +@fa-var-send-o: "\f1d9"; +@fa-var-server: "\f233"; +@fa-var-share: "\f064"; +@fa-var-share-alt: "\f1e0"; +@fa-var-share-alt-square: "\f1e1"; +@fa-var-share-square: "\f14d"; +@fa-var-share-square-o: "\f045"; +@fa-var-shekel: "\f20b"; +@fa-var-sheqel: "\f20b"; +@fa-var-shield: "\f132"; +@fa-var-ship: "\f21a"; +@fa-var-shirtsinbulk: "\f214"; +@fa-var-shopping-bag: "\f290"; +@fa-var-shopping-basket: "\f291"; +@fa-var-shopping-cart: "\f07a"; +@fa-var-shower: "\f2cc"; +@fa-var-sign-in: "\f090"; +@fa-var-sign-language: "\f2a7"; +@fa-var-sign-out: "\f08b"; +@fa-var-signal: "\f012"; +@fa-var-signing: "\f2a7"; +@fa-var-simplybuilt: "\f215"; +@fa-var-sitemap: "\f0e8"; +@fa-var-skyatlas: "\f216"; +@fa-var-skype: "\f17e"; +@fa-var-slack: "\f198"; +@fa-var-sliders: "\f1de"; +@fa-var-slideshare: "\f1e7"; +@fa-var-smile-o: "\f118"; +@fa-var-snapchat: "\f2ab"; +@fa-var-snapchat-ghost: "\f2ac"; +@fa-var-snapchat-square: "\f2ad"; +@fa-var-snowflake-o: "\f2dc"; +@fa-var-soccer-ball-o: "\f1e3"; +@fa-var-sort: "\f0dc"; +@fa-var-sort-alpha-asc: "\f15d"; +@fa-var-sort-alpha-desc: "\f15e"; +@fa-var-sort-amount-asc: "\f160"; +@fa-var-sort-amount-desc: "\f161"; +@fa-var-sort-asc: "\f0de"; +@fa-var-sort-desc: "\f0dd"; +@fa-var-sort-down: "\f0dd"; +@fa-var-sort-numeric-asc: "\f162"; +@fa-var-sort-numeric-desc: "\f163"; +@fa-var-sort-up: "\f0de"; +@fa-var-soundcloud: "\f1be"; +@fa-var-space-shuttle: "\f197"; +@fa-var-spinner: "\f110"; +@fa-var-spoon: "\f1b1"; +@fa-var-spotify: "\f1bc"; +@fa-var-square: "\f0c8"; +@fa-var-square-o: "\f096"; +@fa-var-stack-exchange: "\f18d"; +@fa-var-stack-overflow: "\f16c"; +@fa-var-star: "\f005"; +@fa-var-star-half: "\f089"; +@fa-var-star-half-empty: "\f123"; +@fa-var-star-half-full: "\f123"; +@fa-var-star-half-o: "\f123"; +@fa-var-star-o: "\f006"; +@fa-var-steam: "\f1b6"; +@fa-var-steam-square: "\f1b7"; +@fa-var-step-backward: "\f048"; +@fa-var-step-forward: "\f051"; +@fa-var-stethoscope: "\f0f1"; +@fa-var-sticky-note: "\f249"; +@fa-var-sticky-note-o: "\f24a"; +@fa-var-stop: "\f04d"; +@fa-var-stop-circle: "\f28d"; +@fa-var-stop-circle-o: "\f28e"; +@fa-var-street-view: "\f21d"; +@fa-var-strikethrough: "\f0cc"; +@fa-var-stumbleupon: "\f1a4"; +@fa-var-stumbleupon-circle: "\f1a3"; +@fa-var-subscript: "\f12c"; +@fa-var-subway: "\f239"; +@fa-var-suitcase: "\f0f2"; +@fa-var-sun-o: "\f185"; +@fa-var-superpowers: "\f2dd"; +@fa-var-superscript: "\f12b"; +@fa-var-support: "\f1cd"; +@fa-var-table: "\f0ce"; +@fa-var-tablet: "\f10a"; +@fa-var-tachometer: "\f0e4"; +@fa-var-tag: "\f02b"; +@fa-var-tags: "\f02c"; +@fa-var-tasks: "\f0ae"; +@fa-var-taxi: "\f1ba"; +@fa-var-telegram: "\f2c6"; +@fa-var-television: "\f26c"; +@fa-var-tencent-weibo: "\f1d5"; +@fa-var-terminal: "\f120"; +@fa-var-text-height: "\f034"; +@fa-var-text-width: "\f035"; +@fa-var-th: "\f00a"; +@fa-var-th-large: "\f009"; +@fa-var-th-list: "\f00b"; +@fa-var-themeisle: "\f2b2"; +@fa-var-thermometer: "\f2c7"; +@fa-var-thermometer-0: "\f2cb"; +@fa-var-thermometer-1: "\f2ca"; +@fa-var-thermometer-2: "\f2c9"; +@fa-var-thermometer-3: "\f2c8"; +@fa-var-thermometer-4: "\f2c7"; +@fa-var-thermometer-empty: "\f2cb"; +@fa-var-thermometer-full: "\f2c7"; +@fa-var-thermometer-half: "\f2c9"; +@fa-var-thermometer-quarter: "\f2ca"; +@fa-var-thermometer-three-quarters: "\f2c8"; +@fa-var-thumb-tack: "\f08d"; +@fa-var-thumbs-down: "\f165"; +@fa-var-thumbs-o-down: "\f088"; +@fa-var-thumbs-o-up: "\f087"; +@fa-var-thumbs-up: "\f164"; +@fa-var-ticket: "\f145"; +@fa-var-times: "\f00d"; +@fa-var-times-circle: "\f057"; +@fa-var-times-circle-o: "\f05c"; +@fa-var-times-rectangle: "\f2d3"; +@fa-var-times-rectangle-o: "\f2d4"; +@fa-var-tint: "\f043"; +@fa-var-toggle-down: "\f150"; +@fa-var-toggle-left: "\f191"; +@fa-var-toggle-off: "\f204"; +@fa-var-toggle-on: "\f205"; +@fa-var-toggle-right: "\f152"; +@fa-var-toggle-up: "\f151"; +@fa-var-trademark: "\f25c"; +@fa-var-train: "\f238"; +@fa-var-transgender: "\f224"; +@fa-var-transgender-alt: "\f225"; +@fa-var-trash: "\f1f8"; +@fa-var-trash-o: "\f014"; +@fa-var-tree: "\f1bb"; +@fa-var-trello: "\f181"; +@fa-var-tripadvisor: "\f262"; +@fa-var-trophy: "\f091"; +@fa-var-truck: "\f0d1"; +@fa-var-try: "\f195"; +@fa-var-tty: "\f1e4"; +@fa-var-tumblr: "\f173"; +@fa-var-tumblr-square: "\f174"; +@fa-var-turkish-lira: "\f195"; +@fa-var-tv: "\f26c"; +@fa-var-twitch: "\f1e8"; +@fa-var-twitter: "\f099"; +@fa-var-twitter-square: "\f081"; +@fa-var-umbrella: "\f0e9"; +@fa-var-underline: "\f0cd"; +@fa-var-undo: "\f0e2"; +@fa-var-universal-access: "\f29a"; +@fa-var-university: "\f19c"; +@fa-var-unlink: "\f127"; +@fa-var-unlock: "\f09c"; +@fa-var-unlock-alt: "\f13e"; +@fa-var-unsorted: "\f0dc"; +@fa-var-upload: "\f093"; +@fa-var-usb: "\f287"; +@fa-var-usd: "\f155"; +@fa-var-user: "\f007"; +@fa-var-user-circle: "\f2bd"; +@fa-var-user-circle-o: "\f2be"; +@fa-var-user-md: "\f0f0"; +@fa-var-user-o: "\f2c0"; +@fa-var-user-plus: "\f234"; +@fa-var-user-secret: "\f21b"; +@fa-var-user-times: "\f235"; +@fa-var-users: "\f0c0"; +@fa-var-vcard: "\f2bb"; +@fa-var-vcard-o: "\f2bc"; +@fa-var-venus: "\f221"; +@fa-var-venus-double: "\f226"; +@fa-var-venus-mars: "\f228"; +@fa-var-viacoin: "\f237"; +@fa-var-viadeo: "\f2a9"; +@fa-var-viadeo-square: "\f2aa"; +@fa-var-video-camera: "\f03d"; +@fa-var-vimeo: "\f27d"; +@fa-var-vimeo-square: "\f194"; +@fa-var-vine: "\f1ca"; +@fa-var-vk: "\f189"; +@fa-var-volume-control-phone: "\f2a0"; +@fa-var-volume-down: "\f027"; +@fa-var-volume-off: "\f026"; +@fa-var-volume-up: "\f028"; +@fa-var-warning: "\f071"; +@fa-var-wechat: "\f1d7"; +@fa-var-weibo: "\f18a"; +@fa-var-weixin: "\f1d7"; +@fa-var-whatsapp: "\f232"; +@fa-var-wheelchair: "\f193"; +@fa-var-wheelchair-alt: "\f29b"; +@fa-var-wifi: "\f1eb"; +@fa-var-wikipedia-w: "\f266"; +@fa-var-window-close: "\f2d3"; +@fa-var-window-close-o: "\f2d4"; +@fa-var-window-maximize: "\f2d0"; +@fa-var-window-minimize: "\f2d1"; +@fa-var-window-restore: "\f2d2"; +@fa-var-windows: "\f17a"; +@fa-var-won: "\f159"; +@fa-var-wordpress: "\f19a"; +@fa-var-wpbeginner: "\f297"; +@fa-var-wpexplorer: "\f2de"; +@fa-var-wpforms: "\f298"; +@fa-var-wrench: "\f0ad"; +@fa-var-xing: "\f168"; +@fa-var-xing-square: "\f169"; +@fa-var-y-combinator: "\f23b"; +@fa-var-y-combinator-square: "\f1d4"; +@fa-var-yahoo: "\f19e"; +@fa-var-yc: "\f23b"; +@fa-var-yc-square: "\f1d4"; +@fa-var-yelp: "\f1e9"; +@fa-var-yen: "\f157"; +@fa-var-yoast: "\f2b1"; +@fa-var-youtube: "\f167"; +@fa-var-youtube-play: "\f16a"; +@fa-var-youtube-square: "\f166"; + diff --git a/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/scss/_animated.scss b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/scss/_animated.scss new file mode 100644 index 000000000..8a020dbff --- /dev/null +++ b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/scss/_animated.scss @@ -0,0 +1,34 @@ +// Spinning Icons +// -------------------------- + +.#{$fa-css-prefix}-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; +} + +.#{$fa-css-prefix}-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); + } +} diff --git a/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/scss/_bordered-pulled.scss b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/scss/_bordered-pulled.scss new file mode 100644 index 000000000..d4b85a02f --- /dev/null +++ b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/scss/_bordered-pulled.scss @@ -0,0 +1,25 @@ +// Bordered & Pulled +// ------------------------- + +.#{$fa-css-prefix}-border { + padding: .2em .25em .15em; + border: solid .08em $fa-border-color; + border-radius: .1em; +} + +.#{$fa-css-prefix}-pull-left { float: left; } +.#{$fa-css-prefix}-pull-right { float: right; } + +.#{$fa-css-prefix} { + &.#{$fa-css-prefix}-pull-left { margin-right: .3em; } + &.#{$fa-css-prefix}-pull-right { margin-left: .3em; } +} + +/* Deprecated as of 4.4.0 */ +.pull-right { float: right; } +.pull-left { float: left; } + +.#{$fa-css-prefix} { + &.pull-left { margin-right: .3em; } + &.pull-right { margin-left: .3em; } +} diff --git a/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/scss/_core.scss b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/scss/_core.scss new file mode 100644 index 000000000..7425ef85f --- /dev/null +++ b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/scss/_core.scss @@ -0,0 +1,12 @@ +// Base Class Definition +// ------------------------- + +.#{$fa-css-prefix} { + display: inline-block; + font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration + font-size: inherit; // can't have font-size inherit on line above, so need to override + text-rendering: auto; // optimizelegibility throws things off #1094 + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + +} diff --git a/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/scss/_fixed-width.scss b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/scss/_fixed-width.scss new file mode 100644 index 000000000..b221c9813 --- /dev/null +++ b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/scss/_fixed-width.scss @@ -0,0 +1,6 @@ +// Fixed Width Icons +// ------------------------- +.#{$fa-css-prefix}-fw { + width: (18em / 14); + text-align: center; +} diff --git a/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/scss/_icons.scss b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/scss/_icons.scss new file mode 100644 index 000000000..e63e702c4 --- /dev/null +++ b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/scss/_icons.scss @@ -0,0 +1,789 @@ +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ + +.#{$fa-css-prefix}-glass:before { content: $fa-var-glass; } +.#{$fa-css-prefix}-music:before { content: $fa-var-music; } +.#{$fa-css-prefix}-search:before { content: $fa-var-search; } +.#{$fa-css-prefix}-envelope-o:before { content: $fa-var-envelope-o; } +.#{$fa-css-prefix}-heart:before { content: $fa-var-heart; } +.#{$fa-css-prefix}-star:before { content: $fa-var-star; } +.#{$fa-css-prefix}-star-o:before { content: $fa-var-star-o; } +.#{$fa-css-prefix}-user:before { content: $fa-var-user; } +.#{$fa-css-prefix}-film:before { content: $fa-var-film; } +.#{$fa-css-prefix}-th-large:before { content: $fa-var-th-large; } +.#{$fa-css-prefix}-th:before { content: $fa-var-th; } +.#{$fa-css-prefix}-th-list:before { content: $fa-var-th-list; } +.#{$fa-css-prefix}-check:before { content: $fa-var-check; } +.#{$fa-css-prefix}-remove:before, +.#{$fa-css-prefix}-close:before, +.#{$fa-css-prefix}-times:before { content: $fa-var-times; } +.#{$fa-css-prefix}-search-plus:before { content: $fa-var-search-plus; } +.#{$fa-css-prefix}-search-minus:before { content: $fa-var-search-minus; } +.#{$fa-css-prefix}-power-off:before { content: $fa-var-power-off; } +.#{$fa-css-prefix}-signal:before { content: $fa-var-signal; } +.#{$fa-css-prefix}-gear:before, +.#{$fa-css-prefix}-cog:before { content: $fa-var-cog; } +.#{$fa-css-prefix}-trash-o:before { content: $fa-var-trash-o; } +.#{$fa-css-prefix}-home:before { content: $fa-var-home; } +.#{$fa-css-prefix}-file-o:before { content: $fa-var-file-o; } +.#{$fa-css-prefix}-clock-o:before { content: $fa-var-clock-o; } +.#{$fa-css-prefix}-road:before { content: $fa-var-road; } +.#{$fa-css-prefix}-download:before { content: $fa-var-download; } +.#{$fa-css-prefix}-arrow-circle-o-down:before { content: $fa-var-arrow-circle-o-down; } +.#{$fa-css-prefix}-arrow-circle-o-up:before { content: $fa-var-arrow-circle-o-up; } +.#{$fa-css-prefix}-inbox:before { content: $fa-var-inbox; } +.#{$fa-css-prefix}-play-circle-o:before { content: $fa-var-play-circle-o; } +.#{$fa-css-prefix}-rotate-right:before, +.#{$fa-css-prefix}-repeat:before { content: $fa-var-repeat; } +.#{$fa-css-prefix}-refresh:before { content: $fa-var-refresh; } +.#{$fa-css-prefix}-list-alt:before { content: $fa-var-list-alt; } +.#{$fa-css-prefix}-lock:before { content: $fa-var-lock; } +.#{$fa-css-prefix}-flag:before { content: $fa-var-flag; } +.#{$fa-css-prefix}-headphones:before { content: $fa-var-headphones; } +.#{$fa-css-prefix}-volume-off:before { content: $fa-var-volume-off; } +.#{$fa-css-prefix}-volume-down:before { content: $fa-var-volume-down; } +.#{$fa-css-prefix}-volume-up:before { content: $fa-var-volume-up; } +.#{$fa-css-prefix}-qrcode:before { content: $fa-var-qrcode; } +.#{$fa-css-prefix}-barcode:before { content: $fa-var-barcode; } +.#{$fa-css-prefix}-tag:before { content: $fa-var-tag; } +.#{$fa-css-prefix}-tags:before { content: $fa-var-tags; } +.#{$fa-css-prefix}-book:before { content: $fa-var-book; } +.#{$fa-css-prefix}-bookmark:before { content: $fa-var-bookmark; } +.#{$fa-css-prefix}-print:before { content: $fa-var-print; } +.#{$fa-css-prefix}-camera:before { content: $fa-var-camera; } +.#{$fa-css-prefix}-font:before { content: $fa-var-font; } +.#{$fa-css-prefix}-bold:before { content: $fa-var-bold; } +.#{$fa-css-prefix}-italic:before { content: $fa-var-italic; } +.#{$fa-css-prefix}-text-height:before { content: $fa-var-text-height; } +.#{$fa-css-prefix}-text-width:before { content: $fa-var-text-width; } +.#{$fa-css-prefix}-align-left:before { content: $fa-var-align-left; } +.#{$fa-css-prefix}-align-center:before { content: $fa-var-align-center; } +.#{$fa-css-prefix}-align-right:before { content: $fa-var-align-right; } +.#{$fa-css-prefix}-align-justify:before { content: $fa-var-align-justify; } +.#{$fa-css-prefix}-list:before { content: $fa-var-list; } +.#{$fa-css-prefix}-dedent:before, +.#{$fa-css-prefix}-outdent:before { content: $fa-var-outdent; } +.#{$fa-css-prefix}-indent:before { content: $fa-var-indent; } +.#{$fa-css-prefix}-video-camera:before { content: $fa-var-video-camera; } +.#{$fa-css-prefix}-photo:before, +.#{$fa-css-prefix}-image:before, +.#{$fa-css-prefix}-picture-o:before { content: $fa-var-picture-o; } +.#{$fa-css-prefix}-pencil:before { content: $fa-var-pencil; } +.#{$fa-css-prefix}-map-marker:before { content: $fa-var-map-marker; } +.#{$fa-css-prefix}-adjust:before { content: $fa-var-adjust; } +.#{$fa-css-prefix}-tint:before { content: $fa-var-tint; } +.#{$fa-css-prefix}-edit:before, +.#{$fa-css-prefix}-pencil-square-o:before { content: $fa-var-pencil-square-o; } +.#{$fa-css-prefix}-share-square-o:before { content: $fa-var-share-square-o; } +.#{$fa-css-prefix}-check-square-o:before { content: $fa-var-check-square-o; } +.#{$fa-css-prefix}-arrows:before { content: $fa-var-arrows; } +.#{$fa-css-prefix}-step-backward:before { content: $fa-var-step-backward; } +.#{$fa-css-prefix}-fast-backward:before { content: $fa-var-fast-backward; } +.#{$fa-css-prefix}-backward:before { content: $fa-var-backward; } +.#{$fa-css-prefix}-play:before { content: $fa-var-play; } +.#{$fa-css-prefix}-pause:before { content: $fa-var-pause; } +.#{$fa-css-prefix}-stop:before { content: $fa-var-stop; } +.#{$fa-css-prefix}-forward:before { content: $fa-var-forward; } +.#{$fa-css-prefix}-fast-forward:before { content: $fa-var-fast-forward; } +.#{$fa-css-prefix}-step-forward:before { content: $fa-var-step-forward; } +.#{$fa-css-prefix}-eject:before { content: $fa-var-eject; } +.#{$fa-css-prefix}-chevron-left:before { content: $fa-var-chevron-left; } +.#{$fa-css-prefix}-chevron-right:before { content: $fa-var-chevron-right; } +.#{$fa-css-prefix}-plus-circle:before { content: $fa-var-plus-circle; } +.#{$fa-css-prefix}-minus-circle:before { content: $fa-var-minus-circle; } +.#{$fa-css-prefix}-times-circle:before { content: $fa-var-times-circle; } +.#{$fa-css-prefix}-check-circle:before { content: $fa-var-check-circle; } +.#{$fa-css-prefix}-question-circle:before { content: $fa-var-question-circle; } +.#{$fa-css-prefix}-info-circle:before { content: $fa-var-info-circle; } +.#{$fa-css-prefix}-crosshairs:before { content: $fa-var-crosshairs; } +.#{$fa-css-prefix}-times-circle-o:before { content: $fa-var-times-circle-o; } +.#{$fa-css-prefix}-check-circle-o:before { content: $fa-var-check-circle-o; } +.#{$fa-css-prefix}-ban:before { content: $fa-var-ban; } +.#{$fa-css-prefix}-arrow-left:before { content: $fa-var-arrow-left; } +.#{$fa-css-prefix}-arrow-right:before { content: $fa-var-arrow-right; } +.#{$fa-css-prefix}-arrow-up:before { content: $fa-var-arrow-up; } +.#{$fa-css-prefix}-arrow-down:before { content: $fa-var-arrow-down; } +.#{$fa-css-prefix}-mail-forward:before, +.#{$fa-css-prefix}-share:before { content: $fa-var-share; } +.#{$fa-css-prefix}-expand:before { content: $fa-var-expand; } +.#{$fa-css-prefix}-compress:before { content: $fa-var-compress; } +.#{$fa-css-prefix}-plus:before { content: $fa-var-plus; } +.#{$fa-css-prefix}-minus:before { content: $fa-var-minus; } +.#{$fa-css-prefix}-asterisk:before { content: $fa-var-asterisk; } +.#{$fa-css-prefix}-exclamation-circle:before { content: $fa-var-exclamation-circle; } +.#{$fa-css-prefix}-gift:before { content: $fa-var-gift; } +.#{$fa-css-prefix}-leaf:before { content: $fa-var-leaf; } +.#{$fa-css-prefix}-fire:before { content: $fa-var-fire; } +.#{$fa-css-prefix}-eye:before { content: $fa-var-eye; } +.#{$fa-css-prefix}-eye-slash:before { content: $fa-var-eye-slash; } +.#{$fa-css-prefix}-warning:before, +.#{$fa-css-prefix}-exclamation-triangle:before { content: $fa-var-exclamation-triangle; } +.#{$fa-css-prefix}-plane:before { content: $fa-var-plane; } +.#{$fa-css-prefix}-calendar:before { content: $fa-var-calendar; } +.#{$fa-css-prefix}-random:before { content: $fa-var-random; } +.#{$fa-css-prefix}-comment:before { content: $fa-var-comment; } +.#{$fa-css-prefix}-magnet:before { content: $fa-var-magnet; } +.#{$fa-css-prefix}-chevron-up:before { content: $fa-var-chevron-up; } +.#{$fa-css-prefix}-chevron-down:before { content: $fa-var-chevron-down; } +.#{$fa-css-prefix}-retweet:before { content: $fa-var-retweet; } +.#{$fa-css-prefix}-shopping-cart:before { content: $fa-var-shopping-cart; } +.#{$fa-css-prefix}-folder:before { content: $fa-var-folder; } +.#{$fa-css-prefix}-folder-open:before { content: $fa-var-folder-open; } +.#{$fa-css-prefix}-arrows-v:before { content: $fa-var-arrows-v; } +.#{$fa-css-prefix}-arrows-h:before { content: $fa-var-arrows-h; } +.#{$fa-css-prefix}-bar-chart-o:before, +.#{$fa-css-prefix}-bar-chart:before { content: $fa-var-bar-chart; } +.#{$fa-css-prefix}-twitter-square:before { content: $fa-var-twitter-square; } +.#{$fa-css-prefix}-facebook-square:before { content: $fa-var-facebook-square; } +.#{$fa-css-prefix}-camera-retro:before { content: $fa-var-camera-retro; } +.#{$fa-css-prefix}-key:before { content: $fa-var-key; } +.#{$fa-css-prefix}-gears:before, +.#{$fa-css-prefix}-cogs:before { content: $fa-var-cogs; } +.#{$fa-css-prefix}-comments:before { content: $fa-var-comments; } +.#{$fa-css-prefix}-thumbs-o-up:before { content: $fa-var-thumbs-o-up; } +.#{$fa-css-prefix}-thumbs-o-down:before { content: $fa-var-thumbs-o-down; } +.#{$fa-css-prefix}-star-half:before { content: $fa-var-star-half; } +.#{$fa-css-prefix}-heart-o:before { content: $fa-var-heart-o; } +.#{$fa-css-prefix}-sign-out:before { content: $fa-var-sign-out; } +.#{$fa-css-prefix}-linkedin-square:before { content: $fa-var-linkedin-square; } +.#{$fa-css-prefix}-thumb-tack:before { content: $fa-var-thumb-tack; } +.#{$fa-css-prefix}-external-link:before { content: $fa-var-external-link; } +.#{$fa-css-prefix}-sign-in:before { content: $fa-var-sign-in; } +.#{$fa-css-prefix}-trophy:before { content: $fa-var-trophy; } +.#{$fa-css-prefix}-github-square:before { content: $fa-var-github-square; } +.#{$fa-css-prefix}-upload:before { content: $fa-var-upload; } +.#{$fa-css-prefix}-lemon-o:before { content: $fa-var-lemon-o; } +.#{$fa-css-prefix}-phone:before { content: $fa-var-phone; } +.#{$fa-css-prefix}-square-o:before { content: $fa-var-square-o; } +.#{$fa-css-prefix}-bookmark-o:before { content: $fa-var-bookmark-o; } +.#{$fa-css-prefix}-phone-square:before { content: $fa-var-phone-square; } +.#{$fa-css-prefix}-twitter:before { content: $fa-var-twitter; } +.#{$fa-css-prefix}-facebook-f:before, +.#{$fa-css-prefix}-facebook:before { content: $fa-var-facebook; } +.#{$fa-css-prefix}-github:before { content: $fa-var-github; } +.#{$fa-css-prefix}-unlock:before { content: $fa-var-unlock; } +.#{$fa-css-prefix}-credit-card:before { content: $fa-var-credit-card; } +.#{$fa-css-prefix}-feed:before, +.#{$fa-css-prefix}-rss:before { content: $fa-var-rss; } +.#{$fa-css-prefix}-hdd-o:before { content: $fa-var-hdd-o; } +.#{$fa-css-prefix}-bullhorn:before { content: $fa-var-bullhorn; } +.#{$fa-css-prefix}-bell:before { content: $fa-var-bell; } +.#{$fa-css-prefix}-certificate:before { content: $fa-var-certificate; } +.#{$fa-css-prefix}-hand-o-right:before { content: $fa-var-hand-o-right; } +.#{$fa-css-prefix}-hand-o-left:before { content: $fa-var-hand-o-left; } +.#{$fa-css-prefix}-hand-o-up:before { content: $fa-var-hand-o-up; } +.#{$fa-css-prefix}-hand-o-down:before { content: $fa-var-hand-o-down; } +.#{$fa-css-prefix}-arrow-circle-left:before { content: $fa-var-arrow-circle-left; } +.#{$fa-css-prefix}-arrow-circle-right:before { content: $fa-var-arrow-circle-right; } +.#{$fa-css-prefix}-arrow-circle-up:before { content: $fa-var-arrow-circle-up; } +.#{$fa-css-prefix}-arrow-circle-down:before { content: $fa-var-arrow-circle-down; } +.#{$fa-css-prefix}-globe:before { content: $fa-var-globe; } +.#{$fa-css-prefix}-wrench:before { content: $fa-var-wrench; } +.#{$fa-css-prefix}-tasks:before { content: $fa-var-tasks; } +.#{$fa-css-prefix}-filter:before { content: $fa-var-filter; } +.#{$fa-css-prefix}-briefcase:before { content: $fa-var-briefcase; } +.#{$fa-css-prefix}-arrows-alt:before { content: $fa-var-arrows-alt; } +.#{$fa-css-prefix}-group:before, +.#{$fa-css-prefix}-users:before { content: $fa-var-users; } +.#{$fa-css-prefix}-chain:before, +.#{$fa-css-prefix}-link:before { content: $fa-var-link; } +.#{$fa-css-prefix}-cloud:before { content: $fa-var-cloud; } +.#{$fa-css-prefix}-flask:before { content: $fa-var-flask; } +.#{$fa-css-prefix}-cut:before, +.#{$fa-css-prefix}-scissors:before { content: $fa-var-scissors; } +.#{$fa-css-prefix}-copy:before, +.#{$fa-css-prefix}-files-o:before { content: $fa-var-files-o; } +.#{$fa-css-prefix}-paperclip:before { content: $fa-var-paperclip; } +.#{$fa-css-prefix}-save:before, +.#{$fa-css-prefix}-floppy-o:before { content: $fa-var-floppy-o; } +.#{$fa-css-prefix}-square:before { content: $fa-var-square; } +.#{$fa-css-prefix}-navicon:before, +.#{$fa-css-prefix}-reorder:before, +.#{$fa-css-prefix}-bars:before { content: $fa-var-bars; } +.#{$fa-css-prefix}-list-ul:before { content: $fa-var-list-ul; } +.#{$fa-css-prefix}-list-ol:before { content: $fa-var-list-ol; } +.#{$fa-css-prefix}-strikethrough:before { content: $fa-var-strikethrough; } +.#{$fa-css-prefix}-underline:before { content: $fa-var-underline; } +.#{$fa-css-prefix}-table:before { content: $fa-var-table; } +.#{$fa-css-prefix}-magic:before { content: $fa-var-magic; } +.#{$fa-css-prefix}-truck:before { content: $fa-var-truck; } +.#{$fa-css-prefix}-pinterest:before { content: $fa-var-pinterest; } +.#{$fa-css-prefix}-pinterest-square:before { content: $fa-var-pinterest-square; } +.#{$fa-css-prefix}-google-plus-square:before { content: $fa-var-google-plus-square; } +.#{$fa-css-prefix}-google-plus:before { content: $fa-var-google-plus; } +.#{$fa-css-prefix}-money:before { content: $fa-var-money; } +.#{$fa-css-prefix}-caret-down:before { content: $fa-var-caret-down; } +.#{$fa-css-prefix}-caret-up:before { content: $fa-var-caret-up; } +.#{$fa-css-prefix}-caret-left:before { content: $fa-var-caret-left; } +.#{$fa-css-prefix}-caret-right:before { content: $fa-var-caret-right; } +.#{$fa-css-prefix}-columns:before { content: $fa-var-columns; } +.#{$fa-css-prefix}-unsorted:before, +.#{$fa-css-prefix}-sort:before { content: $fa-var-sort; } +.#{$fa-css-prefix}-sort-down:before, +.#{$fa-css-prefix}-sort-desc:before { content: $fa-var-sort-desc; } +.#{$fa-css-prefix}-sort-up:before, +.#{$fa-css-prefix}-sort-asc:before { content: $fa-var-sort-asc; } +.#{$fa-css-prefix}-envelope:before { content: $fa-var-envelope; } +.#{$fa-css-prefix}-linkedin:before { content: $fa-var-linkedin; } +.#{$fa-css-prefix}-rotate-left:before, +.#{$fa-css-prefix}-undo:before { content: $fa-var-undo; } +.#{$fa-css-prefix}-legal:before, +.#{$fa-css-prefix}-gavel:before { content: $fa-var-gavel; } +.#{$fa-css-prefix}-dashboard:before, +.#{$fa-css-prefix}-tachometer:before { content: $fa-var-tachometer; } +.#{$fa-css-prefix}-comment-o:before { content: $fa-var-comment-o; } +.#{$fa-css-prefix}-comments-o:before { content: $fa-var-comments-o; } +.#{$fa-css-prefix}-flash:before, +.#{$fa-css-prefix}-bolt:before { content: $fa-var-bolt; } +.#{$fa-css-prefix}-sitemap:before { content: $fa-var-sitemap; } +.#{$fa-css-prefix}-umbrella:before { content: $fa-var-umbrella; } +.#{$fa-css-prefix}-paste:before, +.#{$fa-css-prefix}-clipboard:before { content: $fa-var-clipboard; } +.#{$fa-css-prefix}-lightbulb-o:before { content: $fa-var-lightbulb-o; } +.#{$fa-css-prefix}-exchange:before { content: $fa-var-exchange; } +.#{$fa-css-prefix}-cloud-download:before { content: $fa-var-cloud-download; } +.#{$fa-css-prefix}-cloud-upload:before { content: $fa-var-cloud-upload; } +.#{$fa-css-prefix}-user-md:before { content: $fa-var-user-md; } +.#{$fa-css-prefix}-stethoscope:before { content: $fa-var-stethoscope; } +.#{$fa-css-prefix}-suitcase:before { content: $fa-var-suitcase; } +.#{$fa-css-prefix}-bell-o:before { content: $fa-var-bell-o; } +.#{$fa-css-prefix}-coffee:before { content: $fa-var-coffee; } +.#{$fa-css-prefix}-cutlery:before { content: $fa-var-cutlery; } +.#{$fa-css-prefix}-file-text-o:before { content: $fa-var-file-text-o; } +.#{$fa-css-prefix}-building-o:before { content: $fa-var-building-o; } +.#{$fa-css-prefix}-hospital-o:before { content: $fa-var-hospital-o; } +.#{$fa-css-prefix}-ambulance:before { content: $fa-var-ambulance; } +.#{$fa-css-prefix}-medkit:before { content: $fa-var-medkit; } +.#{$fa-css-prefix}-fighter-jet:before { content: $fa-var-fighter-jet; } +.#{$fa-css-prefix}-beer:before { content: $fa-var-beer; } +.#{$fa-css-prefix}-h-square:before { content: $fa-var-h-square; } +.#{$fa-css-prefix}-plus-square:before { content: $fa-var-plus-square; } +.#{$fa-css-prefix}-angle-double-left:before { content: $fa-var-angle-double-left; } +.#{$fa-css-prefix}-angle-double-right:before { content: $fa-var-angle-double-right; } +.#{$fa-css-prefix}-angle-double-up:before { content: $fa-var-angle-double-up; } +.#{$fa-css-prefix}-angle-double-down:before { content: $fa-var-angle-double-down; } +.#{$fa-css-prefix}-angle-left:before { content: $fa-var-angle-left; } +.#{$fa-css-prefix}-angle-right:before { content: $fa-var-angle-right; } +.#{$fa-css-prefix}-angle-up:before { content: $fa-var-angle-up; } +.#{$fa-css-prefix}-angle-down:before { content: $fa-var-angle-down; } +.#{$fa-css-prefix}-desktop:before { content: $fa-var-desktop; } +.#{$fa-css-prefix}-laptop:before { content: $fa-var-laptop; } +.#{$fa-css-prefix}-tablet:before { content: $fa-var-tablet; } +.#{$fa-css-prefix}-mobile-phone:before, +.#{$fa-css-prefix}-mobile:before { content: $fa-var-mobile; } +.#{$fa-css-prefix}-circle-o:before { content: $fa-var-circle-o; } +.#{$fa-css-prefix}-quote-left:before { content: $fa-var-quote-left; } +.#{$fa-css-prefix}-quote-right:before { content: $fa-var-quote-right; } +.#{$fa-css-prefix}-spinner:before { content: $fa-var-spinner; } +.#{$fa-css-prefix}-circle:before { content: $fa-var-circle; } +.#{$fa-css-prefix}-mail-reply:before, +.#{$fa-css-prefix}-reply:before { content: $fa-var-reply; } +.#{$fa-css-prefix}-github-alt:before { content: $fa-var-github-alt; } +.#{$fa-css-prefix}-folder-o:before { content: $fa-var-folder-o; } +.#{$fa-css-prefix}-folder-open-o:before { content: $fa-var-folder-open-o; } +.#{$fa-css-prefix}-smile-o:before { content: $fa-var-smile-o; } +.#{$fa-css-prefix}-frown-o:before { content: $fa-var-frown-o; } +.#{$fa-css-prefix}-meh-o:before { content: $fa-var-meh-o; } +.#{$fa-css-prefix}-gamepad:before { content: $fa-var-gamepad; } +.#{$fa-css-prefix}-keyboard-o:before { content: $fa-var-keyboard-o; } +.#{$fa-css-prefix}-flag-o:before { content: $fa-var-flag-o; } +.#{$fa-css-prefix}-flag-checkered:before { content: $fa-var-flag-checkered; } +.#{$fa-css-prefix}-terminal:before { content: $fa-var-terminal; } +.#{$fa-css-prefix}-code:before { content: $fa-var-code; } +.#{$fa-css-prefix}-mail-reply-all:before, +.#{$fa-css-prefix}-reply-all:before { content: $fa-var-reply-all; } +.#{$fa-css-prefix}-star-half-empty:before, +.#{$fa-css-prefix}-star-half-full:before, +.#{$fa-css-prefix}-star-half-o:before { content: $fa-var-star-half-o; } +.#{$fa-css-prefix}-location-arrow:before { content: $fa-var-location-arrow; } +.#{$fa-css-prefix}-crop:before { content: $fa-var-crop; } +.#{$fa-css-prefix}-code-fork:before { content: $fa-var-code-fork; } +.#{$fa-css-prefix}-unlink:before, +.#{$fa-css-prefix}-chain-broken:before { content: $fa-var-chain-broken; } +.#{$fa-css-prefix}-question:before { content: $fa-var-question; } +.#{$fa-css-prefix}-info:before { content: $fa-var-info; } +.#{$fa-css-prefix}-exclamation:before { content: $fa-var-exclamation; } +.#{$fa-css-prefix}-superscript:before { content: $fa-var-superscript; } +.#{$fa-css-prefix}-subscript:before { content: $fa-var-subscript; } +.#{$fa-css-prefix}-eraser:before { content: $fa-var-eraser; } +.#{$fa-css-prefix}-puzzle-piece:before { content: $fa-var-puzzle-piece; } +.#{$fa-css-prefix}-microphone:before { content: $fa-var-microphone; } +.#{$fa-css-prefix}-microphone-slash:before { content: $fa-var-microphone-slash; } +.#{$fa-css-prefix}-shield:before { content: $fa-var-shield; } +.#{$fa-css-prefix}-calendar-o:before { content: $fa-var-calendar-o; } +.#{$fa-css-prefix}-fire-extinguisher:before { content: $fa-var-fire-extinguisher; } +.#{$fa-css-prefix}-rocket:before { content: $fa-var-rocket; } +.#{$fa-css-prefix}-maxcdn:before { content: $fa-var-maxcdn; } +.#{$fa-css-prefix}-chevron-circle-left:before { content: $fa-var-chevron-circle-left; } +.#{$fa-css-prefix}-chevron-circle-right:before { content: $fa-var-chevron-circle-right; } +.#{$fa-css-prefix}-chevron-circle-up:before { content: $fa-var-chevron-circle-up; } +.#{$fa-css-prefix}-chevron-circle-down:before { content: $fa-var-chevron-circle-down; } +.#{$fa-css-prefix}-html5:before { content: $fa-var-html5; } +.#{$fa-css-prefix}-css3:before { content: $fa-var-css3; } +.#{$fa-css-prefix}-anchor:before { content: $fa-var-anchor; } +.#{$fa-css-prefix}-unlock-alt:before { content: $fa-var-unlock-alt; } +.#{$fa-css-prefix}-bullseye:before { content: $fa-var-bullseye; } +.#{$fa-css-prefix}-ellipsis-h:before { content: $fa-var-ellipsis-h; } +.#{$fa-css-prefix}-ellipsis-v:before { content: $fa-var-ellipsis-v; } +.#{$fa-css-prefix}-rss-square:before { content: $fa-var-rss-square; } +.#{$fa-css-prefix}-play-circle:before { content: $fa-var-play-circle; } +.#{$fa-css-prefix}-ticket:before { content: $fa-var-ticket; } +.#{$fa-css-prefix}-minus-square:before { content: $fa-var-minus-square; } +.#{$fa-css-prefix}-minus-square-o:before { content: $fa-var-minus-square-o; } +.#{$fa-css-prefix}-level-up:before { content: $fa-var-level-up; } +.#{$fa-css-prefix}-level-down:before { content: $fa-var-level-down; } +.#{$fa-css-prefix}-check-square:before { content: $fa-var-check-square; } +.#{$fa-css-prefix}-pencil-square:before { content: $fa-var-pencil-square; } +.#{$fa-css-prefix}-external-link-square:before { content: $fa-var-external-link-square; } +.#{$fa-css-prefix}-share-square:before { content: $fa-var-share-square; } +.#{$fa-css-prefix}-compass:before { content: $fa-var-compass; } +.#{$fa-css-prefix}-toggle-down:before, +.#{$fa-css-prefix}-caret-square-o-down:before { content: $fa-var-caret-square-o-down; } +.#{$fa-css-prefix}-toggle-up:before, +.#{$fa-css-prefix}-caret-square-o-up:before { content: $fa-var-caret-square-o-up; } +.#{$fa-css-prefix}-toggle-right:before, +.#{$fa-css-prefix}-caret-square-o-right:before { content: $fa-var-caret-square-o-right; } +.#{$fa-css-prefix}-euro:before, +.#{$fa-css-prefix}-eur:before { content: $fa-var-eur; } +.#{$fa-css-prefix}-gbp:before { content: $fa-var-gbp; } +.#{$fa-css-prefix}-dollar:before, +.#{$fa-css-prefix}-usd:before { content: $fa-var-usd; } +.#{$fa-css-prefix}-rupee:before, +.#{$fa-css-prefix}-inr:before { content: $fa-var-inr; } +.#{$fa-css-prefix}-cny:before, +.#{$fa-css-prefix}-rmb:before, +.#{$fa-css-prefix}-yen:before, +.#{$fa-css-prefix}-jpy:before { content: $fa-var-jpy; } +.#{$fa-css-prefix}-ruble:before, +.#{$fa-css-prefix}-rouble:before, +.#{$fa-css-prefix}-rub:before { content: $fa-var-rub; } +.#{$fa-css-prefix}-won:before, +.#{$fa-css-prefix}-krw:before { content: $fa-var-krw; } +.#{$fa-css-prefix}-bitcoin:before, +.#{$fa-css-prefix}-btc:before { content: $fa-var-btc; } +.#{$fa-css-prefix}-file:before { content: $fa-var-file; } +.#{$fa-css-prefix}-file-text:before { content: $fa-var-file-text; } +.#{$fa-css-prefix}-sort-alpha-asc:before { content: $fa-var-sort-alpha-asc; } +.#{$fa-css-prefix}-sort-alpha-desc:before { content: $fa-var-sort-alpha-desc; } +.#{$fa-css-prefix}-sort-amount-asc:before { content: $fa-var-sort-amount-asc; } +.#{$fa-css-prefix}-sort-amount-desc:before { content: $fa-var-sort-amount-desc; } +.#{$fa-css-prefix}-sort-numeric-asc:before { content: $fa-var-sort-numeric-asc; } +.#{$fa-css-prefix}-sort-numeric-desc:before { content: $fa-var-sort-numeric-desc; } +.#{$fa-css-prefix}-thumbs-up:before { content: $fa-var-thumbs-up; } +.#{$fa-css-prefix}-thumbs-down:before { content: $fa-var-thumbs-down; } +.#{$fa-css-prefix}-youtube-square:before { content: $fa-var-youtube-square; } +.#{$fa-css-prefix}-youtube:before { content: $fa-var-youtube; } +.#{$fa-css-prefix}-xing:before { content: $fa-var-xing; } +.#{$fa-css-prefix}-xing-square:before { content: $fa-var-xing-square; } +.#{$fa-css-prefix}-youtube-play:before { content: $fa-var-youtube-play; } +.#{$fa-css-prefix}-dropbox:before { content: $fa-var-dropbox; } +.#{$fa-css-prefix}-stack-overflow:before { content: $fa-var-stack-overflow; } +.#{$fa-css-prefix}-instagram:before { content: $fa-var-instagram; } +.#{$fa-css-prefix}-flickr:before { content: $fa-var-flickr; } +.#{$fa-css-prefix}-adn:before { content: $fa-var-adn; } +.#{$fa-css-prefix}-bitbucket:before { content: $fa-var-bitbucket; } +.#{$fa-css-prefix}-bitbucket-square:before { content: $fa-var-bitbucket-square; } +.#{$fa-css-prefix}-tumblr:before { content: $fa-var-tumblr; } +.#{$fa-css-prefix}-tumblr-square:before { content: $fa-var-tumblr-square; } +.#{$fa-css-prefix}-long-arrow-down:before { content: $fa-var-long-arrow-down; } +.#{$fa-css-prefix}-long-arrow-up:before { content: $fa-var-long-arrow-up; } +.#{$fa-css-prefix}-long-arrow-left:before { content: $fa-var-long-arrow-left; } +.#{$fa-css-prefix}-long-arrow-right:before { content: $fa-var-long-arrow-right; } +.#{$fa-css-prefix}-apple:before { content: $fa-var-apple; } +.#{$fa-css-prefix}-windows:before { content: $fa-var-windows; } +.#{$fa-css-prefix}-android:before { content: $fa-var-android; } +.#{$fa-css-prefix}-linux:before { content: $fa-var-linux; } +.#{$fa-css-prefix}-dribbble:before { content: $fa-var-dribbble; } +.#{$fa-css-prefix}-skype:before { content: $fa-var-skype; } +.#{$fa-css-prefix}-foursquare:before { content: $fa-var-foursquare; } +.#{$fa-css-prefix}-trello:before { content: $fa-var-trello; } +.#{$fa-css-prefix}-female:before { content: $fa-var-female; } +.#{$fa-css-prefix}-male:before { content: $fa-var-male; } +.#{$fa-css-prefix}-gittip:before, +.#{$fa-css-prefix}-gratipay:before { content: $fa-var-gratipay; } +.#{$fa-css-prefix}-sun-o:before { content: $fa-var-sun-o; } +.#{$fa-css-prefix}-moon-o:before { content: $fa-var-moon-o; } +.#{$fa-css-prefix}-archive:before { content: $fa-var-archive; } +.#{$fa-css-prefix}-bug:before { content: $fa-var-bug; } +.#{$fa-css-prefix}-vk:before { content: $fa-var-vk; } +.#{$fa-css-prefix}-weibo:before { content: $fa-var-weibo; } +.#{$fa-css-prefix}-renren:before { content: $fa-var-renren; } +.#{$fa-css-prefix}-pagelines:before { content: $fa-var-pagelines; } +.#{$fa-css-prefix}-stack-exchange:before { content: $fa-var-stack-exchange; } +.#{$fa-css-prefix}-arrow-circle-o-right:before { content: $fa-var-arrow-circle-o-right; } +.#{$fa-css-prefix}-arrow-circle-o-left:before { content: $fa-var-arrow-circle-o-left; } +.#{$fa-css-prefix}-toggle-left:before, +.#{$fa-css-prefix}-caret-square-o-left:before { content: $fa-var-caret-square-o-left; } +.#{$fa-css-prefix}-dot-circle-o:before { content: $fa-var-dot-circle-o; } +.#{$fa-css-prefix}-wheelchair:before { content: $fa-var-wheelchair; } +.#{$fa-css-prefix}-vimeo-square:before { content: $fa-var-vimeo-square; } +.#{$fa-css-prefix}-turkish-lira:before, +.#{$fa-css-prefix}-try:before { content: $fa-var-try; } +.#{$fa-css-prefix}-plus-square-o:before { content: $fa-var-plus-square-o; } +.#{$fa-css-prefix}-space-shuttle:before { content: $fa-var-space-shuttle; } +.#{$fa-css-prefix}-slack:before { content: $fa-var-slack; } +.#{$fa-css-prefix}-envelope-square:before { content: $fa-var-envelope-square; } +.#{$fa-css-prefix}-wordpress:before { content: $fa-var-wordpress; } +.#{$fa-css-prefix}-openid:before { content: $fa-var-openid; } +.#{$fa-css-prefix}-institution:before, +.#{$fa-css-prefix}-bank:before, +.#{$fa-css-prefix}-university:before { content: $fa-var-university; } +.#{$fa-css-prefix}-mortar-board:before, +.#{$fa-css-prefix}-graduation-cap:before { content: $fa-var-graduation-cap; } +.#{$fa-css-prefix}-yahoo:before { content: $fa-var-yahoo; } +.#{$fa-css-prefix}-google:before { content: $fa-var-google; } +.#{$fa-css-prefix}-reddit:before { content: $fa-var-reddit; } +.#{$fa-css-prefix}-reddit-square:before { content: $fa-var-reddit-square; } +.#{$fa-css-prefix}-stumbleupon-circle:before { content: $fa-var-stumbleupon-circle; } +.#{$fa-css-prefix}-stumbleupon:before { content: $fa-var-stumbleupon; } +.#{$fa-css-prefix}-delicious:before { content: $fa-var-delicious; } +.#{$fa-css-prefix}-digg:before { content: $fa-var-digg; } +.#{$fa-css-prefix}-pied-piper-pp:before { content: $fa-var-pied-piper-pp; } +.#{$fa-css-prefix}-pied-piper-alt:before { content: $fa-var-pied-piper-alt; } +.#{$fa-css-prefix}-drupal:before { content: $fa-var-drupal; } +.#{$fa-css-prefix}-joomla:before { content: $fa-var-joomla; } +.#{$fa-css-prefix}-language:before { content: $fa-var-language; } +.#{$fa-css-prefix}-fax:before { content: $fa-var-fax; } +.#{$fa-css-prefix}-building:before { content: $fa-var-building; } +.#{$fa-css-prefix}-child:before { content: $fa-var-child; } +.#{$fa-css-prefix}-paw:before { content: $fa-var-paw; } +.#{$fa-css-prefix}-spoon:before { content: $fa-var-spoon; } +.#{$fa-css-prefix}-cube:before { content: $fa-var-cube; } +.#{$fa-css-prefix}-cubes:before { content: $fa-var-cubes; } +.#{$fa-css-prefix}-behance:before { content: $fa-var-behance; } +.#{$fa-css-prefix}-behance-square:before { content: $fa-var-behance-square; } +.#{$fa-css-prefix}-steam:before { content: $fa-var-steam; } +.#{$fa-css-prefix}-steam-square:before { content: $fa-var-steam-square; } +.#{$fa-css-prefix}-recycle:before { content: $fa-var-recycle; } +.#{$fa-css-prefix}-automobile:before, +.#{$fa-css-prefix}-car:before { content: $fa-var-car; } +.#{$fa-css-prefix}-cab:before, +.#{$fa-css-prefix}-taxi:before { content: $fa-var-taxi; } +.#{$fa-css-prefix}-tree:before { content: $fa-var-tree; } +.#{$fa-css-prefix}-spotify:before { content: $fa-var-spotify; } +.#{$fa-css-prefix}-deviantart:before { content: $fa-var-deviantart; } +.#{$fa-css-prefix}-soundcloud:before { content: $fa-var-soundcloud; } +.#{$fa-css-prefix}-database:before { content: $fa-var-database; } +.#{$fa-css-prefix}-file-pdf-o:before { content: $fa-var-file-pdf-o; } +.#{$fa-css-prefix}-file-word-o:before { content: $fa-var-file-word-o; } +.#{$fa-css-prefix}-file-excel-o:before { content: $fa-var-file-excel-o; } +.#{$fa-css-prefix}-file-powerpoint-o:before { content: $fa-var-file-powerpoint-o; } +.#{$fa-css-prefix}-file-photo-o:before, +.#{$fa-css-prefix}-file-picture-o:before, +.#{$fa-css-prefix}-file-image-o:before { content: $fa-var-file-image-o; } +.#{$fa-css-prefix}-file-zip-o:before, +.#{$fa-css-prefix}-file-archive-o:before { content: $fa-var-file-archive-o; } +.#{$fa-css-prefix}-file-sound-o:before, +.#{$fa-css-prefix}-file-audio-o:before { content: $fa-var-file-audio-o; } +.#{$fa-css-prefix}-file-movie-o:before, +.#{$fa-css-prefix}-file-video-o:before { content: $fa-var-file-video-o; } +.#{$fa-css-prefix}-file-code-o:before { content: $fa-var-file-code-o; } +.#{$fa-css-prefix}-vine:before { content: $fa-var-vine; } +.#{$fa-css-prefix}-codepen:before { content: $fa-var-codepen; } +.#{$fa-css-prefix}-jsfiddle:before { content: $fa-var-jsfiddle; } +.#{$fa-css-prefix}-life-bouy:before, +.#{$fa-css-prefix}-life-buoy:before, +.#{$fa-css-prefix}-life-saver:before, +.#{$fa-css-prefix}-support:before, +.#{$fa-css-prefix}-life-ring:before { content: $fa-var-life-ring; } +.#{$fa-css-prefix}-circle-o-notch:before { content: $fa-var-circle-o-notch; } +.#{$fa-css-prefix}-ra:before, +.#{$fa-css-prefix}-resistance:before, +.#{$fa-css-prefix}-rebel:before { content: $fa-var-rebel; } +.#{$fa-css-prefix}-ge:before, +.#{$fa-css-prefix}-empire:before { content: $fa-var-empire; } +.#{$fa-css-prefix}-git-square:before { content: $fa-var-git-square; } +.#{$fa-css-prefix}-git:before { content: $fa-var-git; } +.#{$fa-css-prefix}-y-combinator-square:before, +.#{$fa-css-prefix}-yc-square:before, +.#{$fa-css-prefix}-hacker-news:before { content: $fa-var-hacker-news; } +.#{$fa-css-prefix}-tencent-weibo:before { content: $fa-var-tencent-weibo; } +.#{$fa-css-prefix}-qq:before { content: $fa-var-qq; } +.#{$fa-css-prefix}-wechat:before, +.#{$fa-css-prefix}-weixin:before { content: $fa-var-weixin; } +.#{$fa-css-prefix}-send:before, +.#{$fa-css-prefix}-paper-plane:before { content: $fa-var-paper-plane; } +.#{$fa-css-prefix}-send-o:before, +.#{$fa-css-prefix}-paper-plane-o:before { content: $fa-var-paper-plane-o; } +.#{$fa-css-prefix}-history:before { content: $fa-var-history; } +.#{$fa-css-prefix}-circle-thin:before { content: $fa-var-circle-thin; } +.#{$fa-css-prefix}-header:before { content: $fa-var-header; } +.#{$fa-css-prefix}-paragraph:before { content: $fa-var-paragraph; } +.#{$fa-css-prefix}-sliders:before { content: $fa-var-sliders; } +.#{$fa-css-prefix}-share-alt:before { content: $fa-var-share-alt; } +.#{$fa-css-prefix}-share-alt-square:before { content: $fa-var-share-alt-square; } +.#{$fa-css-prefix}-bomb:before { content: $fa-var-bomb; } +.#{$fa-css-prefix}-soccer-ball-o:before, +.#{$fa-css-prefix}-futbol-o:before { content: $fa-var-futbol-o; } +.#{$fa-css-prefix}-tty:before { content: $fa-var-tty; } +.#{$fa-css-prefix}-binoculars:before { content: $fa-var-binoculars; } +.#{$fa-css-prefix}-plug:before { content: $fa-var-plug; } +.#{$fa-css-prefix}-slideshare:before { content: $fa-var-slideshare; } +.#{$fa-css-prefix}-twitch:before { content: $fa-var-twitch; } +.#{$fa-css-prefix}-yelp:before { content: $fa-var-yelp; } +.#{$fa-css-prefix}-newspaper-o:before { content: $fa-var-newspaper-o; } +.#{$fa-css-prefix}-wifi:before { content: $fa-var-wifi; } +.#{$fa-css-prefix}-calculator:before { content: $fa-var-calculator; } +.#{$fa-css-prefix}-paypal:before { content: $fa-var-paypal; } +.#{$fa-css-prefix}-google-wallet:before { content: $fa-var-google-wallet; } +.#{$fa-css-prefix}-cc-visa:before { content: $fa-var-cc-visa; } +.#{$fa-css-prefix}-cc-mastercard:before { content: $fa-var-cc-mastercard; } +.#{$fa-css-prefix}-cc-discover:before { content: $fa-var-cc-discover; } +.#{$fa-css-prefix}-cc-amex:before { content: $fa-var-cc-amex; } +.#{$fa-css-prefix}-cc-paypal:before { content: $fa-var-cc-paypal; } +.#{$fa-css-prefix}-cc-stripe:before { content: $fa-var-cc-stripe; } +.#{$fa-css-prefix}-bell-slash:before { content: $fa-var-bell-slash; } +.#{$fa-css-prefix}-bell-slash-o:before { content: $fa-var-bell-slash-o; } +.#{$fa-css-prefix}-trash:before { content: $fa-var-trash; } +.#{$fa-css-prefix}-copyright:before { content: $fa-var-copyright; } +.#{$fa-css-prefix}-at:before { content: $fa-var-at; } +.#{$fa-css-prefix}-eyedropper:before { content: $fa-var-eyedropper; } +.#{$fa-css-prefix}-paint-brush:before { content: $fa-var-paint-brush; } +.#{$fa-css-prefix}-birthday-cake:before { content: $fa-var-birthday-cake; } +.#{$fa-css-prefix}-area-chart:before { content: $fa-var-area-chart; } +.#{$fa-css-prefix}-pie-chart:before { content: $fa-var-pie-chart; } +.#{$fa-css-prefix}-line-chart:before { content: $fa-var-line-chart; } +.#{$fa-css-prefix}-lastfm:before { content: $fa-var-lastfm; } +.#{$fa-css-prefix}-lastfm-square:before { content: $fa-var-lastfm-square; } +.#{$fa-css-prefix}-toggle-off:before { content: $fa-var-toggle-off; } +.#{$fa-css-prefix}-toggle-on:before { content: $fa-var-toggle-on; } +.#{$fa-css-prefix}-bicycle:before { content: $fa-var-bicycle; } +.#{$fa-css-prefix}-bus:before { content: $fa-var-bus; } +.#{$fa-css-prefix}-ioxhost:before { content: $fa-var-ioxhost; } +.#{$fa-css-prefix}-angellist:before { content: $fa-var-angellist; } +.#{$fa-css-prefix}-cc:before { content: $fa-var-cc; } +.#{$fa-css-prefix}-shekel:before, +.#{$fa-css-prefix}-sheqel:before, +.#{$fa-css-prefix}-ils:before { content: $fa-var-ils; } +.#{$fa-css-prefix}-meanpath:before { content: $fa-var-meanpath; } +.#{$fa-css-prefix}-buysellads:before { content: $fa-var-buysellads; } +.#{$fa-css-prefix}-connectdevelop:before { content: $fa-var-connectdevelop; } +.#{$fa-css-prefix}-dashcube:before { content: $fa-var-dashcube; } +.#{$fa-css-prefix}-forumbee:before { content: $fa-var-forumbee; } +.#{$fa-css-prefix}-leanpub:before { content: $fa-var-leanpub; } +.#{$fa-css-prefix}-sellsy:before { content: $fa-var-sellsy; } +.#{$fa-css-prefix}-shirtsinbulk:before { content: $fa-var-shirtsinbulk; } +.#{$fa-css-prefix}-simplybuilt:before { content: $fa-var-simplybuilt; } +.#{$fa-css-prefix}-skyatlas:before { content: $fa-var-skyatlas; } +.#{$fa-css-prefix}-cart-plus:before { content: $fa-var-cart-plus; } +.#{$fa-css-prefix}-cart-arrow-down:before { content: $fa-var-cart-arrow-down; } +.#{$fa-css-prefix}-diamond:before { content: $fa-var-diamond; } +.#{$fa-css-prefix}-ship:before { content: $fa-var-ship; } +.#{$fa-css-prefix}-user-secret:before { content: $fa-var-user-secret; } +.#{$fa-css-prefix}-motorcycle:before { content: $fa-var-motorcycle; } +.#{$fa-css-prefix}-street-view:before { content: $fa-var-street-view; } +.#{$fa-css-prefix}-heartbeat:before { content: $fa-var-heartbeat; } +.#{$fa-css-prefix}-venus:before { content: $fa-var-venus; } +.#{$fa-css-prefix}-mars:before { content: $fa-var-mars; } +.#{$fa-css-prefix}-mercury:before { content: $fa-var-mercury; } +.#{$fa-css-prefix}-intersex:before, +.#{$fa-css-prefix}-transgender:before { content: $fa-var-transgender; } +.#{$fa-css-prefix}-transgender-alt:before { content: $fa-var-transgender-alt; } +.#{$fa-css-prefix}-venus-double:before { content: $fa-var-venus-double; } +.#{$fa-css-prefix}-mars-double:before { content: $fa-var-mars-double; } +.#{$fa-css-prefix}-venus-mars:before { content: $fa-var-venus-mars; } +.#{$fa-css-prefix}-mars-stroke:before { content: $fa-var-mars-stroke; } +.#{$fa-css-prefix}-mars-stroke-v:before { content: $fa-var-mars-stroke-v; } +.#{$fa-css-prefix}-mars-stroke-h:before { content: $fa-var-mars-stroke-h; } +.#{$fa-css-prefix}-neuter:before { content: $fa-var-neuter; } +.#{$fa-css-prefix}-genderless:before { content: $fa-var-genderless; } +.#{$fa-css-prefix}-facebook-official:before { content: $fa-var-facebook-official; } +.#{$fa-css-prefix}-pinterest-p:before { content: $fa-var-pinterest-p; } +.#{$fa-css-prefix}-whatsapp:before { content: $fa-var-whatsapp; } +.#{$fa-css-prefix}-server:before { content: $fa-var-server; } +.#{$fa-css-prefix}-user-plus:before { content: $fa-var-user-plus; } +.#{$fa-css-prefix}-user-times:before { content: $fa-var-user-times; } +.#{$fa-css-prefix}-hotel:before, +.#{$fa-css-prefix}-bed:before { content: $fa-var-bed; } +.#{$fa-css-prefix}-viacoin:before { content: $fa-var-viacoin; } +.#{$fa-css-prefix}-train:before { content: $fa-var-train; } +.#{$fa-css-prefix}-subway:before { content: $fa-var-subway; } +.#{$fa-css-prefix}-medium:before { content: $fa-var-medium; } +.#{$fa-css-prefix}-yc:before, +.#{$fa-css-prefix}-y-combinator:before { content: $fa-var-y-combinator; } +.#{$fa-css-prefix}-optin-monster:before { content: $fa-var-optin-monster; } +.#{$fa-css-prefix}-opencart:before { content: $fa-var-opencart; } +.#{$fa-css-prefix}-expeditedssl:before { content: $fa-var-expeditedssl; } +.#{$fa-css-prefix}-battery-4:before, +.#{$fa-css-prefix}-battery:before, +.#{$fa-css-prefix}-battery-full:before { content: $fa-var-battery-full; } +.#{$fa-css-prefix}-battery-3:before, +.#{$fa-css-prefix}-battery-three-quarters:before { content: $fa-var-battery-three-quarters; } +.#{$fa-css-prefix}-battery-2:before, +.#{$fa-css-prefix}-battery-half:before { content: $fa-var-battery-half; } +.#{$fa-css-prefix}-battery-1:before, +.#{$fa-css-prefix}-battery-quarter:before { content: $fa-var-battery-quarter; } +.#{$fa-css-prefix}-battery-0:before, +.#{$fa-css-prefix}-battery-empty:before { content: $fa-var-battery-empty; } +.#{$fa-css-prefix}-mouse-pointer:before { content: $fa-var-mouse-pointer; } +.#{$fa-css-prefix}-i-cursor:before { content: $fa-var-i-cursor; } +.#{$fa-css-prefix}-object-group:before { content: $fa-var-object-group; } +.#{$fa-css-prefix}-object-ungroup:before { content: $fa-var-object-ungroup; } +.#{$fa-css-prefix}-sticky-note:before { content: $fa-var-sticky-note; } +.#{$fa-css-prefix}-sticky-note-o:before { content: $fa-var-sticky-note-o; } +.#{$fa-css-prefix}-cc-jcb:before { content: $fa-var-cc-jcb; } +.#{$fa-css-prefix}-cc-diners-club:before { content: $fa-var-cc-diners-club; } +.#{$fa-css-prefix}-clone:before { content: $fa-var-clone; } +.#{$fa-css-prefix}-balance-scale:before { content: $fa-var-balance-scale; } +.#{$fa-css-prefix}-hourglass-o:before { content: $fa-var-hourglass-o; } +.#{$fa-css-prefix}-hourglass-1:before, +.#{$fa-css-prefix}-hourglass-start:before { content: $fa-var-hourglass-start; } +.#{$fa-css-prefix}-hourglass-2:before, +.#{$fa-css-prefix}-hourglass-half:before { content: $fa-var-hourglass-half; } +.#{$fa-css-prefix}-hourglass-3:before, +.#{$fa-css-prefix}-hourglass-end:before { content: $fa-var-hourglass-end; } +.#{$fa-css-prefix}-hourglass:before { content: $fa-var-hourglass; } +.#{$fa-css-prefix}-hand-grab-o:before, +.#{$fa-css-prefix}-hand-rock-o:before { content: $fa-var-hand-rock-o; } +.#{$fa-css-prefix}-hand-stop-o:before, +.#{$fa-css-prefix}-hand-paper-o:before { content: $fa-var-hand-paper-o; } +.#{$fa-css-prefix}-hand-scissors-o:before { content: $fa-var-hand-scissors-o; } +.#{$fa-css-prefix}-hand-lizard-o:before { content: $fa-var-hand-lizard-o; } +.#{$fa-css-prefix}-hand-spock-o:before { content: $fa-var-hand-spock-o; } +.#{$fa-css-prefix}-hand-pointer-o:before { content: $fa-var-hand-pointer-o; } +.#{$fa-css-prefix}-hand-peace-o:before { content: $fa-var-hand-peace-o; } +.#{$fa-css-prefix}-trademark:before { content: $fa-var-trademark; } +.#{$fa-css-prefix}-registered:before { content: $fa-var-registered; } +.#{$fa-css-prefix}-creative-commons:before { content: $fa-var-creative-commons; } +.#{$fa-css-prefix}-gg:before { content: $fa-var-gg; } +.#{$fa-css-prefix}-gg-circle:before { content: $fa-var-gg-circle; } +.#{$fa-css-prefix}-tripadvisor:before { content: $fa-var-tripadvisor; } +.#{$fa-css-prefix}-odnoklassniki:before { content: $fa-var-odnoklassniki; } +.#{$fa-css-prefix}-odnoklassniki-square:before { content: $fa-var-odnoklassniki-square; } +.#{$fa-css-prefix}-get-pocket:before { content: $fa-var-get-pocket; } +.#{$fa-css-prefix}-wikipedia-w:before { content: $fa-var-wikipedia-w; } +.#{$fa-css-prefix}-safari:before { content: $fa-var-safari; } +.#{$fa-css-prefix}-chrome:before { content: $fa-var-chrome; } +.#{$fa-css-prefix}-firefox:before { content: $fa-var-firefox; } +.#{$fa-css-prefix}-opera:before { content: $fa-var-opera; } +.#{$fa-css-prefix}-internet-explorer:before { content: $fa-var-internet-explorer; } +.#{$fa-css-prefix}-tv:before, +.#{$fa-css-prefix}-television:before { content: $fa-var-television; } +.#{$fa-css-prefix}-contao:before { content: $fa-var-contao; } +.#{$fa-css-prefix}-500px:before { content: $fa-var-500px; } +.#{$fa-css-prefix}-amazon:before { content: $fa-var-amazon; } +.#{$fa-css-prefix}-calendar-plus-o:before { content: $fa-var-calendar-plus-o; } +.#{$fa-css-prefix}-calendar-minus-o:before { content: $fa-var-calendar-minus-o; } +.#{$fa-css-prefix}-calendar-times-o:before { content: $fa-var-calendar-times-o; } +.#{$fa-css-prefix}-calendar-check-o:before { content: $fa-var-calendar-check-o; } +.#{$fa-css-prefix}-industry:before { content: $fa-var-industry; } +.#{$fa-css-prefix}-map-pin:before { content: $fa-var-map-pin; } +.#{$fa-css-prefix}-map-signs:before { content: $fa-var-map-signs; } +.#{$fa-css-prefix}-map-o:before { content: $fa-var-map-o; } +.#{$fa-css-prefix}-map:before { content: $fa-var-map; } +.#{$fa-css-prefix}-commenting:before { content: $fa-var-commenting; } +.#{$fa-css-prefix}-commenting-o:before { content: $fa-var-commenting-o; } +.#{$fa-css-prefix}-houzz:before { content: $fa-var-houzz; } +.#{$fa-css-prefix}-vimeo:before { content: $fa-var-vimeo; } +.#{$fa-css-prefix}-black-tie:before { content: $fa-var-black-tie; } +.#{$fa-css-prefix}-fonticons:before { content: $fa-var-fonticons; } +.#{$fa-css-prefix}-reddit-alien:before { content: $fa-var-reddit-alien; } +.#{$fa-css-prefix}-edge:before { content: $fa-var-edge; } +.#{$fa-css-prefix}-credit-card-alt:before { content: $fa-var-credit-card-alt; } +.#{$fa-css-prefix}-codiepie:before { content: $fa-var-codiepie; } +.#{$fa-css-prefix}-modx:before { content: $fa-var-modx; } +.#{$fa-css-prefix}-fort-awesome:before { content: $fa-var-fort-awesome; } +.#{$fa-css-prefix}-usb:before { content: $fa-var-usb; } +.#{$fa-css-prefix}-product-hunt:before { content: $fa-var-product-hunt; } +.#{$fa-css-prefix}-mixcloud:before { content: $fa-var-mixcloud; } +.#{$fa-css-prefix}-scribd:before { content: $fa-var-scribd; } +.#{$fa-css-prefix}-pause-circle:before { content: $fa-var-pause-circle; } +.#{$fa-css-prefix}-pause-circle-o:before { content: $fa-var-pause-circle-o; } +.#{$fa-css-prefix}-stop-circle:before { content: $fa-var-stop-circle; } +.#{$fa-css-prefix}-stop-circle-o:before { content: $fa-var-stop-circle-o; } +.#{$fa-css-prefix}-shopping-bag:before { content: $fa-var-shopping-bag; } +.#{$fa-css-prefix}-shopping-basket:before { content: $fa-var-shopping-basket; } +.#{$fa-css-prefix}-hashtag:before { content: $fa-var-hashtag; } +.#{$fa-css-prefix}-bluetooth:before { content: $fa-var-bluetooth; } +.#{$fa-css-prefix}-bluetooth-b:before { content: $fa-var-bluetooth-b; } +.#{$fa-css-prefix}-percent:before { content: $fa-var-percent; } +.#{$fa-css-prefix}-gitlab:before { content: $fa-var-gitlab; } +.#{$fa-css-prefix}-wpbeginner:before { content: $fa-var-wpbeginner; } +.#{$fa-css-prefix}-wpforms:before { content: $fa-var-wpforms; } +.#{$fa-css-prefix}-envira:before { content: $fa-var-envira; } +.#{$fa-css-prefix}-universal-access:before { content: $fa-var-universal-access; } +.#{$fa-css-prefix}-wheelchair-alt:before { content: $fa-var-wheelchair-alt; } +.#{$fa-css-prefix}-question-circle-o:before { content: $fa-var-question-circle-o; } +.#{$fa-css-prefix}-blind:before { content: $fa-var-blind; } +.#{$fa-css-prefix}-audio-description:before { content: $fa-var-audio-description; } +.#{$fa-css-prefix}-volume-control-phone:before { content: $fa-var-volume-control-phone; } +.#{$fa-css-prefix}-braille:before { content: $fa-var-braille; } +.#{$fa-css-prefix}-assistive-listening-systems:before { content: $fa-var-assistive-listening-systems; } +.#{$fa-css-prefix}-asl-interpreting:before, +.#{$fa-css-prefix}-american-sign-language-interpreting:before { content: $fa-var-american-sign-language-interpreting; } +.#{$fa-css-prefix}-deafness:before, +.#{$fa-css-prefix}-hard-of-hearing:before, +.#{$fa-css-prefix}-deaf:before { content: $fa-var-deaf; } +.#{$fa-css-prefix}-glide:before { content: $fa-var-glide; } +.#{$fa-css-prefix}-glide-g:before { content: $fa-var-glide-g; } +.#{$fa-css-prefix}-signing:before, +.#{$fa-css-prefix}-sign-language:before { content: $fa-var-sign-language; } +.#{$fa-css-prefix}-low-vision:before { content: $fa-var-low-vision; } +.#{$fa-css-prefix}-viadeo:before { content: $fa-var-viadeo; } +.#{$fa-css-prefix}-viadeo-square:before { content: $fa-var-viadeo-square; } +.#{$fa-css-prefix}-snapchat:before { content: $fa-var-snapchat; } +.#{$fa-css-prefix}-snapchat-ghost:before { content: $fa-var-snapchat-ghost; } +.#{$fa-css-prefix}-snapchat-square:before { content: $fa-var-snapchat-square; } +.#{$fa-css-prefix}-pied-piper:before { content: $fa-var-pied-piper; } +.#{$fa-css-prefix}-first-order:before { content: $fa-var-first-order; } +.#{$fa-css-prefix}-yoast:before { content: $fa-var-yoast; } +.#{$fa-css-prefix}-themeisle:before { content: $fa-var-themeisle; } +.#{$fa-css-prefix}-google-plus-circle:before, +.#{$fa-css-prefix}-google-plus-official:before { content: $fa-var-google-plus-official; } +.#{$fa-css-prefix}-fa:before, +.#{$fa-css-prefix}-font-awesome:before { content: $fa-var-font-awesome; } +.#{$fa-css-prefix}-handshake-o:before { content: $fa-var-handshake-o; } +.#{$fa-css-prefix}-envelope-open:before { content: $fa-var-envelope-open; } +.#{$fa-css-prefix}-envelope-open-o:before { content: $fa-var-envelope-open-o; } +.#{$fa-css-prefix}-linode:before { content: $fa-var-linode; } +.#{$fa-css-prefix}-address-book:before { content: $fa-var-address-book; } +.#{$fa-css-prefix}-address-book-o:before { content: $fa-var-address-book-o; } +.#{$fa-css-prefix}-vcard:before, +.#{$fa-css-prefix}-address-card:before { content: $fa-var-address-card; } +.#{$fa-css-prefix}-vcard-o:before, +.#{$fa-css-prefix}-address-card-o:before { content: $fa-var-address-card-o; } +.#{$fa-css-prefix}-user-circle:before { content: $fa-var-user-circle; } +.#{$fa-css-prefix}-user-circle-o:before { content: $fa-var-user-circle-o; } +.#{$fa-css-prefix}-user-o:before { content: $fa-var-user-o; } +.#{$fa-css-prefix}-id-badge:before { content: $fa-var-id-badge; } +.#{$fa-css-prefix}-drivers-license:before, +.#{$fa-css-prefix}-id-card:before { content: $fa-var-id-card; } +.#{$fa-css-prefix}-drivers-license-o:before, +.#{$fa-css-prefix}-id-card-o:before { content: $fa-var-id-card-o; } +.#{$fa-css-prefix}-quora:before { content: $fa-var-quora; } +.#{$fa-css-prefix}-free-code-camp:before { content: $fa-var-free-code-camp; } +.#{$fa-css-prefix}-telegram:before { content: $fa-var-telegram; } +.#{$fa-css-prefix}-thermometer-4:before, +.#{$fa-css-prefix}-thermometer:before, +.#{$fa-css-prefix}-thermometer-full:before { content: $fa-var-thermometer-full; } +.#{$fa-css-prefix}-thermometer-3:before, +.#{$fa-css-prefix}-thermometer-three-quarters:before { content: $fa-var-thermometer-three-quarters; } +.#{$fa-css-prefix}-thermometer-2:before, +.#{$fa-css-prefix}-thermometer-half:before { content: $fa-var-thermometer-half; } +.#{$fa-css-prefix}-thermometer-1:before, +.#{$fa-css-prefix}-thermometer-quarter:before { content: $fa-var-thermometer-quarter; } +.#{$fa-css-prefix}-thermometer-0:before, +.#{$fa-css-prefix}-thermometer-empty:before { content: $fa-var-thermometer-empty; } +.#{$fa-css-prefix}-shower:before { content: $fa-var-shower; } +.#{$fa-css-prefix}-bathtub:before, +.#{$fa-css-prefix}-s15:before, +.#{$fa-css-prefix}-bath:before { content: $fa-var-bath; } +.#{$fa-css-prefix}-podcast:before { content: $fa-var-podcast; } +.#{$fa-css-prefix}-window-maximize:before { content: $fa-var-window-maximize; } +.#{$fa-css-prefix}-window-minimize:before { content: $fa-var-window-minimize; } +.#{$fa-css-prefix}-window-restore:before { content: $fa-var-window-restore; } +.#{$fa-css-prefix}-times-rectangle:before, +.#{$fa-css-prefix}-window-close:before { content: $fa-var-window-close; } +.#{$fa-css-prefix}-times-rectangle-o:before, +.#{$fa-css-prefix}-window-close-o:before { content: $fa-var-window-close-o; } +.#{$fa-css-prefix}-bandcamp:before { content: $fa-var-bandcamp; } +.#{$fa-css-prefix}-grav:before { content: $fa-var-grav; } +.#{$fa-css-prefix}-etsy:before { content: $fa-var-etsy; } +.#{$fa-css-prefix}-imdb:before { content: $fa-var-imdb; } +.#{$fa-css-prefix}-ravelry:before { content: $fa-var-ravelry; } +.#{$fa-css-prefix}-eercast:before { content: $fa-var-eercast; } +.#{$fa-css-prefix}-microchip:before { content: $fa-var-microchip; } +.#{$fa-css-prefix}-snowflake-o:before { content: $fa-var-snowflake-o; } +.#{$fa-css-prefix}-superpowers:before { content: $fa-var-superpowers; } +.#{$fa-css-prefix}-wpexplorer:before { content: $fa-var-wpexplorer; } +.#{$fa-css-prefix}-meetup:before { content: $fa-var-meetup; } diff --git a/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/scss/_larger.scss b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/scss/_larger.scss new file mode 100644 index 000000000..41e9a8184 --- /dev/null +++ b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/scss/_larger.scss @@ -0,0 +1,13 @@ +// Icon Sizes +// ------------------------- + +/* makes the font 33% larger relative to the icon container */ +.#{$fa-css-prefix}-lg { + font-size: (4em / 3); + line-height: (3em / 4); + vertical-align: -15%; +} +.#{$fa-css-prefix}-2x { font-size: 2em; } +.#{$fa-css-prefix}-3x { font-size: 3em; } +.#{$fa-css-prefix}-4x { font-size: 4em; } +.#{$fa-css-prefix}-5x { font-size: 5em; } diff --git a/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/scss/_list.scss b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/scss/_list.scss new file mode 100644 index 000000000..7d1e4d54d --- /dev/null +++ b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/scss/_list.scss @@ -0,0 +1,19 @@ +// List Icons +// ------------------------- + +.#{$fa-css-prefix}-ul { + padding-left: 0; + margin-left: $fa-li-width; + list-style-type: none; + > li { position: relative; } +} +.#{$fa-css-prefix}-li { + position: absolute; + left: -$fa-li-width; + width: $fa-li-width; + top: (2em / 14); + text-align: center; + &.#{$fa-css-prefix}-lg { + left: -$fa-li-width + (4em / 14); + } +} diff --git a/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/scss/_mixins.scss b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/scss/_mixins.scss new file mode 100644 index 000000000..c3bbd5745 --- /dev/null +++ b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/scss/_mixins.scss @@ -0,0 +1,60 @@ +// Mixins +// -------------------------- + +@mixin fa-icon() { + display: inline-block; + font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration + font-size: inherit; // can't have font-size inherit on line above, so need to override + text-rendering: auto; // optimizelegibility throws things off #1094 + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + +} + +@mixin fa-icon-rotate($degrees, $rotation) { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation})"; + -webkit-transform: rotate($degrees); + -ms-transform: rotate($degrees); + transform: rotate($degrees); +} + +@mixin fa-icon-flip($horiz, $vert, $rotation) { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}, mirror=1)"; + -webkit-transform: scale($horiz, $vert); + -ms-transform: scale($horiz, $vert); + transform: scale($horiz, $vert); +} + + +// Only display content to screen readers. A la Bootstrap 4. +// +// See: http://a11yproject.com/posts/how-to-hide-content/ + +@mixin sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0,0,0,0); + border: 0; +} + +// Use in conjunction with .sr-only to only display content when it's focused. +// +// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 +// +// Credit: HTML5 Boilerplate + +@mixin sr-only-focusable { + &:active, + &:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; + } +} diff --git a/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/scss/_path.scss b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/scss/_path.scss new file mode 100644 index 000000000..bb457c23a --- /dev/null +++ b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/scss/_path.scss @@ -0,0 +1,15 @@ +/* FONT PATH + * -------------------------- */ + +@font-face { + font-family: 'FontAwesome'; + src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}'); + src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'), + url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'), + url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'), + url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'), + url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg'); +// src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts + font-weight: normal; + font-style: normal; +} diff --git a/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/scss/_rotated-flipped.scss b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/scss/_rotated-flipped.scss new file mode 100644 index 000000000..a3558fd09 --- /dev/null +++ b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/scss/_rotated-flipped.scss @@ -0,0 +1,20 @@ +// Rotated & Flipped Icons +// ------------------------- + +.#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); } +.#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); } +.#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); } + +.#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); } +.#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); } + +// Hook for IE8-9 +// ------------------------- + +:root .#{$fa-css-prefix}-rotate-90, +:root .#{$fa-css-prefix}-rotate-180, +:root .#{$fa-css-prefix}-rotate-270, +:root .#{$fa-css-prefix}-flip-horizontal, +:root .#{$fa-css-prefix}-flip-vertical { + filter: none; +} diff --git a/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/scss/_screen-reader.scss b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/scss/_screen-reader.scss new file mode 100644 index 000000000..637426f0d --- /dev/null +++ b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/scss/_screen-reader.scss @@ -0,0 +1,5 @@ +// Screen Readers +// ------------------------- + +.sr-only { @include sr-only(); } +.sr-only-focusable { @include sr-only-focusable(); } diff --git a/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/scss/_stacked.scss b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/scss/_stacked.scss new file mode 100644 index 000000000..aef740366 --- /dev/null +++ b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/scss/_stacked.scss @@ -0,0 +1,20 @@ +// Stacked Icons +// ------------------------- + +.#{$fa-css-prefix}-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; +} +.#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center; +} +.#{$fa-css-prefix}-stack-1x { line-height: inherit; } +.#{$fa-css-prefix}-stack-2x { font-size: 2em; } +.#{$fa-css-prefix}-inverse { color: $fa-inverse; } diff --git a/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/scss/_variables.scss b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/scss/_variables.scss new file mode 100644 index 000000000..498fc4a08 --- /dev/null +++ b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/scss/_variables.scss @@ -0,0 +1,800 @@ +// Variables +// -------------------------- + +$fa-font-path: "../fonts" !default; +$fa-font-size-base: 14px !default; +$fa-line-height-base: 1 !default; +//$fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.7.0/fonts" !default; // for referencing Bootstrap CDN font files directly +$fa-css-prefix: fa !default; +$fa-version: "4.7.0" !default; +$fa-border-color: #eee !default; +$fa-inverse: #fff !default; +$fa-li-width: (30em / 14) !default; + +$fa-var-500px: "\f26e"; +$fa-var-address-book: "\f2b9"; +$fa-var-address-book-o: "\f2ba"; +$fa-var-address-card: "\f2bb"; +$fa-var-address-card-o: "\f2bc"; +$fa-var-adjust: "\f042"; +$fa-var-adn: "\f170"; +$fa-var-align-center: "\f037"; +$fa-var-align-justify: "\f039"; +$fa-var-align-left: "\f036"; +$fa-var-align-right: "\f038"; +$fa-var-amazon: "\f270"; +$fa-var-ambulance: "\f0f9"; +$fa-var-american-sign-language-interpreting: "\f2a3"; +$fa-var-anchor: "\f13d"; +$fa-var-android: "\f17b"; +$fa-var-angellist: "\f209"; +$fa-var-angle-double-down: "\f103"; +$fa-var-angle-double-left: "\f100"; +$fa-var-angle-double-right: "\f101"; +$fa-var-angle-double-up: "\f102"; +$fa-var-angle-down: "\f107"; +$fa-var-angle-left: "\f104"; +$fa-var-angle-right: "\f105"; +$fa-var-angle-up: "\f106"; +$fa-var-apple: "\f179"; +$fa-var-archive: "\f187"; +$fa-var-area-chart: "\f1fe"; +$fa-var-arrow-circle-down: "\f0ab"; +$fa-var-arrow-circle-left: "\f0a8"; +$fa-var-arrow-circle-o-down: "\f01a"; +$fa-var-arrow-circle-o-left: "\f190"; +$fa-var-arrow-circle-o-right: "\f18e"; +$fa-var-arrow-circle-o-up: "\f01b"; +$fa-var-arrow-circle-right: "\f0a9"; +$fa-var-arrow-circle-up: "\f0aa"; +$fa-var-arrow-down: "\f063"; +$fa-var-arrow-left: "\f060"; +$fa-var-arrow-right: "\f061"; +$fa-var-arrow-up: "\f062"; +$fa-var-arrows: "\f047"; +$fa-var-arrows-alt: "\f0b2"; +$fa-var-arrows-h: "\f07e"; +$fa-var-arrows-v: "\f07d"; +$fa-var-asl-interpreting: "\f2a3"; +$fa-var-assistive-listening-systems: "\f2a2"; +$fa-var-asterisk: "\f069"; +$fa-var-at: "\f1fa"; +$fa-var-audio-description: "\f29e"; +$fa-var-automobile: "\f1b9"; +$fa-var-backward: "\f04a"; +$fa-var-balance-scale: "\f24e"; +$fa-var-ban: "\f05e"; +$fa-var-bandcamp: "\f2d5"; +$fa-var-bank: "\f19c"; +$fa-var-bar-chart: "\f080"; +$fa-var-bar-chart-o: "\f080"; +$fa-var-barcode: "\f02a"; +$fa-var-bars: "\f0c9"; +$fa-var-bath: "\f2cd"; +$fa-var-bathtub: "\f2cd"; +$fa-var-battery: "\f240"; +$fa-var-battery-0: "\f244"; +$fa-var-battery-1: "\f243"; +$fa-var-battery-2: "\f242"; +$fa-var-battery-3: "\f241"; +$fa-var-battery-4: "\f240"; +$fa-var-battery-empty: "\f244"; +$fa-var-battery-full: "\f240"; +$fa-var-battery-half: "\f242"; +$fa-var-battery-quarter: "\f243"; +$fa-var-battery-three-quarters: "\f241"; +$fa-var-bed: "\f236"; +$fa-var-beer: "\f0fc"; +$fa-var-behance: "\f1b4"; +$fa-var-behance-square: "\f1b5"; +$fa-var-bell: "\f0f3"; +$fa-var-bell-o: "\f0a2"; +$fa-var-bell-slash: "\f1f6"; +$fa-var-bell-slash-o: "\f1f7"; +$fa-var-bicycle: "\f206"; +$fa-var-binoculars: "\f1e5"; +$fa-var-birthday-cake: "\f1fd"; +$fa-var-bitbucket: "\f171"; +$fa-var-bitbucket-square: "\f172"; +$fa-var-bitcoin: "\f15a"; +$fa-var-black-tie: "\f27e"; +$fa-var-blind: "\f29d"; +$fa-var-bluetooth: "\f293"; +$fa-var-bluetooth-b: "\f294"; +$fa-var-bold: "\f032"; +$fa-var-bolt: "\f0e7"; +$fa-var-bomb: "\f1e2"; +$fa-var-book: "\f02d"; +$fa-var-bookmark: "\f02e"; +$fa-var-bookmark-o: "\f097"; +$fa-var-braille: "\f2a1"; +$fa-var-briefcase: "\f0b1"; +$fa-var-btc: "\f15a"; +$fa-var-bug: "\f188"; +$fa-var-building: "\f1ad"; +$fa-var-building-o: "\f0f7"; +$fa-var-bullhorn: "\f0a1"; +$fa-var-bullseye: "\f140"; +$fa-var-bus: "\f207"; +$fa-var-buysellads: "\f20d"; +$fa-var-cab: "\f1ba"; +$fa-var-calculator: "\f1ec"; +$fa-var-calendar: "\f073"; +$fa-var-calendar-check-o: "\f274"; +$fa-var-calendar-minus-o: "\f272"; +$fa-var-calendar-o: "\f133"; +$fa-var-calendar-plus-o: "\f271"; +$fa-var-calendar-times-o: "\f273"; +$fa-var-camera: "\f030"; +$fa-var-camera-retro: "\f083"; +$fa-var-car: "\f1b9"; +$fa-var-caret-down: "\f0d7"; +$fa-var-caret-left: "\f0d9"; +$fa-var-caret-right: "\f0da"; +$fa-var-caret-square-o-down: "\f150"; +$fa-var-caret-square-o-left: "\f191"; +$fa-var-caret-square-o-right: "\f152"; +$fa-var-caret-square-o-up: "\f151"; +$fa-var-caret-up: "\f0d8"; +$fa-var-cart-arrow-down: "\f218"; +$fa-var-cart-plus: "\f217"; +$fa-var-cc: "\f20a"; +$fa-var-cc-amex: "\f1f3"; +$fa-var-cc-diners-club: "\f24c"; +$fa-var-cc-discover: "\f1f2"; +$fa-var-cc-jcb: "\f24b"; +$fa-var-cc-mastercard: "\f1f1"; +$fa-var-cc-paypal: "\f1f4"; +$fa-var-cc-stripe: "\f1f5"; +$fa-var-cc-visa: "\f1f0"; +$fa-var-certificate: "\f0a3"; +$fa-var-chain: "\f0c1"; +$fa-var-chain-broken: "\f127"; +$fa-var-check: "\f00c"; +$fa-var-check-circle: "\f058"; +$fa-var-check-circle-o: "\f05d"; +$fa-var-check-square: "\f14a"; +$fa-var-check-square-o: "\f046"; +$fa-var-chevron-circle-down: "\f13a"; +$fa-var-chevron-circle-left: "\f137"; +$fa-var-chevron-circle-right: "\f138"; +$fa-var-chevron-circle-up: "\f139"; +$fa-var-chevron-down: "\f078"; +$fa-var-chevron-left: "\f053"; +$fa-var-chevron-right: "\f054"; +$fa-var-chevron-up: "\f077"; +$fa-var-child: "\f1ae"; +$fa-var-chrome: "\f268"; +$fa-var-circle: "\f111"; +$fa-var-circle-o: "\f10c"; +$fa-var-circle-o-notch: "\f1ce"; +$fa-var-circle-thin: "\f1db"; +$fa-var-clipboard: "\f0ea"; +$fa-var-clock-o: "\f017"; +$fa-var-clone: "\f24d"; +$fa-var-close: "\f00d"; +$fa-var-cloud: "\f0c2"; +$fa-var-cloud-download: "\f0ed"; +$fa-var-cloud-upload: "\f0ee"; +$fa-var-cny: "\f157"; +$fa-var-code: "\f121"; +$fa-var-code-fork: "\f126"; +$fa-var-codepen: "\f1cb"; +$fa-var-codiepie: "\f284"; +$fa-var-coffee: "\f0f4"; +$fa-var-cog: "\f013"; +$fa-var-cogs: "\f085"; +$fa-var-columns: "\f0db"; +$fa-var-comment: "\f075"; +$fa-var-comment-o: "\f0e5"; +$fa-var-commenting: "\f27a"; +$fa-var-commenting-o: "\f27b"; +$fa-var-comments: "\f086"; +$fa-var-comments-o: "\f0e6"; +$fa-var-compass: "\f14e"; +$fa-var-compress: "\f066"; +$fa-var-connectdevelop: "\f20e"; +$fa-var-contao: "\f26d"; +$fa-var-copy: "\f0c5"; +$fa-var-copyright: "\f1f9"; +$fa-var-creative-commons: "\f25e"; +$fa-var-credit-card: "\f09d"; +$fa-var-credit-card-alt: "\f283"; +$fa-var-crop: "\f125"; +$fa-var-crosshairs: "\f05b"; +$fa-var-css3: "\f13c"; +$fa-var-cube: "\f1b2"; +$fa-var-cubes: "\f1b3"; +$fa-var-cut: "\f0c4"; +$fa-var-cutlery: "\f0f5"; +$fa-var-dashboard: "\f0e4"; +$fa-var-dashcube: "\f210"; +$fa-var-database: "\f1c0"; +$fa-var-deaf: "\f2a4"; +$fa-var-deafness: "\f2a4"; +$fa-var-dedent: "\f03b"; +$fa-var-delicious: "\f1a5"; +$fa-var-desktop: "\f108"; +$fa-var-deviantart: "\f1bd"; +$fa-var-diamond: "\f219"; +$fa-var-digg: "\f1a6"; +$fa-var-dollar: "\f155"; +$fa-var-dot-circle-o: "\f192"; +$fa-var-download: "\f019"; +$fa-var-dribbble: "\f17d"; +$fa-var-drivers-license: "\f2c2"; +$fa-var-drivers-license-o: "\f2c3"; +$fa-var-dropbox: "\f16b"; +$fa-var-drupal: "\f1a9"; +$fa-var-edge: "\f282"; +$fa-var-edit: "\f044"; +$fa-var-eercast: "\f2da"; +$fa-var-eject: "\f052"; +$fa-var-ellipsis-h: "\f141"; +$fa-var-ellipsis-v: "\f142"; +$fa-var-empire: "\f1d1"; +$fa-var-envelope: "\f0e0"; +$fa-var-envelope-o: "\f003"; +$fa-var-envelope-open: "\f2b6"; +$fa-var-envelope-open-o: "\f2b7"; +$fa-var-envelope-square: "\f199"; +$fa-var-envira: "\f299"; +$fa-var-eraser: "\f12d"; +$fa-var-etsy: "\f2d7"; +$fa-var-eur: "\f153"; +$fa-var-euro: "\f153"; +$fa-var-exchange: "\f0ec"; +$fa-var-exclamation: "\f12a"; +$fa-var-exclamation-circle: "\f06a"; +$fa-var-exclamation-triangle: "\f071"; +$fa-var-expand: "\f065"; +$fa-var-expeditedssl: "\f23e"; +$fa-var-external-link: "\f08e"; +$fa-var-external-link-square: "\f14c"; +$fa-var-eye: "\f06e"; +$fa-var-eye-slash: "\f070"; +$fa-var-eyedropper: "\f1fb"; +$fa-var-fa: "\f2b4"; +$fa-var-facebook: "\f09a"; +$fa-var-facebook-f: "\f09a"; +$fa-var-facebook-official: "\f230"; +$fa-var-facebook-square: "\f082"; +$fa-var-fast-backward: "\f049"; +$fa-var-fast-forward: "\f050"; +$fa-var-fax: "\f1ac"; +$fa-var-feed: "\f09e"; +$fa-var-female: "\f182"; +$fa-var-fighter-jet: "\f0fb"; +$fa-var-file: "\f15b"; +$fa-var-file-archive-o: "\f1c6"; +$fa-var-file-audio-o: "\f1c7"; +$fa-var-file-code-o: "\f1c9"; +$fa-var-file-excel-o: "\f1c3"; +$fa-var-file-image-o: "\f1c5"; +$fa-var-file-movie-o: "\f1c8"; +$fa-var-file-o: "\f016"; +$fa-var-file-pdf-o: "\f1c1"; +$fa-var-file-photo-o: "\f1c5"; +$fa-var-file-picture-o: "\f1c5"; +$fa-var-file-powerpoint-o: "\f1c4"; +$fa-var-file-sound-o: "\f1c7"; +$fa-var-file-text: "\f15c"; +$fa-var-file-text-o: "\f0f6"; +$fa-var-file-video-o: "\f1c8"; +$fa-var-file-word-o: "\f1c2"; +$fa-var-file-zip-o: "\f1c6"; +$fa-var-files-o: "\f0c5"; +$fa-var-film: "\f008"; +$fa-var-filter: "\f0b0"; +$fa-var-fire: "\f06d"; +$fa-var-fire-extinguisher: "\f134"; +$fa-var-firefox: "\f269"; +$fa-var-first-order: "\f2b0"; +$fa-var-flag: "\f024"; +$fa-var-flag-checkered: "\f11e"; +$fa-var-flag-o: "\f11d"; +$fa-var-flash: "\f0e7"; +$fa-var-flask: "\f0c3"; +$fa-var-flickr: "\f16e"; +$fa-var-floppy-o: "\f0c7"; +$fa-var-folder: "\f07b"; +$fa-var-folder-o: "\f114"; +$fa-var-folder-open: "\f07c"; +$fa-var-folder-open-o: "\f115"; +$fa-var-font: "\f031"; +$fa-var-font-awesome: "\f2b4"; +$fa-var-fonticons: "\f280"; +$fa-var-fort-awesome: "\f286"; +$fa-var-forumbee: "\f211"; +$fa-var-forward: "\f04e"; +$fa-var-foursquare: "\f180"; +$fa-var-free-code-camp: "\f2c5"; +$fa-var-frown-o: "\f119"; +$fa-var-futbol-o: "\f1e3"; +$fa-var-gamepad: "\f11b"; +$fa-var-gavel: "\f0e3"; +$fa-var-gbp: "\f154"; +$fa-var-ge: "\f1d1"; +$fa-var-gear: "\f013"; +$fa-var-gears: "\f085"; +$fa-var-genderless: "\f22d"; +$fa-var-get-pocket: "\f265"; +$fa-var-gg: "\f260"; +$fa-var-gg-circle: "\f261"; +$fa-var-gift: "\f06b"; +$fa-var-git: "\f1d3"; +$fa-var-git-square: "\f1d2"; +$fa-var-github: "\f09b"; +$fa-var-github-alt: "\f113"; +$fa-var-github-square: "\f092"; +$fa-var-gitlab: "\f296"; +$fa-var-gittip: "\f184"; +$fa-var-glass: "\f000"; +$fa-var-glide: "\f2a5"; +$fa-var-glide-g: "\f2a6"; +$fa-var-globe: "\f0ac"; +$fa-var-google: "\f1a0"; +$fa-var-google-plus: "\f0d5"; +$fa-var-google-plus-circle: "\f2b3"; +$fa-var-google-plus-official: "\f2b3"; +$fa-var-google-plus-square: "\f0d4"; +$fa-var-google-wallet: "\f1ee"; +$fa-var-graduation-cap: "\f19d"; +$fa-var-gratipay: "\f184"; +$fa-var-grav: "\f2d6"; +$fa-var-group: "\f0c0"; +$fa-var-h-square: "\f0fd"; +$fa-var-hacker-news: "\f1d4"; +$fa-var-hand-grab-o: "\f255"; +$fa-var-hand-lizard-o: "\f258"; +$fa-var-hand-o-down: "\f0a7"; +$fa-var-hand-o-left: "\f0a5"; +$fa-var-hand-o-right: "\f0a4"; +$fa-var-hand-o-up: "\f0a6"; +$fa-var-hand-paper-o: "\f256"; +$fa-var-hand-peace-o: "\f25b"; +$fa-var-hand-pointer-o: "\f25a"; +$fa-var-hand-rock-o: "\f255"; +$fa-var-hand-scissors-o: "\f257"; +$fa-var-hand-spock-o: "\f259"; +$fa-var-hand-stop-o: "\f256"; +$fa-var-handshake-o: "\f2b5"; +$fa-var-hard-of-hearing: "\f2a4"; +$fa-var-hashtag: "\f292"; +$fa-var-hdd-o: "\f0a0"; +$fa-var-header: "\f1dc"; +$fa-var-headphones: "\f025"; +$fa-var-heart: "\f004"; +$fa-var-heart-o: "\f08a"; +$fa-var-heartbeat: "\f21e"; +$fa-var-history: "\f1da"; +$fa-var-home: "\f015"; +$fa-var-hospital-o: "\f0f8"; +$fa-var-hotel: "\f236"; +$fa-var-hourglass: "\f254"; +$fa-var-hourglass-1: "\f251"; +$fa-var-hourglass-2: "\f252"; +$fa-var-hourglass-3: "\f253"; +$fa-var-hourglass-end: "\f253"; +$fa-var-hourglass-half: "\f252"; +$fa-var-hourglass-o: "\f250"; +$fa-var-hourglass-start: "\f251"; +$fa-var-houzz: "\f27c"; +$fa-var-html5: "\f13b"; +$fa-var-i-cursor: "\f246"; +$fa-var-id-badge: "\f2c1"; +$fa-var-id-card: "\f2c2"; +$fa-var-id-card-o: "\f2c3"; +$fa-var-ils: "\f20b"; +$fa-var-image: "\f03e"; +$fa-var-imdb: "\f2d8"; +$fa-var-inbox: "\f01c"; +$fa-var-indent: "\f03c"; +$fa-var-industry: "\f275"; +$fa-var-info: "\f129"; +$fa-var-info-circle: "\f05a"; +$fa-var-inr: "\f156"; +$fa-var-instagram: "\f16d"; +$fa-var-institution: "\f19c"; +$fa-var-internet-explorer: "\f26b"; +$fa-var-intersex: "\f224"; +$fa-var-ioxhost: "\f208"; +$fa-var-italic: "\f033"; +$fa-var-joomla: "\f1aa"; +$fa-var-jpy: "\f157"; +$fa-var-jsfiddle: "\f1cc"; +$fa-var-key: "\f084"; +$fa-var-keyboard-o: "\f11c"; +$fa-var-krw: "\f159"; +$fa-var-language: "\f1ab"; +$fa-var-laptop: "\f109"; +$fa-var-lastfm: "\f202"; +$fa-var-lastfm-square: "\f203"; +$fa-var-leaf: "\f06c"; +$fa-var-leanpub: "\f212"; +$fa-var-legal: "\f0e3"; +$fa-var-lemon-o: "\f094"; +$fa-var-level-down: "\f149"; +$fa-var-level-up: "\f148"; +$fa-var-life-bouy: "\f1cd"; +$fa-var-life-buoy: "\f1cd"; +$fa-var-life-ring: "\f1cd"; +$fa-var-life-saver: "\f1cd"; +$fa-var-lightbulb-o: "\f0eb"; +$fa-var-line-chart: "\f201"; +$fa-var-link: "\f0c1"; +$fa-var-linkedin: "\f0e1"; +$fa-var-linkedin-square: "\f08c"; +$fa-var-linode: "\f2b8"; +$fa-var-linux: "\f17c"; +$fa-var-list: "\f03a"; +$fa-var-list-alt: "\f022"; +$fa-var-list-ol: "\f0cb"; +$fa-var-list-ul: "\f0ca"; +$fa-var-location-arrow: "\f124"; +$fa-var-lock: "\f023"; +$fa-var-long-arrow-down: "\f175"; +$fa-var-long-arrow-left: "\f177"; +$fa-var-long-arrow-right: "\f178"; +$fa-var-long-arrow-up: "\f176"; +$fa-var-low-vision: "\f2a8"; +$fa-var-magic: "\f0d0"; +$fa-var-magnet: "\f076"; +$fa-var-mail-forward: "\f064"; +$fa-var-mail-reply: "\f112"; +$fa-var-mail-reply-all: "\f122"; +$fa-var-male: "\f183"; +$fa-var-map: "\f279"; +$fa-var-map-marker: "\f041"; +$fa-var-map-o: "\f278"; +$fa-var-map-pin: "\f276"; +$fa-var-map-signs: "\f277"; +$fa-var-mars: "\f222"; +$fa-var-mars-double: "\f227"; +$fa-var-mars-stroke: "\f229"; +$fa-var-mars-stroke-h: "\f22b"; +$fa-var-mars-stroke-v: "\f22a"; +$fa-var-maxcdn: "\f136"; +$fa-var-meanpath: "\f20c"; +$fa-var-medium: "\f23a"; +$fa-var-medkit: "\f0fa"; +$fa-var-meetup: "\f2e0"; +$fa-var-meh-o: "\f11a"; +$fa-var-mercury: "\f223"; +$fa-var-microchip: "\f2db"; +$fa-var-microphone: "\f130"; +$fa-var-microphone-slash: "\f131"; +$fa-var-minus: "\f068"; +$fa-var-minus-circle: "\f056"; +$fa-var-minus-square: "\f146"; +$fa-var-minus-square-o: "\f147"; +$fa-var-mixcloud: "\f289"; +$fa-var-mobile: "\f10b"; +$fa-var-mobile-phone: "\f10b"; +$fa-var-modx: "\f285"; +$fa-var-money: "\f0d6"; +$fa-var-moon-o: "\f186"; +$fa-var-mortar-board: "\f19d"; +$fa-var-motorcycle: "\f21c"; +$fa-var-mouse-pointer: "\f245"; +$fa-var-music: "\f001"; +$fa-var-navicon: "\f0c9"; +$fa-var-neuter: "\f22c"; +$fa-var-newspaper-o: "\f1ea"; +$fa-var-object-group: "\f247"; +$fa-var-object-ungroup: "\f248"; +$fa-var-odnoklassniki: "\f263"; +$fa-var-odnoklassniki-square: "\f264"; +$fa-var-opencart: "\f23d"; +$fa-var-openid: "\f19b"; +$fa-var-opera: "\f26a"; +$fa-var-optin-monster: "\f23c"; +$fa-var-outdent: "\f03b"; +$fa-var-pagelines: "\f18c"; +$fa-var-paint-brush: "\f1fc"; +$fa-var-paper-plane: "\f1d8"; +$fa-var-paper-plane-o: "\f1d9"; +$fa-var-paperclip: "\f0c6"; +$fa-var-paragraph: "\f1dd"; +$fa-var-paste: "\f0ea"; +$fa-var-pause: "\f04c"; +$fa-var-pause-circle: "\f28b"; +$fa-var-pause-circle-o: "\f28c"; +$fa-var-paw: "\f1b0"; +$fa-var-paypal: "\f1ed"; +$fa-var-pencil: "\f040"; +$fa-var-pencil-square: "\f14b"; +$fa-var-pencil-square-o: "\f044"; +$fa-var-percent: "\f295"; +$fa-var-phone: "\f095"; +$fa-var-phone-square: "\f098"; +$fa-var-photo: "\f03e"; +$fa-var-picture-o: "\f03e"; +$fa-var-pie-chart: "\f200"; +$fa-var-pied-piper: "\f2ae"; +$fa-var-pied-piper-alt: "\f1a8"; +$fa-var-pied-piper-pp: "\f1a7"; +$fa-var-pinterest: "\f0d2"; +$fa-var-pinterest-p: "\f231"; +$fa-var-pinterest-square: "\f0d3"; +$fa-var-plane: "\f072"; +$fa-var-play: "\f04b"; +$fa-var-play-circle: "\f144"; +$fa-var-play-circle-o: "\f01d"; +$fa-var-plug: "\f1e6"; +$fa-var-plus: "\f067"; +$fa-var-plus-circle: "\f055"; +$fa-var-plus-square: "\f0fe"; +$fa-var-plus-square-o: "\f196"; +$fa-var-podcast: "\f2ce"; +$fa-var-power-off: "\f011"; +$fa-var-print: "\f02f"; +$fa-var-product-hunt: "\f288"; +$fa-var-puzzle-piece: "\f12e"; +$fa-var-qq: "\f1d6"; +$fa-var-qrcode: "\f029"; +$fa-var-question: "\f128"; +$fa-var-question-circle: "\f059"; +$fa-var-question-circle-o: "\f29c"; +$fa-var-quora: "\f2c4"; +$fa-var-quote-left: "\f10d"; +$fa-var-quote-right: "\f10e"; +$fa-var-ra: "\f1d0"; +$fa-var-random: "\f074"; +$fa-var-ravelry: "\f2d9"; +$fa-var-rebel: "\f1d0"; +$fa-var-recycle: "\f1b8"; +$fa-var-reddit: "\f1a1"; +$fa-var-reddit-alien: "\f281"; +$fa-var-reddit-square: "\f1a2"; +$fa-var-refresh: "\f021"; +$fa-var-registered: "\f25d"; +$fa-var-remove: "\f00d"; +$fa-var-renren: "\f18b"; +$fa-var-reorder: "\f0c9"; +$fa-var-repeat: "\f01e"; +$fa-var-reply: "\f112"; +$fa-var-reply-all: "\f122"; +$fa-var-resistance: "\f1d0"; +$fa-var-retweet: "\f079"; +$fa-var-rmb: "\f157"; +$fa-var-road: "\f018"; +$fa-var-rocket: "\f135"; +$fa-var-rotate-left: "\f0e2"; +$fa-var-rotate-right: "\f01e"; +$fa-var-rouble: "\f158"; +$fa-var-rss: "\f09e"; +$fa-var-rss-square: "\f143"; +$fa-var-rub: "\f158"; +$fa-var-ruble: "\f158"; +$fa-var-rupee: "\f156"; +$fa-var-s15: "\f2cd"; +$fa-var-safari: "\f267"; +$fa-var-save: "\f0c7"; +$fa-var-scissors: "\f0c4"; +$fa-var-scribd: "\f28a"; +$fa-var-search: "\f002"; +$fa-var-search-minus: "\f010"; +$fa-var-search-plus: "\f00e"; +$fa-var-sellsy: "\f213"; +$fa-var-send: "\f1d8"; +$fa-var-send-o: "\f1d9"; +$fa-var-server: "\f233"; +$fa-var-share: "\f064"; +$fa-var-share-alt: "\f1e0"; +$fa-var-share-alt-square: "\f1e1"; +$fa-var-share-square: "\f14d"; +$fa-var-share-square-o: "\f045"; +$fa-var-shekel: "\f20b"; +$fa-var-sheqel: "\f20b"; +$fa-var-shield: "\f132"; +$fa-var-ship: "\f21a"; +$fa-var-shirtsinbulk: "\f214"; +$fa-var-shopping-bag: "\f290"; +$fa-var-shopping-basket: "\f291"; +$fa-var-shopping-cart: "\f07a"; +$fa-var-shower: "\f2cc"; +$fa-var-sign-in: "\f090"; +$fa-var-sign-language: "\f2a7"; +$fa-var-sign-out: "\f08b"; +$fa-var-signal: "\f012"; +$fa-var-signing: "\f2a7"; +$fa-var-simplybuilt: "\f215"; +$fa-var-sitemap: "\f0e8"; +$fa-var-skyatlas: "\f216"; +$fa-var-skype: "\f17e"; +$fa-var-slack: "\f198"; +$fa-var-sliders: "\f1de"; +$fa-var-slideshare: "\f1e7"; +$fa-var-smile-o: "\f118"; +$fa-var-snapchat: "\f2ab"; +$fa-var-snapchat-ghost: "\f2ac"; +$fa-var-snapchat-square: "\f2ad"; +$fa-var-snowflake-o: "\f2dc"; +$fa-var-soccer-ball-o: "\f1e3"; +$fa-var-sort: "\f0dc"; +$fa-var-sort-alpha-asc: "\f15d"; +$fa-var-sort-alpha-desc: "\f15e"; +$fa-var-sort-amount-asc: "\f160"; +$fa-var-sort-amount-desc: "\f161"; +$fa-var-sort-asc: "\f0de"; +$fa-var-sort-desc: "\f0dd"; +$fa-var-sort-down: "\f0dd"; +$fa-var-sort-numeric-asc: "\f162"; +$fa-var-sort-numeric-desc: "\f163"; +$fa-var-sort-up: "\f0de"; +$fa-var-soundcloud: "\f1be"; +$fa-var-space-shuttle: "\f197"; +$fa-var-spinner: "\f110"; +$fa-var-spoon: "\f1b1"; +$fa-var-spotify: "\f1bc"; +$fa-var-square: "\f0c8"; +$fa-var-square-o: "\f096"; +$fa-var-stack-exchange: "\f18d"; +$fa-var-stack-overflow: "\f16c"; +$fa-var-star: "\f005"; +$fa-var-star-half: "\f089"; +$fa-var-star-half-empty: "\f123"; +$fa-var-star-half-full: "\f123"; +$fa-var-star-half-o: "\f123"; +$fa-var-star-o: "\f006"; +$fa-var-steam: "\f1b6"; +$fa-var-steam-square: "\f1b7"; +$fa-var-step-backward: "\f048"; +$fa-var-step-forward: "\f051"; +$fa-var-stethoscope: "\f0f1"; +$fa-var-sticky-note: "\f249"; +$fa-var-sticky-note-o: "\f24a"; +$fa-var-stop: "\f04d"; +$fa-var-stop-circle: "\f28d"; +$fa-var-stop-circle-o: "\f28e"; +$fa-var-street-view: "\f21d"; +$fa-var-strikethrough: "\f0cc"; +$fa-var-stumbleupon: "\f1a4"; +$fa-var-stumbleupon-circle: "\f1a3"; +$fa-var-subscript: "\f12c"; +$fa-var-subway: "\f239"; +$fa-var-suitcase: "\f0f2"; +$fa-var-sun-o: "\f185"; +$fa-var-superpowers: "\f2dd"; +$fa-var-superscript: "\f12b"; +$fa-var-support: "\f1cd"; +$fa-var-table: "\f0ce"; +$fa-var-tablet: "\f10a"; +$fa-var-tachometer: "\f0e4"; +$fa-var-tag: "\f02b"; +$fa-var-tags: "\f02c"; +$fa-var-tasks: "\f0ae"; +$fa-var-taxi: "\f1ba"; +$fa-var-telegram: "\f2c6"; +$fa-var-television: "\f26c"; +$fa-var-tencent-weibo: "\f1d5"; +$fa-var-terminal: "\f120"; +$fa-var-text-height: "\f034"; +$fa-var-text-width: "\f035"; +$fa-var-th: "\f00a"; +$fa-var-th-large: "\f009"; +$fa-var-th-list: "\f00b"; +$fa-var-themeisle: "\f2b2"; +$fa-var-thermometer: "\f2c7"; +$fa-var-thermometer-0: "\f2cb"; +$fa-var-thermometer-1: "\f2ca"; +$fa-var-thermometer-2: "\f2c9"; +$fa-var-thermometer-3: "\f2c8"; +$fa-var-thermometer-4: "\f2c7"; +$fa-var-thermometer-empty: "\f2cb"; +$fa-var-thermometer-full: "\f2c7"; +$fa-var-thermometer-half: "\f2c9"; +$fa-var-thermometer-quarter: "\f2ca"; +$fa-var-thermometer-three-quarters: "\f2c8"; +$fa-var-thumb-tack: "\f08d"; +$fa-var-thumbs-down: "\f165"; +$fa-var-thumbs-o-down: "\f088"; +$fa-var-thumbs-o-up: "\f087"; +$fa-var-thumbs-up: "\f164"; +$fa-var-ticket: "\f145"; +$fa-var-times: "\f00d"; +$fa-var-times-circle: "\f057"; +$fa-var-times-circle-o: "\f05c"; +$fa-var-times-rectangle: "\f2d3"; +$fa-var-times-rectangle-o: "\f2d4"; +$fa-var-tint: "\f043"; +$fa-var-toggle-down: "\f150"; +$fa-var-toggle-left: "\f191"; +$fa-var-toggle-off: "\f204"; +$fa-var-toggle-on: "\f205"; +$fa-var-toggle-right: "\f152"; +$fa-var-toggle-up: "\f151"; +$fa-var-trademark: "\f25c"; +$fa-var-train: "\f238"; +$fa-var-transgender: "\f224"; +$fa-var-transgender-alt: "\f225"; +$fa-var-trash: "\f1f8"; +$fa-var-trash-o: "\f014"; +$fa-var-tree: "\f1bb"; +$fa-var-trello: "\f181"; +$fa-var-tripadvisor: "\f262"; +$fa-var-trophy: "\f091"; +$fa-var-truck: "\f0d1"; +$fa-var-try: "\f195"; +$fa-var-tty: "\f1e4"; +$fa-var-tumblr: "\f173"; +$fa-var-tumblr-square: "\f174"; +$fa-var-turkish-lira: "\f195"; +$fa-var-tv: "\f26c"; +$fa-var-twitch: "\f1e8"; +$fa-var-twitter: "\f099"; +$fa-var-twitter-square: "\f081"; +$fa-var-umbrella: "\f0e9"; +$fa-var-underline: "\f0cd"; +$fa-var-undo: "\f0e2"; +$fa-var-universal-access: "\f29a"; +$fa-var-university: "\f19c"; +$fa-var-unlink: "\f127"; +$fa-var-unlock: "\f09c"; +$fa-var-unlock-alt: "\f13e"; +$fa-var-unsorted: "\f0dc"; +$fa-var-upload: "\f093"; +$fa-var-usb: "\f287"; +$fa-var-usd: "\f155"; +$fa-var-user: "\f007"; +$fa-var-user-circle: "\f2bd"; +$fa-var-user-circle-o: "\f2be"; +$fa-var-user-md: "\f0f0"; +$fa-var-user-o: "\f2c0"; +$fa-var-user-plus: "\f234"; +$fa-var-user-secret: "\f21b"; +$fa-var-user-times: "\f235"; +$fa-var-users: "\f0c0"; +$fa-var-vcard: "\f2bb"; +$fa-var-vcard-o: "\f2bc"; +$fa-var-venus: "\f221"; +$fa-var-venus-double: "\f226"; +$fa-var-venus-mars: "\f228"; +$fa-var-viacoin: "\f237"; +$fa-var-viadeo: "\f2a9"; +$fa-var-viadeo-square: "\f2aa"; +$fa-var-video-camera: "\f03d"; +$fa-var-vimeo: "\f27d"; +$fa-var-vimeo-square: "\f194"; +$fa-var-vine: "\f1ca"; +$fa-var-vk: "\f189"; +$fa-var-volume-control-phone: "\f2a0"; +$fa-var-volume-down: "\f027"; +$fa-var-volume-off: "\f026"; +$fa-var-volume-up: "\f028"; +$fa-var-warning: "\f071"; +$fa-var-wechat: "\f1d7"; +$fa-var-weibo: "\f18a"; +$fa-var-weixin: "\f1d7"; +$fa-var-whatsapp: "\f232"; +$fa-var-wheelchair: "\f193"; +$fa-var-wheelchair-alt: "\f29b"; +$fa-var-wifi: "\f1eb"; +$fa-var-wikipedia-w: "\f266"; +$fa-var-window-close: "\f2d3"; +$fa-var-window-close-o: "\f2d4"; +$fa-var-window-maximize: "\f2d0"; +$fa-var-window-minimize: "\f2d1"; +$fa-var-window-restore: "\f2d2"; +$fa-var-windows: "\f17a"; +$fa-var-won: "\f159"; +$fa-var-wordpress: "\f19a"; +$fa-var-wpbeginner: "\f297"; +$fa-var-wpexplorer: "\f2de"; +$fa-var-wpforms: "\f298"; +$fa-var-wrench: "\f0ad"; +$fa-var-xing: "\f168"; +$fa-var-xing-square: "\f169"; +$fa-var-y-combinator: "\f23b"; +$fa-var-y-combinator-square: "\f1d4"; +$fa-var-yahoo: "\f19e"; +$fa-var-yc: "\f23b"; +$fa-var-yc-square: "\f1d4"; +$fa-var-yelp: "\f1e9"; +$fa-var-yen: "\f157"; +$fa-var-yoast: "\f2b1"; +$fa-var-youtube: "\f167"; +$fa-var-youtube-play: "\f16a"; +$fa-var-youtube-square: "\f166"; + diff --git a/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/scss/font-awesome.scss b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/scss/font-awesome.scss new file mode 100644 index 000000000..f1c83aaa5 --- /dev/null +++ b/maxkey-web-maxkey/src/main/resources/static/font-awesome-4.7.0/scss/font-awesome.scss @@ -0,0 +1,18 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ + +@import "variables"; +@import "mixins"; +@import "path"; +@import "core"; +@import "larger"; +@import "fixed-width"; +@import "list"; +@import "bordered-pulled"; +@import "animated"; +@import "rotated-flipped"; +@import "stacked"; +@import "icons"; +@import "screen-reader"; diff --git a/maxkey-web-maxkey/src/main/resources/templates/views/layout/common.cssjs.ftl b/maxkey-web-maxkey/src/main/resources/templates/views/layout/common.cssjs.ftl index 78a1bc763..13f2eef02 100644 --- a/maxkey-web-maxkey/src/main/resources/templates/views/layout/common.cssjs.ftl +++ b/maxkey-web-maxkey/src/main/resources/templates/views/layout/common.cssjs.ftl @@ -6,6 +6,8 @@ + <#-- font-awesome-4.7.0 --> + <#-- metadata --> <#--bootstrap-table-1.16.0--> diff --git a/maxkey-web-maxkey/src/main/resources/templates/views/layout/top.ftl b/maxkey-web-maxkey/src/main/resources/templates/views/layout/top.ftl index 94588f110..7c3bde932 100644 --- a/maxkey-web-maxkey/src/main/resources/templates/views/layout/top.ftl +++ b/maxkey-web-maxkey/src/main/resources/templates/views/layout/top.ftl @@ -40,12 +40,13 @@
  <@locale code="login.password.changepassword"/>  
+ <#if Session["current_authentication"].principal.roleAdministrators==true >
  <@locale code="global.text.manage"/>  
- +
  <@locale code="global.text.logout"/>  
diff --git a/maxkey-web-maxkey/src/main/resources/templates/views/login.ftl b/maxkey-web-maxkey/src/main/resources/templates/views/login.ftl index 81278360f..052821b73 100644 --- a/maxkey-web-maxkey/src/main/resources/templates/views/login.ftl +++ b/maxkey-web-maxkey/src/main/resources/templates/views/login.ftl @@ -1,175 +1,184 @@ - + - <#include "layout/header.ftl"> <#include "layout/common.cssjs.ftl"> -<#if true==isKerberos> - <@browser name="MSIE"> - - - - + - <#--submit loginForme--> - $("#loginSubmit").on("click",function(){ - doLoginSubmit(); - }); - <#--submit tfaLoginForme--> - $("#tfa_loginSubmit").on("click",function(){ - doLoginSubmit(); - }); - - <#--read username cookie for login e--> - if($.cookie("username")!=undefined&&$.cookie("username")!=""){ - $("input[name=j_username]").val($.cookie("username")==undefined?"":$.cookie("username")); - $("input[name=j_password]").val(""); - var switch_tab=$.cookie("switch_tab")==undefined?1:$.cookie("switch_tab"); - if(switch_tab==2){ - switchTab("switch_tfaLogin"); - }else{ - $("#div_commonLogin input[name=j_password]").focus(); - } - - }else{ - $("#div_commonLogin input[name=j_username]").focus(); - } - <#--resend captchae--> - $("#tfa_j_otp_captcha_button").on("click",function(){ - if(captchaCount<60){ - return; - } - var loginName=$("#tfa_j_username").val(); - if(loginName==""){ - return; - } - $.get("<@base />/login/otp/"+loginName,function(data,status){ - alert("Data: " + data + "\nStatus: " + status); - }); + @@ -211,17 +220,30 @@ $(function(){ <@locale code="login.text.username"/>: - + +
+ + +
+ <@locale code="login.text.password"/>: - + +
+ + +
+ <#if true==isCaptcha> <@locale code="login.text.captcha"/>: - +
+ + +
diff --git a/maxkey-web-maxkey/src/main/resources/templates/views/main/appList.ftl b/maxkey-web-maxkey/src/main/resources/templates/views/main/appList.ftl index d455675bf..bfa329537 100644 --- a/maxkey-web-maxkey/src/main/resources/templates/views/main/appList.ftl +++ b/maxkey-web-maxkey/src/main/resources/templates/views/main/appList.ftl @@ -23,7 +23,14 @@
<#if "Desktop"!=app.protocol> - + + href="${app.loginUrl}" + + <#if "IDP"==app.inducer> + href="<@base/>/authz/${app.id}" + + target="_blank" title="${app.name}" > @@ -65,7 +72,14 @@ <#else> - + + href="${app.loginUrl}" + + <#if "IDP"==app.inducer> + href="<@base/>/authz/${app.id}" + + target="_blank" title="${app.name}" > @@ -78,7 +92,14 @@ <@locale code="button.text.visit"/> <#else> - + + href="${app.loginUrl}" + + <#if "IDP"==app.inducer> + href="<@base/>/authz/${app.id}" + + target="_blank" title="${app.name}" > <@locale code="button.text.visit"/> diff --git a/maxkey-web-maxkey/src/main/resources/templates/views/registration/register.ftl b/maxkey-web-maxkey/src/main/resources/templates/views/registration/register.ftl index 46576854f..f672dedd7 100644 --- a/maxkey-web-maxkey/src/main/resources/templates/views/registration/register.ftl +++ b/maxkey-web-maxkey/src/main/resources/templates/views/registration/register.ftl @@ -1,63 +1,125 @@ - - - - - - My JSP 'register.jsp' starting page - - - - - - + + + +<#include "../layout/header.ftl"> +<#include "../layout/common.cssjs.ftl"> + + + +
+ <#include "../layout/nologintop.ftl"> +
- - - - - -
- - -
- +
+
+
+ +
- - + + - - + + + - - + + - - + + - - - - - - - + + - + + - + + +
<@locale code="register.lastname"/><@locale code="forgotpassword.emailmobile"/>
<@locale code="register.firstname"/><@locale code="login.text.captcha"/>:
<@locale code="register.workemail"/><@locale code="userinfo.displayName"/>:
<@locale code="register.company"/><@locale code="userinfo.username"/>:
<@locale code="register.workphone"/>
<@locale code="register.users"/><@locale code="login.text.password"/>
"/><@locale code="login.password.confirmPassword"/>
"/>
-
- - +
+ + + + + \ No newline at end of file diff --git a/gradleBuildRelease.bat b/release.bat similarity index 68% rename from gradleBuildRelease.bat rename to release.bat index 19ecd3f5e..9bb469baa 100644 --- a/gradleBuildRelease.bat +++ b/release.bat @@ -1,8 +1,17 @@ -call gradleSetEnv.bat +call setEnvVars.bat set START_TIME="%date:~0,10% %time:~0,2%:%time:~3,5%" echo start time %START_TIME% +call %JAVA_HOME%/bin/java -version +call %GRADLE_HOME%/bin/gradle -version + +echo start clean . . . + +call %GRADLE_HOME%/bin/gradle clean + +echo start clean complete . + call %GRADLE_HOME%/bin/gradle checkenv call %GRADLE_HOME%/bin/gradle diff --git a/gradleSetEnv.bat b/setEnvVars.bat similarity index 100% rename from gradleSetEnv.bat rename to setEnvVars.bat diff --git a/sql/maxkey_v2.2.0.RC1.sql b/sql/maxkey_v2.2.0.RC1.sql deleted file mode 100644 index 90e588f42..000000000 --- a/sql/maxkey_v2.2.0.RC1.sql +++ /dev/null @@ -1,855 +0,0 @@ --- MySQL dump 10.13 Distrib 5.6.23, for Win64 (x86_64) --- --- Host: 127.0.0.1 Database: maxkey --- ------------------------------------------------------ --- Server version 8.0.21 - -/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; -/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; -/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; -/*!40101 SET NAMES utf8 */; -/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; -/*!40103 SET TIME_ZONE='+00:00' */; -/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; -/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; -/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; -/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; - --- --- Table structure for table `mxk_accounts` --- - -DROP TABLE IF EXISTS `mxk_accounts`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `mxk_accounts` ( - `ID` varchar(45) NOT NULL COMMENT '主键', - `UID` varchar(45) DEFAULT NULL COMMENT '用户ID', - `APPID` varchar(45) DEFAULT NULL COMMENT '应用ID', - `RELATEDUSERNAME` varchar(200) DEFAULT NULL COMMENT '用户名', - `RELATEDPASSWORD` varchar(200) DEFAULT NULL COMMENT '密码', - `MODIFIEDDATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', - `APPNAME` varchar(100) DEFAULT NULL COMMENT '应用名称', - `USERNAME` varchar(45) DEFAULT NULL COMMENT '用户名', - `DISPLAYNAME` varchar(45) DEFAULT NULL COMMENT '用户显示名', - PRIMARY KEY (`ID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户账号表'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `mxk_accounts` --- - -LOCK TABLES `mxk_accounts` WRITE; -/*!40000 ALTER TABLE `mxk_accounts` DISABLE KEYS */; -INSERT INTO `mxk_accounts` VALUES ('26b1c864-ae81-4b1f-9355-74c4c699cb6b','7BF5315CA1004CDB8E614B0361C4D46B','fe86db85-5475-4494-b5aa-dbd3b886ff64','test@connsec.com','6bc4cb2c2967c12ed0bdd93ee2e48bdd','2015-05-05 11:12:26','腾讯企业邮箱','admin','系统管理员'),('36371b00-1a88-4fce-955d-1828e778bdd6','7BF5315CA1004CDB8E614B0361C4D46B','c8038bd4-12a4-4b45-9d43-61b3ecdc2eb4','myltpv9527@163.com','3752d262dd2efc6db55a752ab2049f89','2015-01-16 15:36:44','有道云笔记','admin','系统管理员'),('37d640d9-5f1d-4b41-a20e-bad0d547fa20','7BF5315CA1004CDB8E614B0361C4D46B','850379a1-7923-4f6b-90be-d363b2dfd2ca','myltpv9527@163.com','3752d262dd2efc6db55a752ab2049f89','2015-01-17 03:05:24','网易163邮箱','admin','系统管理员'),('44f7e28d-399c-4756-a0c6-bad96bde4a8a','7BF5315CA1004CDB8E614B0361C4D46B','c1cabfaeb9a448028ffab2148da9f65c','21313','c1e66f5a57a76f19c9683e8a3a58898a','2015-05-05 08:06:49','QQ Login','admin','系统管理员'),('e3ee7f1c-48cf-48ee-ad07-29491b649bf5','7BF5315CA1004CDB8E614B0361C4D46B','a08d486a-2007-4436-aeda-4310e9443ec7','a1','9653392173f7e8eb2a4545aa816506ff','2019-10-20 13:06:08','OAuth v1.0a Demo','admin','系统管理员'); -/*!40000 ALTER TABLE `mxk_accounts` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `mxk_apps` --- - -DROP TABLE IF EXISTS `mxk_apps`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `mxk_apps` ( - `ID` varchar(45) NOT NULL COMMENT '主键', - `NAME` varchar(300) NOT NULL COMMENT '应用名称', - `LOGINURL` varchar(300) CHARACTER SET cp850 COLLATE cp850_general_ci NOT NULL COMMENT '应用登录地址', - `CATEGORY` varchar(45) DEFAULT NULL COMMENT '应用类型', - `SECRET` varchar(400) DEFAULT NULL COMMENT 'SECRET', - `PROTOCOL` varchar(300) DEFAULT NULL COMMENT '应用协议', - `ICON` blob COMMENT '应用图标', - `STATUS` tinyint unsigned DEFAULT NULL COMMENT '状态', - `CREATEDBY` varchar(45) DEFAULT NULL COMMENT '创建人', - `CREATEDDATE` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `MODIFIEDBY` varchar(45) DEFAULT NULL COMMENT '修改人', - `MODIFIEDDATE` datetime DEFAULT NULL COMMENT '修改时间', - `DESCRIPTION` varchar(400) DEFAULT NULL COMMENT '描述', - `VENDOR` varchar(45) DEFAULT NULL, - `VENDORURL` varchar(200) DEFAULT NULL, - `CREDENTIAL` tinyint DEFAULT '0', - `SHAREDUSERNAME` varchar(100) DEFAULT NULL, - `SHAREDPASSWORD` varchar(400) DEFAULT NULL, - `SYSTEMUSERATTR` varchar(45) DEFAULT NULL, - `ISEXTENDATTR` varchar(4) DEFAULT NULL, - `EXTENDATTR` varchar(4000) DEFAULT NULL, - `SORTINDEX` int unsigned DEFAULT '0', - `ISSIGNATURE` tinyint DEFAULT '0', - `VISIBLE` tinyint DEFAULT '0', - `ISADAPTER` tinyint unsigned DEFAULT '0', - `ADAPTER` varchar(400) DEFAULT NULL, - `PRINCIPAL` varchar(45) DEFAULT NULL, - `CREDENTIALS` varchar(200) DEFAULT NULL, - PRIMARY KEY (`ID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='应用表'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `mxk_apps` --- - -LOCK TABLES `mxk_apps` WRITE; -/*!40000 ALTER TABLE `mxk_apps` DISABLE KEYS */; -INSERT INTO `mxk_apps` VALUES ('001bd032-d132-4747-b434-73f21b352c63','招聘管理系统','http://hr.maxkey.top','HR','05681f23341b0676f0124a9d2f809af9df962b0983ae8557a6fe31a66c782983','OAuth_v2.0','GIF89a0\00\0\0݀\04Mgڴ~̘\Z݀5ٳ˗߉ٲ̗݁qd߈Ō۷„͙w\'ÈiNŋބ jРΜѢի3֬֫ڵhܹ2߾6ǏÇJթӦ߿>С|ɒ (͚ނ8رxXΝl۵ބ ذ߆\rݺXԪϞ}֭ӧ:VSm\\Ptxϟݻ`Ԩ]y9ɒƌӥoПI{\'-Å޼ʔbС:Q0ɓCcҥOʼnܸBb\\Ŋ۶,}ÆR@Ϡ*ރksuƍ[Λn!^ϝزoȏ[ׯm+kլj*Ĉĉ)rW7ѣć+cȒO݁ȑ}ǎ! NETSCAPE2.0\0\0\0!-Made by Krasimira Nejcheva (www.loadinfo.net)\0!\0\n\0\0,\0\0\0\00\00\0\0\0HA\08qÇ\rkÎsu j8P̔\0 G\"Ɇx0\\r06IJfK\rbJ u\Zlb23dIek50\0(%Ph6hw,\"ħ)H>60\0x}dYW8ȔQ)0 ^c $ 8ergE&\0\"ҌI%F<\Z@1AK\n6R2\n\ZiG/8e\n+` iЂ;h$шA\\@xb|BE .ŎiJ *&NHqB 0WȾaʧ  A, #\\AOowA\0!\0\n\0\0,\0\0\0\00\00\0\0\0H*\\ȰCtرË\n-x%@(0$@Ǔ\n9JXd$+Xs]0;`&Ƥ4Kܗʋ\Zr!6< 46x_.\Zͨ7~8@ckBJ#ZB9 RB6\'}wIPX`HAlE4\0!uU$L:A e=A.ɀP6A0*\\ +@JH$\04`:XAu*^A6HRa/Dvښ ~\0\'\0ѮgD0oBN8oBL /pk?,;\0!\0\n\0\0,\0\0\0\00\00\0\0\0H*\\ȰÇ#2P*$j$8*Rڸ HHJiU>P%11g*M)P8RP26E71H!\rv@6L4rH!\\\"\"¼9tB2fJ_aj#!{32#N0@.ZkdɂLMvg~@ \rdB\n $F@Eǂ p8 \0%)Lтz8@ 6If(\"TQЀF\Z5\ZAB}ʙ1P\0y˄1\\\nډ;̀gAah2&  -At!B\0p\ny\'D,SCGpsű硃d&Yl884 ʓ\nJABTzW4\'!lim -#|Rp664dϫz\\C/ت@DLJdc߬1P H D#q\niAKd@K fSrAa) Ri>\0|QׅA/7MXPGXD\\lB,$\0!\0\n\0\0,\0\0\0\00\00\0\0\0H*\\ȰÇ#:\\BŃRŏO(`Nj6BI~)#NppŐxY\npxFTB.8 bJ0-T\"@=I\0#i]JB |F\\+uH!WټA,yC~ _A/w^z~_ueGBx!n*0]:=KPh_ \Z` o 0 `5D)B+B k`d , Rְ:YDpA%@=&K2\Z&DYi\"PE Z\nA&8vbM2BLQE\ZJh\0A%I)=P,Ul@1\rO\Z>C(/x\Z6+*2dCd‡:!&`IJ-p\0<:9:4꺊\0& D1P\0PE1`.Pй׶%r{ .zpc=1N/`EaŜ$N1fQ@\0!\0\n\0\0,\0\0\0\00\00\0\0\0H*\\ȰÇ#:4`@Ń\rL$Iŏ\0H\0DG}+9(b\'4XpB$,E1P1Ġ\'6 @dO0bUdI†\n2R#Ep(D˕8c˞M6 B`ct\"g FHc|Ѐ/.Yǹ!R- 6L\Ztn@@<\n} yEj={ l}dDo)m n q / 2n1DFd\0D`\'R\"C\n-|(q4$@ \0lP` )%>*dDdH9䉘\rDAqDKB`D8 \'\0{ PBI (kj\0-dBs\n00 ^\04@C8\0nF@VhqC|\0.\\li\0\\KYI\nŠLD(\0km@ o Cxz\0\0:@sP1?\\P %A!AE,/\\h{\0 \0\nZjLg0{>\0y2|Υr_~0k\0\\z\'E^{>7u=2dw7<1@.,PuqY[ry!EC(kyB*Di:$( $yt;$ieHy7XI<pgI\ryPpSmZYfI7ղV* h`p*%A( \'7r\rU\rA\'ʤ񭁧2i *f`\0f2=*BP s hza ڪ WM⃟=8 \\T@ `uvx.$\0!\0\n\0\0,\0\0\0\00\00\0\0\0H*\\ȰÇ#JHq HM6@RQ!$\\0hA:LT7d(p&T90C\0@1A N\"D?J%h,8cCZRpA\rI71D\'*.HT7(RīEN\n+xpRa4HEr9bo;*Ep\"t8F;%QA *c8CҜ Y q#G( HtMq@4|@y ޵\'pϟ5gw_<@@`QDw R\")x@/( JBBa)lP~7E 3\"<|Jt_B1#.^4B`J\\D3`Q1-Ú_\0x\n`\"t\Z$Wr䙧@BF葆t-b<$D\n%Q@J@¤y%CwaD \0\ny*:zli\n.#@D2&H%K\"\0$2f>\nC8T @\rIBxFd`@TA@CXpA\nFK@?0\rjl*!0?A0q^/,\0l\0;',0,NULL,NULL,NULL,NULL,'','MAXKEY','',0,NULL,NULL,NULL,'0',NULL,1,0,0,0,'',NULL,NULL),('1327c121-cfad-49ba-bf61-afd3a1e09d5c','LTPA-Cookie','http://tokenbased.demo.maxkey.top:8080/demo-ltpa/ltpa.jsp','FINANCE','d6227a3d7756c255874ec7029678b8d1','Token_Based','\0JFIF\0\0\0\0\0\0\0C\0 \n \r \Z\Z $.\' \",#(7),01444\'9=82<.342\0C \r\r2!!22222222222222222222222222222222222222222222222222\0\0\0\"\0\0\0\0\0\0\0\0\0\0\0\0 \n \0\0\0\0}\0!1AQa\"q2#BR$3br \n\Z%&\'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz\0\0\0\0\0\0\0\0 \n \0\0\0w\0!1AQaq\"2B #3Rbr\n$4%\Z&\'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz\0 \0\0?\0(\n(\n(\n(\n+Z\'ouZhl\r1`?L4֯MunC}U(K0c4QE\0QE\0QE\0QE\0QE\0QE\0QE\0TR<\"fc\0I+M2uZ\rc^;Hwc\n;RР\"JGК`Hr\08\0hvH}:٣opI%cy,f)<;0k)ɀh1ײg&ɺAg?2C~8#(\0(\0(\0(\0)v`I\'\0\nuyhnu)c?D{3\ZIܵ鑶28w?EwOQP:6§O=QxQ$a,J-쳆P޽CHuih%g.~ae5C\Z\ZE\0*\0t\0v-1\\O6;;O8t8B*8y\0)m` Yw@Q߮sӊ\Z(wH:b >0G\\i)#Nϰo:\Z(;YhpAYX]uk3E&Ӳc!هW\Z>[J:gC w wf2Q@((-Y,qf\'$:Χ&],\0\nU^2ZOhkّ\"+[x8bPP0yM45\rQ-\07G^@0(QE\0QE\0WP]Z@\'fѓ\"k*#eQ#̕\n5q2Zռȁ?Ǒ6F+DUb?tM-q p{r?U{QLAEP\\όR$F!T rOOķQK4 ܣ><ڋjıdRJgMoLoPo*Ȫ9rZX1pb\0qfaXd,edO\'=K-ƣtQ+2E#8r+k~i7M{qr\"`&UU,FqS$(\0(\04w? 5EY/q\'>V\0Mz|٣ڽoۊ6[t֯2px?JhQE\0QE\0V->{ɛCH ժ>$UtgܬDU~`=hnnkNdF$\0:XA!\\m3{m~W|-M.*[2:F%HgESQE\0QE\0W\'\r髩ZnP9.}GQyE\0|]_e/flLg?eWҢ-hĴݔwi}3g{oZsi2M(r]Oó,.6/ \0U}\rz^SJUMJ)lX$g~4c)gWtZݧeU_*Qy\0Q\0@t\"\\MI9,{zrڊN-q\0iQOV!#۲P#=ZڲͩS?zxs<#I,YݎK1M1ٝݙff9$5sJү5B;;?ઽ=QszVh`_y<\'\0Wp\n5\ncgÖ\ZҖVߝn$(\0(\0(\0(\0B# םxW%R K[7\0d\0 F>gӯ4ˣm}m-d\\g{_K^z+Jផ\nK^[6=ց\'x>5(SV;/5f\r6V\'v aKtJC3\'z(Tդq`/IU tfWY&^N|<\ns|==[]dkK#ɞe \0ez޽A/C%n^CO+^b\n(\n(\n(\n(\n(\n(\n(2A&]i)PA~@7\0n=u5+ \"HrrHH+Ѩ(((((',1,NULL,'2019-11-09 10:13:11',NULL,NULL,'Test','MaxKey','https://github.com/shimingxy/MaxKey',0,NULL,NULL,NULL,'0',NULL,7,0,1,1,'org.maxkey.authz.token.endpoint.adapter.TokenBasedDefaultAdapter',NULL,NULL),('38c8a544eaa04aaeaa49d9c77ace40cd','Token_Based_Json','http://tokenbased.demo.maxkey.top:8080/demo-tokenbase/','FINANCE','c1f6adfcadd8ba23f73395f16a45dbe7','Token_Based','PNG\r\n\Z\n\0\0\0\rIHDR\0\0\0U\0\0\0X\0\0\0k\0\0\0 pHYs\0\0\0\0+\0\0\0tIME !5\0\0\0tEXtAuthor\0H\0\0\0 tEXtDescription\0 !#\0\0\0\ntEXtCopyright\0:\0\0\0tEXtCreation time\05 \0\0\0 tEXtSoftware\0]p:\0\0\0 tEXtDisclaimer\0\0\0\0tEXtWarning\0\0\0\0tEXtSource\0\0\0\0tEXtComment\0̖\0\0\0tEXtTitle\0\'\0\0 \0IDATxyTs꽡ZQ@EP%}͘8q3.u|\'!fD,*,@Uuܺ2|}n,9y\\G-f\0DS\'m4}E2x`&My/I\"B*_Rr_Ek-Ð ZzaXrSJaY_Tc\0Ƙh\n۶r(h{iG>[ܱޒ),(R`PD~ \0Uߵ9f%mG\n\n9/feYIlܸ͛7~zF|夓NCɈX3.bbt\"/|hllT*@EEC #aÆ%5aeY5W-avm63{lf͚[oۻeQG\'0\" (D)$RE#BB hm]wmeee?.>}eavޮesWw*20q6n%\\oQreY%Sɲ,1TVVgi@PI326h\0-vdϞ=%}א^{5^{5|A{1LXBѵb&hioo/fѢEi HF6 Di?N\0B\"ޔ2DA)0d۶m]C~z.|M 35 p]3gh\"\\%%9 CȘ1c;v,5558KZԐ|V+֛!\"!\"\Z Eҋ(jp&ڵkYz5~TRyaΝw}(Nv^I/\"\"^zX%=XʶmƊ+i_M7D:\"s#6ٺ\"i%C. F!\n XMMXrD}\ri + E_|1\\+\"QK\"Bcc#vZbSWXݻc\0>}z\06klWMyՀ \0#RHKC/}&HgЯO\\x0Qb,Р-E.B\r\ZDCC@/ZSO=5atOT@%U)Eccc¢P[[ˑG\Zq>~XBק1SёTF&hbrRfS\\s3{Btљ|˨Vچv_ǟ7\'>ed@\0˲1:hh7n\r\r\r%f޶mJԞX=bj\\I[[[5ڤ%#QJ Tl*,TJaDXߜł|A:|Au/l%w9+R]\"h!\Z4h>mHu{^9\\KӤR#)b.%Urc*GKO3㛫?cO&H;lkIR3h$ϼSVr@+00vc3JbjG//ZŊ`N{QP\nmi7x|!8c v\\PF-|rXNG޴\'fV`\n΂.V}9c;rOV%(Q\"FPZ(_t*[ϼW%7~tY\Z?e\"-B?U/^O }%(.1#\\,,=^1XĞzN1 $ZH0\nˆH%[1C`PrlTڲq\\ -\Zg\0Ra; d!\0vHjAăLlJ!ɃʃѠHn5ò\rM,[T \0J!hA~q)ЉRJ] Ao$WL(A%p&-_Ulª;MӅA@)D(U\\&hRQAHX`kި%u<\n \rqhSE\ZٴvdBQK^*fL`p0AD JNSW}\Z-\\E\"]*Z$7 ~\Zש ]ÜU\ZBE\"tP. 8R)E J[dv~s7XE.(٢(l-b93EBp͋r=OT j*ؗ 21Q\'2<\n}UA[:\0>,9l`_m 0ThPJerWxuE :ݏ`Ojm&ߗGL/L(݁J\Zm掯Oל6cE U O7le*SyL܍c GKo%U1__wszO{K@&!4K;G ,ZZ/_Ŭg̛0x͐\nd>1 PCH,DRR:AFfwq\r\'h m2VD)\"9r&mذ]vQWW3;}gC8>mj*/^@dB?vJ<@ᖕ]fML9iw\\;W6O-ܴC,M,|Ee(6ύ+NgP*\0X0~ kv;&8W?׊5P0PU0rD8 \nh6551w\\.2<2]\0sA+t:\rwމ 3EKkN;H\Z;ezᒿ}]ϾySaW O>M<=۶lG#\0ġr@mU-|/pġA͢tem\rx,X).TV\Z ӧ@FvyABe\n\"±Gum;3fpPYY%|qC1!J..t3}t~&(u Ð?iN</ %gluٲ^͗>/~0lob\ZB2e)K*SIvVN/Cg0em!Ũ q2G.ێFL&Ap ؂PR(++㪫B$J4SJa6˗/saX8% Y/@QI J*m-9R=EB4ƈFL#0؈!\\XHdP3ƐJ߾9K CèQ8#$ C8.G%L\rÐ\'_f^x./_H̙3o4Hɇx\n㧠l ni%!J(EGT7XV8uHpvx]7ObTc\n|]-\nT\n/\'lّ%u4w>۶O<ߎ뺉g!zI(+)Ԓ۩y!UUU| __fҤI\'۫95QCpgfVHEMȡ RfGbe𕍪>_زr T[@T@i vQJXb#ڪDYUd%JAB뽑Y)\0)J\n#1cF2c̛7 \Z4 \\ >:5(,{%8 /hmc#8q2284q⠌B\"l;-\Z SdwwݿZ;Bހ\n/׈mXkvʐ-.ʎVca6D21m<+Wlٲnn>l6 8NIVG.Txt\Zc z*cǎ-Xli4m6n#464mB-ZkEh bp\\u4nHi#rx\rߺIVmڍl A(aq#mhoL;뛹?+pql? <CI\r Haڵ*o}***袋0.m\'71cxg\0}oET 5ފ OLd6~r~>g5۷Y_u s9?-fĠa2jԨf/\\_IF 0E1Ү\"4y*ggJ3hF!FE\ry\\~Xy-ǰ\ZN;X\\aւ\\0͑:ni ˴c9VqoLӧO\"8=ݱsbs1bP`d\"bF$$f1e>CTb4pXc<o#x>ϭ_?ۨV*˪p-3::27Ce*քg(Z0Vͺh\rJ(\nv=\r(HcMwrGl7zX4!(> .OlZ=[w:\Zu72.N^]hbLN^$  *IUTtEKV61>\n6k\\!JP:0rD\"Ji.DK5(;ʏ,1Cj1A{XJi;/o-݊И@€͑ ۛc>d)/C%(8|s;GYOEmqA\" Jwco#ƕVVVTܥUV|E ϰ<2\nFA3NJc\Z\Z\0mٹ tJ:{Ν%Cf޷o^CC7naŪaBuO,y>\'_7/>Am\Z54?>\\4~u-\'՟SFo5R>Dnj@=2cĈ%;8b^`rUq\0izmWg?S,ZMJեt0B7%0: =˪Xh|A @\r0a„\rx_j2a„J)g}ng=\'\"\"aVL f$;-w͚52n8Dk[RUU%6m m /%K\0ջw3 g}6v\ZÇ\'$H hS(\0a|A44J9hՇv^zx^˱4+ʋ^ ۶K@:\'c}_0-[H]]\0⺮h9sxCI5.j$3FFH(&Jv1y @c$on8Nrgޫ*rYIj}5AP__ϣ>Juu5lwd2\\ץ$@)7 rPJPA:R.ZG Lfٚ~)I8\'? r\nAZJ{[ys9+?`ܹ z+DW %\nI>`h\ZסTyn%Y{)So3<?+z/~ĸqxGؾ};˗/gٲe\\f::: }뷏u`\nVh*F|IRL:vDl۶MZ[[Y֯_/O?L/J?߹Z|Ib}7,J͛oͯk&Ӷ\0\0IDAT:7h Re˖uZ3\'cƌBJ)fϞͲe˘rt\n2Ch1>w\\}i]ar-0i$o#n:|ߧ}\0ye((++ `E)Euu5O<6m⤓N.K^Oq$yCZ1rI-2cFXxӧ3vX,Y1}ү_?6mDSSS2_x≉Mjժ#E̊z3f@k5\\CEEEI>.E%3r$!<#L:S]]0!޽c=֚}_#8t:ԩS;<?pRO}Gwޡ*/ò,QJɓO>uוب6ll6\\1c@dWUUɂ eӦM%7ߜ;v${I_|bIVGN햩{zKѣ?òj*immcʚ5kdƌJJ-++;CVXܿc?|s؛3j(yA$fmSO͛?n0;|$Sc@۶㎓[ZZZ#+W˲Jd2R__/&L#FH:otZ?p?~| d2R^^.L&hR***OԘI=)в,ٰaCҗT\"5v[WW< u=ĹC-J9\r(,[۷f\Zz!^~quE K1ʵ_jܧCH6tհ4 nx&!\'*\n@555Of-ObhL28`@1u\"3c j\0\0\0\0IENDB`',1,'superadmin','2013-05-25 03:45:54',NULL,NULL,'Test','MaxKey','https://github.com/shimingxy/MaxKey',0,NULL,NULL,NULL,'0',NULL,6,0,1,0,'',NULL,NULL),('3a2c3f84-1df7-413a-8a42-f3add972e0d0','O2OA','http://o2oa.maxkey.top/x_desktop/oauth.html?oauth=MaxKey','OA','74a81906a41d3a89866edc237b3ffb2496d0aaf34af60931b942ef9c37cb9e71','OAuth_v2.0','PNG\r\n\Z\n\0\0\0\rIHDR\0\0\0\0\0\0\0\0\0j\0\0 IDATx}l]]6sN@y)\nc\'M\"Ī&⟊uLQq, ZZCCP\riRa-XPA\"1\"$(Iľ~ѹc硚νT9^sKӯz7GwS!S\\n9\0+d봙pCroYΊ_O>,ЬN4?_`IdM|׎D d)-=r&kkD Z6rF_\r=.ϓ=z\0 &G\"\06Ѓ\0XԞ>\0qKB\0V D0&!\"D@a\"L B D0&!\"D@nl.ٸo|6u1jn6d.aWdOO{ydaэCYǩED#}۾ږ|\"ݧ^+0WDx{&;:1M\Z@Y}&5F%@a\"L B D0eYk\0&?03_h0ه\0\ZLGGwfHry_50<.1]Z^;;GݸP\Ziɾgj)%v=Jy:w*]]ݣZ~BO|կmscgYDzBOT~Rb10<\\38z L4jt0Th0d,aX[ 0&!\"D@aJL\0pDB]4DC\0Q;B2n)\0D$9[⯄w߽7$[r,M=;/\\]=EcN{ϴ}`LkٰcW7H|O3[T=\"]p#e,^ފs20UAw=z\nQ}ǓĞz&)כa\"*foga\"6WB\"D@a\"L B D0&!\"D@m8I W].6%Lwm|xt7jSKz̨zԥ$/s [{^zsYbpC[nW+j\0yswt}w=C}\Z=\\W+.dNQs=*]nwm^>%w(…9΋+?m߾p@zħPdw~fzjgA|3$.vavlS2F \\nWBρ&!\"D@a\"L B D0swyk9 wOU+c Z\r)e_E7ٗrY†Ԇ\"_(}̅ o7J.̞]zAhwZysbrٵw:}oг\0Y*̛?;>7j( \nY*@\nf#?\"s\0y)kL\nB1lk<\"LI\0S1t@<#L&!\"D@a\"&۷07 Xl%3`y7\r}3XlpIsRf?|gBhN/N<za4c)w]\r=Rox^noI6޶{^z㾲u`:1?.o = aI>=9J97|͟:;E a^%}\" b;(B\0,F@a\"L B D0&!¬ݴև׵ rHp8 1 L&oѮc4s`zI3O=K k|sț2J]G5L sk;F;$0g<77!\"D@a\"L B D0&!\"D@a\"L B D0&y.\0hؗ\nbYK*@P/c)\nK^\n=-݇})KQ0Su/K>ˑUg,l}*ܾrܛ{{Ƥ_wW{BυK_SE9R+LBd0@3!L B D0&!\"D@a\"L B D0erYy\0r)Ssd}Gq*tݘZ@fQV|8ݧ^:wx֋̹hÖI \nc5妹#eQ* 7|r\\Xy,!\"D@a\"L B D0&!\"D@a\"L BIWC`Ad\"ӡ3lhtfv\"qC m2iN@py: jI-4z&f\'ʽ%Cۧs͆\rhJE-sr`ZJv*@IO_Uږ6xnRmΚ]u 4e봙pC^M_R.\0\0(!dA\0\0\0\0IENDB`',0,NULL,'2020-06-28 08:58:42',NULL,NULL,'','兰德纵横','http://www.o2oa.net/',0,NULL,NULL,NULL,'0',NULL,18,0,0,0,'',NULL,NULL),('3a93e28d-558d-4dc7-a3f2-9bf5255a1372','人力资源管理系统','http://hr.maxkey.top','HR','55738fd06aa1dd42d373f3c571adcd39','CAS','\0JFIF\0,,\0\0\0C\0\n \n \n \Z\'!%\".\"%()+,+\Z /3/*2\'*+*\0C\n \n ***************************************************\0\"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0K\0\n\0\0\0!1AQaq\"#26RtBrs$347CSbUcD\0\0\0\0\0\0\0\0\0\0\0\0\0\08\0\n\0\0\0\0\0\01!24Aqr3Qa\"RS#bc\0 \0\0?\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0cnwm1|bm\"$mVO 3Z(G|Jn91!ĹUrW5 [5ϖ\0iw,]\"j\ZzfV L[^ȿ\0O\0,i*ImFF}qi\0EUƊ+03TJƼұ[T7Z)\Zr+@PPbտ$>dZ|vI%H\\tVܧ\\W% 1;S%^,\'\'Z. \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0u4fCw__EZ 64;Qf_M^ϏP&[D!k]⮎\"vjƾZK ە\\s\\\\UsUSUUUU]N\0\0\0\0\0\0\0\0\0\0\0\0\0z=V4sW%NOhw*luߞ[c\\{Hb+},&D~Ƿa(=H\"{msW%ERgaDzĭg,{*\ZS~qMdbʞ\Z54\'m{4S\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0b\Z;\r6CIn:O,PrQZ#OiJzڗUJfz;n^ou\\lKUy8賫1\0\0\0\0;v5]GF߽J(juƿ%\0\0Ai[4*JΏw3\r+OkDJj:x\"Dd28db\Z$}SDDL2C($MT:拹Kk\'\"*s*EVPS?bLAhW`=J*ӶZGݚw.dn*+$}.&jJ)*$OfF䧈\0\0\0\0K& Tkһ^.r@_/IhowD9?I&/OSGA_SleU⛕980xwSsLbys:P\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0O\"Qǫ%dw/G^XھlMw*\nꋕtuזEW\'N΢jQ#ErU[L.LB^E+,A,OY6FfDBX0\0\0\0uqʱM\Z\'laAnQGhW:s\\cvOfj{xv\\Qwxq(\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\09$lQIcQ\\.D=6?rq6N\"#T\r[_}:V4~L ^oizT\0B@\0*ͥYU}\':1oIFi$]빩WVJk vK,dw?W2`ô\ZmXމLNd3 \0\0\0\0\0\0\0\0\0\0\0\0\0\0$l72Vrd3ECX5}uTEbNt\"%sp+k<®\'D!(`\0\0\0 sFꍕ==DT\\w*Ad`+(VPY8~t|ݛb\0%\0\0\0\0\0\0\0\0\0\0\0\0\0\0_\r5eB-TM̉RrVU;/Mtu\\DK)\0f1jTkZUWrI-ީE]\'h<+bg*\"L;~\\N3\0\0\0zvUkU\\l] VshWDԍrm)AmƹͧU)#Nڽ%ܺ-G<0v&N\\ESiHjʪڋsJlN\"uqniAgx,64k\"\"dɁVm,s~}j<:m8\\1h8kxdqn_;ir,oV@zUM98qiʕ%uh Q MI^ץ,Sy5_\'kNmý:kL_6E+&FY覭U?;=|Ǟk ݴ0-w۫$WyZ+нu+ik9 \'\Z&5>\0/VVhc5@\0\0U\\;\0*aYFȧvO;#E]CŠZJk+rr}e=wgKGP͏cHK\0\0>e[U\nuvj;P\0-LUTӻZ9Zj)BtwuYJT GUvbbP\0\0\0\0\0\0\0\0\0\0\0\0^{\Z֦j\ZW-vfevuSXUdUoCw5;>0H\0\\ࢇ=iL˞**H۩MF:ԭ+}?3i=%;\0\0\0f2(kS7*HΥ)t=Y-jgCHF7zqiG>S-2%թg&\")ǝzmfUeeNJش1\Zg\\ecr\0\0\0\0\0\0\0\0]%a#Jbs|-ose=Ǝ:)4Y1sG!GX\\/pm|uwdU}4N*bxj{gbv\ZUͰFƽG5ɛU4T= \0\0\"Ɨ+B@Q\\ܷ9>P\0v{FA7vb\02xzⶫ-VLԓ.{ yCo.-\\ 7G3ݭ\"3zgݟhC0\0$\0\0\0\0\0\0\0\0\0\0\nI5jTThKX\\*\'Pc;UXγ(U\"DW&T̉M3V9h,և5/%_s܍bf.Hy?C-P1ȒrڍMo4#;ex\0=Җ/\\=`J:)U\nVF>stA:{W9Q7ɍ1&+W@,T#jW˻ѤokO9\Z֊GgH.6f֮sO\0 U^z|\nnA2~R|u B-USKu9LJcޣ۶\"^y_֫\0_9\0\0U)qLjd_^i*\rZ\nn71{P! ,;/#m/\ZcOj99*yJw*y @\0\0\0\0\0\0\0\0\0\nk6x?M`޽^O;f0P߂eoET-~(~_ǭ_ 6(\0lNN\0\0ҟ.\r:fr4]?LBxݗ`l={3\\ϓhp \0\0\0[5Zg:XڍXDv_6qU\ry\"գwz`gDrq>ꌺ|L!.t-~jƲiԉ]#7[>`\r=| crP\0\0i-;W\'{MF\n\0\n\0BCNET89jfqT@/f.ljᩓQ9\0\0\0\0\0\0\0\0\0\08রco^^\' m$+ڸ1ka\0\r&Z&P\\aHi$7z;3\\XDsU*Q6&\\g^%ifi&Hg_;y??*C>u|36ʾ\02w~Uz_[N|KҠ,]*b>&5Rΰ>E77$Tn[9\\1.-k\n.DO|rݗ`l={3\\ϓhr\0\0\0\0܌bʈX귬SqgM\",WZ(DfN]DkxG:Lx5UՑ\\o CtkS]QKLgFT6mK\ru|D5^-fv]N-srD6 Y5{/>+]qkL=yvc<\0?j[^XILs-zP[竗ц5z䛊E:Y#\'\\k\0fe<.wjO\"兣z%Y656W\0J\0\0\0\0\0\0\0\0\0\0pSX1W|\nk6xm\\5~\n\0\0\0\0\0\0\0\0\0\0ݗ`l={3\\ϓhrk**lT;-eXqp+cyeᨼ;4B:_WxYjj]9Yff^[{>_96+Ftx5t~\0 r\0\0\'e4&3ڽk0˒RۣՍz.IҼW\rXn AnfJIH.U\0rukj1(vZ]MgCACG F5μOq\ZFU5L;\0\0\\汪5LUv\")11rDVS]yUEԅ9\0\06[fzdǛ_D8͓vW$.\0\0H\0\0\0\0\0\0\0\0\0\0゚z{&SX1W|ĮG{jY \0T7`K-&!ۊ=`9W6U6eoETوX;BĹU33\0#WUܨa_U\0rigU9Wʏ_*O0~%|Bi;Z6ZY+VI9IU\Z..\r:fr4lbà[¦μ \0\\sze39={vq<3܀&.ئ6kSOE]\\ӸUݵH&^jߜLL\0be(7bf.TESj柤\08ޛJ\'M \Z\n=GE,DVM<^cq4Γ8M:kUnNx\Z˵yץOq ў(\\GYT9C>kɗO)4j%w9UnJ\'\0=\0\0 Ƿ[U3ʋ賛| !bdQgԜJZ**W+y\0Hڤ!U˭#&@Ҕ$O;VNis^`y!DkkZr\0\0\0\0\0\0\0\0\0\0\05zzb3؍Uՙmr;j\Z\rV&\0Z(s>cvl,n͹4`U~O@J UKcY#E򞿇I]Kdc*̶D.^[ʾUt}Ul$Dw\\nϫ~nvƷAB@\0v/_jիLݞ3~\0xynu]VݱtNIKD \0\0\0\0\0\0\0\0\0\0\0\0\08রco^^\' m$+ڸ1ka\0\r&Z&P\\eHi27\"*}m=Ԯgɱ@brp\0G_Y/J|4%iO9ݎ:?9\0*3#׻/ݗ{ӎ.gV&&7 6W!\0\0y+UQS, ⺪$fT/-N7.\\Ӱ٥Li_io\r \0SƫUnk_M;7)kol\\PC*rn\05PLױr^<T4Gc~n\Z6Ʀjjf8Q3W/W9juc]P)ïQ]o5;|tՕJ6lGU2dMqr+\Z[Z|r9W=*檫\0{c\0Nerm496R˖7~W|3ؠ98\0ӯo>\\\Zu^iO9ݎ:9\0*3#׻/ݗ{ӎ6gV&&7 6W \0\01F=rd*\Z)(UyZuʹwmN^_itiu5Z/J(-rw&;Kdfz^-5OJ9>\0[>mjW2/9ڻ*9Z*q+U+z5zpo\0 +O\'=Gx\\z#&i쟄 ٣Be֥=#6&X?J.=.6eoRMEEx&^u^*KdJzFGzO^u \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0׆fcFq&p6#\\ՍU1#]/hzɯ4ߧݩ\Z]5]컸~F?G#&\0?\05#U˻SH9)Kw\\ED=хĪ*n1xG7kӍ\0j\0\nNMe|仓?e۹v\\pǗ`^kq.ޜ|խ>}9z33qyR<)s`90O\'e̓2ÍyR<)s`90O\'e̓2f啤\nPD-] d//Gv/ml{1\0 WK9eztge03shJ{˿Ib*q*cbŢ~;i=;0^TVA13]ul靻\Z9Ӽ^o^w,}!L! <~4q??$^ yQ̹ ҏ8$Bjsx\'WC1E@g-n.( f@`IĽ_r% pH.QughH3{ǹnl}ncc2 ٳ^3\rYE|\nӹ⢳h,E g1&~9V~x w>VZ_ yJD!8X8|0f5s8_>ƽ=_s&UMjRդL3>1~ F,+~ 5:\n)f,{&Xuxy*c/GKjR6APSZq|nkobo7%.*],v1 5!Np!Ò\rxG.mpѦ afhd\r31ź%hwjidbx35>orC>@^,\"Ԥ%E;yUCj`\0f8{ /^HJeM\0x/_r,ZBh*3f8$9s\\Sje\0(uPX3kVwƞ )_>IVBAMڣ]/϶0;uHIXg\Zyzj߼6Sw[oC瞌YQRv&< ې+R\'y VErd;l|GXbSU\\Z8 ztDqU M,:),/kvn} Td$BYRhKUuzvνA{||a\"u<63E+\" #qڥs!I|GjR\Z&uYf,pyF88\\3Qg`8 KR?`7IP{V+X X`OyRc8fFFg%\r(h3BNI.( [wǶ! 3oЙ6\'/~\n\ZMx_Ч9.@2Lr\ZAr>q;j4`I,ҳ΄nj+|qt 7¾}-nATW00Si$:4ä\0A\Z5Ht:\\/Ì?MpH GȸvJed N\r0\'uzSrd*t[b[D8\np\r.{ jpB8ᵙD7)fP`Tk\"pNS 7>FhD\\]+TI=/RH#G$ >޾a矺Յa^:{slc(>-z,(Kpq\"B @8P6;_ރYb* \Z{z={\n&W~ng<9AP*:!WcjRMԴ\"kd\\vf*D)G*.+KEړ%òնe=8)2c+! wCBdJ&>x_pv&M TXQ ct(Xp850Xݛ6b1b#>7D\Zۓwxܷ,\nU;r5|ӈ\\fO*g]h>Y>Ps偘⭃\nZg?/\\֗\Z-PF[>~y ,]3\\!*+.fJ{\rml HL:v-?e: 1KX#GaU ɪei[իȲW8Jx}\0t;]6Zgc!>} ~ mw\" \'@RL8$ 8g&=P=TKW`y Sw TN%^:jb{)\r!ZjzNgȩpD\ZKHQw.4>FR\n\n\"pJcxS_OM$TJeYIiOOMR8Ċe=\\ϼOq%#/|n.pBQL@9enbqA%xQ>(B?)\n^=d]1\"w1\"t%_pD\'ň44 ?E|Pϗor^ujL)!tphxk!e\"Ώz\Z-\'i-gѠ;2lC\'IrT 2K/LNu)઒O\\n㒳NF^:@TV pWp??|aZ9\0-bCtlQ8\'2=^A!WНñ1>v/s0ʜ0($Xjb9*Srֆ_|ow8e\"ljf%ӑ]B(|?]V8* -I9](2 #d),e=^#y^mO!2$/\"ue+99z-;G1+T\rX7\nT{/LHAwN!R\0e*iXgSN[s i$XHRBpН!5%Hxɑ!ѲwH]e8/(vB\r1!DHq:PiYB/K};@2*RNVs#x)!eh5)k-7L\".IE \Zf>wC|t&:6px&%$hϱ@0Ry[~w jM=QT&PH]RJHڏNEq s#7}CP ) lu1{FGضvN-l5\0VO6IdM^=\0\0TuL9k01 \n\\m1[0pMӄWCTjqu`5e7n(a>N?k?bt П> Na8_ ݌\"/ȃC#ot\"6#WOsb\'UĤ8 -*y|]H: ^D=\ru$S8Dxb+\\ ߙFIΐdTjD59b۳pQ\rdK#;()-7| VTUU5Ĥ$(4fx@5wr]{v. QE>)s\rVab^Zw o>~-qzB`Ww40|715@h, >Ox&98V|PPQP1sˑI$Yݓd}\r< [*KfXXpL㣉o\\v_KU y\\u=8>Q.Wd-P)T9E̓k| Є 6o9N[?7a #H&\r*5Rɵ.~fHfXCguV@h5\Z5!N@V029w-Hel}b=!Uh5qChU_r\ZK}tN;l\'MJV뽾9PL~\"~\'5+FD -pdD*XQYúS\\qt#tۆ+ YԷp`\'u9f AU_Pd@9,AL;O3WO\n70-&+R-\"FtM:{qۏ~Xz*@Sm\r/w]gLa@rz|VKv>ddEɕu<+V sC\r6pI .Ç J>w>ypDb!\nU9q0%ϢM|UDE,cfբH\rc1C;U>bJtt`#~\n\r4I:\0TzY#\r2 4\\=+7Onc3tZZ$pPE.=}3ݱWFaQ\"cxۙ\'s)kbI``lw]/nV@AH6iMrR9C%CXY0 8i֩[ -[b3xN19V\0){Qj=dul޸mFxWؾg)yDXU`}4>xɦ^ਲ@LE\\r1E2<9zD? ר\"[;p\r*yO0=ΑG,g}͌NI I$Fe 9qx!}\Z> ՑZoe\ZM 6*+OL{RC,KrO9P1![~ UG\rM^IvMgb[U\r4V,ǰ@J\0!wIW=գ 4Pu82P#VaH=_PA82\'=Rrн{ˢ.T1|=Z@E IcB~,=;7N)j]!eĤJ/xKd,G ގAL9ՋZ@Jk\"{.Z8rBf0auo2)\\Z\Z<\nxuJ\"48ճ:(@RpAM^%xŨ~ת|œ\\B̃:*djxڦEN;0gNZ[PsXJy&=w0~_mzN̓2ÍyR<)s`9HIzo\0\0\0\0IENDB`',1,'admin','2014-09-16 13:56:03',NULL,NULL,'','MaxKey','https://github.com/shimingxy/MaxKey',0,NULL,NULL,NULL,'0',NULL,17,0,1,1,'org.maxkey.authz.cas.endpoint.adapter.CasDefaultAdapter',NULL,NULL),('525d261fa3b04d19af0debabbd5a1e2d','SalesForce ','https://login.salesforce.com/','SAAS','e8297041ca3347987bc739a2c9f33e7d4909881759ea590b0c091d4f645202e71e698f87c64032dc548d6ec7dc3c4863','SAML_v2.0','PNG\r\n\Z\n\0\0\0\rIHDR\0\0\0O\0\0\0@\0\0\0[b*S\0\0\0 pHYs\0\0\0\0+\0\0\0tIME &R\0\0\0tEXtAuthor\0H\0\0\0 tEXtDescription\0 !#\0\0\0\ntEXtCopyright\0:\0\0\0tEXtCreation time\05 \0\0\0 tEXtSoftware\0]p:\0\0\0 tEXtDisclaimer\0\0\0\0tEXtWarning\0\0\0\0tEXtSource\0\0\0\0tEXtComment\0̖\0\0\0tEXtTitle\0\'\0\0 \0IDATxg}zvᰊ\")S%[UF^`! `{ A\0 7XdBI%}ȩwnS %%6 νs~> `8n.CY׭C!5-Nx(w˙B8H@-w?{}MiZ+[^\npfC9)n+H-E1%TuES[d\" JbCXK$%4%\"H믱~f!jwqcFA54E܀4/ A 83wCoAͷ˛7p,Jv|lzI6(B\Z5\nE$(g!ϡjڛI0k~c~쳜.>KXYu@<\0n^|?\'8c@K!h!\n/nL:;SLR8^BB\Z\n*[ \\ـ-7wv1e\rXB `EF7H o@  HPh ,xZO8@75q.shYC4y mύi1mfLtM4D]3c,UI֛?\"+\Z<\ZG;0$\rY8h΃Ӭpn=g\n!{iN \\Y0(im)%>3I݀+\Z̵|\Z\"!+B 8\"XqSg1 ꒨jB^å\r|q~Rs`8/{HUV6x/s8r\rEx7Ak;c\rBh \Zη\ZR5䝢w<ʆX(Ph)-v.]hF£% L;#llx[2ISc\ZcQ8U4!vG!G~kw֞2$$A#^)\Zi$ME^7x$*H7!䦶}G $!A$@:80Xe!Y1y׿8O|+y$!6o\Z&bfjmPA{K\n%tH\'Y_?}շHVv\\69\n\r7C-\n (AXMM&XuaQB߁ʽB4M-{dvi1DTk4rDM tޔ}ןyU\ZQ´2t{}3z.NX*\' 5rC}+z\0IPN\'՞/~.>\Z\ZOK=0iqBGaЮDƻ\\x%j65FK\\0huþ%pv\\Bd (f3jאv#F,XƻWH9[W|ˏ􏞤8w,Ǐ=}\nZDC\'<D+?{I6nإp-,a%&XTeAHEPV#\Z_xo(\rEε:,}  $ ag =~M܏a^fK\'?./r8r{|n^pX,jqj@uPF`*6G9eBGPRaYb=ŵmWy]!MIR*Jo$tz+ pr\nv*E\Z(Y:CXs,.P0EQ;҅F\ZK}<\r[HLOŧf{k __9|!B8zh:Fv(PS G8ApW^ߠBAy˸ܧWL8}+,/ JWc(EYd\r> M=$NZj[ThёEقbzWY2H{8cp6Vci 16ho<|`\'.ƨ&&\nJaX9VN2FjM$bW\0FP/WNI4oeO=uha uu$E6p_k}#()Yq=l]PW*3!ӞroH 4LTIABI]koѣ0c|Xp7tHzgy~FiK\r#:APgj+\'ǟ<酷8LM\r4\"Bb`I V5\n\"}\Zmͳ_{ӿ;$߅˝joK^с# AY\Zg,)#%=S_+A&= Fy@U*#\'yG41+) buԦdMu@%&\"AIl\\xӇ)VD“Q\"vim#bCL:\"CaDBU;<=^ ¬o\\+/RlYS]DxQ*\0fBu(i8,۹QHn\re *d}9H!bQcqaz f P[\"$qNfSKzWSQ#=:\rI+v>Zj>E>P䑇Ns,֖7fcߺ+/ Ѕ ؙYȌ4B\0R\nz2پ?B~G)-i ؛y!y\r\'o\'3)b>q$/Ե+%{\" s!z4[~3{\r\"B0S;i<آtR(aAuMs\\& VC\"߲n\";Cǟ _-C\nláCI&1:\'\" يzB T=tDko|]ׄAyDu΁$=^ O| 7# *\Z-h=㇑Q>&h qH_Xd;ϹRl\0%{׽ϱx}GS>Y}8~5iȦ4O\')vk[p ;!\n\Zv{t( R,!ZYg&eA(!zi{}r:΀AM+6׮^ҕ+( 1/vᶓG v(%T0 Qz<G:\0I&fa$\"8s{`{~?\r*KK+wb\rLw8nf??\\} o5ҩѕ7a +\09v6V9a.BtmË+Fo]ѵglB\'Kw%i\0N`G3dP0XXAB,D=31dtis8~eq\Z %FVVyX>qwQ(A8~Ҩtw:ࢌ\"iDCpoAc \nb2FQ Ⱥ:q\'\'-xRH%C7\\ޅK jjGbMQsۃ!W! 2H4 <\"X%NU QIDV \0l.\0GM!:s\'ŧ^korlCSOtӺ@(.VTRQ)I!!uƻ8+H S̆Ze]TQȖZso*P?b+J4 IH/Kq60AQK K\rm*ZQG (C4w020US S䌷wN=|l}Nmn?u>Nj} &-{4}h\Z\"*)6uD*A8h: \ZRc#VcIg5ÑSbM Xy x@ij\Z:p;ɬhRΦPIk<14\r4sSGӐےYU36o)LA\n\0$I258\ZՐ{)#\'I >oѿ}T0r׾o\\$\Z!Ѯ?3CNjIUJX:` k``V)1\\r&/nE*h(D1|wiD\n| ]}ݟu)\\W%B2Љ\"YN\nPɚ#vاS-e>1HɄHǘiר>{{3:)TJ\0A> Rن\0](Pc  _z(bo4ckkֵݛiC\ZT B Tw~@֊i\nO~ڵ6+T `^Fв)pG$MH+y͡>fs)\"wa\Z\\ōhC\\ L R1%BKE i]g)٘.!Dt{9~4OOm[p(V\06YPU][GJH\")MC[Wq:\Z؜&@\nMd5B̼XIZŻ\0G*5)!\0*HT{(\Zʑ%q ꚅ(GҳT)Ԟg69|QXԌ./Dq*u\ZM :]bMNF&;AS`g{4 úF}\':Y\"[ ;XimH97\nlCu&d5O ^~es9T\' -Xh\nJC%\rTcE\rfE lc(gS 4-a7!(\'U\ng⋈\rgBWw_\'\\\\yrEyfgݫ\'DK=AF9*SiWNqij(!\rtx!J˛!˶q@ymȦcXK3RF$6Ӫ`{B@:\"\n0 +\0f`rȇ0pReDnU3&L,\nCmc!\0G; .Q:c1*tmp\ZE4ԛogJ*B%%\"@1mjܬ8Bt{}lN\Z…wC=6 v@VidXHChƻԓQB@m@6hcɧcŚ4Ud^<-ZUJP{8ŝ?Ϥֱ\Z(DKۜe^\ZMvl \nvb )ZL2G\n4@6\"ݤ3AʂZ\" D >i呵EvU>ݷs$=S[%~G{Q}t@HEaLP (El\rkv%Nh:ML!ʄHU@hmsMs @4n}#bH8i]RԶ-hI)fḬ.t.Ëop!¸щf{gtzsٵ]~R_c(Gc\"XW_6GCЖ7\rz:$3CnFoOЌtS3m6Yaϥ요YcR̦Vs_VEp~|_Y\Zf#Ρ4L\na\0aS$tLcO(E3m**U|9wWBSreP8K=_# T\' I_;D>0|i$I25n+ 32.AEF2 -gA <-hmpt ĝ PjBBm,r)7BP5Q\\+,Y\'W\"uR6W>唾ѮѴ7_|L(}@Q<`q8c4*eٳ7/3k*e\np|A =bqi:BQKX)v]8ч W^{l:$b9i.{\0aU1N@aCE1\Z}op{m  %V|nr,66a+\\\n n#OtIk\0\0 hIDATKDor^KNRWt\0IS\n^!ae@sS?gg{C\\SVlŚCo|F$ wL*Es3\"$\" h6BD݀Qb\';Pwٗyd;\"m&%C\\g|c wvڦ+q*FX9|K\'=,\ZtIG1XXDmoE9z4u$Z\\{ǥ4* PLⴽl q+˨PaY>EYA\ZR,w \"$:Ķ87? ^g9pHS\\@\'ggy@y|4!X[%\\[cmHyەzvWV(Yx2x^G]lmq@ !53OHAOƈB\"\'S\ZzYBxqJ8\'{44%\'x _d Sg&%>N:#l0WX?~u$ئ!BiAS9Y\r 鷿RaGChA_{`<}S\\FY1w)~EA-R;B\nE$tP\":/}?o}U9{hñNQz&A!\Z,9`GE[(T7zLiw.+kfռwVP0c8wDiU<@YfC29BH(-z:leA,m@bZԐR_γ/spllr{?!u0wΩ܏<%W_&]_؆В T&ӕ&5Vi7 ]!xmS\Zm\'(/n6!Aaᕦ5;qcgbYAȩqz\\RB^֐6Ͼ#. WYp!zqO}u;vKe=-pU;@k0`ˣրl\\Wyڍ)ÍQmI7S<ňŸ?ÿaeccM>ӥ4a{1O겡\r~əF1]RTFq wARFpS|M\09jR%^!1 Fyn.M?w$h@oiږ#9sgů%NW_aY-;/k(JY]>*ūWtɕ*? g\0$ir邊X c i U۠@I-J\Z:7ιmǻG!Pbn߲ƠQ8,oU\Z3?|=bbBL BOnk$ M|PfGġG?}mg/)O,0-G˰QIOcBBT(Z1\ru\\{[w _W&?*b ֣|b*vܶ&TE4}S2*IYY[G_#p,C`FN9b=*hȅDŽITnx;w›V;\0hoJd>!YO2ƋL8|3ؚIYR\'!G1S.8qyчC zhJ4y_Fx8tTX<9Q]ڜ%-փh!-8͋xy#\0@]0۾Å u\"D\r@==}yM0 dˁ#3yD5ፄy E$%Zg؛k{@8PS7)o㜃?g܍\"DRRlM$4ֵq-IQ0LY9gx] }t|).VTz# 6l.ԽH\n.769}{<ʃvrq7\nntqzS=ys4xC{Ԟdd |a+k ߠʛ9f7_oq/wh=\"`!%0gZ 쫜<, \nkK\r)*nB(d[h^ϣ8Ae[<%<(\\Kn~[Y@ .)0nݦv9hC0)\0\0\0\0IENDB`',1,'superadmin','2013-05-23 13:50:19','admin','2016-11-06 16:37:22','CRM','SalesForce',' http://www.salesforce.com',0,NULL,NULL,NULL,'0',NULL,13,0,1,0,'',NULL,NULL),('5649f603-f2ac-4b0c-8fc3-e80ddce8c443','腾讯云','https://cloud.tencent.com/','SAAS','10364a9b7f02af7583a68cbc288d29b20f616f2154cbdf8c3d4852f4369b9d66','SAML_v2.0','PNG\r\n\Z\n\0\0\0\rIHDR\0\0\0\0\0\0O\0\0\0߅f\0\0\0gAMA\0\0 a\0\0\0sRGB\0\0\0\0PLTE\0\0\0\0\0l\0\0\0 \0m\0n/\0p\0(((\0\0[[[ʏ\0\0\0\0\0\0\0\0\0܅\0_LLLr㮮333\0j \0Qȫ\0W\0Z\0򧧧\0VVVJJJ\0c\0U777\0a\0\0h ň...@@@GGG\0%%%uuuYEu\0חDDDOOOqqq|||\0\\\0Y~~~;;; }fK\0e28yyy^Xx\'hhh*7lll\0bbbRRReߞsQ^^^\0lYYY-WB\0z(ᢢ[1ern ?\0\0\Z\0jB([\0\0IIDATx{PT.gaX3[.*ĕ\nEJ<\n>#JAbMXcFmV̨$G\'I;f:}̴t߹{ewAHs~w~$  EFGs1bh)1&GCh=fǁK>TqȵS/7`c6lh3Xl t(<#ׇlmjZP*56l= nrrҁ!2YJ`=妇@rbQ+?Xm]{h=æ3Օj\'?QtVy1%^}a1\rZ9;_Kuu\ZS* ,T vJMECd1lc\Z3\\hygų:_ƞ^JCi\"oP%=جa\0AxgyTbCq6޲U1Ӫ\r(7tqqZBϒpI%b\n@zxtxz$zW϶F\ZDV $wiDbwc)w~J ɠEIA\n\"\'/SXE\"I\rq~t.QRGYmVoF)dAQdL\"hp&\"Xbuo.݃ΚEb06bcPrq61rÔģ-2,g4_jmi|cu8Jw0P9du|I\nE(q@`\n )m6l#eߍrZ\\Vxp8x~;Φ矿|uqŋv7>FAX\'jŮ-MeeM\r0WЮr?hX\r\Zh=y{gnqjxT{wCHh3o{WᖎKXJ#Ma˞v}fZ}SH2<]|*dVG=@XŽFu,J^%\"&Nz`MMH۵\ZLX\'*п†5 ~.u*$# WF\ri`V6u^Y7l6Wn03\'BB^\'dH,4219wV뫺Y3ft @ a嶗`|*?h5qŦO;L\\]?E>ǵ A[׮ߎ榻~Pf<6C&_\n||MIII(M79$\0,\Zπ.=a\\.8v6e쁵=;4\Z g;ttP455 \'\nڸSh\r%(X\rK$5tJ&9Q@v\r`FӞh!%Y#sX\"\n!!y٘Tp!) 0#0r>*(Vw=i͚p\\GzêdRb 9Aa!k1i2naߗ{)(񴢸ݯi9\ZM7d0֌>|~۩I\0Cf~[QENs_j&`ݫc~.p|ov(NGZd诊rVB~j^n`^>A9\',6 ù/#Vs\r~W^YǚRǡ749| kF:ʚv>\0<l(€Vƃ4z\"h!U߸Z+\"U~U\"A`[d+;:K=o=q1,HO0uoT8\"b2$4\nE$592VƬ`y?,VX5Y.m{> Ef2UgGfH.et\0\"~P4\0x^iYuNvn 2xr}$#hFarxLSQ\0xpwee>8%xkJ+݅y32\\\n 6nmزa&̦q( #Uؑx+XLptzq5}LT,Jq\r4\r&0 s`\\,0Bt9? rq7ט(i9Z*EkW B7khe1$T`ATز1u˜EШԘGYdls1f˖lsν-m #YXrs{Wg)[#3+`~ۯjC_*8\n+>98 RUPˆŊ~9v\\^lgij/75KL\'~8 EV\\?\n4j{f=fWY5ߦӬcڞlх-VXAc5KŋxL7:I2bqBV^`YG@a\nt-䡊,#j\"ZU\'у Ѭl!b5A+xr3[ip@U+ۑma`y){UVje$a}6v>y&ГX D:$FpzhD%;I4Kem!3#q52\r&eYeY* MYl$ҋKY⺺foƃ-e>7h\'#4D >i12D`z]5fMH ( PL~/eƘ\'q!Y:_YycPi!H\nlVѐt:=\"#_9f3rcCE J;دu`fx*oDs>Jș\'Vvf5HI1 IL0a k-^q<*q/lʽSd0=ՑһHX#&S8N&++n:+R;U[S2%&d-7cbT\'Tke!$ǽ8X+\Z&789׃ҮKtmOie;6/wUF\ZRFWYUVgMk\ZG.Y\'\\]lL-y#SK@ӅJH3~AAKˬwaV˩8kZ1Wp__?Tҽ[KPiBFk.S\0DöKLmZbA;MfTO\"Cָ̊?N/Dm`2ڟi/6 VSU4br4(\0\\z =3G-2,y\\K<E%+McTtTO2UmgЙk2(L4SMj1?𳱾j+z-*2]u-*O(۽k3jB5)e0\\;*b6b吸m7n)sI kɺXK eHʜll!jL}RV-K#EEVWdM-=HDRאwa ,wwqWWMevn\0Ƭlx8tiˡ\0sФpS6jvy+)}6mQ\Zy?🇝 X[-3<\"R\0\0\0\0IENDB`',1,NULL,'2020-02-27 14:35:46',NULL,NULL,'腾讯云','腾讯','https://console.cloud.tencent.com/',0,NULL,NULL,NULL,'1','[{\"attr\":\"https://cloud.tencent.com/SAML/Attributes/Role\",\"type\":\"UNSPECIFIED\",\"value\":\"qcs::cam::uin/100013138092:roleName/cloud.tencent_maxkey,qcs::cam::uin/100013138092:saml-provider/maxkey\"},{\"attr\":\"https://cloud.tencent.com/SAML/Attributes/RoleSessionName\",\"type\":\"UNSPECIFIED\",\"value\":\"maxkey\"}]',1,0,1,0,'',NULL,NULL),('78917a82-1c86-4020-b86a-3b1b350357e3','JWT Demo','http://tokenbased.demo.maxkey.top:8080/demo-jwt/','COMMUNICATION','985e805bd49770e7e797209db3cc2767','Token_Based','PNG\r\n\Z\n\0\0\0\rIHDR\0\0\0\0\0\0T\0\0\0d\0\0\0 pHYs\0\0\0\0+\0\0\0tIME\n\rƏS\0\0\0tEXtAuthor\0H\0\0\0 tEXtDescription\0 !#\0\0\0\ntEXtCopyright\0:\0\0\0tEXtCreation time\05 \0\0\0 tEXtSoftware\0]p:\0\0\0 tEXtDisclaimer\0\0\0\0tEXtWarning\0\0\0\0tEXtSource\0\0\0\0tEXtComment\0̖\0\0\0tEXtTitle\0\'\0\0 \0IDATxGv?eV1=#$Y+PHCC;9+B!Aa)dG貭{$`f0Wtwe>YՃ ܝhLUY|{%q4QCU\0 !ppI(\\㒞%p.EIEKB\r3Y㒾T\Z>BRY>ijW\r$J@C.eIfJiH6!X@z\\%]LjQ0\\咞47:%=\'yͺN9<]Et*4]$wʊ73\"//;/<+ \Z-#XCջ+z}I,j$\\ڠ>NR0`Tt\\ǒI!S1K\";~e`6G\'@u| ![مg0Lw yrr:ϝQ_kyc ͬCPMQ-pN1\nu\"-RG4Cv=\Z{k@lr&iDh$*e0n3bv:L\\\r#\nH\ZҜf\ZSۯk(XD\\W[>f\0j+&ҬԆz%/Lu2S\'Hkny\\&ߌhHZs|\'.\'\rn:<ڀZěɪbd#e)\\R1C\\J Dw#aq@$jQ,(\n.&`A %h2\0eYĂt0T&RaT4\Z1&\\MiiBl3O=f\Z*b5F.$ Q:}&frD@\rxb-Da&L/ 0g`!H:?N -HNU &H;M\"^T QCsgkibޯV-\06~\0QE5μKA2\rQ?Bd=uʼnatW! 2g=D*8lޡf$QxT\nx\n9o\"7 H\'ʔ/N8S\Z2O{-4o(]Z5DcJka8 N\\|ތ23д[`&{G*BSkhV_:Q:A\'4&qC38ޥ_D<.&ݹ-Bǘ _O1{{n Ydl{ PV0;M\\$EtDԹ$ (\'c#Pa38=:iĝ l9}#w f/GY7 4H6T\'d9(_E Vf9s\"1p>G7Y:G k&:YY$ck\Z{e9pXe%q\'rU<\\MEEXbr-ƧLvԖW1fv{DՐ=Eon #M@B\0ay-z?>1Q <>ߤ9G?\Z(eVW`V`&WKutHy>}ꉕD&OO8;UPEq+ 4tɔ\n|zlj TkttQZvQȁY$unso-[ɜ2\0LA|ڭ6\'.Ms˛oy!R0\ZT#jཀ8bKWXXq,灊ӓ&G;G0\nz̯\rB Q1a6:y=c\\,&kTV22cDhkqiJP{e䔡Ha`茑KH茡IDid`C1RULYoޠ̃9a5\"fDZh zꙵ.]JX,kok9,}p\0j_zkŹ~(_N5!1RPG=9ٷ\Zɘ@+RxbVcE칩ŋn*Eڔ}sK)gW]+Ëqv7x$06,Mģg׷_YgTED\r1d82\"ЛYf~u\'\\e|‘oR[ea->*Lj\'s:SB3e2\Ze0:֣+(QdX5eu(dž\rF k0c7SoBuZH^N8c`Dd~u\rbQh0N\"gqm 8ߡYQ6 1w!ogʰ-0\r.\nŇ|HCēvH-di1I[p)@K%=V Es4.XNzNs1M\ZoD-]\'kph9b6O蔽{}@,%k(ErnTV|DVBw~͵1R$Ÿsb)\n_cumj3VꟇ\nn=HYiDֽ3,酧fD!+UO<ɫ},$!ﲸ}MpxH<}qI1ϊävݸ\'q 1 65 E!* g\'jCwrUR\0,oQNfl/.Ĕ<qVﳯ@2.QZ(!D/u-f(Us&l*%LjEKG(.\rVR`!GQXܼvѡ$U\"DoӤh\n$c,[,)0_4J[&ϺmOhLVSG谺u\ZSU 6K\\w *!z:3K,_ NuDJ-s;*&*cͱq\Z&p)/<?5Ai&dxz$\'EZڵ#\\`a*>38xG(U:\Z3)Q,H\\*b:9\n g1e=֯ f6ktiy)ΟtK$Rwgz17U%?7|1ڕ/Q1w##5bFOI.}h()BGo\'`Xȩ%\Z4)qDH8ũr: ,oUN\'=s5||:HM9jRPs3t7[Y#AmĦIzd+pR1s&!qSUކ>pu-,󈂊aҍ9;ۈU)Ya~\Z]´YRml|\\1NLʼnX uM)DIg~7\\sc~ $!Hy)Y{q\Z1/Fag|m$rZJ,TNعSFC¸3,>2ž\rZOK ۑ q~>ƖS#<3ћ_KF6>+/ b2\"9\'C(TF)!;7 U,bB{ncfv+ }\"%\"Q2/(Qhԧ\r u- g?~EYշ}3 ߄x8)gi~]|N:[9=X`yhrq\"9ڽmp\ro1&1W܈mvoL,8ٻhB SGgvŕ 湑+Ƙ$}lgSEH S\"K%O?m+#R2 Ck3Tс *}bTXavޣ )#(;smA1ڕ7fQdp\0O\rxxA YJy\Z o-F2>@7O7$cR]Zei**@ x18>h!˛tWbu:3kKٌǏnQqbr3+We2_ׁf͕\rxO]k-M0dtGF 7tt׾J[s#16Gp{7eR3,,_ł1 eat:峟=_Z` EHH=I.\n(Eor^/]12p#l< i\rU̺ء`i:#Fp cNpwUB@}_?R\\DDk󘶬075uPxA]ŴktfV@蘃Ov8ݽD\"7kK>E,7EbP\nqy|}\'TcT9fX]Q\"ۮ:igzʤU}\Z-7t\Z.^&ԏEp(n~Q, &Nr|~c$uВmzKW0r9W3K[.^DŅ3 \0Euwp%R-\0N/z|~ɿ//S\'d=^jZ@9hg9TCvLo:,l[!XSq>uDA閎ӓ{ܽm8f\\+6X^nf@kӾbtoؤ_ḁXD, 0XFnSW b%O51 d~5SE*$\"N!nŵ3%1ʠ,1:E T5t̮@|7rR=8:Dc B 䋥-4vvm54TW=/V>K@pm\"9(2cTQ*őV\0\Z)魽(\0 Ejr\n˫ouR@QF+SZE:\\yba렾S0G5auM3$wPyZx,_g:ml\\=OkY.LsS\r|`8<ҡpor4!7ߠ-bAjP &P.w\ncm\\wxk,x/BC\rgz%jfBzH`XN488<VFߧ,KBHM\'ᄗEmzJ pZf0|xGnm\0\0IDAT1:$\rP\rT*\\QXx7|J]|=|mJ$p_ PQ/#^Rf1?f>IL1j<9?Zb\ZJS9*\Zk=#mCZ{xy5XLy ?\0sJow?|\'YT YQC(꼕I.I[a#B z\ZIԯb}\0k*ا#OP1n9xkw+1(,ݜv38ufm78?I*a4|ÇUD]-}+sB1 }܄cy COQ[Mf2osSQ9iՙ$:D\'zU-u\'`,G=>D8MeѰˣ4\0N?\'?!J#W6[RO?MaZw/-jʏ_DηDIxXZɔxIS۩w=&2d78&s=7oWyv8<:dmm{w|21Ȋv{(2y?av/C )!^5n3EorgumٳwY$N#]<;ws]b1kLOv㴞| \nc z>etZ\ZeXONg_cS|<3>1NNNP6oοBQ]if/Eɓ(H@gcF!PtKJ)Wcp,/.}o\rK_ǩc8%}R/ȇPa8b*ma]s3:=,\nf}VyMwY_]bqKܑSI7v<\"ggWx\nN\';xHKiZ>\'\0\"Т)ocgCuNjƼU]r[ڬd ΁k%~3EkM\0\"zqKCi]SQrP&4\\5jnyr~Q &\nbY.r xI/5\ruҘL#Ŭ h{<\\M+F^,W561#݊TQg\n툚q%b-E__S?7S\0\0\0\0IENDB`',1,'admin','2016-10-13 14:29:10',NULL,NULL,'Test','MaxKey','https://github.com/shimingxy/MaxKey',0,NULL,NULL,NULL,'0',NULL,4,0,1,1,'org.maxkey.authz.token.endpoint.adapter.TokenBasedJWTAdapter',NULL,NULL),('850379a1-7923-4f6b-90be-d363b2dfd2ca','网易163邮箱','http://email.163.com/','E-COMMERCE','57f4c775d02eb00e4f8c62ab79037d8f949a3ac684791843026cf902ec000e2a','Form_Based','PNG\r\n\Z\n\0\0\0\rIHDR\0\0\0}\0\0\0~\0\0\0 \0\0\0 pHYs\0\0\0\0+\0\0\0tIME \Zq*Px\0\0\0tEXtAuthor\0H\0\0\0 tEXtDescription\0 !#\0\0\0\ntEXtCopyright\0:\0\0\0tEXtCreation time\05 \0\0\0 tEXtSoftware\0]p:\0\0\0 tEXtDisclaimer\0\0\0\0tEXtWarning\0\0\0\0tEXtSource\0\0\0\0tEXtComment\0̖\0\0\0tEXtTitle\0\'\0\0 \0IDATxy|ř3#nKuٖ}H 0% #l ,X$+a $$BXpc[>d˲eݚќu:OO?O=UO=S*\"{]8RRjZ> \"8f!f-Z@;:2!40(+?crZx\"Vvi&]OJB6PS4>\"ֶ:<!Z5RFR|ډΟ I\0j]D7hl%x\0 bc(sW(;lS֚\ZG+q\'@d\"%G`Z}w\nSsM71.}l?y9)=}\n]kM+okl3*cVEaʥaef֚gX )ll\Z}M믦ܯzN_DdÕבԒ8nȋ4y/S\'3a&5;}\rxer[ک8pKZkVS e/1u#nBmvOdjkOx[ZkWZkmxݺ.dC\\;D5Zk+?e\0ֶ:k>GD\\[MDo[{A~\0cD Y ɘ59]VDZڈn!yFs @4md4\Zִ]|>oQ&5`d.Z@ glKK((xP} Q@;6N,FG}=jiS~Uxas*KyzνV.\0Qqh&cQp!7,ר}`*RjQlf!,5NKi1S&Q~^v\"Yee#f1ө [Ϧ~KO%#w:A\0 jht8tؗ1\"`; w6 ⤖,Sx\"\ZЋu~W;\\uz>!v6p[9uIPĪ>W_)ބii;+h9>!p9 GWO;uʘz? `_\'x !fQ蔭v}nsmb.~ \\q쬱& 3s_0w/Zw/nڋX_(1}9kCu_<,&֖?%/۟]}U6ҒFh^K\n?45R\n^? 3b 8(CׇgB1s:@;OQ|\nyw0=~r ~;=Ԩ\'VJ\Zj|?3ﻇI6*6oCo!GH0 }L²^~7s!S$ \'RWKއt<2HwionHhO;sGc|}\npwLȆ]3x*Li:hsGLp#\0rVŎ:t;\'U#vK6~,B+WCbv;Ug˷._#i2|̺\Zeyhǜ5eK\'k“uE|$ @ cXe(`LA BΔL6⾽axD_vﶩzˍ7-A;;s.Y% <u?N\'#Ў3N ?Pn̤+Ǔh}/F!{\"6C]<\"ΟXl^1:(8nhZkD7[/@(;fur?x\'wm\nP[ﺆbtz=Kvƈ cXD :7i]L:? xu;:F׾tKE|5\r?MN_:mcg)DΜ0.0L`}x3ɪLzڔ5ӟ^\'H6rF)X@? F{f&Na\"xכs:tk+sLӤ?~J2J8ݼxs3MtfYz&K膐5cq2IDk ~C)t$JSFӾ;oH^bfKFzu\n2T2n5J+k)`0\nD N8RE#+kyݯ>MH(P;Ƽ&mnIɈS\"6$ᑢOh%bNk5:pU{41h\rnW[D-h7M+/@lgLVR\")v\ZpAM\"^ЂrsrɘTa(zhl؈H\ny4*a0X{Et\0pHlj7ƈ[KSt84|ؘ2܉0\r CB|Q6j\rۀLO`%?Z5K\\Eڅ\"gR\n\06\0WN(wTZ%\r=N/:E;/9RGXSZ2,Ig}k[/J.7R]E)w_5 i}ᵽJ鉴r\0`(Z^xxsKψP~јf=`9kߢojvaYӁxK+dY{Ŵ~qߥ`7ھГ-M Z]C3Qo$R+5߿\Z3V)DCۛo;x&9}fG)v$DvjbM\rAw7r\"*RŶ1:t7\\:!`ףgҙc$IBɧD݋/<:`5MDX}+h=ʛvϓ?_F_HoI1]\0 кMzaɍiG=3@Tk{:w?(\Zv+.muD\\]rV5cdD|1}2}k騮N+9\"diSX6h49\Z_z7q턱g(-5]\0ک)`)o\'C09ښ-ljH|la\r4iz%|+eȚT̑wA79-T*F C&n\'fvK^3=ii-lN CSzԓsfX䟨}i\rdF`H¨%Qn\"^L,bqG3eW-v%\rO?2c۞\rY4HhfVM2ZR&D̼n\n:r@f;\Z%HˆjV܁D7)P^V~gP0yNBF~>/3]jͶ_G흿Fz̦h#bLZZJo Q}uL?!1z)/#).EN4|npf_9b\n߲;\Zw܎zR[vAA]H˯u b(֬8`X,w1-I\\OiӅKEK2\nD8\"z\'H_BNf%W[G?!TV8g)r\Z2 fAi;eD\"a=,;?xh>\nE,,_$v߻9gһm&\'F+Gs_dKH{0aZ%K@]XI4vM,dI9x&Crf~\Z嬾Z2\ZU#l&yݜFs \Zɀd,Ŵ㎣%dFE_}{Ww{Q F߬鮅7S6h(? t$\nRJɛV3)5Ix22ףWi~r 33\r0\\zH<7Z\0К Z~/~\\\"8wƽkD2˙ XͅJcan)S]CZyÛ(oq )Z\\CWVR_(/!{<ǖ\"}g1ß⋍05jaY3)ծtl+Hp(Bq;h\"&X0^ݱ?HMF Yx}\nfJ>L?umwO)G{X#=9ͤoIH4*UgOpzn6!7݀$Uc;lDk1< e[}3+kȴθD\' 2Y%{\ZfYYwȭ6)Em=DOc6*nO)*._=}Aṗ\Z;*]{eC&;KGMc\08P^ oNΰ[p7d eY&ෘyI) !B[RXS3Ne_ݫ!INb#4)?ՆӃ!\"5[7 { v ZNq-Ú.ljzPh`UW K#撻hZOȄ-e]qv>\n?|\'))\nQ7ޤW WoC{jwg2䖔ʩd7D{ZJfA]e\'}?=Gޒ5]MoE /Srʉ)ucbDw? ջ&3+s\0,mƚΖ^c.M4Aꊷxj J1a|뮻ȶ A!ZܛcI^QP\'xJS)E>%Mi!V[7#(*Xx;bU..h2%-m|z؁0PM\rsgHp0OuzJzx/b晧3/a|]SblW=w c0VRLɇjJpBa6|;꭮ `*\"-͉}tfvpFD:g\r1& 6zZSO]3Į-)gTqwf ]uфOg]M;6ĶY{4[tmz_t)B1`}wBxZ4q,fPTu\0s:3W\')#= 5~]]j:p>8*~to?#{~v,6i\\Gp1}T(/ ќ,([RHL: -$gR1Fg6·RGoe^BY^  Á|;@2\"AydwC{@&`Y٘&\\Y+.\no\\Oi\n=#Qj5=H9f Wơ7H4G|ww2KmHvs gÁ>lյkɼSn\r}zeW؉wM~t-ӎ:½\n-æAe6ȜR>h];}рҪGo7{[;@.lǡ Y\'\'au7P]\"¢+5 jG%^nсoR!׳Ӆ>]MSNhMRd/=#/ `wQk<\rs^d5(c4@dl;MhZwO\rix<;WI]zIX*/]KtO)wXq5>!哘hw_\0uڼKzLpv|F?ԥ!ZV|®^hpjE?|_2yyC]a/;w{zFœ/X{~xSۀG\rzzrԿK([W8\\GD[nBڰ wPV\"#)ˣ&ɓ(9,.*\Zhl~QjyӀ18D+ij`<;$g $Q0`Ll֏E2?\"LnDS3Mhx]Zjð:(7\"B\\/a \'\',UEA`>*j0RcHأ8`$+vо30Í+h_.r,7\"$\"vTe`z3CDhXCXt)Tr0y]ׇ\'5&-p-B!6U\\q6-\'-N}LF\0ecni>zKm}Ku2&͙\"B石iۮ_ؚv3O 1p\'2 }Ifrl|;q6u#We:Mc0)[\001YoGhG~ܥIӡ8SKuY=T|9OE1gijOuR}mD_c}A\\F=r%}DsF*>^ T~_|h Ȭ[|=PQ@mֳkãTyX]D&󮹂ǰCk7Oo/onwbTEnԈګYu \'lyhzn\"^8PjO>Z\0-M6:Dh]]IeYH\"-tQPx!e\rƉiY->$\0Tˢ@;Qmw9rF\"¦>Ʀ!ޑa%c dzw-_*&Z>/H{uk6ݮ.حtlJޜԒ\n$њj6\ZlRjL k#Zl؈8k/O/ceu\rA)$?MEhs3fBwI|yƶ5M蠪o 6 -4>-[q:\";N05.I$d\ZH׎Y;A˪Ul9\Z}XK QMHVz9P\n\'`-7]9uE:\Z%J`F>?\"vC\"ㄙ8r;h\"%h{W|JŲ(^r2,eZ;#sb-7miJ\Z\'`1$zFߛ贳56)1\"\Z3sG\'u++V*B۶X5u\\qN! p\Z! 4 Z]C޸Sj86\n o&:> 5qn8l:+ЎA1*\rW]\'WƬrmUM.BX3:<;MnU#U>w$eVhk\Zq9EQ 3NV)dOdr+aXHEAu%m\ry$d$~EeH[+4=?6p=QHXwfĎÊd,ݷ>y&!ce\\mWu|ǡk熬b$aQ\\}WΏ%F~4Q0Ǯ_2^\"q) Z#zHITO#BP~)$ ztL\'\\׶4)^&+{t?$4CN_HفKNEף CnJ\"D eDQuGHBoH|Zt(JDXzٮC\r*N# !脶WtŊ.MSw|H>N\nCQN\'>\"E7,QGBӏQw6 cbÒ,\r \ZCc?B[〨Aѭ#|\ZG~H+o#07S 6ƹF5\nMHb 0*FQmZ7.$ ܨp&g8;F\\\"{-}+eׯR^HAˆw2}@Q$!0a` -;Sbh4{97õ_>9.}t[_ :~$8 _2Eà`NtuvoN89r!*Xʑ[r17OjJ7׿2?!Te740x=icb0o7L>~f?3FXa> \rVʧ7Oo}g#n\\NB]Dfg#k,({J}Z(mb-i`˦B\Z9 `EyO0v `-+yt4vۦ `aDN)ԗV,;3C3#!)L’dG8 C ϋ%q՝UtLgXr1P,:- ;KӭU~H0ߵJ| ?..aOjӌ΢/CXkaulT8=TK!%}H8So,KϭI2Tkʲ$rdx{||gMt\"D,uh(# ud`aHױ7ukpI]{\\όp`Tpеٹދ@>\'y26q!0\\PJv&?X/J#sE^cUSPFQ\0jr)4$tâ],VW}d/\Zf[g]&P[Oݩ|f$iu\'_un{hղWRORe֍H\"2}\Z-voۉoKjp1-v&WQcj>8.OpR$v/\Z;{Sv]\Z.As\'*t`DfGWI;V!\n2VFG.دw=|Ɏ\'\na=#9Y>T=3,K혃xTcDZ*DR 3^~kׁ;4cYU*Ie\'}ۓIItV)8o!\Z%X^{-w0 nޑzPlh޻⹮ !U@׮NϓT](씣X\n#rD\n٠gL?:-1iM_Kn9.;GMoJ!8 `L\"wR1\\.w/U]V.J և/,R7ĥxH(>+-mI/=G&Ўn i.ӊ\rcFF [cNzVZ,7O9DyVU[嫥}G}]\'GB.²8)G{YZ{{KaJϧtQS D),,YrQayJ2p`EF- rӾrZo9KD:.DONlud03R1A2ݨ\\.91(%P\r꽵 !ȐbAc~LőU?H ,Oo\"OqklpjښEGXїaT.A =\'y:[^J_X횒w 4oI /W!\Z\Z\' Sf\'a)dzg-5_iۈ4S=)Ľi*XW_A!@4_yQn5Sqt4 A */!t, $<\0pVp 8svȲkVh~\"~&,VԦ#a\ZZ[rP+J=WP[E>f\\r(蕿~GJO@a ̇-qge.ɑoUhfe$ndR8 R7\Zѭ- !aLVbqU1R7>eQy\\;}}i&/iiLLpӀCڮUy_>rfw: |)@2\'K0mOT(esXQ/_ڳc#8}fhdc IWT́skݵs޼3&=;`x$.nHeZMș 5[Sݷ E\Z`Q\Z\0}>~N,W Ct&g,=\0Kh oТ_twUm-~^Ӵ/烮ɰ @2&c|R%&{v\'w_=]??݌8Bw&\0%=[f2FHP(JwG.R&*5,^AzK^^h\\9 \"W7}e^\\^$h?P\ZhX|sOwx\\?77jƯ;{iGooxm\'fI$ak䜎^O#zdUG;\Z`>?~JXl&qQ:z $ _:%aIfYjŸ{?;\'Uf06RTKD_5oq) Qde1KLD:\rBKGv\"ZtVl$lsC{-όzbJ3& U0M[\nИ! zi06=lW=DF;bJ*aJcDŐP&LYJ.8(o;xZib$ 6j^(\n\ZI.)me3.⻛~f~BL/EE&#x\r{s2 @L *܌u6CD~^?}a#>lT&IXѰje@I5!q+3487j|\"tXY0R{;;gk\"x\Z/iE#T\rtHH/#銩K}\'nV,&\\j𫗷-\"mrwW&-%(i581xѪy\0QXKڲ(#J74\\+_uJb<,\"on d_1\n=(KHP\nh+ڇt¦6!0QWWƊfoy|[[+\n_*N6m;C!>5x&JRwr\\$+\rO ij %EWAZ[:v2~p5?S}4\"h)_8Mj |X֤,ls \\A)_={y۲KaKBzGBw6&k]. Z0r@GK @2D22~U_j}} r{cRvvJ 4La ?U1\'a/r}7Xs)jw׾g-faP.:FMБR90a0(ʘ3:C1$4}\0j-t̘̅ݙ|E笨ci5) AZqE9~8/_vٞf\ZkjS G!Mm\'d]8BBF9*GHT])i\'XƮZpe_@e\rbTӼtwhp,7~A萭ɤz)UY W7mś2mxJ@:EaS)9*nh\03O@[?T*g~m7~s=S\'mp@!Ό\Z25<)ejpwK!WlTJI/il[:-0Z`B8ep(\ZUDVuY\'ShKDl1s0+\'gp|LoS*HtI4Rs\ZlY|^\Z %7$[@-b$|@y}$C\Z9[8)C\Z*r*L3K;j; { qf<>6Hi|{tJLnH)28^uvY]-K,NLd&7}Q\ZN5c?\r\r0aUa֜MW{sR\"* ϟ_3Ӯz~o}o+Kk550w=\\ؗ2hJ*Qf6=R(~D:V9YN 㧿կ[$SN+ q AQ\"_@u;Pn,R10{y_03άvFXu<{KcN>a..\0~];N4XMzykYnqgю`C\rGX\\껒[em\0L{MIcN4mLW\\#,|M^SlV?\'Fb)L:D\n2&\0O W&|jW~} -~n;.J@)r\nE%KEGCC,T)dÐЄƴVIt]2wSˋ~slKN]qjrH)U~2(s<\r\Za!\'P\0\"pKX,q5gtnmah bءHXpҶ݉3}ggϭO ?;|:r\\>HeϾ䩅5sJ8^HbNPmv$ԏf\'ÍbC,#肟\0\0 \0IDATu~śU^Y7ǝ2H QtZRn_bEzk<\05퐊r iMnnp%c;>++DE ݑ\n $F9 !.\0 qH\rzW{]r% :o@éhm˒Mefu:H`}}˞S7k#k#5-z?llKΨ~CY`gy`\'ǻ?AdF&?])ěimWLkp F BoZR89\'\\EuƉ;8婫FBVt\" jX&ba骍 kJ|m0PwipA}b~s^lޗ;}v֥S3Zf/վfc$6z\'TZlx* NӴb$pqDŽځ56qg}\'ZNYдfβ->ih\"LjGaoNH$euU\0.\Z_Ŏ\nv.o\Zr> %>]OnlfVf،ZWT$]\r_I5 8#TEv~:BRPU^\\.hYUi\';V\Z]mт\r3j\r&&6-P2{{P{\ZX6ҁ͠XxҹGLSNm%8Ȥ΢qAos1F(\"ȭa.FXB>k YeX%d݈b6F /I^! 2 \nciy:^*Ds ӗֹnL/mf ɽIgd7xRj9Q0+64-_K6uhۮGƃT*f\0]0yvq% \"og{/GUeB%6UМĢ\0ne $Eèfo4ƨ2SpF<$pWu &\nX`LX>c?z;^ydP\'] =!gP [ +kiGGё3׊c__BT$h<½&.ɏjKuLJ47#@=5B0&V UNr ϻTFU,ƱZWCf)v}iIbe&GCޯ#\nxt$4Zb8&Y_QEЙ\'h&ZYZǾG?8DH/\\e=;6¬$:K}Eg%S&|nAFP00򕾁vL\0=k8~$W\"D.f:gׄeA @aNYNϰW\rˢxysrGSv~hAmM~w( 3 FBNDE:o`BÕԁu F \":Io&Gl8;D}iW:h:8e}(%){TݯNuAൄ \"\\\r\\O CWB$ +%ZgKӓnkB2_P_Pj$H6K+7hc\rQI{yVfeܲE7r.]9˰ 8~5= *+6Ez\Zqe<Jr)\"b]{# RC\nW]S]xsmr둝/:[ˆynG?Ԛbg\rp e)QŕO?dCGXNhIL<>biQ^c/i#|`s#=z.w]֗ˎfO9efCKE$\rE, Ev}R* \nD^R (l) E~7f(4$j6NI&2\nF\\VKVryr*@,ݶ\'IBڈكOpc>eB$`]=d<*WpJ%!t9,{6>6cnW0`2N9jR&ÐPlTà\rp>0*rOBp.*աkW:wyxi6E׸%V w(5EaHHEFB>AE*3v`&/a]ҫDrvܵK{ cLXfР=HAˤ)n*XU=(/S c>!`cZ\n\'Hk_kmkٽ?)ܠJB<\rsVy)† /3,3U1DžI?J58+OqX3j(%vr_Wn. Ow?Ca, 2® 8TLKDLrI 1}i[>b@կb8PT1,fҩo;{F/o]Uo^cB)mITE0Ҳ\rqS71J|?cp&Tcړaho\Zїߘ2k m\"\Zcgq(?vZש\'zϟlN(#jBҚ|)Hf(% }^9iYA4+IVТ9x9U:_q_K0[p)/2W.I1OxZ*!^b?eKRf@[@IRxgqؒLəsj_>/\rub[HnV\0 Ml;a2 il#cae-rXpo{u]^Ҥl)\'f,R(\0 1)o fI?l6% :#gN]:;5>0T/B:ꄩ^ZhT\0~$G\0|W\'ێ9:UC[NŁ1 0\\\rvWm|cږ:PiT0\09#шj! xJe2̗a%[ \'f!LrL_v{R/;781 [\nf{x\'\ro\0p_Gh>QB?2. %.3[+9db{vupk5nE 3ueGN|i/uaf4=\'fGkU,\Zic \"nB|YjI:LKŶ$XZ!L1P̜g΁׻\'C3,cOkrc7\'6>mIqZI&-sjˣn15\"&{qHa0OٻW:xn Rr&&\'LEO!2ql芔;ۮA:,Q䩔)O\\9gG#̖gMXCD1z̚[mf9á|折u 0zpA.,z/_|¹+=Q<ˆYB 5g뢒Jos.3\no1 $]\"7Q+%։~΃] +`d/dؤ܎b*).1s `}_ݕ/6,RƇ,Q0ܕ2}ʹL\0*f lf( ى*ʮ.\' S&8BR֤^hܧ)d\rmwx qZ6ov!Ȇ$\'οsWNɺEֻj^\n(k,TA:pQ+S|w۰q&g/(x_\ZkMԃa-nJ)|ľ5SAˊ#h8ל0b@HjRTkF~c\'<e<3{àe Ӛ85lb\\/\Z{ĻZ]¨/@hfYDgo]rҌST?KkXؿ7b~T9}W|UY\0Y\ZcK=h^K\n[S\r= JPOraFe\0pTWMzʔp[\\7*$XMbP8ԯUPc]vwy%30dMV  T4$\010QIPAiZI4Y\'ˠ~զj#D)\04rI\'\\0rY\Z($`R$˙D޽AjbВ[\rŅOх`kC\ZqZO\ZjIU@8 ͱ\\&+f՟}m$4JZ)/߃cM\0!V?n&t\nh֋rb4?K\r/R/ ~($jvϭыmUCLWSf\rA1 Z\0D!ָ H)\r_yQ退/@7LBmgI~A;\0kd&eҲ膵}md۔tD=Ȣ[]J6XU X5+P`sv\n^|rbq\r%a\0hL`S\nZu;t\ZK) j2_Ԋ>뒹јp9hW^pYs>@JAٳȴip#P/4נ?DCc^,2C 躁U$~ӊu\nД%7KLrY(UKeH8JƢSgU7/h}圥KjZg6&j,߶6ܛH3l$\0SB0>oF-u˅5Kܔ(a\0~R;ڀB?i1RZ/iݫZT=\n@eltA{ mu6S{ ؍M\'\rյ ͫ/h]8wFkkzITE Qh4\ZSS|y{h3::L`ٺ.Ϯ^G.ȶ;GXPa\'x9]5Kw1b _NPP1x-MK紛aVHR\r>fbNhNԌSwl脤kՁ+\Zړ>)䰓3ڦ W[51J\0 B!N43ρhOCy\\wI@&9-$vIe:G㧷صɠP*QP)Yx=r4M)@L33DDݦ\063x f3@\0YqyHmqPl\\\")%VJ !ĔS\r7xn9o&5nMVj3[f^89Զ̯knNV`U*rJhE۩~\0Ch{c*2vXup0wO mקb*Q0I[y .\'w(ܧ\"F]윎ψTz $\nΚ%3m.4ڨ -],Љn8ᔆ+Ƕ޹|׵\Zxt4ͬkKב2qn&-Ot 7l´/`(ÒYww(}PX+fҥkX4Ig^3a`ny\r/c͚1zvJWs\n/Ns~i\\2HQ\nh,,rnʯ4,&m\n1Nzj>`WWmzmUטԽXbx sVF,έi^1g5s.nh[5ίJ;zEV.ŝ&z(JŌ\ZK%|\"x$X\"J:-_s\'wS:+lgF2\'U0c,@,v:S9yŲ\rm3㽞;>\"av_1.e#@^ r7;r:w5hvsC^wU/=qmKL>P ځiAq,ͮ3.N3MN~mV~<_P4An~P\\b;+F|EBUFW\Z?0r;w;WfaMTULnNV{\ZdNwD-uvsk_YKsGKc}Y5Mm?\"Dж-\rӟƉ象ɨ-xvGݝ-}k+_U}tSK;~.Gصwl<5k5Q}ۅJD-d j)ȣJ9li2]n=q] !qXD;z/oK U@\'Αy!ԤwJ\n]\0\"-\0Uذ.HjYM_4{͜D}pÊb\\53.T:a&BÑ?g^_Ynv!МgCotnots~vōv`n0Q+\r\\=cu<{_[gYD@eWF!\n0FW a쮝Iڧ.m[^]۸6*ה*e&q`ASjzcsSt`L\r)R1fX)\\w߾=?R%M_%$(g%pWn\rQ}`QlH8U-g vFO{N\\YlzF+f]׬ttd7\r.yNoW\Z/8nZ(_.wvϮ; EĮ)ͬTA%V4N2uז>-a<pOuÚ@*\0D3Tw:\0JBpn ;jkwܴꉯ.ܼqe5U\r݃3l )Z&Tni@1=ơIA??Ƕ^Mʪ2{%oi~ Cd juQ\ZG\nwىcἪo?W>ok\"ks<\'U\n=M;+-9oabfXv&*Ô;8x\\JaLJ_\"0j*p^*F*qD.9յƆs\r_K$N[+J\0\0IDAT*cЏ0H;dCxߎw^_jX򒿔|P(#U8pkC;PB0?nˇ\0f\0,X6\rMƨ\0mP-9ɷN^ Q]f/?+^\\0J%ZXbqo#aT{v\Z)%@ Z+jB^?sv$ExW3S^or7fJ%3~;}/ƪYI${\n [`6rdi2\Zw Y\0\'l)~x3{^LJV+B\n?0\n g ʯnق3Mpbcdƕ$~<#\'qԧByIȌj\'^[쓳;fٵU,,4HXPŽ%$Y1hՍkZԒBPb[4_$?[aw)!ТMԴHf,`_O[Y8e=]R])wD/?D\'3\\\r\0xH3\rsV&جQă\n8p=S\0* ^ H-uA@2%^4&a }LXq}sǿ~xkO-6?AY{J+CXD3g-`x[^0k6+rEx<ݎũd!^02JP@ S7pC}@TJ%SrHy>+ :-Qe$uM\Z n@\'B\ns%N\\?!Y@s\ZꚢGuH!7D,Э!y3kt}vrfP&{ƒTQk 岅U:/1cWW\rjCc/ȏFU8.\ndv;SK\0dk™sk}KS,驉kO>w4!\ZaIR/cQt+uDI D6L״ul|~D6 \'Ld?֜mq1uBcaUy9m_0}._|q_YųjPy `(^-BAN*h2 țSe\rmhn3|v@p\n۵xf.g\ZUO/Wb㷿lN \0DbhE|%bfq0ozyOa,b.lL)L}͏\\o: [gv$ )\ZND+Fjb֠u:6+N\0.J~}sQCCT|F\Zf\ZX@enHphkB#45;f]g\' Uj6=|bihQ!jCfpk \Z9bW\r55-kڞ]3? Q\\eA:펦_~?,z@ҚGF_85BB#(ljeIDAچ3\Z!@YNÿ{BoЋaDUaQ燊n%;Sj\rMxuznn_<7ړI:Y>%-恸U2BQ\rQd&zD4%O廯vkz\r Z4}$kஅA1TsZ,a||;!=I۳la}m-nGn&͎nU&|^Xaz^^9CH|C5؄[F{#$館 [J2XF\0e3Z\"9ᾡ HTp%B՘9k; օh !R(̨j_׼vr0>Wdb R\0gH(q?08!`Oҥ3{=Nbmkip<n}k#OzـhXVrc=-#_oѺ 7x⍃[w]8>X7/XmMc?+E\nï $\rCCgّ+y\"&ԋ\njbhAD @Qjpz^ى5\ZG3;bkjId7i 2B0u?6aQ;bqSN@_P~f?}{KNq[%4YQPAdyF (^[t)(=Duc=\'\\=gk7?`,j=:khlf6:IO33ƒ&ڼ晳{qgu/׾vQGs6Ͱ?yqO PmpggwEL5jĜvS2/s-2KZe[{?eaڎ\rV{_ّs9?]ʰBYA$fbo*&yKc`\Z\Z@S:\"!F~z9Ǘؾ;w|y!ZS,j\rJǘ, IM,0c@]@:B1gIR!\'h 7whwt5Km30,!\nB T21uݮAVCVZW| Ӷ&|N.Kf5xa=d;*>\nNE058z\'l\n9!oV=R%U&3ȫtN>qӬ[DKXvd[(Dtx wKz NZ؆!̘̤f)T]\".1`\rbDWܣJ{g f%PbAݠ8s9ANYpqm?sDJ!ML-ce\"\0da\r&R˖=Aƒ}Aʃ(041/wԬ_Y`]v,dI^$$יB $J 0bjv$0R?<)%6m @r|0RQKRLfEĖ]N?.S\\^;}L>OYH1L`?k[v$x{8v,^J_j &B<pDd*0]O(4݌8:ѣP! 3BK>vw왉D1=~˞ٞvߗkSQP%Q 8 eni\Z1*RC]td.| خ29|LR>|ՉXSgLmR\n ;]Z6D;~k$*ll19rC ;fQy\"H+8\n?ycWO;sw]ا3ʩNdSȩvԢeª~q^O\0L-F@tܢ[*YI젊r0d+qK`7eZ3ӿ~; Qp\0 I\nn4.uw]OYN+D\r#wdXzOf?Bw Q]0{ٟ=uMw\nӍQL QX]\rT”yvÌy_OqxGݧGmOJbOӝ74g!cl Pa /s;-(1V‘s򼗑њZ\rC0p2yZ;*tZ~L~3 wGdk(`iٟ>O6&ᜬuktiVat6̜!qϥ:N4}z}mW عMwIԔ.v齟MTs Ui]wލVyƏiψѢ>2 #BƠ~^dkY2^ L9W\0K#l=VU0|0ddr=9s+$Щ 42*VD\ZB8\0rbaZķozyufK#vedJi&4\Z[xnGuRHM\0\\ͭmܥ?yťz6^ؖl&\0@>/gWʫg%Ȭ0EZWLA@ӫ4E榡u]1JO/I3xĦ-x9jŒRK9^&ٲusW|xfﶳΎtȢWF$=! a1wbw曛LvG⛠b\\´W硟^S5DڸE}o\r` &6%wy+Br5*&$C}?oaHOVq-*TM~8^2LmNz|?S{q5l.\\\ZW3d@3Vw((G^Mw!ORL$7-\\?[ʦ|TqȆ!i(8tZTJP@;H$JXsyG[anoտrƪꅸb!3*Y!MJzn]셙֯XG[<[@c.+HIֲ\Z )HTsИ͔:ZEnm\\?_Zz<{<%KT\"qM Ҙ(OaFMP u5$I*\"j[ 67=ÍlOEF\'BOS12i\'uۼ͏?܂?ν?~$~nS\nT9 W5yOA?=w}&X>goX١D9&\n%ZFR2#3:JcVQFh*QߚF/z3df,OveO_[ Z2e;5QӜOZuqptP\ZbY?Ħߥ~RkQ\0(&=\Zl*9g—76/4NĚ<9H%;Ȅ Ej›\0/I^SYHcW, q8\n%X<4O$(H`xAygVuw>n/#^rBw9}[zTTUW5ʙWς#/cù PIT #XN mD.eejVT+_չp`Aṙ C;\"62\") \'c-`ՌM폽wjGWnde__0D٘NFN1<ʤgډ\'m\\/ng#a^mI4LJbn^)L\n/Q֚k7攫\\.j\Z^ E @yQVUCM\rsKj߉;gFB|o7\r\n%Q,-9&f6\\yxG1Qi\"pFYނdM?XzCgTj T96K6\0GRAAHXA cjwq}Z׌<+-|iB>KVaq\r=*1KMɤk{֥;Ǟ?f) lVZ[t7\\w.\\0f\\jdmA\'J5. )!v<(\Z^ w/z0vqlL?2n҃>3)D#2S$@O$}WϲĊ/~;v0#xVkMosF\Z-(QiL_ c\\\"7?n`Y3U/M9`<`\\/nZUS1;@K$Ez3,\"Y g%_9I!W`Z׾wqoN|ti`( tKڂ\Zaj$Cɜ>~ >OleґT(P 7{ځ3i|(y3>\"\'ZV6k[΁^ʦx5$~\rT#\"{G۾!R P2Y#2YGJL/_L&\ZU&b()\0$yDI2H@ z/oJvS3P ltdT0c,# bh:釹)P+&E4ua+%6F?*?_`Tܧ*TE!i:1WɤpYb|GF*4a# !>7$U= fp*4SBa9#Yx( _Z%kSEC%&33d3ƩdӐQ2%b]4_?g$SLVH~OwpC+yEdf&*I/^<I)Еe*hpМ5 ;C̔\\Ⱥa8޴\ZONRXG7>eRB\0.eevX*W#0!J1Q\"K\\J\n.k.#f ̻\'n4~zG@=en_!q1䚼^jLjŐد`@/`1FJRS1TCA&ۅ°LUٰxӳW׍^lAF¸Y«M\"JF^LB 7:YXP%JzɎs‚u-MM\'f<^\Zv?g\'se!E)ޠ}7\"\'!V6w͍\rǠybAN.\ZԓOzf?=3{{e|xW=C\"GCcQtƯGHQ\noz(&*Ͳk E뷜ڵkP_c$[4E&8W7\\P\\w/\n؅ȝ9ofÚMO[ܾOfY9\'tE@)0$4j]\ZɄcTϯo[kޡstb#;<(Ro&U0疄S$MǔO&WfScُtnj ~ܦG\Z_tw7П2T %\\[:M ʃ7e}ڔ6FWA cbV}Hx/3\\0[ưV\n3Y6m8$-X#\"!(b\"xWS?Uϧw]`{@\\VV p2B\rU(~NeX}t`eXhU\"&PouӥGL_NCݙ`B\0ݢp\0\0\0\0IENDB`',1,NULL,'2020-07-03 15:00:18',NULL,NULL,'','泛微','https://www.weaver.com.cn/',0,NULL,NULL,NULL,'0',NULL,19,0,1,0,NULL,NULL,NULL),('9e36af33-11b8-4208-a902-6bf7a635ecce','阿里云','https://www.aliyun.com','SAAS','452c3a975fa92bbd1cd47a08ab167fe9a3cdca4c6c6a1c24f6be4882c558fecb','SAML_v2.0','PNG\r\n\Z\n\0\0\0\rIHDR\0\0\0\0\0\06\0\0\0F1\0\0IDATxoHU/C|!JQ m-(X^D!wOޖ2ɍtlKʵ!n9qJf\ruMO%p9Ϲ<9^ {y>>ϹAXt HB HB HB HB HBL!@zwιx\r8:_|: o,~tE_YÏ\0\\u7Gm&0֣.# *v*^T^2g!ƁtvQ]fmRK͹w׺\0G9_a. =ۨdj!@rL\"S\rOo(XZi⃇؍<( ;V\'/ 8-c0M^?\'_#iB!t兩l p\rLŲLWUavl(o#S53͹EK$1D-GOoB~2Z\0N}sȄ8[Ət\0V!\ruX1wr$YuǨk#A^lPrB( !T^}9\r6T+(4%ֽr$p\'fϴZ{:BdyĔ\\$B=1,e \nRm/Nv1)D,V&Q-!\0upZڳ&/n3ϧxCt/W!Lݔe^?;xYb\na?Ta>a41.79\0;l&zqrl_=U¿6 g*g!CG[19 ?Ym`q-r![B2:K~;XyoOUBV;WpfjD?P?V}9[E`J;\Z8wY.[#e,-Ȟ:|]f̂Z\"^þ}9p}]`1\\1RJm׳IΏTuS⻜o/ϥgwU?g~Nnu, ż}j!LT%-R.h_~{i{*gYFą-Slm|Ų[k@e[>;%1=$:j!\06 ̳ƇGu~ٮR?z^nN[\"xzrB\0w>kh<.ԛ&Bz{:KwWn6&}8BOk:J`sӛ^_eٍQ~5ck\03! ! ! ! ! ! ! !ML I\0\0\0\0IENDB`',1,NULL,'2020-02-28 01:42:20',NULL,NULL,'阿里云','阿里','https://www.aliyun.com',0,NULL,NULL,NULL,'1','[{\"attr\":\"https://www.aliyun.com/SAML-Role/Attributes/RoleSessionName\",\"type\":\"UNSPECIFIED\",\"value\":\"2037230828547234327\"},{\"attr\":\"https://www.aliyun.com/SAML-Role/Attributes/Role\",\"type\":\"UNSPECIFIED\",\"value\":\"acs:ram::1729982683323703:role/maxkey,acs:ram::1729982683323703:saml-provider/maxkey\"},{\"attr\":\"https://www.aliyun.com/SAML-Role/Attributes/SessionDuration\",\"type\":\"UNSPECIFIED\",\"value\":\"1800\"}]',2,0,1,0,'',NULL,NULL),('a40388d23cea4c5ba93bed865b81d255','Basic_Demo','http://www.baidu.com','E-COMMERCE','a3ac51c6653ec2eb0afa9ebd0ccb966f539d16e64c7450775399330aa19a8dc81e698f87c64032dc548d6ec7dc3c4863','Basic','PNG\r\n\Z\n\0\0\0\rIHDR\0\0\0G\0\0\0G\0\0\0UZ\0\0\0 pHYs\0\0\0\0+\0\0\0tIME 0-څ5>\0\0\0tEXtAuthor\0H\0\0\0 tEXtDescription\0 !#\0\0\0\ntEXtCopyright\0:\0\0\0tEXtCreation time\05 \0\0\0 tEXtSoftware\0]p:\0\0\0 tEXtDisclaimer\0\0\0\0tEXtWarning\0\0\0\0tEXtSource\0\0\0\0tEXtComment\0̖\0\0\0tEXtTitle\0\'\0\0IDATxkeUuk}{^0`!L͌ (F X$C$V>h%|$)-cP1)+GAA 0{u9{w[U5{_[n\n`{OAD11ys!QǪڻz\0UEU{Ͻn\"!5Uk-FFΥ n`ӦMl޼V3bE;عs\'E7 )ضmWZ%k-\"–-[8餓ؾ};###,ٸq#֭#p TUQٳg0>>N\'g\"0`a||=ZKPB#?yN%pGČ\nH1̯~g.z dVL7TgQ4D 8CcFR!H*B\ntA2T  ` p{ E$DsQ \06Y\"`%055n!ϤBO0c KB!E\"1& Xz/NQAL>y\nr 2ZX[daTDpH-ep ZJDA2%.ו5;b\r IʟlhzO,,A\nIDR(p6\Z bbȴ`0L|@TGο$X`$HƱȩg<>gAL02;~=Y^P\nKW`oՔ(@, hi83jai7w)\\1Z ΋9\"/K׾s/Q4ė%hZ\"\nY,p,+NA$DKNiꕼ-ڭ?hc 8Y-,)P\Z[T\'Y][O]W2d:HN\rXУٽPh7-=kfMCiȠF #M>|gG:-&Q6v2(sV9\Z2?ŨNWUQrx̸힟oɝ<ʁP\n\nbX*r\Zs.|) %e\\m]{ܷ\0G(ю, ״J!ϟ_da{;>\Z Ji8pi ~av7غqwޅX+6mJ lB3f` IF,->u\'y2Ƈ>mxC4 8sM~XoYWL\"cs<-pBr-pqo\r%<6u:oq_;[|G EH\0-ҿXj9ۛ[{o\np}k_ f0xtDXR,jC\'HTMXf9JzWMj4ipWM\rI})rӄQb*(My\r) xi5mn|ຯpDcb/9p pCN4V|a^tNjYs<\'aB,}|.|>1AԒgK)U\"tSM\nDK)YIx8`s2_\"66p=!̩CkLe4\"ZRGi1RMbĆ.k k[RcJKƀUd!gkԗ;0o{6Y,(y_0\0ы\"L)|ꋷW!fH`kFvi.ٺ_x#a,NcU)NR;5\\0\r81/JȎ:űң!ԟ\\`3~w\0\"WQT$\"ii6oL9O3D%԰kY3̷};U0ʖؼfa >,Ri:|,\"\"| HUJB0R 2-h[/E8ey/]ǺH4H\0tt*i2x?\n\Z\"Un{3e&e9;p?KJ=B_>PЈ3\\rYUϧ=m:\\riT=G 1ڥ.34]*^L=\0$8W0,6 h\na}|01e]Pejz\Z&jb4ell\0xigo??dج q5!n3ha1dY\"QSؔ\Z{O(;3EqbP\"l+b iPwy,] _!FZlkpӵ-bm? e~_}|e-AB,L z:6}ngWJ&WĔV%I3{lO}N9ÓLE7\'Z{$2#M$!eM=f!x\'r^i R:mr׾)_ɜ cc$a(kF\r.,~Ges7N3jE2SL#(]SV)^*KĻ4)a-i&l?=4Y?0ѺTq\ZxΩϢS!s)e*Y-qZb2A$I-m \\H1i\r~2y~ fgo_LPrӤTTiTb9;|\0,CY,=@ꔊOV\0ZSFu m:8D__wa`/(Qi\ZI^[8NgyT=94XԳ9axќvWUQuHcp͌;7doBJ]t/ɭf K9i^qJb5C7,U1 oPt!qw\nSٲ.:L `EVz(1ۧdQQZq7{YAN \Z\r$xjq jdee]D\"Q2 \"?_e1Ҵ\\|^GN!QIo-GBF,YPs\r i \r1Uvzz4S:/K\Zivh goZõo\'аxJeB\"T\rtD5 \nBu?;lՙL;-i 0%\\-Y% !5yGdMҾOBЄShP QV9;`:9F{FXٴRCcL^D>XK|˂>\" r\Zf+b)h/벎~e!{=b3LVr8̢\\ ATGi{eys\'b:|@f}8 ~?*@+yLe!\"Du}^ذ̴ͩТ}BD޸GXO(\n,itX ȬH\07l.;b@Ca@,!9r)K(aJY^i^=ڦեÓS\"UMEN|:7N(ǟ5+s9x\"XlpRq4Mv؁1&u<՝\\61?0vݻٷoSSF:cػw/w90~;7nd||gWK]pcܿY}?yL\0|\\ZD6F* 89SJ\rI:D^J o15ֳr@M]P.xC\0o ,IC^AN$}$(J4\\S f*j{BARj <80* <122\Z)hw\\+q-j2Iz\r T(P\Z$#:;Do*gDO-[Ev4)Ρ\n!\\ \"JpQ\"Hy$Dpxؾ/I$!!. |v՘ii`*wVp@}ȇS\n0X{p `\rT*`DJ8zYәg\"VѾbp 2 +~tf⤔=m )U\n~sy:){9*@\0[@PJ\0fzjFZhl_|B^n*\'2C\n묿}K~*O.7T~ɉ rq4MϜ~Rf؎Vcve*bbDeJ´,ARJlF~m8\nhlmP,bdYrq2;;dH\'M3iDQm;@`x\r>{2p룛,.^6ϟ\\e44M4 wÓo7xJLWڔR(ljgQ,dѤDa\'\'*/ɠi4q&5zHFFˀ\n_=\\erbZR79ibfVDrVpP)%v~7Hzw9\0tKO̡T.Sxwi0X_ƄlޣoD_wrpl[pm2!;`p6Vŋ)~ҡ0mGbmjacLt;:Nr\\~YY޵oNz\"U%7܋öxFl6T{).mYK>#\n#]oU)RrT,r/vWN199۷VT*U\Z&a_JQ !mN`dd$LRBa\0njw|n. {Eb\'ϻ#{.eu;vrLLB/q^h$\"|`#!etޝ\\qr[Gl1K3B~ tgiQ\'mOYPB*7`r>ݽP1H$h7 㫹^yߴ*?W@Au݌HzRJ\ZfP&z HZKw*};;;{GV^)<< 1…s灣^WmO0BRJvҫAa5|v$.onK0{?77T~=j!=XiYZ4qO8;P g^]:q _R3jzVO-həw60ꅽ/_]b:Dz,wq$}4MG1@\"} u̎d{v*溞aoȗ{a~4,\rLpEVn,coQgkkw\r_SOW?0jaqa\rW<ww߰/RFv}Z{t0u]G~Ԓl/buF\0Q,\rz=60H[u\'cf]Ic!7|sͦ7^>P+TxP0kc>ʕKїN6ct ~_(KUPQ坾scx*d fY>䧦xǗX~Wd,X+afz ϑO0iqp\'zj7D|/UB޽}2z&2Atp)Z6{\"; c䧦秘EV*s$@57e ;]:_O\Z3 w˼zۍwm4MCpNJأinݾ(ӭpB %h\raRɉ <2:ᄃh\09?Ly`gPHMQEߡd \0\'I}3&GA{ܼᄃT*1:Rj׹ >ȨUU2\Zy/.}M?>g(\nZQ FY^5**;_jmpErle4d?%𿭛xF:Qh]{sfJBOi;X(Ӯ\"d?9@\\sO?-pI\Zi{igN-Z&VQfyݿm3AB`u8D RS0TҒm[`Gr\Zs` Di(\nǙI&)肏Ci=U8柀 iPvYI\0\0\0\0IENDB`',0,NULL,'2015-01-08 15:17:35',NULL,NULL,'','MaxKey','https://github.com/shimingxy/MaxKey',0,NULL,NULL,NULL,'0',NULL,11,0,0,0,'',NULL,NULL),('b32834accb544ea7a9a09dcae4a36403','OAuth v2.0_Demo','http://oauth.demo.maxkey.top:8080/demo-oauth/','HR','4e1d7eb7b14ad658e8d9066c95902c852ff6494512a742a8392d1d16adc5af551e698f87c64032dc548d6ec7dc3c4863','OAuth_v2.0','PNG\r\n\Z\n\0\0\0\rIHDR\0\0\0|\0\0\0{\0\0\0\0\04IDATxUȀX m삽`\n;(`(5=Ϝ3p{=OO|>?X~]?xw}Vww}ᮻpn}[o{o2oW;#6{ӛ޴k_/ˏ~ы^t%~WtA]-X{=яwxw߿+}٧]xnw\\/mo{-oyˣov-o{r|[w퓟vЇ>t{<\no}[׽u^\09YzVt%\0<>;?Ca{CKûmݶխnm6]>ozӛMnr[lq\roxC6x6̷N9唝/xg>󙕟ݻo{;ꨣ| \'}[~w/?[lY׿?]|݊+|{? kvurfuoli׽u]y0._O~ON?Sĉ\'}s\n38!׿ߡ?]}ʕCZjUw%t^zi[zuo7M/}{ի^5ڪ+\\:]izwk_{Fmtʆnx@=6y+ж ;s/~7Ժ+лg-Yd?-. \Z!7_t{Cm\nlÊ̷ߎ-@jm?L\ZT1k:ӟ-oyKwG % @k5*<E0oto]YbeGwt袋.򗿌pC߮}+_J\0\Z/]t~7!\0]\\tdWw7я~theL7-.3N |~gQ(^W<[xq}k_q{to@^8^~Z.\raTs=iвC6ځ]O>oFgy&-Rfri`wQK^SO,Ϩ\0\'D|m 80\'kP?p)0`|軫X-ZH?\nE^-~߿YEه90>A@5\09aIOzR< Lt$h>YG OUoݍnt# t7;_Ztt!}GKC>hH-w1\ZO}jW%Ty6\0LzUΗLJUنWkhx :GoCu[W!34A [h_\\U;4`bIUɀ-RO4t3@i_j/\0G;xjgEIFU̡↘sb-鷪^\0O4ЇvU<\01344@n4tUe0RjWbb\rКTFv~wh\Z=4<\02\0]㯙o&]V!m|$xǔt5՛R|jسNri;m\'\"h\0Ayy6\ZG=?TF 4{&-`&m?tk\\*viykf* :\0\r|~5̺L\0p4=?qx[CtIʲC_v@>G}#vΜm\'nou-g_Z4k\rU.)^\ZIaTq{\\Wv=K\nlcvrĤETͥq}ih>\']Piuxт>w].G/}i\Zje~sXsaȚxUΔpZZ(Kʨ`~f]nZ)ճN!܋x@\08Vvw\"# _\\h\\G c&R/U2 lLp\0pN saJ;\rt\Z-f_WmR8\Zͧ>|-b\" !J1|x&?(^Wg1Ik?\Zk\0G∡i2>軬w`;(tY݈v\"l>Tz$p:A`Plʮ9g\r KpTb}Ѓdh=N?Ǭ n[U\0>\"8\"\\}<@?{1y\rRhaiN;Ĕ2<Js ̤l&r-n-\\i`= I~s#[Ӓh^ 8n@&>>KRR2\Zv99s}y@˭@o;\n#WBE^U0=}\r\' Ftaϖ0:&;&?pU<7ل\\wے r\reܾùT7,)tjp]y=lS|q#c|w+[*2:f S;\0\\޶r|fv;6DJ>cDY`V4 g}A}t}s݋n}QTP\0{ hll\"4LLD\0`Nuhb⡊OBOa[&\\ xQ$7嗢_M=j]>{h9O&} #vWhQRk\'n ЌhF?Och{4ԏb292vVsDH$p4ʧ>8hL(u ʡ@vYz@0%LVkG-[ϸ\0`\Z8B96IhI>C5[`ߦ|QoQ@V#5\0CeKt/\0&\\˩\r`pS4&sPSν:\rhg܉1RgKƁY=O} (67;, D+-!ۣ|9ɯ`\'0XpX`p\0l \n\06\Z+R!X\'M[ee\ZGpst˘۬9]UͫKNѪ1`um8vv3:zG)s\nrN OL+w]\r\0A3$@y>ߜ-tx}xQ˗!\0L뵮\nL:@GnsX OQr4iݾcdI6D*Mgy^t;#-]@ h_Sy\\oPo<:Uj!-:\rGvYfg>Ms~`0kⅼv5}:ag\"+nF&1 IKf}V{\0ED57\nz\nVpUv(f=ԏ:6ULA{[\r2_lx@E,v@F`cD-Q4nv a\\U;Mx՞1DHC@oͺ)Q@ K-jID]K\\p%517Z ȴ]ɯOkI pfޥxS&FU:oR`#=\\*FnD+a i?$JK0$:_^ͤ˩f%Lv R/}sQ糝#Sp׷}I\'&PUUnÊqΟs pXg^4\riLzJIϡπ\nTQ_-4 g&9>[r-)k^8g[w;^ժ]z[\'V,uVC̹y!)~6y6l I~vLqIR\rk2!afu _$ȼ\0SYJئe6`zءq9tEd\n345t!1#`\0\"6A! \'Jn})4͒& y❚ZC\" \'5)zL\"gVg\Z A\n@nfWt.w`30\"kc0`mJqIs.@r|z1R3T;Mr{fϮ[,#F0B4{F33Z>W3k@e%лxբpLILǴp\Zؒ@a*x}:uXA p`$03=gD UXq}\Zݎt}<]t{_2.+WϘk5[g>ZZ2 {$g0PGQ|ʼv\n/ah{IR09\\\'+6&WfL1&ov.\' \\O,}*[΋|ǽd.S7ۧi鮥:P\Z جf!,R`uJɑ0wk1;ab^9D\0Ċ2绥s\0<`ƒ113ˡ_bMڛ6zh4U2N vM\nsMal>P|\\CrhW(FaYHHP4K@;c x?]Rq@ b 3nl}]o*0GK]GZ|>%IۛrE3 %JZ_Qr,:w?;۔D:ff6\0]{\0cH-ŷ3]i(S?rQgrT]Ш >D]4Ӷ2O.}᳁jI\0uM\n&qAܨ\0[уW/V;ܻHk\r2ԂguJSQ\0O\0\08s0ev5i?x߁2]0\Z\\E cg*9~g>] x\'#\'Ч\0?rLsASHK;߱+Dh9\rh`=h:\Z\'\Z ]q,pE]S\0(6x\rPD;\0\Z_*Z\0f|Kl*s]BIQǏbd\ZG0IG|:iԉPqEoxaX1l10ʚ9ΨV+{\n\\{2ν4\r+ |#c\0w\naDނI{ F&`ﶅ15鐆9/#S(>;1s[LϔV~<\" ٧`Gv`Xgpq@\'F^JjD~43 Ínŷ`F@Bf_LHW\"jyFk\"PAh:/6侢湂},ߧ3/,\r!`MUTׅll9圉# \rx\' xͶX\rA1.6yPR(BE-Oqh\Z^@-1 Ӏ6!`JǏ̏=t3[ĘV(bd\r49,\n0us $xOksE\0¸g/1˥\"}L9ä\Z%r5Yq򨀍 n5=r<63__ X n`[1]!(##p1d:W3N;|hRu \0~3\0_*OK)`QBΤp.Yx6-5 (;Ϭ9*LZsXe1#LsS1c1O0\ZI$~ejZsLPJc\\^F \Z rΧҵRPx&Y!=w%?:/\ZzMB򷑴.<lRؚ`HDa\'aaN9o\nE*Psh%z~wAf6\Z}t@ :yKZk&}X\Z>VC iͼ`vʍt\ZPa>6}`^^v?Kiy5\"PۘE\Ze[,s*`e2@pn +ͻߣWk\r|/-/b {EJיt6<ܛj xGkoo#y4\'8@/j-E/HCgˣi{1JJǤ13Zlw}`W͡ ČMfᣌ\0{͉i>Z/2h>㏴i8 g#4\0=ZVogئfz%ծTț~#m&Ĭ XM1uIߒcv-40hR L6؞IɧLmvI\\C\"4A\'H\\NڟL9y}xx_7)X=\"#h`j FlhcR0h<?EkbO+,S 8toKT\nZR=zV} ~[ .m뗾A |r)-F}\\܋Kbn2]xMmͱaIEL8MBݱD 0 [=@f)*\0s\ZڜC3ԺL\"\'`~vE)N% m_җ>oo5y2~P+6^\'fj5Gh) -g21bRQ:oO_2ã|̸{a\"q#O1\n>)M3$٧LDή!ȋ MDrSp۳\'0\ZlG\'%{a%d(tY݄@guGc>~KqL0̿׆tF)OLj{q$f\'NsifQ7B#` &6\"4Lo\"l:>}56aro*\ZoxD\"CSmל_t2ϬG@Kafrr9uRg14\ZC`c\"a\Z;j*MJ1Mn lob4,j홁KH]\'`c>o/2Mj\Zl5_^VD3<&8a-6oB\no!}y<\r#&Ra4L>^C*d^w\ZC\0sՀ6E0h@%Xl ǦHTDf #V\0p7@ H1%p,\\*~M\n6*_~:+R0\\j.;ɍip\Zb_4]d>1[)@4@]NJ~4P{BLnAe*m4Ћ_K2?e=-\n \"d&`cR@ODKSW]<;L׀O|L&4T\ri%%;ը* =POAyi/kL 0 1u,\0ՇgD_PB(;v| $@R蒹d&1-\n~S^ؠ$TALtOi1.at8):lE뫆JU\07Ё ~j 17_-B8~i[t@E.9;ȑIo&$+- \0_5 %kRj@q`Ǘ#?{\0NKغvlZ>V3u})\r ($xk5}K\')4cBB\0]:c!`cYg}y)\0lv\0vk0.Rjelm*[ZmNoSN~X^O<BM,oXF1J0?qA>tj\07ʨL}E)<0?_撆!V2C@U)6\"x$;\r!AU:zS CKc_cpL32Eh,\Z\"L!L-mfe!)ߍ\"gwda`H`ŸWlJ2R:o*\\V ۙheNJ\nQ%S5(jb[@\'cfv;Tc26 2}9t(,Y gek؎yyYR9k?fҏVs+Uf`N\Z7‡IW\0Ƅh@\Z\"-E\09\0dm ,V H\Z-/fڐAr}򼬃9ÄsjmeEfV٣Nc\'B:@k3syO(\0`48J(0hF+ 0Jߪ.1}I! gx\rϢy\"4ᑊ̍{-/ys;Z\r3>1y}fv0>4g;(b#0A\\\0;\Z~#hg@}\0\Z˫DcD,\\6Voܸ3[$Z>>21M|z&`ah :+weʁKXV;]3\0v{\r\"0u<#`\\=h4a 8,ߝ3jds*ާ(`ֈ#IaF5@Qi3F[BϜ4TF\\CLe=[0c]w6 ï Xlʽ^R)=WtnjF)QL \0\"\01J\\Lt4T0([ X֤l\Zbdks-ke8:<йPRBϥ\0%1XlZ}@ 0 סypy/dDC2y0Dhx\0(0- gni2,_e\0[ʘuaw~]}ϬLIΟ}%ʼ?\n3\0ue~\'Ӏ5:\n4, yȖKJCFM(\0G}WH\0\"\"pfm[RRgR#@۵wZ웍(,X>X׭qЍjcΫ,RerMTvc߾#> PJg%C&9\03:5B}_g\rv#4>DꙂLPtH6@ZJ?(-Js ЏRAewCy\04 Ҷ9*;..Y,h\"h=0T!|n_{L{qA rd;lLp楾\"iܐr,7g^1W\ZI\nGƔeDM-\ZvoQ.&>Mqys2ˤvZmQc@\nw>:ogE܈;;@>`Zj=5>+asA*|*I]\nv6-˧#-6RKL3XB`ٶ|r˸|&tRdG-Tj\Z K\n8G~w_aIs7HdH\0K -kZE3,2Gm9X_ZEە_§yXVR\n08&4Nǚ$BhɃ;+7QC^l2`ݕ9* vXePBH=M~Yd> bvs(x&nkIvUK4LĚ94/U4\"1 ZS,X>R^D lo\0WH#R+,@8^-0i\'p\"ë-9#xe-%thj@NCuNf$Oтw6gifiPRPK7/y0\0m7Iо%sU.R>^Z{ &۵wP :b1;&!@\0M\Z8ƂNdE~4`!\Zϻg1`D8\"cԟ`<<RKTX/)eupi\n3g f4\n\Z@޶AQNj)̞h&O 9ܴ4oo߁.\n\\fbJXk]Z+0*O\rt#fz\'\0LFvT\0i~۞,p64bp+;sNn5@W{3{#Ld0io,\Z_\"ecq|&r?֣OYԺ7&tbYp t=\'cǔg_[1*,ET00 0&LdGTh#Gy\r<(Q|DǍ=m}\nG[\' //:h?= e< liLKy=h lwۙuaL ɳ~9>dY!gƬϙH&\Z-.k/~)9rr`,m۷#/62jSrhuf14`:F3siio6\Z4&~tsCExA]1HSH\0m*\0SC\0Kp֞G! \\/9j2G2˚EG&Y\"ZM\r>9O/3ˎ\'(-m||r͹l Z-0}\n._\\f#fum,+(1b\0rj4Ṙn4*\Zاۧlg&2f >5~q=Ñփ4P~䵸@.3 5\0D֤|Ѻhgk?[qPQ7E^6#ZZ~Am޵ƾM~0`\"o&N\'Kt[?\Z[?oش\nπ2V.;+з̷DoQ~}Ar9%vG35,,70fQ# cߙ_)pH=1*OFo1o;ğVھҸw&Ԙp1]-\',4O@\'g= ^&e:(Jj>Ul1/B_Y7U)tQ`]!ś\rXR~B:\'\Z&=\\pfX3\rd\\IU5N-]N`ȷ`3!BF.ϫB %D;l8og6+`(xwMs:`v\08To%xWiR_N.cӥݛ\r(WjT_b9i`\\]4}YiJێ/ְ{ |o*;\'5\0\0\0\0IENDB`',0,'superadmin','2013-06-05 15:15:03',NULL,NULL,'','MaxKey','https://github.com/shimingxy/MaxKey',0,NULL,NULL,NULL,'0',NULL,10,0,0,0,'',NULL,NULL),('c1cabfaeb9a448028ffab2148da9f65c','QQ Login','QQ.exe','COMMUNICATION','7a1e2f19c8f21ca9405690d2fedf8c4d0d9f57e9a797732a074689ab39238a2d1e698f87c64032dc548d6ec7dc3c4863','Desktop','PNG\r\n\Z\n\0\0\0\rIHDR\0\0\0B\0\0\0B\0\0\0T\0\0\0\0 pHYs\0\0\0\0+\0\0\0tIME \0,!C\0\0\0tEXtAuthor\0H\0\0\0 tEXtDescription\0 !#\0\0\0\ntEXtCopyright\0:\0\0\0tEXtCreation time\05 \0\0\0 tEXtSoftware\0]p:\0\0\0 tEXtDisclaimer\0\0\0\0tEXtWarning\0\0\0\0tEXtSource\0\0\0\0tEXtComment\0̖\0\0\0tEXtTitle\0\'\0\0+IDATxyU՝?W\ZٛE`PPHR#1q(5QdcQ 8]ōHDP޻_wf1NTTW9>ẮdH(hW4\"!9\riDNC r\Z@4\"\'틼Ygg\'\ronax7 bQWgڼyL6 &Fkk+^}u=餁c;8{R\"It,.\"N=3\'bMdSOy6 B\0-~r͵\r9wW}_+^~m\n\nݍI9&m:&}\"c¤u睌7nJ9&˟_#7젨d D\ZsQ%M}(Rn.]JCCMb߰avB/0Lt=RT6w\\J$A{s?R:;;xwy? 6g:t/Sc/86?p]gE<E ig?SAD\nqnҩccLvs yxGs>RJl[n=WqHW^gپxWh߇i8k8I2iPE>شNm V[ywן^O(Mp!<rhصkP\ZM;x$g_q+BpWcO:.X[C&P=\'$sxU2(\rD@|x U?[Qq=<ð5\Zdɥye#6e7ҡ%@*\Zi AYk$ZZORIJ$R:\ZckqƏRT*\\ ]=\nMqNK}@H\Z ddȣ(:!eQѻ FS 2el\'NstSֆ(YaP6tH;-4mJvG\r1R YĊ`m=g@q G$N?cʢ\\Jbc2,ɜ :ԔqP\\ 0h*H $BW7ttaB\0a{s֕fGEX()_ B9>kZ\\ۦJ\\Hv`VqnŽG9jw7t$q1\0ĵjk\'\0H^v%jXvb|-Bg$z!Zؽ2:dlMHtu| #XCT :J8 gԨG@6flȮ*\r\0\ZQlp\nuC \ZE:B 1mr3ҐL&4=RU\rT$ Z08l|\"O?F#2J }>п`y{$A־8ΩsOUܸu ʀ\0UUPU\\\'V(Jւ3$(Zd?i86LWQA_ c[ؖ_o㳃K\Z;w歘E gEL?n\Z+J?g/7T*U< l>(HP\0,Wtȴwg_l$Yg1l4m:a-zJ&PU\r!DUSyu_q]t&Wf+P8İE[[I=iݽ.Uw D(* |jo\nMT#ƝtOv<`n6l)*)\']p - Dzx7? (Alzo3i{B^,DNJڱ#!bmITaǠa0y`Q$65S#뿺루\ZHiwl\r\rfM܂sh9qpts3Z[\'TK\n)(p|×}Aj%y>mC@lˤ;߰\"J:aE2M{q\0_7Y^\0G#MZ{=B\n#Cp=q=OeRٜЗ_$Χ }j8˞wcn߷ 0bDۢ?vڶL:Q#˙:\ZU\r 6ܼf?9&\ny&>QOѼ3i9;L,AƊ+jH AN\0t\\,rGƺW4s.[~u31@r\'7,nC87ͷ\\0z(stǻq̘E˳Wf<=SO$T>,8aaXK8eaDpK\"*qI&\\|E Ġ=(rXyQa1iUh B#낞8b. \rwpYa2:m&-m Vzɴ[~Z-,q}|)$KKtHkP ??߬[.,=9u\'|lv<,\'; =!;$JaQ!=gX4%5һPB~{3ϾjCõtW O+Xv[9Ͼk⺫FC@UrM(^%)`r=EC}qn\r,έΐ? Tޚ؋ \\T~d7h bƵϜK`07|~VQ:s6W*&O8HAE\\)%$ˣ+~O˵s{|S+!jf9cAlO|lx;^v+g˹-d4\rsU8BASUA\r!T[;yWxu_w%\nT\nH sC1[+LA ]6MPUfc-^{+>AلYL1 j1XEQ0mvKw{ql\'OP-,w@²<̝\ZAtUBg2P\\Q&83&Sl]Gd1\n2TUÍw15qqL\rEQA\n H Us? \']5/\n\"T>jip_R9LPefbL9f*\\c6bFE\0MH TH\nH $HӥP^0o#u4yXu4R4\0tSҕ7 أ®9qD\";OZE۞=4RPt%=J]^S8as1TVVe,tvvDKK tw`gRX}PXQ1#H$B,##,2 aKSSM$]ئ(B3bDZUUU7 RJ2 L] !D\"(p@/>ibcvINX$B^^ht\0L~@4\"!9\r\0AN؆\rM\0\0\0\0IENDB`',1,'superadmin','2013-05-25 09:37:51','admin','2016-09-27 23:03:17','QQ登录','腾讯',' http://im.qq.com/pcqq/',3,'','','uid','0',NULL,14,0,1,1,'org.maxkey.authz.desktop.endpoint.adapter.DesktopQQAdapter',NULL,NULL),('c3d44bb1-e2c4-45dd-91ce-43e821f1321c','Liferay Portal','http://liferay.demo.connsec.com:8080/','OA','d9457a9a9017d2f92ce3d0b58e4328ea637dcc5a434d3bc900bd5f07cd1eda86','OAuth_v2.0','PNG\r\n\Z\n\0\0\0\rIHDR\0\0\03\0\0\03\0\0\0:0*\0\0\0 pHYs\0\0 \0\0 \0\0\0\nOiCCPPhotoshop ICC profile\0\0xڝSgTS=BKKoR RB&*! J!QEEȠQ, \n!{kּ> H3Q5 B.@\n$p\0d!s#\0~<<+\"\0x \0M0B\\t8K\0@zB\0@F&S\0\0`cb\0P-\0`\'\0{\0[!\0 eD\0h;\0VE\0X0\0fK9\0-\00IWfH\0\0 \0 \00Q)\0{\0`##x\0\0FW<+*\0\0x<$9E[-qWW.(I+6aa@.y24\0\0x6_-\"bbϫp@\0\0t~,/\Z;m%h^ uf@\0Wp~<5\0j>{-]cK\'Xt\0\0o(hw?G%\0fIq\0\0^D$.Tʳ?\0\0D*A, `6B$BB\ndr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ\"K5H1RT UH=r9\\F;\02G1Q= C7\ZF dt1r\Z=6Ыhڏ>C03l0.B8, c˱\" \ZVcϱwE 6wB aAHXLXNH $4 7 Q\'\"K&b21XH,#/{C7$C2\'ITFnR#,4H\Z#dk9, +ȅ3![\nb@qS(RjJ4e2AURݨT5ZBRQ4u9̓IK\ZhhitݕNWGw \rLjg(gwLӋT071oUX**|\nJ&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k\ru5&|v*=9C3J3WRf?qtN (~))4L1e\\kXHQG6EYAJ\'\\\'GgSSݧ\nM=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz\0%gA[z|!?:eAAA!h쐭!ΑiP~aa~ \'W?pX\Z15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w%\nyg\"/6шC\\*NH*Mz쑼5y$3,幄\'L\rLݛ:v m2=:1qB!Mggfvˬen/kY-\nBTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n\rڴ\rVE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw-\r6\rU#pDy \r:v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-\0\0\0 cHRM\0\0z%\0\0\0\0\0\0\0\0u0\0\0`\0\0:\0\0o_F\0\0IDATxڽJP$iҏY[Ap^\\]š=j~M!͇C\Z&my{BÁo?|GV\\]%v ڗ&F!׻}\0P0a4ǵ0l-AP0Vv{kF]^W^9;MfɈ^9E~ c@1krcye )r\ZJ*\'&(4T4\n*Tɇ !=J\n1nGba?rc7\ZI \0},r`.vRJF\'p]:_0)= Tl_Cp\nGad,wu貑1/θ swկ>i8tprj:|Ӿx< T^NspkORNXnW:ɚ5NRwLr |p #`\n1,0駭RaX>>: ?QAtɅ:јV}b<11eǙXQX\"ux*}\Zz_oQay`~y;w\'Ó̳.~j >0)x.ZS]xLt塎g]Kˬ:~~d;iLbnK8z%iSgKbYprLŝ侯ϔh,2]אIDՙc\Z_QdQ}sN%_wFP#щYE?P =8ߘ.\"OԦ\n\nYfuR쏡/ca2OA obwZ7n N>]7x ~-醙hGy\n ;:vQ1_OsDux\'N\Z3N̓I[m2<|.I鰬:&&…hEӓs\'!a~x\r m2ay/vӃgb d5nR+mJM,;:&ݰvm0`Ig%OD\"Ff\r<?=jͤ/=)5?vibnzY{y)&m N9KL@nxt\0q;tzf [\'HM>ueKqR坔}?{plGV6۶x@9a)fMO7Gdxa5qܨfv)nu:Y1OvJ%IΛO\"[4%;\r));̠DD\0<6ز[wl^CzyijѯAղ1Yu7~ U QݷFNn؉ w7n<+Y٧,}Lk5{P\'|h .ע\rDtn8-\'Ҍ-UV.˽&;%19g~m\02ނYo]cJyY[&l)f\0G wH.JDK#]EYA_ÍW Zd[PT7<@`Q6!oHA`%P&lFcL)rkɃDdOL!%,tH6?7\\\"ip]vj=7ӧ0̈́^\'ٵA0K?e2/[B,wl6ҽNgP;..ݯo)\\/Ɯɶ2N{nKi)Kâ[wJBZuT,̕#Mx`dWdz%,-xdtHeUy+$VOB}Ruo\r`nOsD7EKB\\z.%Ð Q ڃ \07\'voo1XMư$.%J }~\r7^3v,Ul b_\'r1Z Jy\\}_Ku7^el !{V{n.JY \r35:S ZXq,-&VH0 \rqq;JC0+g)co6Yƶ];g<;,!ǽ O۪#\\eS2;-[#F3\"mRxscJ)\rK~ t7>iI^|E!; $e1klZzUFm12D!;w;Nh{qQ Oi\'[aE)0^ӝP\\*,;GZz學D-YwlZႠKND7Iz /č[ޫy(IF~ W0 f!˶gxzoa/7Gva1Tdwn]MDK0]vT vw jS(l\Z0fh^E/x\n\\dI%G:i{]Q ԶoЍ܅&/>X`R#[)2\rm=!%qɤ~j㒡?oqqd21Jl+h :Η.t=YubnbQUl />غa4wwmemfxT2X0lsb3iI&,dfs\"0lqvȦ6^$ nm)@Y6`&;ܪǗNYURq ĪD vq,3k6nsiܐg,.Wll6 ׉)<2&r#Pu%tMIPO 0#ŽKŒo.]qi BOH-rѓn(OVYv\n7S5.kw=]lߍP|} Iݷ& 2Qkh&%\"amRZ :`Y2͙AʵW4_6U7I=0L@_<&iiL[e|͂` merj)M*xҲjGLk,>F\rl]@Hɖ?qVq/Fnk*GY}$\'{ݲfA03\"gDJ{t|} `cMw+φ\rK=:ʤ|\'w>YO$n3a[;I\'PYy&@SLK7GKUUA\'cw8gڱCm̈́V{+$ epDhϢ^%uSU<ߏu*X0\'>⎩b鄞}\r|FfnW_Iy\\,C%ԗj&}PΓpC=֛#(ς }d޲ZUμ-eårOs%u4/wB0ǺKj>XX%dݨ=J[TDWE8y>K#04\n:ge\0=0{:,ƿOa:VRץk|KG` .)\0\0\0\0IENDB`',1,'admin','2015-01-16 15:33:02',NULL,NULL,'','网易','http://note.youdao.com/',3,'','','username','0',NULL,8,0,1,1,'org.maxkey.authz.formbased.endpoint.adapter.FormBasedNeteaseNoteYoudaoAdapter',NULL,NULL),('f1e33b71-f553-42ab-ae91-2fd913854cda','Token_Based_Simple','http://tokenbased.demo.maxkey.top:8080/demo-tokenbase/sampletoken.jsp','E-COMMERCE','1729a1ee16e532d61e097c01054dcfe7','Token_Based','PNG\r\n\Z\n\0\0\0\rIHDR\0\0\0D\0\0\0B\0\0\0Jp\0\0\0 pHYs\0\0\0\0+\0\0\0tIME ,%6\0\0\0tEXtAuthor\0H\0\0\0 tEXtDescription\0 !#\0\0\0\ntEXtCopyright\0:\0\0\0tEXtCreation time\05 \0\0\0 tEXtSoftware\0]p:\0\0\0 tEXtDisclaimer\0\0\0\0tEXtWarning\0\0\0\0tEXtSource\0\0\0\0tEXtComment\0̖\0\0\0tEXtTitle\0\'\0\0kIDATx՜y%W}?EihX\0If@ $( IXr+NؐE06c,,M9h4h4ow߻ows9ݷE#UIWr#tf %dvM Qը2muIJ%dtt0BF)pXkY^^׋R\')O\'|Ng)%Z\0,p\"oւHcFk@ ;Z`p c!=Eq̺SkR!!w!XKReffYg& `eueFM&&QJaq2X\0m /PDNra?寿qGbA\rqr\"@*~T~$(\nBIAH#$ bR!@T*Ph4jmV^W X\\Q2:61OR+g#`玭|S}4X1\Z_]r 7ͥtͰ@z]m 1MsW2ſezjfffl`a~׿F:R*t7dH`H+a0bhlK2\"$} swȟT+.wR\n [j\r/D%zk \nR9t-S5`\r`\"\n{N~OQ+L \Zlq{>2a#B!DRM%/K9t\'xQ.X^ms^m`EHPm5JH(\nH \Z5XcJmK\"a7}@@@P|e* sjXc@BEd:??*G%Y[\'1(ܦ_ұYH\0wBH\0,MI40&2 tq \"\"((0pd\'ya\n]( w0ư8v{]npTZY\"FI 0\\g}.RD4\ZM1AWR\r$+4hLVDC`љ92Rz7? O)&Y!$Ac9J`ʺ)%hgzzW\n9\'&VR\r\\#%9!R6> ,ÏWǟCtIYg\nu-I3\0`x \n^M\01fZbyы.o3W\\LLN>btZXY*yJ&vpuWe{o~i 5o~wRVXg{IW_K y׻ш^³T\njT@)WYRT2aQJ\"NQJQDUHuY[6Kɶ\\ Z( CF\"]|h D!,&Kɲk2~Mt:t5Q!ZCK\nЁl kuS-.Z /F&(l*50_={*`RŸ 4\n\ZK F3٪{FeX8. % H>ORxtBeEŐ&)Z_rNj?z\Z0$MS C2diRZE%}V-${;k,\ZRJ3[)/d\0Z[\"iیpNDQUxmعG~PHD&VcmT\\klE66\n\Z/FGah4Ð(R(9<Ic2 đP\rAPq!lE ۷o_(viZB|zcV>ʷ?nK!MSQDAH5h6lh061\"90\'ah5Ƨ,N1S@H5A@wufggo\\\n:m2VdlFdgI uqJ@\\rϺBz#XըObO\n&Nx`C%Di;G)TjTHҌ(\n_fskRi냇뮻i[u$vDZ1&%JIz^`F\0rbx{8wW_}-3sBg|,dqaGIwD!yT \"Zk9RJքaO4ӕEZQ{C\0ƙwh4\n\\%_3ࡇ~(>Z^C.rZM:Fg,JJϓZ0%Vka6<qa\"+:Z)]X=&&&7W;177\nf>\nu j9@x\"Κ\",xaג_/ lSĻOADl\0J$Ic gn}x@X>)h0p5H9+yg K}>9d4 QGxȳ&ri @Jv=g_uo$hAhPFn,a34w@pT7a J)aCCP*(&<_ǸX9E\0]o^hdz:[HNarQ;2R>(B *-J9#9sv>>=?]zͳjaf\";᭰I8\0$|>6ZK܏ɲf} HӇwRZ0 MqL\ZqÍ%|w>Ν;Y\\\\\"DQ4w*+٩utxòDQ3TE9OgOPIS=Ě|!OjaHӄ4M2ͅ?^>ctKK XkPRcpol~2{TP:KٯujҤs౟Z\'E=XA\n(A `LJƌV׿~o~LJ@WFNR@kΣI[k}[ ih49toy-_CTk:3%2sťyPx#@g)igrr}|+_fjjvR 0\n;{=C +ȩOIHF806\ZʲQ:5sm?0\nטbB΋EAn+|s_qEnS~Rv=\'cYi\njdAם. 9(\'Uhn]w}nx\'yGe]\0ߍd0\n{ ;vl:Gܹ \'u;`O|CW]j>|n 9֓c2wdiZTJgva9j u:ZlGYߖ/^9cvxw \"4#LMM _\r7n{/?Exfʫ*0]~7EP\\k {&spxi0@\" t]ܢI_#*3[1=~6n_1T LP*Dl>ˮ]Y__G\0%#0 Jez=8& #k\"?Ӛtns_΃no@40Ifb}qڵkrIqwzlC] P/eI*7l?\Z,//swÏE2Yz!p逥H\06\rtVK)9q.2I1$ +s>!g\\WO^Y8!0yr^G)ŏ~#|dYFY!X__X;XTN.e@~NS|ϋB1JU$qAQpy5r5Fw>RK޽3Rfɾ}5_HҌc?X\\}SIH\\|QnL \Z,..*ޫ= Mϋ܀$$٠ss޽IBR!bVY.ϡC=g}VQ($sFWIHy3F~^{Ç3??\Zc6]׉{1kkkiJ&X bfv[җ׽\Znt\nրaGK/}?#ϲun8A*WK&\n9A@Aߓ\\؁ۭjӐ\\W$H[]gnfU$acK$I֚ԇaRֱVFk\Z^B\n !IeYckmWJz\"u :\\ \\q ȭoYןkU Ah`Z JAUnE̩Z$$I~,Bb\\z;=܆2 (z_y(ˑIcu!\'P%RӬp%0IOMu,!]o^9!B\Z_:&X`/Raț\\3I<ۮTB2\0#?ԛ\'l^=[(\nK\0l,z(ch=Xc|R:P 1FEժ3YfxGw.XI*./re26>FJͿ)[1BvsX9;ڵjJ \ZJHs36Srm!Ll6Ooͥ^¶m[hj*Tkqɴ|ߏ晟_GKQCQ)lL7YXko$ QT!pe\\Be6!72d $IbTdi<ȷJ\'h4hPVV4\Z\r**Q%UFe,--n0ѣt$n*{O7cl$RBUQ\r\rf>02<c Aklijmadd#k!TXL~dk4#S䴷c,뽔\n-z]\\k\04W%/k$ܻ(_hubd=AZM%txqf/\"\"֑I?NY#oDTg˴Z4\Zufff8g\nfcv#䒔95 Dt@.p8ʫq0 I[_la=lDlZfc9T[h&+(:\"#8fd v]\'B@QDC1WxHM:b)9uo\"`e/k$Ӑ$h]Xk:4bրT6_s,A%yW`m0R \r0`||;whvPJP܆xܢ~/zs8~rQ.%I-ejb8Tu^~:=4*x$Dl0)#/.:U8{jQKhRp9&ڤYuZ@mlyڰ9uBk~Ϯ]z#\nc^m]qq_ ^s25F^1oFt\\Fm(V.8U*d,M\"Pm077W\n.[)J MoиYZk,e޽l6`w[È\'Wgυ~311LmY`e~aLNNvYX\\deC+pR~bֽ23_H8}[ݮ<1q<{)K^8-x!=XƎ%V(:\r2@kH.tKQ#iwT3f>4ϮL\0\0\0\0IENDB`',1,'admin','2014-12-14 16:14:35',NULL,NULL,'','MaxKey','https://github.com/shimingxy/MaxKey',0,NULL,NULL,NULL,'0',NULL,5,0,1,1,'org.maxkey.authz.token.endpoint.adapter.TokenBasedSimpleAdapter',NULL,NULL),('fb1691c8-afc9-44ca-8b8a-65c13cc4e96f','Teambition(test)','https://account.teambition.com/login','SAAS','85d91f5f4cf5b2138da10a310148927c932b28703d753041cbf8acddd7535334','SAML_v2.0','PNG\r\n\Z\n\0\0\0\rIHDR\0\0\04\0\0\04\0\0\0x\0\0\0sRGB\0\0\0\0gAMA\0\0 a\0\0\0 pHYs\0\0\0\0od\0\0IDAThCkU}P}(\n!(,\") %]4а06ڮZ[5o{ij] ݧ3컻ϼ =fo̙t#thuF4ɣa\\:svr\"\'Kΐ^(xD;t)[߆ k<:{^\nF~zݗ~Bs;B:g~*Ba\\^ҹ :wOi\":αQɢLhz.XX ]E ]¥ udnɢLjT%QB-qFE 8-tRטr݇]ң?薏=܄o\0ח6 _U`(j+\Z}fEE ]f\Zt>=B#W ]!\Z3[u@S6T\ZdOctߗ>>DΞ~XЛq+f`LGIp_D4%Czb/4s{@n\r=U@!5էzR@j =NCE \rP\nFE\"ZJMT*@j֎f@j:Aj\n|ЂW R,>IՓ/F`cV*ŏưX/Hzl:S+z3Nx= !jR+._BE ͚px%G7k\Zj ]*Zg0A@j`ڐ;{pIǗPB~e$,4B1˸cF~e$|EřgƬ9OԉIfIǭs/3ffgvjmŲ$V6Q@`aH 7Q R >ldL?ukw=;;}twU>T}MߙkE>R{οSksNX\0з{% G@(P[H\0-vp+\"R~J*s\'.ia>@2$oxZtIVjF[&4>QvVq\nmeα\Z焙e,UlȀnW9\"Tٿ]OMнC27;b&0׬1xZF+;DǗ qS^UqA))xa .]R>Y9;/}z/AK/^``@kdaF#3EjuM@al\'\n~q&*zSwL\\EȂ*.K6eZ]6wx/7>sWL%ezqS%b`lgyWi&QRȬ+R᪫ϧ,\rZ)Z\0{s$ cd#q`Q;u_>ūĵ:ցW]\nbBT\'T NGM\Z/~vF\\$!s9H/2\'dƠˆ]Jm\ZBBH[\'W9|a*u,8#BIfA+čF7JPQfֳ&03TnfsH68t\nI2}1^@+Tnr]1: 8г߫SqYImijuHs+ǰb:s9tcۨTcLf=]W\nUWXH:3Z)?c1J9Wv @|`lJX9t*\\bG5u[`~q4G:QR|ₔ72FJA\n:w3{Jx}3wQf-( KR:-2&_9+ &ߍ\Za3ˑ׎1}d\ZItz,Vg1\02Y*1/Z4{luD{OTtX8:k G/_PJ\rpDqj܉sI[C\'!-C. *.Ρ5»vQ2N)|!ۍ2uLb+PiJ`2ln MD+EQ2qK\'*Ecvt%*Q!(y+\n;6Ezwڵ.N|;eiɐJ:zbsw(3 ZuUN>c4MCX2Eݴ,eѷsP A\\yИ\ZG:A+o ~9P`Vr8K\'γw[V!*:֒Z\\qHrdH017/gXu@+0Rw60)YA|ݹ10w!AP!3OEOEZ)wy\Z:kb7󏸵%0|]BA\r15\0;ъjiyS46w!H\n?Do6*&>gKQxXo#d\ZjNH#M_jW%_W\r*cYS|1fw%>u\r\"Ԟgq`<@< qNʶ*bJ߉lM\n@x%WㄝUͯhP Z6W匯`\rY,.ųܕJjS&PB6ιҕSϼ7Ȉ&F(`,jZ,\nl0-C(P:bRxg̳\ZL\Z+Bq(\\e1FqK\nE/wإSlh7p b0p_ߺT~6d},c )h;pBM΃թN0Zc\ZcQu\'>wW m` \Z\Z?K9UCVipO;=u@zQUv8(^ 6f׋k$ ҈_=[^>Tw9bS)r य&< `Uލ{;j8GvÚ\\k]nmƀwn\"e1-w ;OOMw`2cI3K%\n-wuPUۛ‰CoZ95[ko?Iغ[xXlQ\ZGwpƺn9;n3W>(r|n\r넟=Vo3)ۢfEچ jȪ}Ghg|\n?M7J987RJ02C߹Ɨ_e,g>ǿs\rqH)3qoF.\\#ՖQXo(^\\r+忊xw Ytω^8U$<5lߐ+L?\0mn\0~)_A\\Z63,g~q~\0u\0\0+⢀?֊\0ͷ-  x?zO?٧Xe[Eŧipn !ϵ1TP~,O-LjuG8o%_A\0?1g|u<ºkH;\'fR;\0&Ki-I9G =E\0~W,\0{k_kx5Zn@4^(1[\0,Yd/e\0Mg~Nֻ H\0\n,pǎj+?c)(&/>J?6}(Jmuk5Ls9l8ހ\n(\n(\n(\n(\n(\n(\n(\n(\n(UK|N\0PG:?l6ͬkVI($nƹ\0%A\0#Qm>{ᵵi$p3 $\0)Rm~4x>\rZt18E~2\0W\0\0TNE$¶5n{kRe4\0i\0$_{j\Z?[xvě-ǜKT;YM` 袀\n(\n(\n(\n(\n(\n(4<+S#4MKP}6e{{YxBXE~\05\0_߲Ժo>3۷ƯRA[`ep<!E\0o_?۟\n6mSǟc&@rfg?w$bJس79<~^ h~?w-?^}fdG\"0*ѸX޾\00\0h6fuYݙ%2 ՙXʷwj^6&:2^^L^O#YgvbIbI$k?iO~Q+ڴ׋<]z׷\rNE\Z4 \Z G:\0(\0(\0(\0(hzm?M5 64N瀨 f\'&*_z~m?ZCk{k_hwIu?\Z܍#`|H\"yg\\Gkq/݅Ο=<ıڀ?(\0eàOm6o:u]>s*~`bAH{/=\0R3@}>x ٮ&|uAc\nbB32Q_5s\0Ho>zu 6gY;FKye-md~ _u~֟m}\"[_j ox8Yc]Bq<FחEw^#Pu9pwܲ)\0I\n1?v_?|+}ǟ\Z!Kh#+rpE-\0QE\0QE\0QE\0UxoQg\Z}j3-\r=Ԭp1$\0\0$ C\nK 5K\n˨|?C-D ?G#/ I+]JƟ-j^1- +8amQ>\0LO3ǫ?ş>ws*xfc7q\0VmY`ᄲC\"\Z?\0~[/\0\r]qfW6b0\'``Tq^wOkج?yuxbrFO\n3\0iҘRmP}yH蠰\nf9g>S*ɕu/>^#gǟ;Jw+C/nRw OV?~ Ho5LoKH?Lc{k~.ԼiKk:9̗7sҿ՘j<xW:i_A/\0oK\0>^I)]b-DMp/W~YQS/8/o\r\'u+#?dP=؏¿*Y}kMU~2v`Z\n/OE/\'O]NִjͿ孕Lvy\0\Z,\0~hzpkvlOMp\0bqʑ_^~mf=KDԯ~Ť e o\0mGV5Ny\n:C\\z{ͼ3Njˣס>E%K2^~z]}͟S4#waxyw6ɠ±x1PN7rǚztkkZ~isaXL64S[ʌUр*A uk}F/=3)pH8\0  ^X[+>\0ȕ06ܣ~mZJ3tKt՚UIJ24GE{|O\0x|s>Tƃڒ ,u{|nmfboQSuGVQQE\0QE\0PU8#Gj([\r\079.~.|*;[y&mnȂ!Yo俽ۢ/^˝sĚ歫]qp9¨2pV0)_ϽHdykR\"dKD*RnFܞ[}-$}M\0\ZrKcLP~}:cMr)XI\nQR#/Ut8n*@mU\\pq:\0|A6׆K/Q?,7ã>Y\0AVtp[43䃶\rHÞI8Fq^U\rBm:Yq$SD\'SÐAt.fԭQrm%}חcO1k|ԟ~kS&?ß*y?Y}ƁĦep&\0I;dQ\0\0? \05im[KlYVL\"%i2H s\' gXiß4WWEQ:B[_$\0_χdK=77[\0k.\rQV\0٧؋ X\0?yY2Uy?S\'0٦$}O]\r6[Kk$novm7RMY9#qe +\Z\n(\n(\nO(l/g\rj ߉QӟFo\n%0vC̀>: EQ@.xv\0\Z\0Z?+;&sAXnQ_]\\0HGPclI8` I#X I\09ɯWnk/g˦%bY>0;1}2`<Ɗ((+?coُ[\0j\0+#Tεow-nٚbI#cd7\0IޥTxOI/5#>HxT5w`x!R~~~۟M>^&}j6=\0Gec __|- .vFn91 aq& eI<\0~2~Yy>RR׃?J \0\\B=y_7\\*l`⿥G99MݽrVjI \0כh2?dp5/#|k\rnj\0+@|ǩ|~ݽke:l;!X`{\00\nߊ_Id׮3P7W\0_̼}u<,-\'Oߗ\0’]{\\\']Iԧ\\\"\0#oǢ\'~э[K7Muiq/AЎƟ#ρ]m5ǃu\rCwA+B]=+O<;2\Z+\0,-ճ\0]׵*tM /)\0ޯ࿤Q\Z8|\\{FooX\\TШ/+3?bdFbxW=Zp#bNOf2X\\bQk7gӱ!,n\\ZW}7}Y˻ l*x$:W?%7<MK)[KLn-#?4n#;x F\r~ߴe=rV8/RV.T\r2,;_ ck&#\'Mo\\^Ne\'MmǰauM5?g\ZqTa?i>[F^])\0J4ڣjDR(\0@Qossl 5_\'->saֿk獴}T*$C2#aպ*ڋz׿d3 MxYaU!U +;ՇEhxO:|Iehz^k\Z K gH@Y\0M~~iO\'U-_ z\0\nlZ6)B2@4g_V~?E/G\n+=ÿ:~a`*)%AmV-I߰_C-~&T\0 uz\']mV1y?Ķ,q`*?\0`33O¤>=R(&VwVH@9 _?g~̞\0zK\rOݕ\06X&*(\0(,<+>x9Z _Vr#i+ |\0hl\0\Z>GNoߧ?\0(\0(\0+ aZ|DͩY\0\rx}\"G_o\rI\0y-\0Fx߉\"A3:\0=ñd}?{Q`/Xcp(}7?~%z\0|Rfj*OO~*W+_e{[%_3lⳟ\'I|߼,j?n+_C\0:d6,:r xt%\"_8|`G UFUr8gK^nhQp\0UQ@+߳YX~1lW̡tʱX?WKʹ[Dc\0d{e,|ήoE\0=[^x_J֫U)MKt&N_\\f$.Dq*{w wy=WkC3\Zu%%EtK_|>\Z\nj%d((\0ٻWAwṜ)\r{ \0\Zwܯ9?`^Y4O7Q$70:2\ZᯧaoR_\\xBRjNf?/zRx~\"*7M2_b\0gѫ|e0&\0\07*(hO`53  ԩF?{ c\0& O{Yha5 4Q-OwEc=~BޯCsfrWzeiž\"pr|Ƃ*>]{y4\\ϯRG;FBJFσ?g?cM\'5/~ ݏC|1\0\0\0c~Fw\Zc\rkCzkzh]ɼ\"2s>\0S\Z<#+ë[.zb\0\\⌵`sZxu;Ijgpnl,l\0uW#7>K~y#\\j1Aꗪ;My)i\nTpkۨ|`(\0(\0(ho\0`o/\0:3>ӌw_\rG{\ZW@Q@Q@mF\0/_%,\rl\0tk٢d9n-#2ask)\06K\0bf\007;g?fK6 ~3l>+?r4_cۜ\0Ӝ[Ô<\r\0$?*b/?M/f\rIYmmɕ| cW\r{\0n\0\"p+i;]9yP֭\r ?6pXp\'?k}_\0<]\'xW{&*=y_Q_yJ\0 kEO\rDOC-,:瞃ֿZ\0(\0(\0+\0vxfj\0A7 bM:#88\r \0\0b+D[-X\\hq⍀q@\0VGo_)5d\0ɷ¾x\r_itt\rz5o#\Z#h%ul}#xɯR@M¸[(T_JGOa] _&\r\'oVkd3pn?YExlU\0x ,dotۈ#S\rz:aڋ_zbQ?i_8弐2qo%Đȥ$:GW/\0v?>xZk)Wۼ !\0i[*}\np0I{luo.XkMpiْe(O˞oJ6?8K 9B.I5\'sh7>(\0(\0*m6][PwMs\"\Z\0y5߱Ç[#cf#0_膽*,5Ey%vϊ*4eV]v`^ojrı)\n\0ʿ?mC\0%X\0nmрNbSfsۥ~rkSmgeBB1Kyl` \0~ҟhYR>A \r~~f|5Kk{iq\ZXncntYcTzkbUV>EپWzZA_UQ]=cџ)u{?Pr #סZݤkgP&/QsvI/;d%\'{ƏWK}R![3>Y>mUV1upfW4/迦*)^]N(\\(\0u\0-e#RjH%3\\&ۋ\\:A+\'\04܋ [V\'M-(8.h&_|TXTTUV^]lvWaVhV_o ST\"i\0\nt{̮Q`?D}kxzIjs_zuuq)#MS\r\0E%ajy=輒?=f3OD_e5 9RoA?5˵E}d\0׭ZiAԪGRXѤ)4۲G>bh> n{y]FHkvkXQmelI$6f#74Lvi܊4s_WozS#xM?HȲ4{\rq2L+?8%ɿE|˲8>w@|oLk\\5/忳qkk#~:OK>톹AӤ\\79\0Q?+=S?l[xoD>ç6jO\r{\0O%$nGSR9W?ͼ>.j)]fv$1/E_ο\0D[{?HQkZI]]H)<~OoO]hEKh&FO\\zu27e~OtGYRΗڍkDߝ7OM[[Lho\n|~^>fcoX\0< \0:·yW[[g䂻\0~Ƿ^Mgۿ\Zg0=竖P]a\\?g&& ~$Nwݳ\\~JB{ML{mc,H8AܓW??<|P\rJV5)<ۛ\0\0@\0\0\0\0\0+ 6i_d<3i=\0%?N*3ةZ+h\"(nSV4䐥}\rϕq,,O#O\'#sC\\hBmXR\Z<`?\\D\Z~#A4>ڌZp\\2럋]\0\05-sZ; ^8M2z,hO$##\no)?z_]HߖO<+Nαqc4^-\0E\0\0u}#P[_O\rxY42J^> 3\r7Nk{l{Mp%ADk3ࢊ(\0(\0g_77xYlARU$U;c.{*ڀ?\04X{\0J>$5o\Z߉pک[Ke?씷2Ǿ_>h\0\0 Afiiўom\nC}N=ho\n\"iW#4im-.%MezUpɎ3d?xV]k:nF\\y0Hck;\0n>~OǯXy>yI#~\0䴐ܱ_4\0QE\0QE\0WG\Z\0\'w?u\'ºȇG!9ӧo#[Bv2P;=|/:SG,2pT\0 uWS9W\0G[DW^1]3YDg 9W7{|]R^<ؐac\\\\\0|_о,x*kBN׼?[`=k8_19=]=Rk丫p{ݫ_-[\09&\rJz\0N|1sy/Em,Y|=DM\083u_n?qզs\'h֗Ym,N[cѧ2U1\'~R\'9ovߩӌ\"dIl肊(((\0(\0+c /OՑ}5g )mLUkW㿅|-x\Zn\\jZuy\\$qK30\0Կ?O?&_-mΧkNծ0,ȇl(y\0}5EPEP\0F\0aF?co|%&a%:uMͤK7t\' k7߳7Ɵ|?&SiZr#&*JFFeq++ \ry\0l6~i^od!񥝴YVң%e9<9$\0 ͭQ@Q@Q@~?_LCc\0߃ѕt ˭nr\'|q3\rT?R\0l|)񥎭yo˨hw$[k:Nxw@wF_ßM0\ZPj}\0Θ}=_u^0E}sX߈4|-OKL9c*$eHthav#$mաQU\'-vz1aWW^髧goO e]|9eGHc J=Oqį&/r߇֥ gm!WRWҾ?Qrpwi2k4B\\fK\\t }9h1j\nwa;TPD=0fɧrֵ\0+pA <\nF \0|\\\0x_Mi| \n>68ǜxȉBļpaƾ7־$^k)QԮy%v>I\n(\n(\n(\n(t\0p0\0~S)|ORhin.0pH#F\0~?Jy>:|||eD;G.\0\'_o>+|p\r-eVbC7/ȬbC#I@Q@Q@Q@Q@p\0ிMۛkUtaG\"0) A\0qE\0!?[ W; tM -\\ 9+F5xz\'/&k%_^\"0*A +\0 %qLux;/u#qմUYr< ;$=%լ72C4rC4,RHJ08 QEPEPEPEPEPEPEPEPEkx?OfդMZ4\n&$ n0B !\0icG#?kk)g}\\]^ q,O`+\0\0- 0Z!ucj.,|1~췄aNR\"F$#_O_oHe[Tj0 *)u|=@%8.>(((((((_+o_\n~(~ZK6B*ǘ.ʡg\0\Z\07|z\0_H$xFi/$i4K~_\0 .ݣc TE?旫Xf [YAs 2:0*AE\0W%\0\0E~Է!Gy7\\,mۧM߈\0u}ӍʭLql<\0\0A|sM-wu? XJj+-ğ4vheFYJa ~Ϳ\0\0\06o~]-q2HK+`nFgcbk\n(\n(\n(\n(\n(\n(\n(\n(\n(\n(>q_o%τ>5{5ksOv1g˿+bE>$ۺvoQ_/ \0.h*8~lUnPw0Hs<0i0&1sB\\܃8_u\"韲Gmnx#c\nK)/$iIlWx \'QI\0g6Ԟ_ۓ뤉c=rsQ@o5$-7_ YM.\0X[9dc=g2/43|Ri-|/jH|mق7^v8t5Q@\Zs\"~yxwğHpojaVLz~|+=/\0|/h6tN.,Q*]\0QE\0QE\0QE\0QE\0QE\0QE',1,NULL,'2019-12-02 04:05:53',NULL,NULL,'','MaxKey','https://github.com/shimingxy/MaxKey',0,NULL,NULL,NULL,'0',NULL,0,0,1,1,'org.maxkey.authz.token.endpoint.adapter.TokenBasedJWTAdapter',NULL,NULL); -/*!40000 ALTER TABLE `mxk_apps` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `mxk_apps_cas_details` --- - -DROP TABLE IF EXISTS `mxk_apps_cas_details`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `mxk_apps_cas_details` ( - `ID` varchar(45) NOT NULL, - `SERVICE` varchar(400) NOT NULL, - `CALLBACKURL` varchar(400) NOT NULL, - PRIMARY KEY (`ID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `mxk_apps_cas_details` --- - -LOCK TABLES `mxk_apps_cas_details` WRITE; -/*!40000 ALTER TABLE `mxk_apps_cas_details` DISABLE KEYS */; -INSERT INTO `mxk_apps_cas_details` VALUES ('3a93e28d-558d-4dc7-a3f2-9bf5255a1372','http://hr.maxkey.top','http://hr.maxkey.top'),('41065fe3-ae67-4172-a460-fd0079e88294','http://cas.demo.maxkey.top:8080/demo-cas/','http://cas.demo.maxkey.top:8080/demo-cas/'),('8e7e4a2f-9e7a-46ee-9dcf-ec02d69cb5e9','http://hr.maxkey.top','http://hr.maxkey.top'),('97d2ab32-b88f-41c4-9c6b-b8a53ac504ee','http://weaver.demo.maxkey.top:8080/weaver/','http://weaver.demo.maxkey.top:8080/weaver/Login.jsp'); -/*!40000 ALTER TABLE `mxk_apps_cas_details` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `mxk_apps_desktop_details` --- - -DROP TABLE IF EXISTS `mxk_apps_desktop_details`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `mxk_apps_desktop_details` ( - `ID` varchar(45) NOT NULL, - `PROGRAMPATH` varchar(400) NOT NULL, - `PARAMETER` varchar(400) DEFAULT NULL, - `USERNAMETYPE` varchar(45) NOT NULL, - `PREUSERNAME` varchar(45) DEFAULT NULL, - `USERNAMEPARAMETER` varchar(45) DEFAULT NULL, - `PASSWORDTYPE` varchar(45) NOT NULL, - `PREPASSWORD` varchar(45) DEFAULT NULL, - `PASSWORDPARAMETER` varchar(45) DEFAULT NULL, - `SUBMITTYPE` varchar(45) NOT NULL, - `SUBMITKEY` varchar(45) DEFAULT NULL, - `PRESUBMIT` varchar(45) DEFAULT NULL, - PRIMARY KEY (`ID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `mxk_apps_desktop_details` --- - -LOCK TABLES `mxk_apps_desktop_details` WRITE; -/*!40000 ALTER TABLE `mxk_apps_desktop_details` DISABLE KEYS */; -INSERT INTO `mxk_apps_desktop_details` VALUES ('c1cabfaeb9a448028ffab2148da9f65c','C:\\Program Files (x86)\\Tencent\\QQ\\Bin\\QQ.exe','','SIMULATION','','username','SIMULATION','','password','Enter','d',''); -/*!40000 ALTER TABLE `mxk_apps_desktop_details` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `mxk_apps_form_based_details` --- - -DROP TABLE IF EXISTS `mxk_apps_form_based_details`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `mxk_apps_form_based_details` ( - `ID` varchar(45) NOT NULL COMMENT 'ID', - `USERNAMEMAPPING` varchar(45) DEFAULT NULL COMMENT 'FORM LOGIN NAME', - `PASSWORDMAPPING` varchar(45) DEFAULT NULL COMMENT 'FORM LOGIN PASSWORD', - `REDIRECTURI` varchar(400) DEFAULT NULL COMMENT 'REDIRECTURI', - `AUTHORIZEVIEW` varchar(100) DEFAULT NULL COMMENT 'AUTHORIZEVIEW FOR LOCAL VIEW DEAL', - PRIMARY KEY (`ID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='FormBase details'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `mxk_apps_form_based_details` --- - -LOCK TABLES `mxk_apps_form_based_details` WRITE; -/*!40000 ALTER TABLE `mxk_apps_form_based_details` DISABLE KEYS */; -INSERT INTO `mxk_apps_form_based_details` VALUES ('850379a1-7923-4f6b-90be-d363b2dfd2ca','userNameIpt','password','https://ssl.mail.163.com/entry/coremail/fcg/ntesdoor2',NULL),('c8038bd4-12a4-4b45-9d43-61b3ecdc2eb4','username','password','http://note.youdao.com/signIn/',''); -/*!40000 ALTER TABLE `mxk_apps_form_based_details` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `mxk_apps_oauth_client_details` --- - -DROP TABLE IF EXISTS `mxk_apps_oauth_client_details`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `mxk_apps_oauth_client_details` ( - `CLIENT_ID` varchar(45) NOT NULL COMMENT 'appkey', - `RESOURCE_IDS` varchar(256) DEFAULT NULL COMMENT '资源ids', - `CLIENT_SECRET` varchar(256) DEFAULT NULL COMMENT 'appsecret', - `SCOPE` varchar(256) DEFAULT NULL COMMENT 'SCOPE', - `AUTHORIZED_GRANT_TYPES` varchar(256) DEFAULT NULL COMMENT '授权类型', - `WEB_SERVER_REDIRECT_URI` varchar(256) DEFAULT NULL COMMENT 'REDIRECT_URI认证返回地址', - `AUTHORITIES` varchar(256) DEFAULT NULL COMMENT 'AUTHORITIES', - `ACCESS_TOKEN_VALIDITY` int unsigned DEFAULT NULL COMMENT 'accesstoken有效时间', - `REFRESH_TOKEN_VALIDITY` int unsigned DEFAULT NULL, - `ADDITIONAL_INFORMATION` varchar(4096) DEFAULT NULL, - `APPROVALPROMPT` varchar(45) DEFAULT 'force', - `AUTOAPPROVE` varchar(45) DEFAULT NULL COMMENT '自动通过', - `IDTOKENENCRYPTEDALGORITHM` varchar(45) DEFAULT NULL, - `IDTOKENSIGNINGALGORITHM` varchar(45) DEFAULT NULL, - `IDTOKENENCRYPTIONMETHOD` varchar(45) DEFAULT NULL, - `USERINFOSIGNINGALGORITHM` varchar(45) DEFAULT NULL, - `USERINFOCRYPTEDALGORITHM` varchar(45) DEFAULT NULL, - `USERINFOENCRYPTIONMETHOD` varchar(45) DEFAULT NULL, - `JWKSURI` varchar(400) DEFAULT NULL, - PRIMARY KEY (`CLIENT_ID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='oauth_client_details'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `mxk_apps_oauth_client_details` --- - -LOCK TABLES `mxk_apps_oauth_client_details` WRITE; -/*!40000 ALTER TABLE `mxk_apps_oauth_client_details` DISABLE KEYS */; -INSERT INTO `mxk_apps_oauth_client_details` VALUES ('001bd032-d132-4747-b434-73f21b352c63','001bd032-d132-4747-b434-73f21b352c63','05681f23341b0676f0124a9d2f809af9df962b0983ae8557a6fe31a66c782983','read','authorization_code','http://www.ssss.com','ROLE_CLIENT,ROLE_TRUSTED_CLIENT',180,180,'{}','force','read','none','none','none','none','none','none','1'),('3a2c3f84-1df7-413a-8a42-f3add972e0d0','3a2c3f84-1df7-413a-8a42-f3add972e0d0','74a81906a41d3a89866edc237b3ffb2496d0aaf34af60931b942ef9c37cb9e71','read,trust,email,phone,address','authorization_code','http://o2oa.maxkey.top/x_desktop/oauth.html?oauth=MaxKey','ROLE_CLIENT,ROLE_TRUSTED_CLIENT',180,180,'{}','force','trust,read,address,phone,email','none','none','none','none','none','none',''),('ae20330a-ef0b-4dad-9f10-d5e3485ca2ad','ae20330a-ef0b-4dad-9f10-d5e3485ca2ad','d15b1f6f6590529f40a7f3955e9e2f182a453b3a241e460939ae532ef6d1068e','read,openid,profile','authorization_code','http://oauth.demo.maxkey.top:8080/demo-oauth/oidc10callback.jsp','ROLE_CLIENT,ROLE_TRUSTED_CLIENT',180,180,'{}','force','read,openid,profile','none','none','none','none','none','none',''),('b32834accb544ea7a9a09dcae4a36403','b32834accb544ea7a9a09dcae4a36403','4e1d7eb7b14ad658e8d9066c95902c852ff6494512a742a8392d1d16adc5af551e698f87c64032dc548d6ec7dc3c4863','read','authorization_code','http://oauth.demo.maxkey.top:8080/demo-oauth/oauth20callback.jsp','ROLE_CLIENT,ROLE_TRUSTED_CLIENT',180,180,'{}','force','read','none','none','none','none','none','none','http://'),('c3d44bb1-e2c4-45dd-91ce-43e821f1321c','c3d44bb1-e2c4-45dd-91ce-43e821f1321c','d9457a9a9017d2f92ce3d0b58e4328ea637dcc5a434d3bc900bd5f07cd1eda86','all,read,trust,write','authorization_code','http://liferay.demo.connsec.com:8080/','ROLE_CLIENT,ROLE_TRUSTED_CLIENT',180,180,'{}','force','trust,write,read,all','none','none','none','none','none','none',''),('my-client-with-registered-redirect',NULL,NULL,'trust','authorization_code,client_credentials','http://anywhere','ROLE_CLIENT',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),('my-less-trusted-client',NULL,NULL,NULL,'authorization_code,implicit','http://','ROLE_CLIENT',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),('my-trusted-client',NULL,NULL,'read,write,trust','password,authorization_code,refresh_token,implicit','http://','ROLE_CLIENT, ROLE_TRUSTED_CLIENT',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),('my-trusted-client-with-secret',NULL,'somesecret','read,write,trust','password,authorization_code,refresh_token,implicit','http://','ROLE_CLIENT, ROLE_TRUSTED_CLIENT',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),('my-untrusted-client-with-registered-redirect',NULL,NULL,'read','authorization_code','http://anywhere','ROLE_CLIENT',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); -/*!40000 ALTER TABLE `mxk_apps_oauth_client_details` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `mxk_apps_saml_v20_details` --- - -DROP TABLE IF EXISTS `mxk_apps_saml_v20_details`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `mxk_apps_saml_v20_details` ( - `ID` varchar(45) NOT NULL, - `CERTISSUER` varchar(200) DEFAULT NULL, - `CERTSUBJECT` varchar(200) DEFAULT NULL, - `CERTEXPIRATION` varchar(100) DEFAULT NULL, - `KEYSTORE` blob, - `SPACSURL` varchar(200) NOT NULL, - `ISSUER` varchar(300) DEFAULT NULL, - `ENTITYID` varchar(300) DEFAULT NULL, - `VALIDITYINTERVAL` int unsigned DEFAULT NULL, - `NAMEIDFORMAT` varchar(45) DEFAULT NULL, - `AUDIENCE` varchar(300) DEFAULT NULL, - `ENCRYPTED` tinyint unsigned DEFAULT NULL, - `BINDING` varchar(45) DEFAULT NULL, - `NAMEIDCONVERT` tinyint unsigned DEFAULT NULL, - `SIGNATURE` varchar(45) DEFAULT NULL, - `DIGESTMETHOD` varchar(45) DEFAULT NULL, - PRIMARY KEY (`ID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `mxk_apps_saml_v20_details` --- - -LOCK TABLES `mxk_apps_saml_v20_details` WRITE; -/*!40000 ALTER TABLE `mxk_apps_saml_v20_details` DISABLE KEYS */; -INSERT INTO `mxk_apps_saml_v20_details` VALUES ('525d261fa3b04d19af0debabbd5a1e2d','VeriSign Class 3 International Server CA - G3','CN=proxy.salesforce.com, OU=Applications, O=\"Salesforce.com, Inc.\", L=San Francisco, ST=California, C=US','17 Oct 2017 23:59:59 GMT','\0\0\0\0\0\0\0\0\0\0 https://sso.connsec.com/sec/saml\0\0CDF\0X.509\0\0d0`0HC77hֺpBng0\r *H\r\001 0 UUS10U\nVeriSign, Inc.10U VeriSign Trust Network1;09U 2Terms of use at https://www.verisign.com/rpa (c)101604U-VeriSign Class 3 International Server CA - G30\r131018000000Z\r171017235959Z01 0 UUS10U\nCalifornia10U\rSan Francisco10U\nSalesforce.com, Inc.10U  Applications10Uproxy.salesforce.com0\"0\r *H\r\0\00\n\0mK-&c\"I= =`ӅujDG)Y$\Z[U`E1_;\ne@\\1VC]BUpgT@:)#zz!ݲD\0RhB!)z`,ěDQ\"-4 ~PAZg pih5\r5iJO^sFRHq\000U0proxy.salesforce.com0 U0\00U0(U%!0++ `HB0CU <0:08\n`HE60*0(+https://www.verisign.com/cps0U#0כ|\"ݭ_)XüF\00AU:0806420http://SVRIntl-G3-crl.verisign.com/SVRIntlG3.crl0r+f0d0$+0http://ocsp.verisign.com0<+00http://SVRIntl-G3-aia.verisign.com/SVRIntlG3.cer0\r *H\r\0\02yD~^Z8pWcDQs6*R/X (+=/T6t!¦!g2J+9k1mVWiED\Z!Dg Pͱ5eyeH:1Z;l \nzyEei~{: @q=\nA K;:;LiY3H.9] Jfarq6=gb`^˔o)S\'R@w\0\0\0\0 connsec.com\0\0>\r\0\0\000\n+*\0aM-5Hfk<랓nH %Њ{ 4#bz;W\rˊ2?0QC#6wP@\\09CJ.*pAaH/CdB\\O @Ez=\0h%b:}NR\'C+ƚ*kswx.G k[wn_+\0 s=`wd@ڇHte```(5\'1Z4LRhy_23yѿ!M,&Czb_PB5ϴ% P}ŕcqHb~7MyЁ`O=Y`/r:P~˞4VoA7^/KlbraS)$T C?\'V#iĤgwJR j4斪\n\\7oϷ=R]lzSЍu~ō>E.O\0ᐸEHתqZlNt*xt6:?LU8#gѪ;.-R> 2Rj\"߈P`QzV71U׻$RtD_4k,oUsh&p8k1ܢ4Z85Y1ޗ!EUO 4/0ܡ6$ZhN: _y\r]MgU`Cs\r8ClW 8X?uhu= R$NAzدe{\Z12i:;`Z-\0)z\'6]` aA,(Lqbp\"Ej%Yȸ8ɭDZݚ O6D|xĿfivNmK8WqI$ F\\L2,j\"{A0yPa=kV~9W>oⵋU^keET3|n`8!QjKOs{\r=lK/J.,ǐ ?Q\"Zh9}B, :suus )$f?ܨ-glk^Ѽ O屰ԎlI$lKc0?\",φ8.ՎIux t?nm]8J2$\0\0\0\0X.509\0\00\Z0Q0\r *H\r\00O1 0 UCN1 0 USH1 0 USH10U\nconnsec10U connsec.com0\r130509145555Z\r400924145555Z0O1 0 UCN1 0 USH1 0 USH10U\nconnsec10U connsec.com0\"0\r *H\r\0\00\n\0s~g9h}@竦^k:i&^W+br՚<KPux7i-.B1l^D~.jFQ)#Y#\ZX0`ط\ZC~<ɔ#PktJ$uͯEfx䄿:\0t6Lڳ/8FQMz |,J9 uuX?ꠎDq\'nka&$sq\00\r *H\r\0\0\rŎ8xU\"NKTF؀w^U_:!C|Eh.RtudIwcz̊.=eZ\0\nןOG-#qlBU}EB\nj^ j7x[3%s2HوEڑpzoZ:8pSSrR)+h^Y R^WDrOu sYZo>#Nzx)Y|w-}nmR}(G% U+VH D','https://shikey-dev-ed.my.salesforce.com?so=00D90000000r4kw','https://sso.maxkey.org/maxkey/saml','https://sso.maxkey.org/maxkey/saml',15,'persistent','https://sso.connsec.com/sec/saml',0,'Redirect-Post',0,'RSAwithSHA1','SHA1'),('5649f603-f2ac-4b0c-8fc3-e80ddce8c443','cloud.tencent.com','EMAILADDRESS=qcloud@tencent.com, CN=cloud.tencent.com, OU=Tencent Cloud, O=Tencent Technology (Shenzhen) Company Limited, L=shenzhen, ST=guangdong, C=CN','Thu Aug 15 14:24:31 CST 2019','\0\0\0\0\0\0\0\0\0\0cloud.tencent.com\0\0p<\n\0X.509\0\0_0[0C \0k0\r *H\r\001 0 UCN10U guangdong10U shenzhen1604U\n -Tencent Technology (Shenzhen) Company Limited10U \rTencent Cloud1\Z0U cloud.tencent.com1!0 *H\r qcloud@tencent.com0\r180815062431Z\r190815062431Z01 0 UCN10U guangdong10U shenzhen1604U\n -Tencent Technology (Shenzhen) Company Limited10U \rTencent Cloud1\Z0U cloud.tencent.com1!0 *H\r qcloud@tencent.com0\"0\r *H\r\0\00\n\0bK3X-% \nUqReƃ}gؘZ ԖwzXd1ag}1;K(ԇ\ryH=xz\"Y<$\r?\"bi ]C~w cX\Z4r<:}p}>ϣӱ08gOK@~M-<\nPX.3)E[E?\0EOt9UE|($_\rª\\\0P0N0U:{Q>(_lm4YH0U#0:{Q>(_lm4YH0 U00\r *H\r\0\0@!C\0j|ZiXt@m-7D4Oz\Z S\Z\ZcAK)cv<\r̥C]*@D|&8ù!23ʸ}\';Z9 ̽REÖDБ)*)c=.*{*P\0Ki?\0=5)Ti!nppGm#kW/,S=cn\'6<\\k%]fx>|C?-yRY.\ZfEq43=]\\aڒY ?eQz\0\0\0\0\nmaxkey.top\0\0r$N\0\0\000\n+*\0dc廅k;Tg,ා*u4\Z\Zq`@\Z^Ss\ZL\\NpZW1E6\\Vhz 3#)фiB D+ ?i W\Z>N+m{޹9:M<\'B\rC+a54`QWC/\'M;+ȵcnSWɠ \n 3{\'[BvcĔc_-[x[& c% `cu>\r+U/f81*3ZL/!ɣ@K\nC7̵%\n\\kпi)z(=M#hJ[ď#F\r}^)\"P x(i_~0j޿$\0{$B@(ZLxO|%ZLr\":q֖Z;&kpaQޔQa;md.\"&(ה|D5!kn?Oݜ 4eȫCG 8H.ONDr u;8ZY2prc\0\0\0\0X.509\0\00~0f^W-0\r *H\r \001 0 *H\r shimingxy@163.com1 0 Ucn1 0 U sh1 0 U sh10\rU\n maxkey10\rU maxkey10U \nmaxkey.org0\r200227024731Z\r400227024731Z01 0 *H\r shimingxy@163.com1 0 Ucn1 0 U sh1 0 U sh10\rU\n maxkey10\rU maxkey10U \nmaxkey.org0\"0\r *H\r\0\00\n\03QJO@W PzߍgGEG^M=\\QhU@~OXpĦ|&qb+!؆jKDh<>=8D~h_Zѹ{R \np\"5_1/S/nc8\ZVP\"5B@p-R|,WxDwLD }?Б\n\\`1?E In7<2{\r;Ҝ0cwdCD\r\\8c *gcŀafԺϥhu϶62d\'Ujmnd~*UQ٨氄eAi\'n(QI4T/I-? vxۿ/nA_ zb=ȟֺ \05|N]VW:|^\0 \"VQ۸,L\'5\Z߯l֋;0$eiaK\nWuIPMP_ͫ\00\r *H\r \0\0O$.%pvAq,,)cOVP gg;22u.ZN,c_ Ga^ F6D`څJy@?*B{|fe#Gw:jg{Ep$\'xb3Wloz8\r\'Qb}[R0dMDEͣgPxkӎ6F%NkCnBYZ\"62>wp (_xq\"\"f,]j+4 +,A\0\0\0\0\nmaxkey.top\0\0r\"\0\0\000\n+*\0ؐy qa.VpW%.rn7b~+ZycF]lChٱbvR)cs{ PGFa]0!Ֆ}?ńF=|w},tz$f#dNcR@sQt~F<$\\P0-Q\r uX;#ϲK-ҪZ_ޝf\nRC@` Gw,\0Bv7\Z\\9 e+|3.H <Kq4L|m\"}wC6d,?Ƶ?*WJAq{`1)% h q ִXXT0ʈvY\nKS6]\"\'^z:H<Y#?VYܼd$+v\Zt˿^\rT5n!7wWR]W1F@&^i~~\"Tb\ZzE9ٗ`#Cz֬BmGi ^݊aۀBѲѰv\riKg96ц$dbgӕLFP,RɞYxQZ/p9S\"|jL݅*+\ZZO{2N >[&<\n(*vKvbro%zd\'roc 1\rGaR@^Nnq\rzTYw8>R /-˦C0jn.c&`V@c W*+&Rq.7\n|?WF,`b[LҼс-T\\ƙ} tN\01cJSAKj\n,gWW,/n= t…Vc=؝MC]ggvĽM Ұ ?qR\Z9i椝nDaX?„^̥p\r$e`̠#s\rMx)P\'+\"lb\'{Z&D]L*A’7:y51VX7ɩvRΉɻY.[6wgp^ /3fHad9z,YԵQ>)ncv RWvU4F 65AN(\r&V/n;C0nN\Z>3g`Dkri,\0rڬ^x/ 04 px;oOe2L$21*sD0KEb\nќhTpT]n\\Q\rNG%!k eߟ8ZY2prc\0\0\0\0X.509\0\00~0f^W-0\r *H\r \001 0 *H\r shimingxy@163.com1 0 Ucn1 0 U sh1 0 U sh10\rU\n maxkey10\rU maxkey10U \nmaxkey.org0\r200227024731Z\r400227024731Z01 0 *H\r shimingxy@163.com1 0 Ucn1 0 U sh1 0 U sh10\rU\n maxkey10\rU maxkey10U \nmaxkey.org0\"0\r *H\r\0\00\n\03QJO@W PzߍgGEG^M=\\QhU@~OXpĦ|&qb+!؆jKDh<>=8D~h_Zѹ{R \np\"5_1/S/nc8\ZVP\"5B@p-R|,WxDwLD }?Б\n\\`1?E In7<2{\r;Ҝ0cС\|ɒ\ \(͚\\ނ\8ر\x\X\\\\Ν\\\\\\l۵ބ\\\ \ذ߆\rݺ\X\ԪϞ\\\}֭ӧ\\\\:\\\V\\\\S\m\\\\P\t\xϟݻ\`\\Ԩ\]\y\9\ɒ\ƌ\\ӥ\oП\I\{\\'\-\Å޼\\ʔ\\\bС\:\Q\0ɓ\C\cҥ\O\\\ʼn\\ܸ\B\b\\\\\Ŋ۶\,\}\\Æ\R\@Ϡ\*\\ރ\k\s\uƍ\[Λ\n\!\^ϝز\\\oȏ\\\[ׯ\m\+\kլ\j\*\\\\Ĉ\\\ĉ\)\r\W\7ѣ\ć\+\cȒ\O݁ȑ\}\\ǎ! NETSCAPE2.0\0\0\0!-Made by Krasimira Nejcheva (www.loadinfo.net)\0!\0\n\0\0,\0\0\0\00\00\0\0\0HA\08\qÇ\r\kÎsu j\8P̔\0 G\"Ɇx0\\r06IJfK\rb\\J u\Zl\b2\3dIe\k5\0\0(\\%P\h6\hw,\"ħ)H>60\0x}dYW\8ȔQ\)\\0\ ^\\c $ 8er\\gE&\0\"ҌI%\F<\Z@1AK\n6R2\n\Z\iG/8\e\n+` iЂ;h$шA\\@xb|BE \.ŎiJ *&\NHqB 0\W\Ⱦaʧ\  A, #\\\AOo\w\A\0!\0\n\0\0,\0\0\0\00\00\0\0\0H*\\ȰCtر\Ë\n-x%@(0$@Ǔ\n\9JXd$+<\\BK\n\Z Q\02\3`@a20v\P!R\E\VŠm\a\R ]5u\0`Ax\\Z=8ce3^/ \s\Z7m\'\r\q\ H5n|\d X\J\@04gR\\Kmj8,5\o!mhtt\ɋXxЪ)mQ1e4\KT4L:sz<6bĉ[\\\7B\00@z\e\\\@\ZrC*Ƅ!\ P(b\0>Xs\]0;`&Ƥ4Kܗʋ\Zr!6<\\ 46x_.\\\Zͨ7~8@ckB\J#Z\B9\ R\\\\\B6\\'}wIP\X`\HAl\\\E4\0!u\U\$L:A e=\A.ɀP6A0\*\\ +\@JH$\04`:X\Au*^\A6HRa/\\Dvښ \~\0\\'\0ѮgD0oBN\\8oBL\\\ /pk?,\;\0!\0\n\0\0,\0\0\0\00\00\0\0\0H*\\ȰÇ#2P*$j$8*Rڸ HHJ\\\iU>P\%1\1g*M)P8RP\2\6E7\1H!\rv@6\L4\rH\!\\\"\\"¼9t\\B\2fJ_\aj#!\{32#N0@\.ZkdɂLMvg~@ \rdB\n $F@E\ǂ p\\8 \0%)Lт\z\8@ 6If(\\\"TQЀF\Z5\\\ZA\B}ʙ\1P\0y\\˄\\1\\\\nډ\;̀g\Aah2&  -At\!B\0p\\ny\\'D,S\CGpsű硃d\&Yl884 ʓ\nJA\BTz\W4\\'!l\im -#\|\\Rp\\664dϫz\\C/ت@D\\LJ\dc߬1P \\H \D#q\\niAKd@K fSrAa\) Ri>\\0|\QׅA/\7\MXPGXD\\lB,\$\0!\0\n\0\0,\0\0\0\00\00\0\0\0H*\\ȰÇ#:\\BŃR\ŏO(`\\Nj6B\I~\)\\#NppŐx\Y\npxFT\\B.8 b\J0-T\"@=I\0\#i]J\B |\\F\\+uH!WټA,y\C~ _A/w^z~_u\e\GBx!n*0\]\\:=\\\K\P\h_ \Z` o \0\ `5D)B+\B k`d , Rְ\:YDpA%\\@=&K2\Z&DYi\"PE Z\nA&8vbM2\\BLQE\ZJh\0A%\I)=\P,Ul@1\rO\Z>C(\\/x\\Z6+*2\dCd‡\:!&\\`\IJ\\-p\0<:9\:4꺊\0& D1P\0P\E1`.\Pй׶\%\r{ .zpc=1N/\\`EaŜ$N1fQ@\0!\0\n\0\0,\0\0\0\00\00\0\0\0H*\\ȰÇ#:4`@Ń\rL$Iŏ\0H\0DG}+9\(\b\\'4XpB$,\E1P1\Ġ\'6 @d\O\0bUdI†\n2R\#Ep(D˕\8c˞M6\ B`ct\"g FH\c|Ѐ/.Yǹ!\R- 6L\Zt\n@@<\n}\ \yEj=\\\{\ l\}d\D\o)m n q \/ 2n\\1DFd\0D`\\'R\"C\\n-\|\\(\q4$@ \0l\P` )%>*dDd\H9䉘\rDAqDKB`D8 \'\0{ PBI \(kj\0-dBs\n\0\0 \^\04@C8\0nF@VhqC|\\0.\\li\\0\\\KYI\nŠLD(\\0\km@ o \Cxz\0\0\:\@sP1?\\\P %\A!AE,\/\\\\h\{\0 \0\n\ZjLg0{>\\0y\2\\|Υr_~\0k\0\\\z\'E^{>7\u\=\2\dw7<1@.,P\uqY\[ry!\EC(kyB*\Di:$( $y\\\t;$ieHy7X\I<p\gI\ryPp\\SmZYfI\7\ղV*\ h\`p*%A(\ \'\7\r\\rU\r\A\'ʤ񭁧2i *f`\0f\2\=*\BP s hza ڪ WM⃟=8 \\\\T\@ `\u\vx.\$\0!\0\n\0\0,\0\0\0\00\00\0\0\0H*\\ȰÇ#JHq HM6@RQ!$\\\\0hA:LT7d\(p&T90C\0@1A N\"\D?J%h\\,8c\CZR\p\A\rI71\D\\'*.\HT7\\(RīEN\n+x\pRa4HEr9b\o\;*E\p\\"t8F;%QA\\ *c8CҜ\ Y q\#G( HtMq@4|\@y \޵\'pϟ5gw\\\_<@\@\`\QDw R\\\")x@/(\ JB\Ba)lP~7\\E 3\\"<|Jt_B\1#.^4B`J\\\D3`Q\\1-Ú_\\0x\n`\"t\Z$\W\r䙧@BF葆t-b<$D\n%Q@J@\¤y\%CwaD \0\ny*\:\zli\n.\\#@\D2&H\%K\"\0$\2\f>\nC8T @\rIBxF\d\`@TA@\\CXp\\\\A\nFK@?\0\r\jl*!0?A0q^/,\0l\\0;',0,NULL,NULL,NULL,NULL,'','MAXKEY','',0,NULL,NULL,NULL,'0',NULL,1,0,0,0,'',NULL,NULL,NULL),('1327c121-cfad-49ba-bf61-afd3a1e09d5c','LTPA-Cookie','http://tokenbased.demo.maxkey.top:8080/demo-ltpa/ltpa.jsp','FINANCE','d6227a3d7756c255874ec7029678b8d1','Token_Based',_binary '\\\0JFIF\0\0\0\0\0\0\\0C\0 \n \r \Z\Z $.\' \",#(7),01444\'9=82<.342\\0C \r\r2!!22222222222222222222222222222222222222222222222222\0\0\0\"\0\\0\0\0\0\0\0\0\0\0\0\0 \n \\0\0\0\0}\0!1AQa\"q2#BR\$3br \n\Z%&\'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\0\0\0\0\0\0\0\0 \n \\0\0\0w\0!1AQaq\"2B #3Rbr\\n$4\%\Z&\'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz\\\\\\\\\\\\\\\\\\\\\\\\\\\\\0 \0\0?\0(\n(\n(\n(\n+\Z\'ouZhl\r\1`?L\\4֯MunC}\U(K0c\4QE\0QE\0QE\0QE\0QE\0QE\0QE\0TR\<\"fc\0\I\+\M2\uZ\\\rc^\\;H\\w\c\\n\;RР\"J\GК`H\r\08\0\h\vH\}\:٣o\pI\%cy,f)\<;0k)ɀh\\1ײg\&\ɺA\g?2C\~8#(\0(\0(\0(\0)v`I\'\0\nuy\\hnu\)\c\?\D{\3\\ZIܵ鑶28\w?\\\EwO\Q\P:6§O=Q\\\xQ\\$a,J-쳆P\޽CHuih%\g.~ae5\\C\Z\\ZE\0*\0t\0v-1\\\O6\;\;O8\t8\B*\8\y\0)\\\m` Yw@Q߮sӊ\Z(wH\\:\b >0G\\\i)\#N\ϰo\:\Z(\;Y\\\h\pAY\\X]\uk3E&Ӳc!\ه\W\\Z>[J:gC\\ w \wf2\Q@((-\Y,qf\'$\\:Χ&]\\,\0\nU^\\2\\ZOh\k\\ّ\\\"\\+[x\8bPP0y\\M45\rQ\\-\\07\G\^@0(QE\0QE\0WP\]\\Z@\'fѓ\\"k\*#\e\Q#\̕\\n5q\\2Zռȁ?Ǒ6\\F\+D\Ub?tM-q p{\r?U{QLAEP\\όR$F!T\ rO\O\ķQ\K4\ \ܣ><\\ڋj\ı\\dRJg\M\oL\\oP\o*Ȫ\9\r\ZX\\1pb\0\q\fa\Xd,edO\'=K-ƣ\tQ+2E#8r+\k\~i7\M{qr\"`\&UU,Fq\\\S$(\0(\0\\4w? 5EY/q\'>V\0\Mz|٣\\ڽo\\ۊ\6[\t֯2\\px?JhQE\0QE\0V->\{ɛCH\\ ժ>$UtgܬDU~\`=h\nn\\kNd\F$\0:\X\A!\\m3{m~\W|-\M.*\[\2:F%\HgESQE\0QE\0W\'\\r髩Zn\\P9.}GQ\yE\0|]_e/\flLg\?\eWҢ-hĴ\ݔw\\\\\i}3g{oZ\si2M(\r\]Oó,.6\\/ \\0U\}\\rz^SJUMJ)l\X$g\~4\c\)gW\\\\\tZݧeU_*Q\y\0\\Q\0@t\"\\MI\\9,{\\\zrڊN\-\q\\0\\iQOV!#۲\P#\=ZڲͩS?\\\zx\s<\#I,YݎK1\M1ٝ\ݙff9$\5sJү5B;;?ઽ\=Qs\\z\Vh`_y<\'\0\W\p\n5\ncgÖ\\ZҖ\V\ߝn\$(\0(\0(\0(\0B# םx\W%\R \K[7\0d\0 \F>gӯ4ˣm}m-\d\\g\{_K^\\z\+Jផ\\\nK^\[6=ց\\'\x\\>5(\SV;/\\5\f\r6V\'v aKtJC3\'z\(Tդq\`/\IU\\ \tfWY&^N|\\<\ns\|=\=[]d\kK#ɞe \0ez޽A\\/\C%n^C\O\+^b\n(\n(\n(\n(\n(\n(\n(2A&]i)\PA\~@7\0n=u5+\ \"HrrH\\H\+Ѩ(((((\',1,NULL,'2019-11-09 10:13:11',NULL,NULL,'Test','MaxKey','https://github.com/shimingxy/MaxKey',0,NULL,NULL,NULL,'0',NULL,7,0,1,1,'org.maxkey.authz.token.endpoint.adapter.TokenBasedDefaultAdapter',NULL,NULL,'username,email,windowsAccount,employeeNumber,departmentId,department'),('38c8a544eaa04aaeaa49d9c77ace40cd','Token_Based_Json','http://tokenbased.demo.maxkey.top:8080/demo-tokenbase/','FINANCE','c1f6adfcadd8ba23f73395f16a45dbe7','Token_Based',_binary 'PNG\r\n\Z\n\0\0\0\rIHDR\0\0\0U\0\0\0X\0\0\0k\0\0\0 pHYs\0\0\\0\0\+\0\0\0tIME\ !5\\0\0\0tEXtAuthor\0\H\0\0\0 tEXtDescription\0 !#\0\0\0\ntEXtCopyright\0\:\0\0\0tEXtCreation time\05 \0\0\0 tEXtSoftware\0]p:\0\0\0 tEXtDisclaimer\0\0\0\0tEXtWarning\0\\0\0\0tEXtSource\0\\0\0\0tEXtComment\0̖\0\0\0tEXtTitle\0\\\'\0\0 \0IDATx\yT\\s꽡\ZQ@EP\\\%\\}͘8\q3.u|\'!f\D\\\,*\,\@Uu\ܺ\2\\\|}n\,\9\y\\\\\G-\\f\0DS\\'m\\4}E2x`&M\y\\/I\"B*\\_Rr\\\_\\\\\Ek-\\Ð \Zz\aXr\\SJaY\_Tc\0Ƙh\\n\۶\\r(\\h{\i\\G>[ܱޒ),(R`PD\\~\ \0\Uߵ\\9f%\\mG\n\n9/feYIlܸ͛7~zF|夓N\\CɈX3.bbt\\\\\"/|hll\T*@EEC \\#aÆ%5aeY5\W-\av\\\m\6\3{lf͚\[o\\ۻe\QG\\\'0\"\ (D)$RE#BB hm\\\\]w\\m\eee?.>}eav\ޮe\sWw\*2\0\q6n\\%\\\oQreY%Sɲ,1TVV\g\i@PI\326h\\0-vdϞ=%}א^{\5^{\5|A{\1LXBѵ\\b&hioo\\/fѢE\i HF6 \D\i?\N\0B\\"ޔ2DA)\0d۶m]\C\~z.\\|M \35 p]3gh\\"\\\%\%\9 CȘ1c;v,5558\K\ZԐ|V+֛!\"!\"\Z Eҋ\(\jp\&\\\\ڵkYz5\~TR\y\a\Ν\w\}<\\kGH\b\\3ƈ1F\00 \SN(\OqG\nill\֖ \0)S\rCDL\)| C1atMN~d@\@v_\v#\\\\NfϞ-۶>(Nv\^I/\"\"^zX%=\Xʶm\Ɗ+i\\\_\M7\D:\"s#6ٺ\"i%C\. F!\\n\ X\\\\MMX\\rD}\ri \+ E_|1\\+\"QK\"Bcc#\vZb\\S\WX\ݻc\0>}z\0\6kl\\\WMy\Հ \0#RHK\C/}\&\\HgЯO\\x\\0Qb,Р-E\\\.B\r\ZDCC@\/ZSO=5atOT@%U)Eccc\\¢P[[ˑG\\Z\q>~XBק1SёTF&hbrRfS\\s3{Btљ|\˨V\چv\\_ǟ\\\\7\'>\ed@\0˲1:hh7n\r\r\r%f޶m\J\ԞX=bj\\I[[[\5\\ڤ%\\#QJ\ Tl*,TJaD\X\\\ߜł|A\:\|\A\u\\/l%\\\w9\+R\]\"h!\Z4h\>m\\\H\\u{^9\\\\\KӤR\#)b\.%Ur\\c*\\G\\KO3㛫?cO&H;lk\IR3h$ϼ\SV\r@+00vc\3JbjG//ZŊ`N{QP\nmi7\x|!8c\ v\\PF-|rXNG޴\\\'\f\\V\`\n΂\\.V\\}\9\c;\\\rOV%(Q\"FPZ(_t*\[ϼ\W%7~tY\Z?\e\"-B?U\/^\O }%(.1#\\\,,=^1X\ĞzN1 $ZH0\nˆH%\[\1C`P\r\lTڲq\\ -\\Zg\0Ra; d!\0v\\\Hj\AăLlJ!ɃʃѠ\H\n5\ò\rM,[\\T\ \0J!hA\\\~\q)ЉRJ] Ao$WL\\(A%p\\&-_\Ul\\ª;MӅA@)D\(U\\&h\RQA\HX`k\\ި%\u<\\n \rqhSE\Zٴv\d\BQK^*fL`p0\AD J\N\SW\}\Z-\\\E\"\]*Z\$7 ~\Zש\\\\\\ ]Ü\U\ZBE\"tP. \8R\)\E J[dv\\\~s7X\E\.(٢(\l\\\-b93EBp\\͋\r\=O\T \\\\j\\*ؗ\ 21Q\\\'2<\n\\}\UA[:\0>\\\\,9l`_m 0ThPJe\\r\WxuE :ݏ`Ojm&ߗGL\\/\\L\\(݁J\Z\m掯O\ל6cE U O7l\\e*\SyL\܍c GK\o%U1_\\_\wszO{K@&\!\4K\;G ,ZZ/_Ŭg̛0x͐\n\d>1 PCH,\D\R\R:AFfwq\\r\\'h m2V\D)\"9r&mذ]vQWW3;}gC8\>mj\*/^@dB?v\J<\@ᖕ\\]\f\\ML9iw\\;W\\\6\O\\-ܴC\,M,|\Ee\(\6ύ\+NgP\*\0\X0~ \kv\;\&\8W?׊5P\0P\U0r\\D8 \nh6551w\\\.\2<\\2\]\0s\A+\t:\rwމ\ 3EKkN;\H\Z;ezᒿ}\]Ͼ\ySaW O>\M\<=۶lG#\\0ġr\@\mU-|/pġA͢tem\rx,X).T\V\Z \\ӧ@F\\\vyABe\n\\"±\\Gu\m;3fpPYY\%|\q\C1\\!J\.\\.\t\\3}t~\\&(\u Ð?iN</ \\%glu\\ٲ\^͗\>/\\\~0l\\ob\ZB2e)K*SIv\VN\\/\\C\g0e\m!\Ũ \q2\G.ێFL&Ap \؂P\R\(++㪫B$J4SJa\6˗/\s\aX\8% Y/@\\QI J*m-9R\=EB4ƈFL#0؈!\\X\\\H\dP3ƐJ\\\߾9K C\èQ8\#$ C\8\.\G%L\rÐ\'_\\\f^x\\\./_H\̙3o4\\H\ɇx\n\㧠l ni%!J(EGT7XV\\8uHp\vx]7\ObTc\n|]-\nT\n/\'lّ%u4\w\\\>۶\O<\ߎ뺉g!\z\I(+)\\Ԓ\۩\\y\!UUU|\ _\\_fҤI\'۫95\\Q\Cpg\\fV\HEMȡ RfGbe𕍪\\\>_\\زr T\[@T@i \vQJXb#ڪDYUd%JAB뽑Y)\0)J\n\#1cF2\c̛7\ \Z4 \\\\\ \>:5\\(\\\,\{\%\8\\ /\hmc\#8\\q\2\\28\\4q\⠌B\"l;-\Z Sd\wwݿ\Z;\Bހ\n/׈m\X\kvʐ-.\ʎVca\6D\21m<+Wlٲ\nn>l6\ \8NIV\G.Tx\t\Zc z*cǎ-\\Xli4m\6\n#\464\mB-Z\kEh b\p\\\\u4n\Hi#rx\\\rߺ\IVmڍ\l \A(aq\#m\ho\L\\;뛹?+pql? <CI\r Ha\ڵ\*o}***袋0\\.m\'7\\1cx\g\0\}oET \\5<\ya\$]\\ \\"B\\\\p\\\\\ɇ\;\Zy\U,X\\?6\\g\O͸у)\Tyi\n\oYaPϩϐ,\\\K?\\+\SLr89\GE\ eЈ\+WH0d\Z\w\ЪeR\\QF%L.\\\\5 ,#\k\sWg\b\\ݴuVê8k\(.=\8>\ފ\ \OLd\6~\r~>g5۷Y_u s9\?-fĠ<\eL0w1{\Rv\0 z$K\o3{!wa2jԨf\/\\_I\F 0E1\Ү\"4y*\g\g\J3hF!FE\r\\y\\\\~Xy\-ǰ\ZN;\X\\aւ\\\0͑:n\i \˴c9Vqo\L\ӧO\"8=ݱs\bs1bP`d\\"bF$$\f1e\>CTb4\\p\\\Xc<o#x>ϭ_?\ۨV*˪\p-\3::27Ce*ք\g\(Z0Vͺ\h\rJ(\nv=\r(Hc\MwrGl7\zX4!(\> .OlZ=[\w:\Zu72.\N^\\]h\\bL\N^\$  *IUTtEKV61>\n\6k\\\\\!J\P\:0r\D\"Ji\.DK5(;ʏ,1Cj1A{\XJi;\/o-\݊\И@€͑ ۛ\c\>d)\\/C%(\8|s;G\Y\OEmqA\" J\w\co\#ƕVVVT\\\\ܥUV|\E ϰ<2\\nF\\A3NJc\\Z\\Z\0m\ٹ\ tJ\\:{\Ν%\\\Cf޷o\^CC7n\aŪaBuO,\\y>\'\_\7/>Am\\Z\\\\5\4\?>\\\4~u-\'՟\\\SFo5\R>\Dnj@=2\cĈ%;8b^`\\\r\\Uq\\\0i\zm\Wg\?\S,ZMJեt\0B\\7%\0: =\˪Xh|A @\r0a„\\r\\x_j2a„J)g}\\\\ng\=\'\"\\"aVL \f\$\;-w͚52n\8Dk[\RUU%6m \\\m /%K\0ջw\\3 g}6v\ZÇ\'\$\H hS(\0a|\A44J9hՇv^zx^˱\\4\\\+ʋ^ ۶K@\:\'c\}_\0-[H]]\0⺮h\9sx\CI5\.j$\3FF\H(&\Jv1y \@c$\\on\\8Nrgޫ*\\\rY\Ij}5AP__ϣ>Juu5\l\w\d2\\ץ$\@)7\ rPJPA\:R.ZG Lfٚ~)I8\\'? r\nAZJ{\[\ys\9\+\?`\ܹ\ z+DW\ %\nI>`\h\\ZסTyn\\%Y{)S\o3\<\?\+z\/~\ĸq\x\Gؾ};˗/gٲe\\\\f::: }뷏\u`\nVh*F|\IRL:vD\l۶MZ[[Y֯_/O?L/\J?߹Z|I\b\}\7,\\J\͛\\oͯk\&Ӷ\0\0IDAT\:\7h\ Re˖u\\\Z3\\'cƌBJ)fϞͲe˘\rt\n2Ch1\>w\\\\\}i]ar\-0i\$\o\#n\:|ߧ\}\\0y\\e((++ `\E)Euu5O<6m⤓N\\.K^Oq\$\\yCZ1rI-\2cFXx\ӧ3v\X,Y1}ү_?6m\DSSS2\_x≉Mjժ#E̊z3f\@k\5\\\CEEEI>.E%3r$!\<\#L:S]]\\0!޽\\\\c=֚}_#8t:\ԩS\;<?pRO}\G\wޡ*/\ò,QJɓO>\\\uוب6ll6\\1c@d\WUUɂ \\\\eӦM%\\7ߜ\;v\\$\{\I_|\bIV\G\N햩\\\{z\K\\ѣ?òj\*immcʚ5kdƌJJ\-++;\CVXܿc\?|\s؛3j\(yA\$fm\\SO\\͛\\?\n\0;\|$Sc@۶\㎓\[ZZZ\#+W˲J\\d2R__/&L#FH:\o\tZ?p?~|\\ \d2R^^.L&hR***OԘI=)в,ٰaC\җT\"5\v[WW\< u=\ĹC\\\-J\9\r(\,[\۷f\\Zz\!^~\\\quE\ K1ʵ_\\\jܧC\H6\tհ4 nx&!\\'*\\n@555O\f\\-ObhL\28`\@1u\\"3c j\\\0\0\0\0IENDB`',1,'superadmin','2013-05-25 03:45:54',NULL,NULL,'Test','MaxKey','https://github.com/shimingxy/MaxKey',0,NULL,NULL,NULL,'0',NULL,6,0,1,0,'',NULL,NULL,'uid,username,email,windowsAccount,employeeNumber,departmentId,department'),('3a2c3f84-1df7-413a-8a42-f3add972e0d0','O2OA','http://o2oa.maxkey.top/x_desktop/oauth.html?oauth=MaxKey','OA','74a81906a41d3a89866edc237b3ffb2496d0aaf34af60931b942ef9c37cb9e71','OAuth_v2.0',_binary 'PNG\r\n\Z\n\0\0\0\rIHDR\0\0\0\\0\0\0\\0\0\0j\0\0 \IDATx\\}l]]\\6s\N@y)\\nc\'M\\"Ī&⟊uL\Q\q,\ ZZCCP\riRa-\XPA\"1\"$(I\ľ~ѹc硚\ν\T\\9^sK\ӯz\\7Gw\S\\!S\\\n9\0+d봙pC\\\ro\\YΊ_O\>,Ь\N\\\\4?\\\\_\\`Id\M\|׎D d)-=r&\k\kD \Z6\r\\F_\r=.ϓ=z\0 \&G\"\06Ѓ\0X\Ԟ>\0qKB\\0\V D0&!\\"D@a\"L B D0&!\\"D@nl.ٸo|6\u\1jn6\d.a\WdOO\{\yda\\э\C\\Yǩ\ED#}۾\ږ|\"ݧ^+0\\WDx\{&;:\1M\Z@\Y\}&\5F\\%@a\"L B D0eY\k\0&?03_h0ه\\\\0\ZLGGwf\Hry\\_\\\\50<\.\1]Z\^;\;G\ݸP\Ziɾgj)%\v=\J\y:w*\]]\\\ݣ\Z~\\\BO|\\կm\s\cgY\Dz\\BOT\\~Rb\10\<\\\38\z L4jt\0\T\h\0\d\,a\X[\ 0&!\\"D@aJL\0pDB]4D\C\0Q;B2n)\0D$9[⯄w߽\7$\[r,M=\\;/\\\]=EcN{ϴ}`Lk\ٰc\\\W7\H|O\3[T=\"]\p#e\,\^\\\ފs\20\UAw=z\nQ}ǓĞz&\)כ\a\"*foga\"6WB\\"D@a\"L B D0&!\\"D@\m\\8\I W\\].6\\%Lwm|xt\7\j\SKz̨\zԥ$/\s \[\{^\zsY\bpC[n\W+j\\0yswt}\w\\\=C}\Z\=\\\W+.dNQ\s=*]nwm\^\>%w(…9\΋\+?m߾p@\zħPdw~fzj\\gA|3$\.vavlS2F \ \\\\nWBρ&!\\"D@a\"L B D0swyk\9\ w\O\U+c\ Z\r)\e_E7ٗr\Y†\\Ԇ\"_(}\̅ o\7J\.̞\\\\\\]zA\h\wZysbrٵw:}\o\г\0Y*̛?;>7j(\ \n\Y\*@\nf\#?\"\\s\0y)\kL\\\\nB1\lk\<\"LI\0\S1\t@\<#L\&!\\"D@a\"\&\\۷07 X\l%\\3`y\\7\r}3X\lpIs\Rf?<\Z\9|1\>|\gB\\h\\N\/N<za\\4c\)w]\r=\R\ox^noI6޶{^\z㾲u`:1\?.o = a\I\>=9\J\97|\͟:;E a^%}\" b;(B\0,F@a\"L B D0&!¬ݴև׵ rH\p8 1 L\&oѮ\c4s`\z\\I\3O=K \k\|sț2J]G5\L sk;F\;$0g<\7\7!\\"D@a\"L B D0&!\\"D@a\"L B D0&y.\0hؗ\nbY\K\\\\*\@P/c)\n\\K\^\n=-݇\})KQ0Su/K>ˑ\U\g,l}*\ܾrܛ{{\Ƥ_wW{BυK_SE9R\+L\\\B\d0@3!L B D0&!\\"D@a\"L B D0er\Yy\\\0r)\Ss\\\d\\}G\\\q*\\t\ݘ\Z@f\QV|8ݧ^\:wx֋̹hÖI \nc\5妹#e\Q*\ 7|\r\\Xy,!\\"D@a\"L B D0&!\\"D@a\"L BIWC`A\d\"ӡ3\lhtfv\"qC m2i\\\N@py\\: \jI-\\4z&f\\'ʽ\%Cۧ\s͆\rhJE-sr\`\ZJv*\@IO_Uږ6xnRm\Κ\]u 4e봙pC\^M_R.\0\0(!dA\0\0\0\0IENDB`',0,NULL,'2020-06-28 08:58:42',NULL,NULL,'','兰德纵横','http://www.o2oa.net/',0,NULL,NULL,NULL,'0',NULL,18,0,0,0,'',NULL,NULL,NULL),('3a93e28d-558d-4dc7-a3f2-9bf5255a1372','人力资源管理系统','http://hr.maxkey.top','HR','55738fd06aa1dd42d373f3c571adcd39','CAS',_binary '\\\0JFIF\0,,\0\0\\0C\0\n \n \n \Z\'!%\".\"%()+,+\Z /3/*2\'*+*\\0C\n \n ***************************************************\0\"\0\\0\0\0\0\0\0\0\0\0\0\0\0\0\0\\0K\0\n\0\0\0!1AQaq\"#26RtBrs\$347CSbU\c\\D\\0\0\0\0\0\0\0\0\0\0\0\0\0\\08\0\n\0\0\0\0\0\01!24Aqr3Qa\\"RS\#bc\\0 \0\0?\0\\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0cnw\m\\1\|bm\"$mV\\O\ \\\\\3Z(G|J\n9\1!\ĹU\\rW5 [5\\ϖ\0iw\,]\"\j\Zz\fV L\[^ȿ\\\0O\0,i*ImFF\}qi\\0\EUƊ+03T\JƼұ[T\\\\\\7Z)\\\\Zr\+\\\@PPb\տ$>dZ|vI%H\\\tVܧ\\\W% \1\;\S%^,\\'\'Z.\ \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0u4fCw\__\EZ 64;Qf_M^ϏP\&\[D\!k]\\⮎\\"vjƾZK ە\\\s\\\\\\UsUS\UU\\UU]N\0\0\0\0\0\0\0\0\0\0\0\0\0\z=V4sW%N\Oh\w*luߞ[c\\\{H\b+}\,\&\D~Ƿa(=H\\"{msW%E\RgaDzĭg,{*\ZS~q\Mdbʞ\Z54\'m{4S\\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0b\Z;\r6CIn\:O\,PrQ\\Z#\\Oi\Jzڗ\UJ\fz\\;n\^\ou\\lKUy8賫1\0\0\0\0;v\5]GF߽\\\J(juƿ%\\\0\0Ai\[4\*\J\Ώw3\\r\+OkDJj:x\"Dd2\8d\b\\Z$}SDDL2C(\$\MT:拹K\\k\'\"*s*E\VPS?bLAhW`=J*ӶZG\ݚw.dn\\*+\$}.\\&jJ)*\$OfF䧈\0\0\0\0K& Tkһ^.r@\_/Ih\ow\D\9?I&/O\SG\A_SleU⛕980xwS\\sLby\s:\P\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0O\"Q\ǫ%d\\w/G^\X\ھlM\w*\nꋕtuזE\W\'N΢j\Q#E\\r\U[L.L\B^\\E+,A,OY6\FfD\\\\\BX0\0\0\0uq\\ʱM\Z\\\'la\AnQ\GhW:\s\\cvOf\j\{xv\\\\\\\Qwxq(\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\09$lQIcQ\\\.\D=6?rq6\N\\"#\T\\\r\\\\[\_}:V4~L ^oizT\\0B@\0\\*\ͥY\U}\':1\\o\\IF\i$]빩\WVJk \vK,dw?W2\`ô\ZmXމ\L\\\\Nd\3 \0\0\0\0\0\0\0\0\0\0\0\0\0\0\$l72V\rd\3EC\X5\}u\T\\Eb\Nt\"%sp\\+k<®\\'\\\D\!(`\0\0\0 \sF\\ꍕ=\\\=DT\\\w*Ad`+\\(V\P\Y\8\~t|ݛb\0%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\_\r\5eB\-\TM\̉\Rr\V\U;\\/\Mtu\\\D\K)\\\0f1\\\j\TkZ\\UWrI-ީE\]\'h<+bg*\"\L;~\\\N3\\0\0\0\zvU\kU\\l] VshWD\ԍ\rm\)\A\mƹͧU\)\#N\ڽ%ܺ-G<0v&N\\ESi\\\HjʪڋsJlN\\"uqniAgx,\64k\\"\"dɁVm\\\\,s\~}j<\:m8\\\\1h8k\\xdqn\_;ir,o\V@zU\\\M98\\q\iʕ\%uh\ \Q MI\^\ץ,\Sy5\_\'\k\\Nm\\\ý\:\kL_6\E+&FY覭\U\?;=|Ǟk \\\\ݴ0-\w\۫$WyZ+н\u+\ik9 \'\Z&5>\\0/\V\Vhc5@\0\0U\\\;\0*a\YFȧv\O\;\\\\#E\]CŠZJk\+rr}e=w\gKGP\͏\c\HK\\0\0>e\[U\\n\uvj\;P\0-LUTӻZ9Zj)\BtwuY\JT \GUvbbP\0\0\0\0\0\0\0\0\0\0\0\0^\\{\\Z֦j\\ZW-\v\\\fevu\\SXU\dUoCw5;>0H\0\\\\\ࢇ=i\\L˞**H۩MF:\\ԭ\+}?3i=%\\;\0\0\0f2(\kS7*HΥ)t=\Y-jgCH\F7zqiG>\S-\2%թg&\")ǝzmfUeeNJ\ش\1\Z\\g\\e\cr\\0\0\0\0\0\0\0\0\]%\a#Jb\\\s|-\ose=Ǝ:)4Y1sG!\GX\\/pm|uwd\U}4\\N\\*bx\j{gb\v\ZU\\\ͰF\ƽG5ɛU4T\= \0\0\"\Ɨ+B\@\\Q\\ܷ9>\P\0\v{FA7vb\\02xzⶫ-VL\ԓ\.\{ yCo.-\\ 7G3ݭ\"3zgݟhC0\0$\0\0\0\0\0\0\0\0\0\0\nI5jTThKX\\\*\'Pc;UXγ(U\"DW&\T\̉M3V\9h\,և5/%_\\s܍bf\.H\y\?\C-P\\1Ȓr\ڍMo4#;\\e\\\\x\\0\=Җ/\\=`J:)U\n\VF\>stA:{W9Q7ɍ1&+W\@\,T\#j\W\˻\Ѥo\\k\O9\Z\֊\GgH\.6f\֮sO\\\0 U^z|\n\n\\A2~R|u B\-U\SKu\9LJcޣ۶\"\^\y_֫\\0_9\0\0U\)qL\jd\_^i*\rZ\\nn71{\P! ,;/#m\\/\\Z\\cOj99*\y\J\w*y @\0\0\0\0\0\0\0\0\0\nk6\\x?M`\޽^O;\f\0P߂eo\E\\T-~\(~_\ǭ_\ 6(\0lNN\0\0\\\\ҟ.\r:fr4\\]?\\L\Bx\\ݗ\\`\\\\\l=\\\{3\\ϓhp \0\0\0[5Z\g\:Xڍ\XDv_6qU\ry\\\\\"գw\z\`gDrq>\ꌺ\|L\!.\t-~j\\Ʋiԉ]#7[>`\\r=| crP\0\0i-\\;W\'{M\F\n\\\0\\n\0BCNE\T89jfqT@/f.lj\ᩓQ9\\0\0\0\0\0\0\0\0\0\08রco^^\'\ m\\\\$+\ڸ1\ka\0\r&Z&P\\aHi$7z;3\\X\DsU\*Q6&\\\\\\\g\\\^%\ifi&\\Hg\_;y?\?*C\\\\\\\>u|3\6\ʾ\02w~U\z_\\[N|\\\K\Ҡ,]*b\>&\\5Rΰ>E77$Tn[\9\\1.-\k\n.D\O|r\\ݗ\\`\\\\\l=\\\{3\\ϓhr\0\0\0\0܌bʈX귬Sq\g\\M\",\WZ(DfN\]D\kxG:\L\\\x5UՑ\\o\\\ CtkS]QKLg\\FT6mK\r\u|D5^-f\v]N-srD\6 \Y\5\{/>+\]qkL\=yv\c\<\\\0?j[^XI\Ls-zP[竗ц5z䛊E:Y#\'\\k\0\f\e<.wj\O\"兣z%\Y656W\\\0J\0\0\0\0\0\0\0\0\0\0pSX1W|\\\nk6\\x\\\m\\\5~\n\0\0\0\0\0\0\0\0\0\0\\ݗ\\`\\\\\l=\\\{3\\ϓhr\\\k**lT;\\\-e\Xqp\+cy\eᨼ;4\B:_W\\xYj\j]9Yff^[{>\_96+F\t\x5t~\0 r\0\0\'\e\4&\\\3ڽk0\\˒RۣՍz.IҼW\r\Xn \Anf\JI\H\.U\0\\ru\k\j1(v\Z\\\]\MgCACG F5\μ\\O\q\ZF\U5L\;\\\0\0\\汪\5L\Uv\"\\)\1\1\r\\D\\\\\V\S]\y\UEԅ9\0\06[fzdǛ\_\\D\8\\͓vW$.\0\0H\0\0\0\0\0\0\0\0\0\0゚z{\&\SX1W|Į\\G{j\\Y\ \0T7\`K-&!\ۊ=`9\W6U6\eo\E\\Tو\X;BĹU3\3\\0#WUܨa_\U\0r\ig\U9Wʏ\\_*O\\\0~%|\Bi;Z6\ZY+V\I9IU\Z\..\r:fr4\lbà\[\¦μ\ \0\\\sze39={\vq\\\\\<3\\܀&\\\.\\ئ\6k\S\O\E]\\\Ӹ\UݵH&\^\jߜ\L\\\\L\0\be\\(\7\\bf.TESj柤\\08ޛJ\'M \Z\n=\G\E,\\DV\M<^cq4Γ\\8M:k\\\U\n\N\x\Z\˵yץOq ў(\\GYT\\9C>kɗ\O)4\j%w9U\n\J\'\\\0=\0\0 Ƿ[U3\ʋ賛| \!\b\\dQg\\ԜJZ**W+\\y\0Hڤ\!U˭#&@\Ҕ\$O;VNis^\`y\!D\k\kZr\0\0\0\0\0\0\0\0\0\0\0\5zz\b3؍U\\\\ՙmr;j\Z\r\V&\0\\Z(\s>cvl\,n͹4\`\U~O@J U\KcY#\E򞿇I\]Kdc*̶D.^[\ʾ\Ut}Ul$\\\\D\w\\\nϫ~nvƷ\AB@\0\v/_\jիLݞ3~\0\xynu]V\\\ݱtNIKD \0\0\0\0\0\0\0\0\0\0\0\0\08রco^^\'\ m\\\\$+\ڸ1\ka\0\r&Z&P\\eHi2\7\\"\\*}m=\Ԯgɱ@brp\0G_\\\Y/J|4\\%iO9ݎ:?9\0*3#׻/\\ݗ\\{ӎ.gV\&\&\7 6W!\0\0y\+UQS,\ ⺪$fT/-N7.\\\\Ӱ٥Li_io\r\ \0SƫUn\k_M;7)ko\\\l\\\P\\C\*rn\05P\\Lױr^\<T\4\Gc\~\\\n\\Z6Ʀjjf8Q3W/W9\\ju\\\c]P\\\)ïQ]\o5;|tՕJ6lGU2\\dM\qr+\Z[\Z|r\9\W=\\*檫\0{c\0N\erm496R˖\7\\~\\W|3\ؠ98\0ӯ\o>\\\Zu^\\iO9ݎ:9\0*3#׻/\\ݗ\\{ӎ6gV\&\&\7 6W \0\01F\=rd*\Z\)\(UyZu\ʹwmN\^_\it\iu5Z\/J(\-rw&;Kdfz^-5OJ9>\\0\[>mj\W\2/\9ڻ\\*9Z*q+\U+z5zp\\o\0 +O\'=Gx\\z#&\i\쟄 ٣B\e֥=#6&\\\X?\\J\.=.\6\\eoR\\MEEx&^u^*\KdJzF\GzO^u \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0׆fcFq\\&\p\6#\\\\ՍU\1\\\#]/hzɯ\\4ߧݩ\Z]\5]컸\~F?\G#\&\\0?\05#U\˻SH9)Kw\\\\E\D=хĪ*\n1xG7\\kӍ\0j\0\nNMe\|仓?\e\\۹\v\\\pǗ\\\`^\\k\q.ޜ\|\խ\>}\9z\33\q\\yR\<)s`90O\\'e̓2\ÍyR\<)s`90O\\'e̓2\\f啤\n\PD-\] d\\/\\/\\\Gv\/ml{1\0\ WK9e\z\\tge03sh\J{˿\\Ib*\\q*cbŢ~\;i=;0^TVA13]u\l\靻\\Z9\Ӽ\\\^\o^w,}!L\\!\ <\~4\\q??$^\ yQ̹ ҏ\8$Bjs\x\'W\C1\E@g\\-n\.( f@`\IĽ_r% \p\H.QughH3{ǹn\\\\\l}n\cc\2 ٳ^3\rY\\E|\\n\ӹ⢳h,E g\1&~9V~x\\\ w\>\VZ_\ yJD!8X8|0f5s8\_>ƽ=_s&UMjRդ\L3>1\\~ F,+~ \\5:\n)f,\\{&Xuxy*c/G\\\\KjR6APSZ\q|n\kobo7%.*],v\1 5!Np!Ò\\rx\\G.mpѦ \\afh\d\r31ź%hw\jid\\bx3\5>or\C>@^,\"Ԥ%E;\y\UCj`\0f8{\\ /^HJeM\0x/\\_\\r,ZBh*3f8$9\s\\\\Sje\0(uP\X3\kV\wƞ\\ )_\\>\IVBAMڣ]/\϶0;uH\\I\Xg\\Zy\z\\\j߼6S\w\[o\C瞌YQRv&< ې+R\'y V\Erd\;\l|\GXbSU\\Z8 z\tDqU M,:),/k\vn}\ \Td$BY\Rh\KUuzv\ν\A{||a\"u\<63\E\+\"\\\ #q\ڥ\s\\!I|\G\jR\Z\&\\uYf,pyF\88\\\3\Qg\`8\ \KR?`7\I\P\{\V\+\X X`O\y\Rc\8fFF\\\\g%\\r(\h3\B\NI.\(\ \[\w\\Ƕ! \3o\Й6\'/~\n\ZM\x_Ч9.\\@2Lr\ZA\r>\\q\\;\j\4`\I\,\ҳ΄n\\j+|qt \\7¾}-nAT\W\0\0Si$:4ä\0\A\Z5H\t:\\/Ì?M\pH GȸvJ\ed\ N\\r\\0\'u\\zSrd*t\[\b[\D\\8\np\r.{ jpB\8ᵙD7)f\P\`Tk\"\pN\S 7>FhD\\]+\TI\=/R\\\H#G$\ \\>޾a矺\Յa\^:\\{slc(>\-z\,(Kpq\\\"B\ \@8P\6;_ރYb\* \Z{\z=\{\\n&W~\\ng<9AP*:\!\Wc\jR\\MԴ\\"kd\\v\f*D\\\)G*\\\.+K\Eړ\%o\̀նe\\=8\)2c\+! w\CBdJ&>x_p\v&M\ TXQ ct\(X\p850X\\\ݛ6b1b#>7D\Z\ۓwxܷ\\,\\\nU;r\\5|\ӈ\\f\\\O*g]\h>Y>Ps\偘⭃\nZ\g\?\/\\\֗\\Z-PF\\\[\>~y\ ,]3\\!*+.f\J\{\\\r\ml\ HL:v-?e: \1KX#GaU\\ \ɪei[\\իȲW8Jx}\0t;]6Z\g\\c!>}\\ ~ \mw\" \'@RL8$ 8g&=\P\=TKW\`y Sw TN\\\\%^:jb\\{)\r!Z\jzNgȩpD\Z\K\HQ\w\\.4>FR\\n\n\"\pJ\\cx\S_O\M$TJeYIiOO\MR8\Ċ\e=\\ϼO\q%#\\/|\n\.p\BQL\@9\e\nbqA%x\Q\>(B?)\n^=d]1\\"w1\"t\%\\_pD\\'ň44 \?E|P\ϗor\^u\j\L\)!tph\xk\!e\"\Ώz\Z-\\'i-\\gѠ\;2\lC\'IrT 2\K/LNu)઒O\\\n\\㒳NF^\:@\TV \pWp\??|aZ\9\0\-b\\\C\t\lQ8\'2=^A\!W\\Н\ñ1\>v/\\s0\ʜ0\(\\$X\j\b9*Srֆ\_\|o\w8e\\"ljf%ӑ]B\(|\\?]V8* -I9](\2\\ \#\d)\\\,e=^#y^\m\O!\2$/\"ue+99\\z-;G1+T\r\X\7\nT{\/L\HAw\\N!R\0e*iX\\gSN\[\\s \i$XHRBpН!5\\\\\%\Hx\ɑ!ѲwH]\e8/(\vB\r1!DHq:PiYB/K}\\;@2*\RNV\s#x)!eh5)k-\7L\".IE\ \Zf\>w\C|t&:\6\px&%$hϱ@0R\y[~\w jM=\Q\T&PH]RJ\HڏNE\q \s\#\7}CP ) lu1{FGض\vN-l\\5\\\0VO6\\IdM^\=\0\0TuL9k\\01 \n\\m\\1[0\\\pMӄWCTjqu`5\\e7n(\a\>N?k?b\t \П\\>\ Na8_ ݌\"/ȃC#o\t\\"6#W\\Osb\'UĤ8 \-*y|]H\\:\ ^D=\\\ru\$\S8Dxb\+\\\\\\ ߙFIΐ\dTjD5\9b۳\pQ\\\rdK#;\()\-\7| V\TU\U5Ĥ$\(4fx\@\\5wr]{v. Q\E\>\)s\\r\Vab^\\Zw o>~-qzB\`Ww40\\|7\\\15@h, \>Ox\&\98V|PP\QP\1sˑ\\I$Y\ݓd}\r< [*KfXX\pL㣉o\\v_KU y\\u\=\8\>Q.Wd-P)T\\9E̓k\| Є 6o9\N[?\7a #H&\r*5R\ɵ\\.~f\\HfXCguV@\h5\Z5!N@\V029w-Hel}b=\!U\h5qChU_\r\ZK}tN;l\\'MJ\V뽾9P\L~\\"~\'\\5+\F\D -pdD*\XQY\\úS\\q\t\#tۆ+ Y\Էp\\`\'u9\\f AU\_Pd\@\\9,AL;O3\WO\n70\-&+\R-\\"Ft\\M:{q\ۏ\~Xz*@\Sm\\r/\w]g\\La@rz|VKv>ddEɕ\u<+V sC\r6pI .Ç \J>\w>ypDb!\n\U9q0%\ϢM|U\DE,c\fբH\rc1C;U>bJtt`#\~\n\r4I:\0TzY#\r2 \4\\\\=\\+7\Onc3tZZ$\\\pPE.=}3\ݱWFaQ\"\cxۙ\'s\)kbI\``\lw]/nV@AH\6i\MrR9C\%CXY\0 8\i֩[ -[\b3x\\N19\V\\0)\{Q\j=d\ul޸mF\x\Wؾg\)\yDXU`}4\>xɦ^ਲ@LE\\\\r1E\2<9\zD? \ר\"[\;p\r*yO0=ΑG,g\\}͌N\I I$F\\e 9qx!}\Z>\ \ՑZo\e\ZM \6\*\+OL\{RC,KrO\\9P1!\[\~ UG\rM\\\^\\IvMgb[\\\U\r\4V,ǰ@J\\0!wIW\\\=գ 4Pu8\2P#VaH=_PA82\'=\Rrн{ˢ.T1|=Z@E I\cB\~,=;7N\)j]\!eĤ\J/xKd,G \\\\ގAL\9\Ջ\Z@Jk\\\"\{.\Z8rBf\0a\\\uo2)\\\Z\Z<\nx\uJ\"\\48ճ\:(@R\pAM^%x\Ũ\~ת|œ\\\B̃:*djxڦ\\\EN;0gNZ[\PsXJ\\\y&=w0\~_m\zN̓2\ÍyR\<)s`9HIzo\0\0\0\0IENDB`',1,'admin','2014-09-16 13:56:03',NULL,NULL,'','MaxKey','https://github.com/shimingxy/MaxKey',0,NULL,NULL,NULL,'0',NULL,17,0,1,1,'org.maxkey.authz.cas.endpoint.adapter.CasDefaultAdapter',NULL,NULL,NULL),('525d261fa3b04d19af0debabbd5a1e2d','SalesForce ','https://login.salesforce.com/','SAAS','e8297041ca3347987bc739a2c9f33e7d4909881759ea590b0c091d4f645202e71e698f87c64032dc548d6ec7dc3c4863','SAML_v2.0',_binary 'PNG\r\n\Z\n\0\0\0\rIHDR\0\0\0O\0\0\0@\0\0\0[b*S\0\0\0 pHYs\0\0\\0\0\+\0\0\0tIME\ &\\R\0\0\0tEXtAuthor\0\H\0\0\0 tEXtDescription\0 !#\0\0\0\ntEXtCopyright\0\:\0\0\0tEXtCreation time\05 \0\0\0 tEXtSoftware\0]p:\0\0\0 tEXtDisclaimer\0\0\0\0tEXtWarning\0\\0\0\0tEXtSource\0\\0\0\0tEXtComment\0̖\0\0\0tEXtTitle\0\\\'\0\0 \0IDATxg\}\z\\\v\\\ᰊ\"\)S%[\U\F^`\\! `{ A\0\ 7XdBI%}ȩwn\S\\ %%6 νs\~> \\`\\8n.C\\\Y\׭C\!\5-Nx(w˙B8H@\-w?{\}Mi\\Z\+[\^\\np\fC9)n+H-E1%\TuES[d\"\ JbCXK$\%4%\"H\\믱~f\!jw\qcFA54E\܀4\\/ \A 8\3wCoAͷ\˛\7p,Jv\|lzI\6(B\Z5\nE$(g!ϡjڛI0k~c~쳜.>\KXY\u@<\0n^|\?\'8\\\c@K\!h\!\n\/n\L:\;S\L\R8^BB\Z\n*[\\\\ \\ـ-\7wv\1e\rXB \`EF\7H o@\  HPh \,xZ\\\\O8@\\75q.shYC4y mύi\1mfLtM\4D\]\3\\c\\\\\\,U\I\\֛?\\\"+\Z<\ZG\;\0$\\\rY8h\\\΃Ӭpn=\g\n!{iN\\ \\\Y0(im)%\>3I݀\\+\Z\̵|\\Z\\"!\+B\ \8\"XqSg\1 ꒨j\\\B^å\r\|q\\~\Rs`8/{\\HUV6x\\/s\8r\rEx7\A\k;c\rBh\\ \\Z\η\Z\R\5䝢w<\ʆX(Ph)-v.]hF£% L;#\ll\\x\[\\\\2ISc\ZcQ\8U4!vG!G~kw\֞2$$\\A#^)\\Zi$\ME^7x$*H\7!䦶}G\ $!A$@:80Xe\!Y1\y׿8O|\+\y$!6o\Z&bfjmPA{K\\n%\t\\H\\'Y_\?}\շHV\v\\\69\n\r7\C\-\n\ (AXMM&Xua\QB߁ʽB4M-{d\vi1DTk4\rDM tޔ\}ןyU\ZQ´2t{}3z.NX\*\' 5rC}+z\0IPN\'՞\\/~\.\\>\\\Z\ZO\K=0iqBGaЮD\\ƻ\\x\%j6\5\\FK\\\0hu\\þ%p\v\\Bd (f3jאv#F,XƻWH9[W|\ˏ􏞤8w\,Ǐ\=}\\nZDC\'<\D\+?{I6nإ\\p-\,a\%\&\XT\eAHEPV#\\Z_\xo(\\r\\Eε:\,}\  $ ag =~M\܏a^f\K\\\'?\\./r8\r\\\\{|\n^pX,jq\j@uPF\`*6G9eBGPRaYb=ŵmWy\]!MIR*Jo$\t\z+ \pr\\nv\*\E\\Z(Y\:CXs,.\P\0E\Q;\\\҅F\ZK}<\r[HL\\\O\ŧf{k \\\__\9|\!B8z\h:Fv(PS G8ApW^ߠB\Ay˸ܧWL8}+\,/ JWc(EY\d\r> M=$NZj\[ThёEقbz\\WY\2H{8cp\6Vci \1\6ho<\|\\\`\\\'\\.ƨ&&\nJaX9V\N\2\FjM\$b\W\0FP/\WNI\4oeO\=uha\ u\u$E6p_k}#()Y\q\=l]PW*3!ӞroH 4LTIABI]koѣ0\c\\\|\\Xp7tHz\\gy\~FiK\r#\\\:A\Pgj+\\'\ǟ<酷8\\LM\\r4\"Bb`I V5\\n\"}\Zmͳ_{ӿ;$߅˝jo\\K\^с# AY\Zg,)#%=S\_\+\A&= Fy@U*#\'yG4\1+\) \buԦdMu@%&\"AIl\\xӇ\)\VD“\Q\"vim#bC\L\:\"CaD\B\U;<\\=^\\ \¬o\\\\+/R\l\YS]\DxQ*\0\\fBu\\(i8,۹Q\Hn\re *d\\\}\9H!\bQcqa\\z f P[\"$\qN\\fS\Kz\WSQ#=:\rI+v\>Zj>E>P䑇\\Ns,֖\\7fcߺ\+/ Ѕ ؙYȌ4B\0\\R\nz\2پ\?B~G)-i ؛\y!y\r\'o\\'\3)\\b\>q\$\/\Ե+%\{\" s!\z4\[~\3{\r\"B0\S;i<آ\tR(aAuMs\\& VC\"߲n\"\;C\ǟ \_\\\-C\n\láCI\\&1:\'\" \ي\zB T=tD\ko\|]ׄ\A\yDu΁\$=^\ O| 7\#\ *\Z-\h\=㇑Q>\\&h qH\_Xd;ϹRl\0\%\\{׽ϱx\}\GS>Y}8~\5iȦ4\O\')vk\[p \;\!\n\\Zv{t( \R,!ZYg&eA(\!\zi{}\r:\\\΀\AM+6׮^\ҕ+( 1/\vᶓ\\G\\ v(%T0\\ Qz<G:\0\I\&fa\\$\"8s{`{~?\\r*KK+w\\b\rLw8nf\??\\}\ \o5ҩ\\\ѕ7\\\\a +\09v6\V9a.B\tm\Ë\+F\o\]\ѵ\\g\\lB\'Kw%i\0N`G3d\P\0\XXAB,\D=3\1dt\\i\s\8~\eq\\Z %FV\Vy\X>q\\wQ(A8~Ҩ\tw:\ࢌ\"\\iD\\C\\poAc \n\b2FQ\ Ⱥ:q\'\'-xRH%C7\\\ޅK jjGb\MQsۃ!W! 2H\4 <\"\X%NU QI\D\\V \0l.\\0G\M\!:s\'\\\ŧ^\\korl\CS\OtӺ@(\\.VT\\RQ)I!!\\\uƻ\8+H S\̆Z\e]TQȖ\Zs\o*P\?b\+J4\ IH/Kq\60AQ\K K\rm*Z\Q\G\ (\C4w020U\S S䌷w\N\\=|\l}Nmn?u\>Nj} &-\{4}h\Z\"*)6uD*A8h: \\ZRc#VcIg5ÑSb\M Xy x@ij\Z:p\\;ɬhRΦPIk<14\r4sSGӐے\YU36o)LA\\n\\0$\\I258\Z\Ր{)#\'\I >\oѿ\}T0\r׾o\\$\\Z!Ѯ?3C\\N\jIUJX:\` k``V)1\\\r&/n\E*h(\\D1|wiD\n\|\ \]}ݟu)\\\W%B2Љ\"YN\\n\\Pɚ#vاS-e>\1\HɄHǘi\ר\>{{3:\)TJ\\0A>\ R\\ن\\0]\(P\c \ \_z(bo4ckk\ֵݛ\i\C\ZT\ B Tw~@֊i\nO~\\ڵ6\+T `^Fв)\pG$MH+\y͡>fs\)\"\\wa\\Z\\\ōhC\\\ \\L R1\%BKE i]g)\٘\\.!Dt{\\9~\4\OOm[p(V\\06Y\PU][\\GJH\")\MC\[Wq\\:\\Z؜&@\nMd5B̼XIZ\Ż\0G*5)!\0*HT{(\\Zʑ%q ꚅ(\\G\\ҳT)Ԟg6\9|\QXԌ\./Dq*\\u\ZM :]bMNF\\&;AS`g{4 úF}\\':\Y\"[ ;Xim\H97\nlCu\\&d5\O ^~\es9T\' -Xh\nJ\C%\r\TcE\rfE lc(gS 4-a7!(\'U\ng⋈\rg\BWw_\'\\\\\\yrEyfgݫ\\'DK=AF9*Si\\WNqij(!\rt\x!J˛\!˶q@ymȦc\XK3R\F\$\6Ӫ`{\B@:\"\\n0 +\0f`rȇ0\p\ReD\\\\nU3\&L,\nCmc!\0G\; .Q:c1*t\mp\\\ZE\4\\\ԛo\g\J*B\%%\"@1mjܬ8Bt{}\lN\Z\\…\\w\C=6 \v\@VidXHChƻԓQB@m@6hcɧc\Ś4Ud^<-Z\UJP{8ŝ?\\Ϥֱ\Z(\DKۜ\e\^\Z\Mvl\ \n\vb\ )ZL2G\n\4@\\6\\\\"ݤ3A\ʂZ\" D \\>i呵\E\\\vU>\ݷs$\=\S[%~G{\Q}t@\\HE\a\LP\ (El\rkv\%Nh:ML!\ʄHU@hms\\\M\s @\4n\}#\b\H8i]\RԶ-hI)fḬ\\.t.Ëop\\\!\¸щf{gt\zsٵ]\~\R_c(Gc\"X\W_6GCЖ7\rz:$3CnFo\OЌtS\\3m6Yaϥ요Y\cR̦V\s_\V\Ep~\\|_Y\Zf#Ρ4L\n\a\0aS$\tL\cO(E3\m**U|\9wWBS\r\eP8K=\_\#\\\\ T\\'\ I_;D>0|i$I25n\+ 32\.\AEF2\ -g\\\A \<-\hmpt\\ ĝ Pj\BBm,r)\7BP5Q\\\\+\,\Y\'W\"u\R6\W\\>唾ѮѴ\7_|L(}@\Q<`q8c4*eٳ7/3k*e\\np|A\\\\ =\\\bqi:BQK\X)v\\]\8ч \\\W^{\l:$\b\9\i\\.{\\\0\aU1N@\aCE1\Z}op{m\\  %\V|nr\\,66\a\+\\\n \n#OtIk\0\0 hIDAT\\KDo\r\^K\N\\RWt\0I\S\\n^!ae@sS\?gg{C\\S\VlŚC\o\|F$ wL\\*\E\s3\"$\" h6B\D݀Q\b\';Pw\ٗy\d\;\"m\&\\\%\C\\\\\\\\\g|\c wv\\ڦ+\q*F\X9|K\'=,\ZtI\G1XXDmoE9\z4u\$Z\\\\{\ǥ\4* PLⴽl q+˨Pa\Y>EY\A\\\\ZR\\\,w \"$:Ķ87\? ^g9pHS\\\@\'ggy@\\\y\\|\4!X[%\\[c\\m\\\Hyەzv\WV\(Yx2x\^G\]\lmq@ \\!5\\3OHAOƈB\"\'S\ZzYB\\x\qJ\8\'\\\{\44%\\\\'x\ _d\ Sg&%>N\\:#l\0\WX?~u\$ئ!Bi\AS\\9Y\r\ 鷿Ra\\G\\\\ChA_{`<}\\\\S\\FY1w)~E\\A-\R;B\nE$t\P\":/}\?o}\\U\9{\\h\ñ\\\\NQz\\&A\\!\\Z,9`GE[(\T7\zLiw\.+kfռwVP\0\c8wDiU\\<@\YfC29B\H(-z:leA,\m@bZԐ\R_\γ/s\\p\\llr\\\{\?!\u0\w\Ω܏\<%\W_&]_؆В T\&ӕ&5Vi\7\ ]\\!xmS\Zm\'(/n6!\Aa\\\\ᕦ5\;\q\c\gbYAȩqz\\RB^֐\\\6Ͼ#. WYp!\\zq\O}\\u;vK\\e=\-pU;@k0`ˣր\l\\\\W\\\\yڍ)\ÍQmI\7S\<\\ňŸ\?\\ÿaeccM\\>ӥ4a{1\O겡\\r\~\ə\F1\]R\\TF\q wAR\FpS\|\M\0\9j\R%^!\1 \\Fy\\\n.\\M?w$h\@oiږ#\9s\gů\%N\\\W_aY\-;/k(JY\]>\*ūW\tɕ\*\? \g\\0$i\r\邊X c i\ U۠@I-\\J\\Z:7\ι\\\mǻG!Pbn߲ƠQ8,oU\Z3\?\\|\=\bbB\L BOnk\$ M\|\Pf\Gġ\\\G?\\}\mg\/)O,0\\\\-G˰QIOcBBT(Z1\r\\u\\\{[w _\W&?*b ֣|\\b\*vܶ\&TE4}S2*IYY[\G_#p,C`F\N9b=*hȅDŽITn\\x;w›V\;\\0ho\\Jd>!\Y\O2ƋL8|3\\ؚIYR\'!G1\S.8q\y\ч\C\\ zhJ4y_Fx\\\8tTX<9Q]ڜ\%\-փh!\-8\͋xy#\\\\\\0@]\0۾Å u\"\D\\\r@=\=}y\\M\0 \\\dˁ\\\#\3yD\5\\ፄy\ E$%Z\g؛\k{@8PS7)\o㜃?g܍\\\"DR\RlM$4ֵq-I\Q0LY9\\\\\\\gx\\]\ }t\|).\\\VTz# \6l.ԽH\\n.769}{<ʃvrq7\nntq\zS=\ys\4xC{\Ԟdd |\a\\+k ߠʛ9f7_oq/wh=\\\"\`\!%0g\Z\\\ 쫜<, \\n\kK\\r\)*\nB(d[h^ϣ8Ae\[<%<(\\Kn~\[\Y\@\ .)\0nݦv\9\\\hC0)\0\0\0\0IENDB`',1,'superadmin','2013-05-23 13:50:19','admin','2016-11-06 16:37:22','CRM','SalesForce',' http://www.salesforce.com',0,NULL,NULL,NULL,'0',NULL,13,0,1,0,'',NULL,NULL,NULL),('5649f603-f2ac-4b0c-8fc3-e80ddce8c443','腾讯云','https://cloud.tencent.com/','SAAS','10364a9b7f02af7583a68cbc288d29b20f616f2154cbdf8c3d4852f4369b9d66','SAML_v2.0',_binary 'PNG\r\n\Z\n\0\0\0\rIHDR\0\0\0\\0\0\0O\0\0\0߅\f\0\0\0gAMA\0\0 a\0\0\0sRGB\0\\\0\0\0PLTE\0\0\0\0\\\0l\0\0\\\0 \0m\\\0\\\n/\\\\0\\\p\0\(((\\\0\0[[[\\ʏ\0\\\0\\0\\\0\\0\0\0\0\\0\܅\0_\\\LLLr\\㮮333\0j\\\ \0Q\\\\\ȫ\0W\0Z\0\\򧧧\0VVV\\\JJJ\0c\0U\\\777\0a\0\\\0h \\ň...@@@GGG\\0%%%uuuYEu\\0\חDDDOOOqqq|||\\\\0\\\0Y\\~~~;;;\\\\\ }f\\K\\\0e\\28\\\\\yyy\\\^\X\\x\'\hhh*\7\\\\\\\\lll\\\0\\\\\\\\\\\\\bbbRRRe\\\\\\ߞ\\s\\Q\\^^^\0\\lYYY\\\\-\\WB\\\\0\z(\ᢢ\\\\\[1\\e\\r\\\\\\\\n\\\\ ?\0\\0\\\\Z\\0jB(\\\[\0\0IIDATx\\{PT\\\\.ga\X\3[.\\*ĕ\n\EJ\\<\n>\#JAbM\\XcFmV\̨\\$G\'I;f:}̴t߹{\\ewA\H\\s\\\~\w~\$ \\\ \E\\\FGs\1b\\h)1&GCh=f\\ǁK\>T\\\\q\ȵS\/7\`c\6lh\3Xl \t\(<#ׇlmjZP*56l= nrrҁ\\!2\\YJ\`=\\妇@r\bQ+?Xm]{\h=æ3\Օj\'?Qt\Vy\1%^}\a1\\rZ9\\\;_K\uu\ZS* \,T v\J\M\\EC\d1lc\\Z3\\\hygų:_ƞ\^JCi\"oP\%=جa\0Axg\yTb\Cq6޲U\\1\Ӫ\r(7tq\qZB\\ϒp\I%b\\n\\@zxtxz$zW϶F\Z\\DV $wi\D\bw\\\c)\w~J\\ ɠEIA\n\"\'/\SXE\"I\rq\~t.QRGY\mV\oF)\dAQd\L\"\hp&\\"X\b\\uo\.\݃Κ\Eb06bc\Prq6\1rÔģ-2\,g4_\\jmi|cu8Jw0\P\9du|I\nE\\(q\@`\\n )m6\l#eߍ\rZ\\V\\xp8\x~;Φ\矿\\\|uqŋ\\v\\7>FAX\'jŮ-MeeM\r0\W\Юr?hX\r\Zh=\y{g\\\\n\qjx\\T\{wC\Hh\\\3o\{\WᖎKXJ\\#M\a˞v}f\\Z}\\SH2\\<]\\|*dV\\G=@XŽ\Fu,J^%\"&\N\z`MM\H۵\ZLX\'*п†\5 ~.u*$# WF\\\\ri\`V6u\^Y7l6W\n03\\'BB\^\'\d\H,\4219wV뫺Y3ft \@ a嶗`|*?h\5\qŦO;\\\L\\\\\\]?E>ǵ \A[׮ߎ榻~\P\f<\6\C\&\\_\n||MIII\(M79\$\0,\Zπ.=a\\\\.\\8\v6e쁵=\;\4\Z g;\t\\tP4\55 \\'\nڸSh\r%(\\\X\rK$5tJ&9\\Q\@v\r`FӞh!\%Y#sX\\\"\n!!y٘Tp!) 0#\0\r>*(\Vw=i͚\p\\GzêdRb 9A\a!\\k1i2naߗ{\)(񴢸ݯ\i9\ZM7d0֌\\\\>|~\۩\I\0Cf\~\\[Q\EN\s_j\&`\\\ݫc~.\p|ov(NGZd\诊rV\B\\~j^n`^>A\9\'\,\6 \ù/#Vs\r~\W^\YǚRǡ74\\9\| k\\F:\ʚv>\0<l(€V\ƃ4z\"h!U߸Z\\+\"U~U\"A\`\[d+\\\;:K=o=q1,H\O0uoT8\"b\\2$\4\n\\E$5\92VƬ`y?\\,V\\X5Y.\\\m{\> Ef2UgGfH\\.e\t\0\\"~P\4\0x^iYu\Nvn \\2\xr}\\$#\hF\\arxL\SQ\0xpwee>\\8%xkJ+݅y32\\\n 6nmزa&̦q\( #\Uؑ\\x\+\XL\p\tzq5}LT,\\J\\q\r4\r\\\&0 s\`\\,0Bt\9? rq\\7ט\(i9Z*\EkW B7kh\e\1$\T`ATز1u\˜\E\Ш\Ԙ\GYd\ls1\f\˖lsν-\m #YX\\\\rs{\\\\W\\g)[#3\+`~ۯjC\_*8\n+\\>98 RU\P\\ˆŊ\~9v\\^lgij\/\75KL\'~\8\ \EV\\\?\n4j{\f=fWY5ߦ\\\\Ӭcڞ\\l\\\\\х\-V\\\XAc5KŋxL7\:I2bqB\\V^`YG@a\nt\\-䡊,#j\"\ZU\'у \Ѭ\l!b5A+\x\r3[ip@U+ۑma\`y){UV\j\\e$a\}6v>y&Г\X D:$Fpz\hD%\\;I4Kem!\\3#q52\r&e\\\YeY*\ MYl$\\ҋ\KY⺺foƃ-e>7\h\'#\\\4D >i12D`\z]\5fM\H\ ( PL~\/eƘ\\'q!Y\\\:_Yyc\\Pi!H\nlVѐt:=\\"#_9f3r\cCE J\;د\u`\fx\*oDs>\Jș\'Vv\\f5HI1 IL\\0\\\\a k-^q<*q/l\ʽSd\0\\\=Ցһ\\HX\#&S8\N&++n:+R;U[S2%\\\\&d-7cbT\'Tk\e!$ǽ8\X+\Z&7\89׃\Ү\KtmO\\ie;6/wUF\ZRFWYUV\\g\Mk\ZG.Y\'\\\\\]l\L-\y\\#SK\@Ӆ\J\H\3~\A\AKˬwaV˩\8\\\k\Z1Wp__?Tҽ\\[KPiBFk.S\\0\\DöK\LmZbA\;\MfTO\"Cָ\̊?N/\\Dm`\2\ڟi/6\\ VS\\U4\br4(\\0\\\z \ =3\G\-2,y\\\K\<E%+M\cTtT\O2UmgЙk\2(L4S\Mj1\\\?𳱾j\+z-*\2]\u\\\-*O(۽k3jB5)e0\\;\*b\6b吸\m\7\n)sI\ \\kɺ\XK eHʜll!\j\\L}\RV-K#EEVWdM\-=\\HDRאw\\a\\ ,w\w\\qW\WMe\\\v\n\\\\0\Ƭ\lx\\\8tiˡ\\\0sФpS\6jvy+)\}\6mQ\Zy\\?🇝 \X[-3<\"R\0\0\0\0IENDB`',1,NULL,'2020-02-27 14:35:46',NULL,NULL,'腾讯云','腾讯','https://console.cloud.tencent.com/',0,NULL,NULL,NULL,'1','[{\"attr\":\"https://cloud.tencent.com/SAML/Attributes/Role\",\"type\":\"UNSPECIFIED\",\"value\":\"qcs::cam::uin/100013138092:roleName/cloud.tencent_maxkey,qcs::cam::uin/100013138092:saml-provider/maxkey\"},{\"attr\":\"https://cloud.tencent.com/SAML/Attributes/RoleSessionName\",\"type\":\"UNSPECIFIED\",\"value\":\"maxkey\"}]',1,0,1,0,'',NULL,NULL,NULL),('78917a82-1c86-4020-b86a-3b1b350357e3','JWT Demo','http://tokenbased.demo.maxkey.top:8080/demo-jwt/','COMMUNICATION','985e805bd49770e7e797209db3cc2767','Token_Based',_binary 'PNG\r\n\Z\n\0\0\0\rIHDR\0\0\0\0\0\0T\0\0\0d\0\0\0 pHYs\0\0\\0\0\+\0\0\0tIME\\n\rƏS\\0\0\0tEXtAuthor\0\H\0\0\0 tEXtDescription\0 !#\0\0\0\ntEXtCopyright\0\:\0\0\0tEXtCreation time\05 \0\0\0 tEXtSoftware\0]p:\0\0\0 tEXtDisclaimer\0\0\0\0tEXtWarning\0\\0\0\0tEXtSource\0\\0\0\0tEXtComment\0̖\0\0\0tEXtTitle\0\\\'\0\0 \0IDATx\Gv\?\eV1=\\\#$Y+\\PH\CC;9+B!\Aa)dG貭\{$\`f0W\twe>Y\Ճ ܝhLUY\|{%\q4QCU\0 !ppI(\\㒞%p.\EIEKB\r3Y㒾\T\Z>BRY\>i\\jW\r$\J@C.e\\IfJ\iH6!X\@\z\\\%]LjQ0\\\\咞4\7:\%=\'yͺN\9\<\]\\\Et*4]\$wʊ73\"/\/;/<\+ \Z\\-\#\\X\C\\\\\ջ+z\\\}\\I,j$\\\ڠ>NR0`\Tt\\\ǒI\!S\1K\\";~e`6\G\'@u\| ![مg0\\Lw\ yr\r\:ϝ\Q_<\W͗\S>ky\\\\c ͬ\\\CPMQ-p\N1\nu\"-\RG4Cv=\\Z{k@lr&\i\Dh$*e\0\n3\bv:L\\\r#\nH\\\\ZҜf\ZSۯ\k(XD\\\W\[>f\\0j+&Ҭ\Ԇz\%/Lu2\S\'Hkny\\&\ߌhHZs|\'.\'\rn:<ڀ\Z\\ěɪbd#e\)\\R\1C\\J\ \Dw#aq@$jQ,(\n.&`A %h\2\0eYĂt0T&RaT4\Z1&\\\MiiBl3O=f\Z*b5F.$ Q:}&\frD\@\rxb\\-Da&L/ \0g`!H:\?N \-HN\\U &H;M\"^\T QCs\gki\bޯV\-\06~\\0QE5μKA2\rQ?Bd=\uʼnatW\! 2\g=D*8lޡf$Q\\xT\nx\n\9o\"7 H\'ʔ/N8S\Z\\\2O{-\4o\(]Z5DcJk\a8 N\\|ތ23д[`\\&{G*BS\k\hV_\\:Q\:A\'4&qC\38ޥ_D<.\&ݹ-Bǘ\ _O\\1{{\n\ \\Y\\d\l{\\ PV0;M\\$EtDԹ$\ (\'\c#Pa3\8=:iĝ l9}#w\ f/GY\7 4\H6\\T\'d9\\(_E Vf9s\\"1p>G7Y:G k&:YY$\\ck\Z{\\\e9p\Xe%\q\'rU\\\<\\\\\MEEXbr\\-Ƨ\L<\/\X[(\nq(\EcfH0\\\*\\fMhY\h$\cTY$^\%8\ c\\ \\}\J}\h6DZssz\<7dhHVi1.\OQs\\\n \1;;\\\<1q|C!s\,n^G.%1\ _+[f\w\\& \?p\飻tf#1q\\\\1W16Y]\B|Lm\kq\\_F\?`hvԖW\\1fv{\\DՐ\=Eon #M@B\0ay-z?>\\1Q <>ߤ9\\G?\\\Z\(\eVW\`V`&\W\Ku\tHy>}ꉕ\\\D&OO8;UPE\q+ \4\tɔ\\\\n\|zlj TkttQ\ZvQȁY$u\nso-[\ɜ2\0L\A|ڭ6\'.M\\s\˛oy!R0\Z\T#\\\\jཀ8bKWXXq,灊ӓ\\\&G;\G\0\nz\̯\rB Q1a6:y\=c\\\,&kTV22cDhk\\q\iJP{e䔡\Ha\`茑K\\\H茡IDid`C1RU\LYoޠ̃9a5\"f\DZ\h zꙵ.\\\]JX,\kok\9,}p\\0j_z\kŹ~(\_N5!1RPG=9ٷ\Zɘ@+RxbVcE칩\\ŋ\n*\E\\ڔ}sK\)gW]+\Ëqv\\7x\$\06,Mģg׷_YgTED\r1\\\d82\"ЛYf~u\'\\\e|‘oR\\\[ea->*Lj\'\s\\:SB3e2\Ze0:\֣\+(QdX\5e\u(dž\rF k0c\7\S\oBuZH^\\\N8c`Dd~u\rb\Qh0N\"gqm\\\ \8ߡYQ6 1w\!ogʰ\\\-0\r.\\nŇ|HCē\\vH-\di1I[p)@\K\%=V\ Es4.\XN\zNs1M\\\Zo\D-\]\\\'\\kph\\\9b6O\蔽{\\}@,\\%k(Ern\\TV|\DVBw~\\\͵1\R\$Ÿ\sb)\n_cum\j3VꟇ\\\nn=HYi\Dֽ3,酧\fD!+U\O\<ɫ\},$\!ﲸ}\M\\pxH<}qI\1ϊävݸ\\\'q 1 \\\65 E!*\ g\\'jCw\rUR\0\,oQ\\\\Nf\l/.Ĕ<\\qVﳯ@2.\\QZ(!D\/u-f\(U\s\&\l\*%LjEKG(.\rVR`!GQ\Xܼv\ѡ\\$\U\\\"D\\oӤh\\\\n\\\$c\,[,\)0_4J[&\\ϺmO\\hLVSG\谺u\Z\S\U 6K\\w\\ *!z:3K,_\ \\N\uD\J-s;\*\\&*cͱq\\\Z&p)/<\\\\\?\5\Ai&dxz$\'EZڵ#\\\`a\*>\38x\G(U:\Z3\)Q,\H\\*\\\\\b:9\\n g\\\1e=֯\ f6k\\\tiy)ΟtK\$Rw\gz17U%?7|1\ڕ/Q1\w\#\#\\5bFOI.}\\\\h()B\Go\'`Xȩ%\Z\4)\qD\\H8ũr: ,o\\\UN\\'\\\\=s5||:HM\9\jRP\s3t7[\Y#\\\Am\Ħ\Izd+pR1s\&!q\SUކ>\pu-,󈂊a\ҍ9;\\\ۈU)Ya~\Z\]´Y\\Rml|\\1\NLʼn\\X uM)DIg~\7\\s\\\c\~ $!\\Hy)Y\\\{q\Z1\/Fag\|\m$r\ZJ,\TNعSFC¸3,>\2ž\rZ\O\K \ۑ\ q~>Ɩ\S\#\<3ћ_KF\6\\>+/ \b2\"9\\'C(TF)\!\;7 \U\,bB\\\{n\cfv+ }\"%\"Q2/(\\Qhԧ<\s\\s\2xʣ%UV^##\\0Tpp\6\Q\+\\\\\M\\!!\He8qHO\=\@ˆ8(\$5p{bX\=6_G\9L E\0\z\$\ Nw\eTj\\ ]\ORէ^\\h\<\\)\D \ZO\\'\a=dAaXu\\=G;\o#W\/n|`\\=oc\0\&6ªcvnS\\\\s+ۘuanRB\\ \@(5ՎJ\Z7M\3Gk\'My.>\r u-\\\\ g?~EYշ}3 \߄x8)\g\i\\~\\]\\\|N\:\[\9=X`y\h\\\rq\"\\9ڽ\\\m\p\\\\r\o1&\\1W\܈\mv\\\oL,8ٻ\hB SGgvŕ\ \\湑+Ƙ$}\\l\g\\SEH S\"\K%O?m+#R\2 C\\k3Tс \*\}bTXav\ޣ )#(;smA1\ڕ7\fQ\dp\\\\0O\rxxA Y\Jy\\Z o-\\F2\\>\@7O7$\\cR\]Zei\*\*\@\ \x\18\\>h!˛tWb\\\u:3kKٌǏnQ\q\\\br\3+We2_\\ׁf͕\r\\x\O]k-M0dtGF \\7\\tt\׾J\[s#\16\Gp{7eR3,,_ł\\1 \eat:峟=_Z` EHH=I.\n(Eo\r^/]\12\p#l< i\\\rU̺ء\`i:#F\p \cN\pwUB@}_?R\\\D\Dk\󘶬075\uPx\\\A]\Ŵ\\\ktf\V@\蘃Ov8ݽ\\\D\"7\\kK\\>E,7\EbP\nqy|\\\}\\'TcT9f\X]Q\"ۮ\:ig\\zʤU}\Z-7t\Z\.^&ԏ\Ep(n~Q, &Nr|\~c\\$uВ\mzKW0\\r9W3K[\.^DŅ3\\ \0Eu\wp%\R-\\0N/\z|~\\ɿ//\S\'\d=^jZ@9\\hg9T\C\v\\Lo\:,l[!XSq>\\\uD\A閎ӓ{ܽm\\8f\\+6X^\nf@k\Ӿ\\bt\oؤ_ḁXD, 0XFn\\SW \\b%O\51 d~\5\SE*$\"N\!nŵ\3\%\1ʠ\,1:E \T\5t̮\@|7rR\=8\\:Dc B 䋥\-4\v\vm\\54\TW=/V>K@p\m\"\9\(\\2\c\TQ*\őV\0\Z)\\魽\(\\\0 Ejr\n˫o\uR@QF\+\SZE:\\yba렾S0G5au\M3\$w\PyZx\\,_g:ml\\\=\Ok\Y.\Ls\S\r|`8<<\\d+}Sv\7ZQ\Pc\q##\ ,o\ ho!\-_[\p4\N 1F\\Wn0f-#\\\\WqR\_Ed}Qr:\Zr:JumO|UO4R4\\\'}\\\\\aVӄgf\t:M\ry\~\P\\iSkV|>ҡp\or4\!7ߠ\-bAjP &P.w\ncm\\wx\\k,\\\x/B\C\\rgz%\j\f\B\z\H`XN488<\\\VFߧ,KBHM\'ᄗE\m\z\\\J \pZf0|xGn\m\\\0\0IDAT1:$\\rP\rT*\\\QX\x7|J]|=|mJ$p_\ PQ/#^R\\f\1?f\>IL\1j<\9?Zb\ZJS9*\Zk=\#mCZ{x\y\5\\XLy\ ?\\0\\\\sJow?|\'YT\ YQ\\C(꼕I.I[a\#B\ z\ZIԯ\b}\0k*ا#OP1n9\x\kw\+1(,ݜv\38\u\fm\\\\78?\I\\*a4\\|\Ç\UD]-\}+sB1\ \}܄cy\ COQ[Mf\2osS\Q9iՙ$\:D\'\zU\-u\'`,G\=>D8\MeѰˣ4\0N\?\'\\?!J\#W6\\[\RO?MaZw\/\\-\jʏ_\DηDIxXZɔ\x\\\I\S۩w=&2d7\\\8&s=7o\W\\y\\v8<:dmm{w|21\Ȋv{(\2y\?\av\/C \)!^5n3E\orgumٳwY$N\#\\\]\<\\;w\s\\]b\1k\\L\\Ov㴞\|\\ \nc\ z>\et\Z\ZeXON\g\_cS|<3>1NNNP\\6\oοB\\Q]\if/\Eɓ(H@gcF!PtKJ)Wcp,/.}o\rK_ǩ\c8%\}\R/\ȇPa8b*\ma]\s3:=,\nf}\\Vy\\M\wY_]bqK\ܑSI7v\<\"gg\Wx\nN\';\xHKiZ>\'\0\"\Т)oc\g\C\u\Nj\Ƽ\U]\r[ڬd ΁k%~\3\EkM\0\\\"zq\KCi]SQrP&\4\\5jny\r~Q &\n\bY.r \\\xI/5\\ruҘL#Ŭ h\{<\\M\+\F^,W561#݊TQg\n툚q%b\-E\__S\?\\7S\0\0\0\0IENDB`',1,'admin','2016-10-13 14:29:10',NULL,NULL,'Test','MaxKey','https://github.com/shimingxy/MaxKey',0,NULL,NULL,NULL,'0',NULL,4,0,1,1,'org.maxkey.authz.token.endpoint.adapter.TokenBasedJWTAdapter',NULL,NULL,'uid,username,email,windowsAccount,employeeNumber,departmentId,department'),('850379a1-7923-4f6b-90be-d363b2dfd2ca','网易163邮箱','http://email.163.com/','E-COMMERCE','57f4c775d02eb00e4f8c62ab79037d8f949a3ac684791843026cf902ec000e2a','Form_Based',_binary 'PNG\r\n\Z\n\0\0\0\rIHDR\0\0\0}\0\0\0~\0\0\0 \0\0\0 pHYs\0\0\\0\0\+\0\0\0tIME\ \Zq*Px\0\0\0tEXtAuthor\0\H\0\0\0 tEXtDescription\0 !#\0\0\0\ntEXtCopyright\0\:\0\0\0tEXtCreation time\05 \0\0\0 tEXtSoftware\0]p:\0\0\0 tEXtDisclaimer\0\0\0\0tEXtWarning\0\\0\0\0tEXtSource\0\\0\0\0tEXtComment\0̖\0\0\0tEXtTitle\0\\\'\0\0 \0IDATx\y|ř\\3#nKuٖ\}\H \0% #l ,X$+a $$BXp\c[>d˲eݚќ\\u\\:\\O\\\O?O=UO=\S*\\"{]\8RRj\\Z> \"8\f!f-Z@;:2!\\40\(+\?crZx\"Vvi&]OJB6P\S4>\"ֶ:<!Z5\RF\\R|ډ\Ο I\0j\]D7\\h\l%\\x\0 bc(\\s\W(;\lS\֚\\\ZG+\q\'@d\"\%G`Z}w\\nSs\M\\71.}\l?y\9)\=}\n]kM+o\\\kl3*\cVE\aʥaef\\֚\g\X )ll\Z\\}M믦\ܯzN_D\\dÕב\Ԓ8n\ȋ\4\y/S\'3a\\&5;}\\\rx\e\\r[ک8pK\ZkV\\S\ \e/1u#nBmvOdjk\\\\Ox[ZkW\Zk\m\x\ݺ.dC\\;D\\5Zk+?\e\0ֶ:k>GD\\[MDo[{\A~\0c\D Y ɘ5\\\9]V\DZڈn!yFs \@\\\4m\d\\4\Zִ\]|>oQ\&\5`d.Z@ glKK\((xP} Q@;6N,FG}=\jiS\\~\\Ux\\a\s*K\\\\\yz\νV.\0Qqh\\&\c\\Qp!\7,\\ר}\`*RjQlf!,5NK\i\\1S&Q~\^v\"Yee\#f\\1\ө\ [Ϧ~KO%#w:A\0 jht8tؗ1\"`; w6 \\⤖,Sx\"\Z\Ћu\~\W;\\u\z>!v6\p\\[9u\IPĪ\>\W_)\ބii;\+h\9\>!p9\ GW\O;uʘz? \`\_\\'x !\fQ蔭v\}\nsmb.\~ \\\q\쬱& 3s\\\_\0\w/Zw/\nڋX_(1}\\\9\kCu_\<,&֖\\?%/۟]}\U6ҒFh\\^K\n\?45R\n^? \3b\ \8(CׇgB1s\:@;OQ|\n\y\w0=~r ~;=Ԩ\'V\J\Zj\|?3ﻇI6*\\6oC\o!GH0 }L²^~\\7\s\!S$\\ \\'RWKއt<2H\\\wionH\hO;sGc|}\npwLȆ\]3x*\\Li:hsGLp#\\0rVŎ\\:\t;\'U#v\K6~,B+WCbv\\;\Ug˷._#i2|̺\Zeyhǜ\5eK\'k“uE|$ \\\\\@ c\Xe(`\L\\A BΔ\L6⾽axD\_\vﶩzˍ\\7-A;;\\s\.Y% <u?\N\\'\\#Ў3N ?Pn̤\+Ǔh\\\}/F!{\"6C\<\Kv%єAD\ӦNk\?9n*.\\\O{\\]\\0efҹ\`)=gCqw\n\i.3\?\~.\\\p/hM۶Z\\3\X}\1\rŸ|F\\oRp\ ]m0v(u\'翡ƀ\=en\ٟ.s\R\G@d]5\Z3\^y\g \\*\9&\q@#Pw\\큤\3 scM\hjz\8&p4\'7/7\t4J\\gw%\"D}&7]O\\)\\'3ٗ_\\(Ed\\>]<\"\Ο\Xl\\\^1\:(8\\nhZ\kD7[/@\\(;f\ur\?x\'\wm\nP[ﺆbtz\=Kvƈ cXD :7i]\L:? xu;:F\׾tKE|\\5\r?MN_:mc\g)DΜ0.0\\L`}x3ɪLzڔ5ӟ\\^\'\H6rF)X@? F{f&Na\"xכ\s\\:tk+\\sLӤ\?~J2J8ݼxs3\\\MtfYz\&\\K膐5c\q2IDk ~C)t$J\\SFӾ;oH^\\bfK\Fzu\\n2T2\\n5J+k)`0\nD N8RE#+k\yݯ>\MH(\P;Ƽ\&m\nIɈS\"\6$ᑢOh%\bN\k5:p\\U{41h\rnW[D-\h7M+/@lgLV\R\"\\\)v\ZpAM\\"^\ЂrsrɘTa(\\zhl؈H\ny\4*\\a0\\X{E\t\0\\p\Hlj7ƈ\\[KSt8\4|\\ؘ2܉0\r C\\B|Q\\\6\j\rۀ\\LO`%?\Z5\K\\\\\\\E\\څ\\"g\R\\n\06\0\WN(wTZ\\%\r=N\/:\E;/\\9R\\G\X\\\SZ2,Ig}\k[/J.7R]E)w_5\ i}ᵽ\J鉴r\\0`(Z^xxsKψP~\јf\=\\`\9kߢojva\YӁxK+\d\\Y{\Ŵ~q\ߥ`7\ھГ-\\M Z]C\3\Q\o$R\+5߿\Z3V)DCۛo\\;x&9}f\\\G)\v$Dv\\jbM\r\\Aw7r\"*R\Ŷ\1:t\7\\:!\`ףgҙc$IBɧD݋/\<:\`5MDX}+h=\\\ʛv\ϓ\?\\_F_H\oI1]\0 кM\z\\aɍi\G\=3@Tk\{:w?(\\Zv+.m\uD\\]rV\\\5cdD|\1}2}k\\騮N\\+\9\\\\"diSX\6h49\Z_z7\q턱\g(-5]\0\ک)`\)\o\\'C09\ښ-\ljH|l\a\\r\4iz%\|+\eȚT̑w\A\\79\\-T*F C\&n\'f\vK\^3\=ii-lN\\ \CSzԓ\s\f\X䟨}i\rdF`H¨\%\Qn\\"^L,b\qG3\eW-v\\%\rO?2c\۞\rY4Hh\fVM2ZR&D̼n\n:r@f;\Z%\\HˆjV\܁D\7)P^V~gP0y\NBF~>/\\3]\jͶ_\G흿F\z̦h#bL\\ZZ\Jo Q}\uL\?\!1\z\)/#)\.EN4\|npf_9b\n߲\;\Zw܎zR[vAA\]H\˯u b(֬\\8\`X\,w1-I\\OiӅK\EK\2\nD8\"z\\'H_B\N\f\%W\[G?!TV\\8\\g)\r\Z2 f\Ai;eD\"a\=,;?xh>\nE\\\,\,\_$v\߻9gһ\m&\'F+Gs\_d\\KH{0aZ%K\@]XI4vM,d\I\9\\\x\&Crf~\Z\嬾Z2\\ZU#l\&yݜF\s \Z\ɀ\d,Ŵ㎣\%d\FE_}{\\Ww{Q F߬\鮅7\S6h(\? t$\nRJɛV\\3)5\\Ix22ףWi~r 33\\r0\\\zH<7Z\0К\ Z~/~\\\\\"8wƽk\D2\˙\ XͅJcan)S\\]CZ\yÛ(oq \)Z\\CWVR_\(/!{\<\\\\ǖ\"}g1\\ß⋍\05j\\\\\a\\Y3)ծtl\+Hp\\(\B\q;\h\"\&X0^\\ݱ?HMF Y\x}\nf\J>L?umwO)\G{X\#=\9ͤoI\H\4*\UgOp\z\n\\\6\\!7݀\$Uc;lDk\1< e\[\\}3+kȴθ\\D\'\ 2Y%{\ZfYYw\ȭ6)Em=DOc6*nO)*._\=}A\ṗ\Z;\*]{\\eC&;\KG\Mc\0\8P^ oNΰ[\\p\7\d\\ eY&ෘyI) !B[\R\\XS\3Ne\\_ݫ!I\Nb\#4)?\ՆӃ!\"5[\7\ { v\\ ZN\\q\-\\\Ú.lj\zPh\`UW K#\撻hZ\O\Ȅ-e\]\qv>\n?|\\'))\n\Q\7ޤ\W WoC{jw\g\2\䖔ʩd\7\D{\Z\\JfA]e\'}?=\Gޒ5\]MoE /Srʉ)ucb\D\w\\? ջ\\&\3\+s\\0,\\m\ƚ\Ζ^c\\.M4Aꊷ\xj J1a|뮻ȶ A!Z\ܛ\\cI^QP\'\xJ\\S)E\\\>%M\i!V\[7#(*Xx\\\;b\U..h\\2\\%-\\m|z\؁0PM\rsgHp0O\\uz\Jzx/b晧3\/a|]\Sb\\l\W\=\w\ c0VRL\ɇ\jJ\pBa6\|;꭮ `*\"-͉}tfv\pFD\:g\\r1\& 6zZSO]\3\Į-\)gTqwf \]u\\\ф\Og\]M\\;6ĶY{\4\[tmz_t)\B1\\`\}wBxZ4q,fPTu\0s:3\\\\\W\')\#\= 5~\\]]\j:p\>8\*~\\t\o\\?#{~v,6i\\G\p\1}T(/ ќ,(\\[RH\\L: \-$gR1Fg6·RGoe\\^BY\^  Á|;@2\"\\\\Ay\dwC{@\&`Y٘\&\\Y\\+.\no\\\\\\O\i\n=#Qj5=H\\9f\ \Wơ7\H\4\\\G\|w\w\2K\mHvs \gÁ>lյkɼSn\r}\\\z\eW؉wM~t-ӎ:½\n-æ\\Ae\6ȜR>h\];\}рҪG\\\\o\7\\{\[;@.lǡ\\ \Y\'\'a\u7P\]\\"¢+5 \jG%^n\сoR!׳Ӆ\\>]M\SN\\\hM\Rd/=#/ \\\`\\wQ\k\<\r\\\s^d5(c\4@dl;M\h\Z\wO\rix\\<;\WI]zIX\*/\]\K\tO)\\w\\\\Xq5>!哘hw_\\0u\ڼKzLp\v\\|F\?ԥ\!ZV|®^\hpjE\\?\|\_2yyC\]a\/\\;w{\zFœ/X\{\~xSۀG\\rz\\zrԿK(\[\\\W8\\\GD[n\B\\\ڰ wPV\"#)\ˣ&\ɓ(9\\,\\.*\Zhl~QjyӀ18D+\ij\`<\;$g\ $Q0`Ll֏\E2?\"\L\\nDS3Mhx\]Z\\jð:(7\"B\\\\\/a\ \'\',U\EA`>*j0RcH\أ8\`$\+\vо30Í+h_\.\r,7\"$\\\\"vTe`z3CDhXCXt\)Tr0y]ׇ\'\\\5&-p-B!6U\\\q6-\'-N}L\F\\0e\c\n\i>zKm\\}Ku\2&͙\\\\"B石\iۮ_\ؚv3O 1p\\'2 }Ifrl|;q6u#\W\e:Mc0\)[\0\\0\1Yo\GhG~ܥIӡ\8SKu\Y\=T|9\\OE\\\\1gijOuR\}mD_c\}A\\F=r%}DsF*>\\\\\^\ \ T\~\_|h Ȭ[|=\PQ\@m\ֳ\kãT\yX]D&󮹂\\\ǰCk7\\O\o/onwbT\EnԈګYu\ \\\'l\\y\hzn\\"\^8P\jO>Z\\0-M6:Dh]]Ie\YH\"-\tQPx!e\rƉiY->$\\0Tˢ@;Qmw9rF\"¦\>Ʀ!\ޑ\a%c\\ dzw-_*\\&Z>\/H{uk6ݮ\.ح\tl\JޜԒ\n$њj6\\Z\lRjL \\\k\#Zl؈\8k\/O/\ceu\r\A)$\?\MEhs3\\f\B\\wI|y\ƶ5M蠪o\ 6 \-\\\4>-[q:\";N\0\5.\\I\$d\ZH׎Y;\A˪Ul\9\Z\}XK QMHVz9P\n\'\\\`-7]9uE:\Z%\\J`\F>?\"vC\"ㄙ8r;h\"%h{W|JŲ(^r2,eZ\\;#s\b-7mi\J\Z\\'\`1$zF\ߛ贳56)1\"\Z3\\\s\G\\'u++V\*B۶\X5u\\\qN\\! \p\Z! 4 Z\]C\޸S\j8\6\n o&:>\\ 5qn\\8l:+\ЎA1*\rW\\]\'WƬrmUM.BX3:<;MnU\#U>w$eVhk\\Zq9EQ 3NV)dO\\\\\\dr+aXHEAu\\%m\ry$\\d$~EeH[\+4\\=\\\?6p=QHXw\\fĎÊ\d,ݷ>y&!ce\\\\\mWu|ǡk熬b$a\Q\\}WΏ%\F~4Q0\\\\Ǯ_\2\^\\"\q\) \Z\#zH\ITO#BP~\\\)$ ztL\'\\׶4)\^&+{t?$4CN_HفKNEף\ CnJ\"D eDQu\\\\\\G\HBoH|Zt\(JDXzٮC\r*N\# !\\脶W\t\\Ŋ.\MS\w|\H>N\nCQN\'>\\"E7,Q\\\GBӏQw6 cb\Ò,\r\ \\ZC\\c?B\[\〨A\ѭ\\#|\ZG~\\H+\\o#07\S\ \\6ƹF5\\nMHb\ 0*\FQ\mZ7.<\Gƶ\|f\!/\0)\ITW+|[\9\\\o1U\A3\TܙR96\\"a\٘54=\=$4\\7suЄd2A@\b 5sQ\~G\x1,0<xJF3\\n*i9 \7~9|\&}\ivKE\"Gҟ\ E!C&(糾\]\Z=p\̇w\r\ri+67uIǍnZ$\~>$\ ܨp&\\g\8\;F\\\"\{\-}\+eׯR^H\Aˆw2}@\Q$!0a\\\`\ \\-;\\\Sb\h4\\{97õ_>9.\}t[_ :~$8\ _2Eà`Ntuv\oN\89r!*Xʑ[r17\\OjJ\7׿2?\\\\\!Te740\x=icb0o\7L>~f?3F\Xa>\ \r\\Vʧ7Oo}g\\#n\\NB\]Dfg#k,(\\\{J}\Z(mb-i`˦B\\Z9 `EyO0v `-+yt4vۦ\ `aDN)\ԗ\V\,;\\3C\3#!\\)\L’d\\\G\8\\ C\ \\ϋ%q՝\UtLgXr\1P,:- ;KӭU~\H0\ߵJ| ?..a\Ojӌ΢/CXka\ulT8=\\TK!%}\H8S\o,KϭI\\2Tkʲ\$rdx{||gMt\"D,\uh(# u\\d`a\Hױ7\ukpI]{\\όp`T\p\е\ٹ\ދ@>\'y\26\q!0\\PJv\\&?X\/J#\sE^\cUSPF\Q\0jr)4\$tâ],\VW\\}d\\\/\Zf[g]&\\\P[Oݩ|f$\i\u\'\\_un\{h\ղWRO\Re֍H\"2}\Z-\\voۉo\\Kjp1\-v\&\WQcj>8.\OpR$v/\Z;\{\Sv]\Z\.As\'*t`D\\fG\WI;V!\n2VFG.\دw=|\Ɏ\'\na=#9Y>\T=3\,K혃xTcD\\Z*\DR\ 3^~kׁ\;\\\\4cYU*Ie\'}ۓIItV\\)8o\!\Z%\X\\^{\\-w\0 nޑ\\\zPl\h޻\⹮ !U\@׮N\ϓT](씣X\\n#rD\n٠gL?:-1iM_\Kn9.\\;\GMo\J\!8 `L\\"\w\\R\\1\\\.\w/U\\\]\V.J\ և/,R7ĥxH(\>+\-mI/=\G\&\Ўn\ \i.ӊ\\\rc\FF [\c\\NzV\\Z,7O\9DyVU[嫥}\G}]\'GB.²\8\\\)G\{\YZ\{\{Ka\Jϧ\t\QS D\)\,,\\Y\rQ\ayJ2p`E\F\- rӾrZo9\KD:\\.\\\D\\ONl\u\d0\3\R1\A2ݨ\\.9\1\(%P\\r꽵\\ !ȐbAc~LőU?H\ ,Oo\"\Oqkl\pj\ښEGXїaT.A =\\'y:\[^\J_X횒w 4oI\ /W!\Z\Z\'\ S\f\'a)\dzg-5_iۈ4S=\)\Ľi*\XW_A!\@4\\_\y\\\\Qn5Sqt4\ A\ \*/\!t, \$<\0\p\Vp\ 8\svȲk\\Vh\~\\\"~&,VԦ#a\Z\Z[r\\P\\+J=W\P[E>f\\\r(\\\蕿~GJO@a ̇-\q\\\g\e\.ɑo\\\\\Uhfe$ndR8 R7\Zѭ- !aLVb\qU1R7>eQy\\\;\}}i\\&\/iiLLpӀCڮ\Uy\_\>\rfw: |\)@2\'K\\0mOT(e\sXQ/_ڳc#8}fh\\d\\c IW\T́sk\ݵs\\\޼3&=;\\`x$.nH\\\\eZMș 5[S\\ݷ E\Z`Q\Z\\0}>~N\\,\W \\Ct\\&g,=\\\0\Kh oТ_\tw\Um-~^Ӵ/\烮\ɰ\ \\@\2&c|R%&{\v\'w_=\\\]??݌\\8Bw&\0%\=[f2FHP(\JwG.R\&*\5,^AzK^\^h\\9 \"W7\}e^\\\\^$h\?P\\ZhX|sOwx\\\?77jƯ;\{iG\\ooxm\\'f\I$ak\\\䜎^O#\zdUG;\Z\`>?~\J\X\l&qQ:\z \$\\ _\:%aIfYj\Ÿ\{?;\'Uf\06RTKD_5oq) Qde1KLD:\rBK\\Gv\\\"ZtVl$l\sC{\-όzbJ3& \U\0M[\n\\\И\\\! zi\0\\6=l\W\=D\\F;bJ*aJcD\ŐP\\&\L\\YJ.8\(o\\;\x\Zib$ 6j^(\n\ZI.\)me3\.⻛~f~\BL/E\E&#x\\r\{\s2 \@L \*܌u6C\D~^\?}a#\\\>lT\&IX\\Ѱje@I5!q+3\4\87j|\"t\XY0R\\{\\\;;\gk\\"\x\\Z/iE#\\T\r\t\HH/#銩K}\\\\\'n\\V,&\\\\j𫗷-\"m\rwW\&-%(i581xѪy\0QXKڲ(\#\\J7\4\\+_\u\Jb<,\"\o\n d_1\n=\(K\H\P\nh+ڇt¦6!\0QWW\\Ɗ\foy|[[+\n\_*\N6m;C\!>5x&J\\\R\wr\\$\+\\\rO ij \%EWAZ[\:v2~p5?\\S}4\"h\)\_8Mj |X֤,ls \\A)_={y۲KaKBzGBw\6&k\].\\ \Z0r@GK @2D22\~U_j}}\ \\r\{\c\Rv\vJ 4\La\ ?U1\\'\\\a\/r}7\Xs)j\w׾g\-f\aP.:FMБR9\0a0(ʘ3:C1$4}\0\j-t̘̅ݙ\|\E\笨\c\i5) \AZ\q\E9~8\/_v\ٞf\ZkjS G!M\m\'d]8BBF9*GH\T])i\'XƮZpe_@e\rbTӼtwhp,7~A\萭ɤz)\U\Y W7\m\\\ś2mxJ@:E\aS)9*\nh\03O@[?\\T*\\g~m\\7\\~s=S\'\mp@!Ό\\Z25<)ej\pwK!\WlTJ\I/il[\\\\:-\\0Z`B8e\p(\Z\\UDVuY\'\\S\h\K\Dl1s\0\+\'\gp|LoS*HtI4Rs\Zl\Y|^\Z %7$\[@\-b$\|@y}$C\Z9\\[\8)C\Z*r*L3K;j\\;\ { q\f\<>6H\i\|{t\JL\\\\nH)28^uvY]\-K\\\,NLd&7}Q\ZN5c?\\r\r0a\Ua֜\MW{s\R\"* ϟ\_3Ӯz~o}o\+Kk\550w\\=\\ؗ2hJ*Qf\6\=R(~D:\\\\V9\YN\ 㧿կ[\\$SN+ q \AQ\"\_@u;Pn\,R10{y_03άvF\\X\\u<{KcN>\a.\.\0\~\]\;N4X\Mzy\\kYn\qgю`C\rGX\\\껒[e\\m\0L{\MIc\N4\\mLW\\#,|\\\M^Sl\\V?\\'\Fb)L:\\D\\n2&\0O W\\&\\|\\j\W\~}\ -~n;.J@)r\nE%KEGC\C\,T)d\\ÐЄ\ƴVIt]2wSˋ~sl\KN]qjrH\)U~2(\s<\r\Za\!\'P\\0\\"pKX,q\5gt\\\\\nmah \\bءH\XpҶ\݉3}ggϭO <\L\(٩D-\\W\>\\?\;|:r\\>H\\eϾ䩅5s\\J8^HbNPmv\$ԏf\'ÍbC,#肟\\0\0 \0IDAT\u~\ś\\U^Y\7ǝ2\\H \ QtZRn_bEzk<\\\05퐊r\\ \iM\nnp%c;>\++\DE ݑ\n $F9 !.\0 qH\\rzW{]\r\\% :o@éhm˒\Mefu\:H`}}˞S7k\#k#5-\z\?\\llKΨ~CY`gy`\'ǻ\?AdF&?])ě\imW\\Lkp F\ Bo\\\ZR89\\'\\\E\uƉ;8婫FB\Vt\" j\X&\ba骍\ k\J|\m0PwipA}b~s^l\ޗ;}\\v֥\S3Zf/վfc$\6\z\'TZlx* NӴb\$pqDŽځ\56\qg}\'ZN\Yдfβ->i\h\"L\jGaoNH$euU\0.\Z_\Ŏ\n\\v.\o\Zr>\ %>\]Onl\fVf،ZWT$]\\r\_I5 8\#TEv~:B\RPU^\\.hYUi\';V\Z\\]mт\\r3j\r&&6-P\2\{\{P\\{\Z\X6\ҁ͠Xx\ҹ\G\LSN\\m%\8Ȥ΢\qAos1\F(\\"ȭa\.F\X\B\>k YeX%d݈b6F\ /\I^! 2 \\nciy:\^\*\\Ds ӗֹnL/mf \ ɽIgd7xRj9Q\0\\+\64-_\K6uhۮ\G\ƃT*\\f\0]0yvq% \\"og{/\G\U\\eB%6UМĢ\0n\e \\$Eèfo4ƨ2S\pF<$p\Wu \&\n\\X`\L\\\X>c\?z\;\\^\y\dP\']\ =!g\P [ \+\kiGG\\ё3׊c\__B\T$h<\\½&.ɏjKu\LJ\47#@=5\B0\&V U\\Nr\ ϻTF\U,\\ƱZWCf)v}iIb\e&\GCޯ#\nxt$4Zb8&Y\_QEЙ\\'h&\ZYZǾ\G?8DH\/\\e=;6\\¬\$:K\}Eg%S\&\|nAFP00򕾁vL\0=k\8~\$W\\"D.f:gׄeA\ @aNYNϰ\\W\rˢ\\x\ys\rGSv~\\hAm\M\\~w( 3 FBN\DE:o`B\Õԁu F\ \":Io&\G\l8;D}iW:\h:8e\}(%){T\ݯNuAൄ \"\\\r\\\\\O\\\ CW\\B$ +%ZgKӓnk\\B2_\P_\Pj$H6\K+7hc\rQ\I\{yV\feܲE\7r\\.]9\˰ 8~5=\ *+6Ez\Z\qe\<Jr)\\"b]{\\#\ R\C\n\W\\]S]x\smr둝\/:[\ˆyn\G?\Ԛb\g\rp\ e)Q\ŕO?dCG\\XNhIL<>biQ\\^c/i#|\\\`\s#=\z.w]֗\ˎf\\O9efCKE\\$\rE, Ev}R* \nD\^R\ (l\) E~7f(4$\j\6NI&\2\nF\\VKVryr\*@,ݶ\\'IBڈكOpc>eB$`\]\\\=d<*Wp\J%!t9,{6>6cnW0`2N9jR&\ÐPlTà\rp>0\*rOBp.*\\\\աkW\:wy\xi6\\E׸%V w(\5E\aHHEFB>AE*3v`&/a]\\ҫ\Drv\ܵK{ cLXfР=HAˤ)n*\XU=(\/S\ c>!\`c\Z\n\'\Hk\_\kmkٽ\\\?\)ܠJB\\\<\\rs\Vy)† /3\,3U1DžI?J58+\OqX3j(%vr_Wn. \\Ow?Ca, 2\\® 8TLKDL\\rI 1}i\[>\b@կ\b8PT1,f\ҩo\;{F/o]Uo\\^cB)mITE0Ҳ\rqS\71J|\?cp&T\cړ\aho\\Zї\ߘ\2k m\"\\Zcgq(?vZש\'zϟ\\\l\N(#jBҚ|)Hf(% }^9i\Y\A4+IVТ\9\\x9U:\\_q_K0[p)/2W.\I1O\\xZ*!\^b?eKRf\@[@IRx\g\q\ؒL\əsj_>/\rub\[HnV\0 M\\\l;a2 il#ca\e-r\\\\\X\p\o{u]\\^Ҥl)\'f\,R(\\\0 1)o\\ fI\?\l6% \:\#g\\\\N]:;\\5>0T/B:ꄩ^ZhT\0~$G\0\|W\\'ێ9:UC[N\\\\\Ł1 0\\\\r\v\\Wm|cږ:\PiT0\0\9#шj\! xJ\e\2\̗a%[ \'\\f!LrL_v{R\/;781 \[\\n\f{x\'\ro\0p_Gh>QB?2. %.3\[+\9d\b{vupk\5n\\E\ \ \3\ue\\G\N|i\/uaf\4=\'fGkU,\Zic \\\"nB|\Y\jI:\LK\Ŷ$\XZ!L1P̜\g΁\׻\'C3\,cOkrc\7\\'\6>\mIqZ\I&\\\-sj\ˣn15\"&{\qHa\0\\O\ٻW:xn\\ R\r&&\'LE\\O!2ql芔;ۮA:,Q䩔)O\\\9gG#̖gMX\C\D1z̚[\\\\\m\f9\á|\折u 0zpA.,z/_|\¹+\=\\Q\\<ˆY\B 5\g뢒Jos.3\no1 $]\"7Q\+\%։\~\\΃] +`\\d/dؤ\܎b\*\).1s `\\}\_\ݕ/\6,\RƇ,\\\Q0ܕ2\\\\\}ʹL\\0*f l\f( ى\*ʮ.\' S&8BR֤^hܧ)\\d\\rm\wx \qZ6ov!Ȇ$\'οsWN\ɺEֻ\\\\j\^\\n(k\\\,TA:\pQ+S\|\\\w۰q&g/\\(\\x\\\_\Z\kM\ԃa\-nJ)|ľ5SA\ˊ#h8ל\0b@\\HjRT\\kF\~\c\\'<e<\3{à\e Ӛ85l\b\\\/\Z{ĻZ]¨/\\@hf\YDgo]rҌS\T?KkX\ؿ7b~T\9\\\}W\|U\Y\0Y\ZcK\=h^K\n[S\r\= JPOraFe\\0pTWMzʔ\p[\\7*$XM\\\bP8ԯ\UPc\\]v\w\y%30dM\V  T4$\01\0\QIPA\iZI4Y\'\ˠ\~\զ\j#D)\04rI\'\\\0rY\\\Z($`\R\\$˙D\޽A\j\b\В[\rŅOх`kC\ZqZO\ZjIU@8 ͱ\\\&+f՟\}m\\$4J\Z)\/\߃cM\0!\\V\?n\\\&t\\nh\֋\rb4\?K\r/\R/ ~\(\$\jv\ϭыmUCL\WSf\rA1 \Z\\0D\!ָ H)\\r_\yQ退/@7LBm\\gI~A;\0\k\d&eҲ膵}md۔tD\=Ȣ[]J6XU\\\ \X\5+\\P`sv\n\\^|rbq\r%a\0\hL`S\nZ\\u\\;t\Z\K) j2_Ԋ>뒹јp9hW\\^pYs>\\@JAٳȴip#P/\4נ?DCc\^\,2C 躁\U$~ӊ\u\nД%7KLr\Y(UKeH8\J\ƢS\gU7/h}圥Kj\Zg6&j,߶6ܛH\3l$\0SB0>oF\-u˅\\\\5Kܔ(a\0\~R;\ڀB?\i1R\Z\/iݫ\ZT=\n@\eltA\{ mu6S\{\ ؍\M\'\rյ ͫ\\/h]8wFkkz\ITE Qh4\ZSS|y{\\h3::L`ٺ.Ϯ^G\.\ȶ;GXPa\'x9]5Kw1\\b \_N\\PP\1x-\MK紛\aV\H\R\r\>fbNhN\Ԍ\\S\\wl\脤kՁ+\\Zړ\>)䰓3ڦ\ W\[51\J\0 B!\N4\3ρhOCy\\wI@&\9-$v\Ie:\G\㧷ص\ɠP*QP)Y\\\x\=r4M)@L33DDݦ\063x \f3@\\0Yq\yHmqP\l\\\"\)%V\J\ !ĔS\r\7xn9o&\\\5nM\V\j3[f\^89Զ̯knN\V\`U*rJ\hE۩~\\0\C\\h\{\c*2vXu\p0\wO m\ק\b*Q0I[y\ \\.\'w(ܧ\"F]\윎ψT\z\ $\nΚ\%3m\.4ڨ\\ \-\],Љn8ᔆ\\+Ƕ޹|\׵\Zxt4ͬkKב2q\n&-O\t 7l´\/\`\(ÒYww(\\}\PX\+fҥ\\\\\\\\kX\\\4I\g^3a\`\ny\r/c͚1zv\JWs\n/\Ns~i\\\2HQ\nh\,\,rnʯ4,&m\\n1N\zj>`\WWmzmUטԽXbx \\sVF,έi^1g\\\\5s.nh[5ίJ;zEV.ŝ\\&z\(\JŌ\ZK%|\\"x$X\"\J:\\\\-_\s\\'w\\S\:+lgF2\\'\U0c\,@,\v:S9yŲ\rm3㽞\;>\"a\\v_1.\e#@^ r\\7\\;r:w5hv\sC^\w\\U/=qmK\L>P \\ځiAq,ͮ3\.N\3M\N~mV~<_P4\An~P\\b;+F|\EBU\F\W\Z?0r\\;w;\W\faMTULn\NV{\\\ZdNwD-\\uv\sk_Y\\\KsGK\c}Y5Mm?\"Dж-\\\r\\\ӟƉ象ɨ-xv\Gݝ\-}\k+_U\\\}tSK;~.G\صwl\\<5k5Q}ۅ\JD-d j)ȣJ9\\li\2]\n=q\\\] !q\X\\\D;z\/o\\K\ \U@\\'Α\y!ԤwJ\n]\0\"-\0Uذ.HjYM_\4{͜D}\pÊ\b\\53.T:a&BÑ?g^_\Ynv!МgCotn\ot\s~vōv`n0Q+\r\\=\\cu<{\_[gYD@e\WF!\n0FW a쮝Iڧ\\.m\[^]۸6*ה*e&q`\ASjzc\s\S\\t`L\r)R1\fX)\\w\\߾\\=\?R%\M_\%\$(g%p\W\n\rQ}\`QlH8\U-\\g\\\ vFO{N\\Y\lzF+f]׬ttd7\r.y\NoW\Z/\8\nZ(_.\wvϮ; E\Į)ͬ\TA%\V4\N2\uז>\\-\a<\pOu\Ú@*\0D3Tw:\0\JBpn ;j\\kwܴꉯ.ܼqe5U\r݃\3\l )Z&Tn\i@1\=ơ\I\A??\\Ƕ\^\\Mʪ2{%oi~\\ Cd\ j\uQ\ZG\nwىcἪ\o?W>\ok\\"\k\\s<\\\'U\n=M\\;+-9oab\fXv&*Ô;8\x\\JaLJ\\\_\"0j\*p^*F*qD\.\9\\յƆ\s\r_\\K$N[+J\0\0IDAT\\*c\Џ0H;dC\\xߎw\\^_j\X򒿔\|\\P(#U\8pk\\C\;\PB\0\?nˇ\0\f\0,X6\rMƨ\0mP-\\9ɷN\^ Q]f/?\+^\\\0\J%Z\Xbq\o#aT{v\Z)%@\ Z\+jB^?s\\v$\ExW\3S^or\7fJ%\\3~\\;}\/\ƪY\I\\${\\n [`6rdi\2\\Zw Y\0\'l)~x3{\^L\JV\+B\n?0\n g\ ʯnق3Mpb\cd\ƕ$~<#\'qԧByIȌj\'^[쓳;fٵU,,4\HXP<\\\Tj\X\"\U4!>Ž%$Y1h\\ՍkZԒBPb[4\_$?\\[aw)!Т\M\\Դ\Hf,`\\_O[\\Y8e\\\=]\\R])wD/?D\'\3\\\r\0xH\\3\\rsV&\جQă\n8p\=S\0* ^ H-uA\\\@2%^4&\\a \}LX\\q}sǿ~\x\kO\-6?A\Y{\J+\\CXD\3g-`x[\^\0k6+\r\\Ex<\\ݎũ\d!\^02JP@ S7p\\C\}@TJ%S\\r\Hy\>+ :-Qe\$uM\\Z n@\\\'B\ns%N\\?!Y@s\ZꚢGu\\H!7D,Э!y\3kt\}\\vr\\fP&\\{\ƒTQk 岅U\\:/\1cWW\\rj\Cc/ȏ\FU8\.\n\dv\;\SK\0\\dk\™sk}K\S,驉\k\O\>w4!\\ZaI\R/cQ\t\\+\uDI D\6\L״u\\\l|\\\\~\D6 \'Ld\?֜mq1uBc\aUy9\m_0\}._|q\_Y\\\ųjPy\ \`\(\^\\-B\AN*h\2 țS\e\rmhn\3|v@p\n۵xf.\\g\\Z\UO\/\Wb㷿\\lN \0DbhE|%\bfq\0o\\zy\Oa,\b.lL)L}͏\\\o: \\[gv$ )\ZN\D+Fjb\֠u:6+\N\0.J~}\sQCCT|F\Zf\\ZX@e\nH\phkB#4\5;f]g\' U\j6\=|bih\Q!jCfpk\ \Z9bW\\r55-kڞ]\3\\?\ Q\\eA:\펦_~\?,z@\\\Қ\G\F\_85\BB\#(lj\eI\DAچ3\\Z\!@Y\N\\\\ÿ\\{BoЋ\aDUaQ\燊\n%;Sj\rMxuz\nn_\<7ړI:Y\\\>\%-\恸U2BQ\\r\Qd&zD\4%O廯vkz\r Z\4\}$kஅ\\A1TsZ,a|\|;!=I۳la}m-nG\\n&͎nU&|\\^Xa\\z^\\^9CH|C\5؄[F{#\$館 [\J2XF\0e\3Z\\\\"\\9ᾡ \\HT\\p%B՘9k; օh !R(\\̨j_׼v\r0>Wd\b R\\\0gH(q?08!\`Oҥ3{\=Nb\\mk\\ip\<n}k\#OzـhXVrc=-#_\oѺ\\ 7x⍃[w]8>X\7\/X\mMc?+E\nï $\rC\C\g\ّ+y\"&ԋ\njbhAD @\Qjpz^ى\5\ZG3\;\\bkjId7\i 2B0u\?6a\\Q;b\qSN@_P~\\\f?\}{\\K\\Nq[%4Y\Q\\PAdy\F (^[t)(=Du\\c=\'\\\\=g\k\7?`\,j=:khlf6:IO33ƒ\&ڼ晳{q\\gu/׾vQGs6Ͱ?yqO P\\mp\ggw\EL5jĜvS\2/s-2\KZe[{?eaڎ\rV{\_\ّs9?\]ʰBYA$fb\o\*&yK\c`\Z\\\Z@\S:\"!\F~\z9\Ǘؾ\;\w\|\\\\y!Z\S,j\rJ\\\\ǘ, IM\\,0\c@]@:B\1gIR!\'\h 7\whwt5Km3\\0,!\\\n\B\ T21uݮAV\\\\\\CVZW|\ Ӷ&\\\|\N.Kf5x\a\\=\d;*>\nNE0\58z\'\l\n\9!o\V\=R%U&\3ȫ\tN\\>qӬ\\\[DKX\vd[(\Dt\x wK\z NZ\؆!\̘̤f\)T]\\".\1`\rbDWܣ\J{g f\%PbAݠ\8\\s\9AN\Ypq\\m?s\D\J!ML-ce\\"\0d\\a\r&R\\˖=Aƒ}Aʃ(0\4\1/\\w\Ԭ\_Y`]v\,dI^\$$יB $J 0bj\v\$0R?\<)%6\\m @r\|0RQKRLfEĖ]N?.\S\\\^;\}L\>\OYH1L`?\k[v$x{8v,^J_j &B<pDd*0]\O(\4݌8:ѣP! 3\\B\K>vw왉D1=~\˞ٞv\ߗ\\kSQP%Q\\ \8 \eni\Z1*RC\]t\d.\| \\خ29|L\\R\\\\\>\|ՉXSg\Lm\\\R\n ;]Z\6\D\;~k$*l\l19\r\C\ ;\\fQy\"H\+8\n\\?y\cWO;\sw\]ا3ʩN\\dS\ȩv\Ԣe\ª~\\q\^\O\0L\-F@\tܢ[*YI젊r0d+q\K`7eZ3ӿ\~; Qp\\0 I\\nn4.uw]\OY\N+D\r#wd\X\zOf?B\w Q]\0{ٟ=\uMw\nӍQL \QX\]\\rT\”yvÌ\y_Oqx\GݧG\m\OJbOӝ74g!cl\ Pa /s;\\\-(1\\V\\‘s\򼗑њ\Z\rC\0p2\y\Z;*tZ~\L\~3\\ wGdk(`iٟ>O6&ᜬuktiVat6\̜!\\qϥ:\N4\}z}\\mW \\عMwIԔ\\.v齟MTs Ui]\w\ލVy\ƏiψѢ>\2\ #BƠ~^d\kY2^ \L9W\\\0\\K\#l=\\VU0|0\dd\r\\=9s+$\Щ 42*VD\\ZB8\0\\\\rbaZ\ķ\ozy\uf\K#ve\dJi&\4\Z[x\n\GuRHM\0\\\ͭmܥ\\?yť\z6^ؖl&\0@>/g\Wʫg%\Ȭ\0EZWLA@\\\ӫ4E榡u]1J\\O\/I3xĦ\-x\9jŒR\\K\\9^&ٲ\usW|xfﶳΎtȢWF\$=! a1\w\bw曛\\\[v\Lv\\\\G\⛠b\\\\´W\硟^\S5DڸE}o\r\`\ &6\%wy\+Br5\*&$C\}\?\\\\\\oaHOVq-*TM~\8\\^2LmNz|\\\\?S{q\\5l.\\\\\ZW3\d\@3Vw((G^Mw\!O\RL$7-\\\?\[ʦ|T\qȆ!i(\8tZ\TJP@;H$\JX\syG[a\noտr\ƪꅸb\\\!\3*\Y!MJ\zn]셙֯X\\G[\<\[@\c.+HIֲ\Z )H\TsИ͔:ZE\\n\m\\?_Zz<{<%KT\"q\M Ҙ(OaFMP u\5$I*\"j\\[ 67\=Í\lOEF\'BOS12i\'\\uۼ͏?܂?ν?~$\\~nS\n\T9 \W5y\OA?=w}&\\X>g\\o\X١\D9\&\n%ZFR2\#3:J\cV\QFh*Q\\\ߚF/z\3d\f,\OveO_\[ Z2e;5QӜO\Zuq\\ptP\\Z\bY\?Ħߥ\~RkQ\0(&=\Zl*9g\—76/\\\4\N\Ě<9H%\;Ȅ \Ej\›\0/\I^\\S\Y\\HcW, q8\\n\\%X\\<4\O$(H`\xAy\\gV\\\uw\\\>n\/#^rBw9}\\\\[zTTUW5\ʙ\Wς#\/cù P\IT #X\N m\D.eejVT+_\չp`\Aṙ C\;\"62\") \\'c-`ՌM폽wjGWn\de_\\\_0D٘NFN1<\ʤgډ\'\\\\\m\\/ng#\a^mI4LJbn^)L\n/Q֚\\\k7攫\\\\\.j\Z^ E \@yQVUCM\\rs\Kj\\߉;\\gFB|o7\r\n%Q,\-9\\&f6\\yx\G1Q\i\\"pFYނ\\d\M\?XzCgTj T\96\K6\0GRAA\HXA cjwq}Z׌<+-|\iB>KVaq\r=*1KMɤ\\\k{֥;Ǟ\?f)\ lV\Z\[t\7\\\\w.\\0f\\jdmA\\'J\\5.\ )!v\<(\Z\^ w/z0\vq\l\\L?2n҃>3)D#2S$@O\\$}Wϲ\Ċ/\\~;\v0\\#xVk\M\os\F\Z-(QiL_ c\\\\\"7?n`Y3U/M\9`<`\\/nZUS1;@K\$Ez3,\"Y g%_\9I!W`\\Z׾wq\oN|ti`( t\K\ڂ\\Zaj$\Cɜ>~ \\>O\l\e\ґ\T\(P\ \7{ځ\\3\i|\(y3>\\"\'\ZV\6k\\\[΁^\ʦx5\$~\\rT#\"{\\\\G۾!\R P2Y#2YG\J\\L/_L&\Z\U&b()\0\$\yDI2H\@\ z/o\JvS3P\ l\tdT0c,# bh:\釹)P+&E\4\\u\a+%6\F?*?\_`Tܧ*\TE!i\:1W\ɤpYb|GF\*4a# !>\7$U= fp*4\SB\a9\#Y\x( _\Z%kSEC%&\33d\\3ƩdӐQ\\2%b]4_\?g$\S\LVH~\Ow\pC+\y\\Ed\f&*I/^<I)Еe*hpМ5 ;C̔\\Ⱥa8޴\Z\\ONRXG7\>eRB\0.\eev\\\X\*W#0!J\1Q\"K\\J\n.k.#\\f ̻\\'\n\4~z\G\@=en_!\\q1\䚼^jLj\\\Őد`@/\`1F\JR\S1T\\C\A&\ۅ°LU\ٰxӳW׍^lAF¸Y«M\"JF^LB 7:YX\P%J\zɎs‚u-MM\\\\'f<^\\\Zv?g\'se!E\)ޠ\}7\"\'\!V6\w͍\\rǠybAN.\Z\ԓ\\O\zf\\?=3{{e|xW=C\\"GCc\Qt\ƯG\H\\Q\noz(&*\\Ͳk\ \\E뷜ڵk\P_c$[\\4E\&8\W7\\P\\w/\n؅ȝ9ofÚM\O\[\ܾOfY\9\\'\tE@)0$4j]\ZɄcT\\\ϯo[kޡstb\#;<(Ro&U0\疄S$Mǔ\O\&WfScُtnj\\\ ~ܦG\\Z_tw\7П2T %\\\\[:M ʃ\7e}\ڔ6FWA cbV}Hx/\3\\0[ưV\n3Y6m8\$-X\#\"!(b\\"x\WS?\Uϧw]\`{@\\VV\ p\2B\\rU(~\NeX\\}t`e\XhU\"\&Pouӥ\\GL_NCݙ\`B\0\\ݢp\\0\0\0\0IENDB`',1,NULL,'2020-07-03 15:00:18',NULL,NULL,'','泛微','https://www.weaver.com.cn/',0,NULL,NULL,NULL,'0',NULL,19,0,1,1,'org.maxkey.authz.cas.endpoint.adapter.CasDefaultAdapter',NULL,NULL,NULL),('9e36af33-11b8-4208-a902-6bf7a635ecce','阿里云','https://www.aliyun.com','SAAS','452c3a975fa92bbd1cd47a08ab167fe9a3cdca4c6c6a1c24f6be4882c558fecb','SAML_v2.0',_binary 'PNG\r\n\Z\n\0\0\0\rIHDR\0\0\0\0\0\06\0\0\0F1\\0\0\IDATx\oHU\/C\|!JQ m-(X\^D!wOޖ2ɍtlK\ʵ!n9q\\\\Jf\ru\M\O\%\p9Ϲ<\9\\\^\ {\\\y>>Ϲ\\AXt HB HB HB HB HBL\!\\@\\z\wι\x\r8:\_\|\:\ o\\,~t\\E_Y\Ï\0\\u\\\7\Gm&0֣.# \*v\\\\*\^T^2g!\Ɓtv\Q\]fmRK\͹\\w׺\\\\0G\9_a\.\ =\\\\ۨdj!@\\r\L\"S\\\r\O\o(XZ\i⃇؍<(\\ ;\\V\'/ 8-c0M^?\'_#\\iB!t兩l p\rLŲ\LWUavl\(\\o#S53͹E\K$1D-\GO\oB~2\Z\0\N\}sȄ8[Ət\\0V\!\r\\u\\\X\1w\r$YuǨk\\#\A^\lPrB\(\ !T^\}9\\r6\T+\\(\4\\%ֽr$\p\'\fϴZ\\{:Bdy\Ĕ\\$B=1\\,e \nRm/\\Nv1)D,\\V\\\&Q\-!\0\\upZ\ڳ\&/n3ϧxCt\/W!Lݔe^?;x\Y\b\na?Ta>a41.79\0;l&\\zqrl_=\U\\¿6 g*g!CG[19 ?Ym`\\\q-r![B2:K\~\;Xyo\OU\B\V;\Wp\f\j\D?P?V\\}9[E`J;\\Z8wY.\[#e,-Ȟ:|]\\\f\̂Z\"^\þ\\}9p}]\`1\\\\\\\\1RJ\m\׳IΏ\Tu\\S⻜\o/ϥ\gw\\\U?g~Nn\u, \ż}\\j!LT\%-\R\\.h_~{i{*gYFą-Sl\\m|\Ų[\k@e[\>;\%1=\\\$:\\j!\06 ̳\ƇG\u~ٮ\R\?z^nN[\"xzr\\B\0\w>k\h<.\ԛ\&Bz{\\:K\wWn\\6&\\}\8BOk\:J\`s\\\ӛ^_eٍQ\~5ck\03! ! ! ! ! ! ! !ML\\\ I\\0\0\0\0IENDB`',1,NULL,'2020-02-28 01:42:20',NULL,NULL,'阿里云','阿里','https://www.aliyun.com',0,NULL,NULL,NULL,'1','[{\"attr\":\"https://www.aliyun.com/SAML-Role/Attributes/RoleSessionName\",\"type\":\"UNSPECIFIED\",\"value\":\"2037230828547234327\"},{\"attr\":\"https://www.aliyun.com/SAML-Role/Attributes/Role\",\"type\":\"UNSPECIFIED\",\"value\":\"acs:ram::1729982683323703:role/maxkey,acs:ram::1729982683323703:saml-provider/maxkey\"},{\"attr\":\"https://www.aliyun.com/SAML-Role/Attributes/SessionDuration\",\"type\":\"UNSPECIFIED\",\"value\":\"1800\"}]',2,0,1,0,'',NULL,NULL,NULL),('a40388d23cea4c5ba93bed865b81d255','Basic_Demo','http://www.baidu.com','E-COMMERCE','a3ac51c6653ec2eb0afa9ebd0ccb966f539d16e64c7450775399330aa19a8dc81e698f87c64032dc548d6ec7dc3c4863','Basic',_binary 'PNG\r\n\Z\n\0\0\0\rIHDR\0\0\0G\0\0\0G\0\0\0UZ\0\0\0 pHYs\0\0\\0\0\+\0\0\0tIME\ 0-څ5>\0\0\0tEXtAuthor\0\H\0\0\0 tEXtDescription\0 !#\0\0\0\ntEXtCopyright\0\:\0\0\0tEXtCreation time\05 \0\0\0 tEXtSoftware\0]p:\0\0\0 tEXtDisclaimer\0\0\0\0tEXtWarning\0\\0\0\0tEXtSource\0\\0\0\0tEXtComment\0̖\0\0\0tEXtTitle\0\\\'\0\0IDATx\keUu\k\}\{^\0\`!L͌ (F X$C$V>h%|$)-c\P1)+GAA\ \0\{u\9{\\w\\[\U5\{\\\_\\[n\\n`{O\AD11\y\s!\QǪڻz\0UEU{\\Ͻn\\"\!5\\\Uk-FF\Υ n`ӦMl޼V\3bE;عs\'E7 \)ضmWZ\%k-\"–-[8餓ؾ};###,ٸq#\֭#\p TU\\Q\\\ٳg\\0>>N\'g\"0\`a||\=\ZK\\PB#?\yN%pG\Č\nH\1̯~g\.z dV\\L\\7T\g\Q\4D \8C\cFR!H*B\ntA2T  `\ p\{ E$DsQ \\06Y\"\`%\\055n!ϤBO0c KB!E\"1& Xz/NQAL>y\nr 2ZX[\da\TDpH-ep\ \ZJ\D\\A\2%.ו5;b\r IʟlhzO,,A\nIDR\\(\\p6\Z bbȴ`0L\\|\@TGο$\\\\X`$HƱ\ȩg<\\>gAL02;~=Y^P\\\nKW`oՔ\(@, \hi83\ja\i7w)\\1Z\\ ΋\9\"/\\\K\\׾s/\Q4ė%\hZ\"\nY,p\\,+NA$DKNiꕼ\\-\\ڭ?hc 8Y-\,)P\Z[T\'Y]\\[O\]W\2d:HN\rXУٽP\h7-=kfMCi\ȠF\ #M>|\\\g\G:-&Q6v2(\s\V9\\Z2?ŨNW\UQrx̸힟\o\ɝ<ʁP\n\\nb\X*\\r\Zs\.|\) %e\\m\]\{\ܷ\\0G\(ю,\ ״\J!\ϟ_da\\\\{;>\\Z \Ji8pi ~\av\7غqwޅX+6m\J\\\\ lB3\f` \IF,->\u\'y2\\Ƈ>mxC4 8sM~\XoY\WL\"cs<-pBr\\-pqo\r%\<6\u:oq_\;[|G\\ EH\0-ҿX\\j9ۛ\[{o\\np}k_ f\0\xt\DXR,jC\'HTM\Xf9\Jz\WMj\4ip\W\\M\\rI})rӄ\Qb*(My\r)\ xi\5mn|ຯpDcb\\/9p \p\CN\4V|a^t\NjYs<\'aB,\}\\|.|>1AԒgK)U\"tSM\nDK)\YI\\x\\8`s2_\"66p=!̩CkLe4\"ZR\G\\\[Mi1\R\MbĆ.k k[RcJ\KƀU\d!gkԗ\;0\\o{6Y,(y_0\0\ы\"L)|ꋷW\!f\H`kFv\i.ٺ\_x#a,NcU)NR;\5\\0\r81/\JȎ:űң!ԟ\\\`3~w\0\"WQT$\"\ii6o\L\9O3\D\%԰kY3̷\\};U0ʖ\ؼfa >,Ri:\|,\\\\"\"| HU\JB0R 2-h\\[/\E8ey\/]\ǺH4H\\\0t\t*\i2\x?\n\Z\"Un{\3\e&e9\\\;\p\?KJ=B_>PЈ3\\r\Y\Uϧ\=m:\\r\\\i\T=G 1ڥ\\.34\]*^L=\\0\$8W0,6 h\na\\\}\|0\1e\]Pejz\Z&\j\b4ell\0xigo?\?\dج q5!n\3ha1dY\"QSؔ\Z{\O\\(;\\\3Eq\bP\"\\l+\b \iPw\y,] _\!FZlkp\ӵ-bm? \\e~\_}\\|e\-\\AB,\L z:6\}\ngWJ&\WĔV%\\I3{\lO}N9\ÓLE7\'\Z\{\$2#M$!\eM=f!\\x\\\'r^i R:mr׾)\_\ɜ \c\c$a\(kF\\r\.\,~Ges7N3jE\2SL#\(]SV)^*\KĻ4)a-\\i&l?=4Y\?0Ѻ\\T\\q\ZxΩϢ\S!s)e*\Y-qZ\b\2A\$I-m \\\\H1i\\r~2\y\~ f\go\_LPrӤ\TTiT\b9\;|\\0,CY,=@ꔊ\O\V\0Z\S\Fu m:\8D\__w\a\`/\\(Q\i\Z\I^[8\\\Ng\yT=9\4\XԳ9\a\xќ\vWUQuHc\\p͌;7\doBJ]\\\t\/\\ɭf\ K9i\^q\Jb5C7,U\1 o\P\t!qw\nSٲ.:L `E\V\z\(1ۧdQQZq7\{\YAN \Z\r$x\jq jdee]D\"Q2 \\"\?\_e1Ҵ\\|\^\\GN\!\Q\\Io\\\-GBF,Y\P\s\\\r i \\\r1Uvzz4S:\/K\Zivh \goZõo\\'\аx\JeB\\"T\\\rtD5 \n\B\\u?;lՙ\L;-i\ \\0%\\\-Y% !5yGdMҾOBЄShP\ \QV\\\9;`:9F{FXٴRCcL^\D\>XK\|˂>\" r\\\Zf+b)h/벎~\e!{\=b3LV\r8̢\\ A\T\Gi\{eys\\'b:|@f\}8 ~?*@\+yLe!\"D\u}^ذ̴ͩТ}\\BD޸\GXO(\\n,itX ȬH\07l.;b@Ca@,!9r)K(\aJY^i\^=ڦեÓ\S\"UMEN|:7\N(\\ǟ5+s9x\"X\\\lpRq\4Mv\؁1&u<՝\\61?0v\\ݻٷo\S\\SF:cػw/w\\9\0\~;7nd||gWK]p\cܿ\Y}<\u\C{\x\\ېl\4w\\̰k\.v\\ŪUҸ۷Wcڵ-011q\\\9Bw\/F8sws{<\\M_ؐ@\"\"=\\\ZFN\0\0\0\0IENDB`',1,'admin','2013-07-18 15:51:46','admin','2016-11-06 15:49:25','Test','baidu','http://www.baidu.com',0,NULL,NULL,NULL,'0',NULL,16,0,1,0,'',NULL,NULL,NULL),('ae20330a-ef0b-4dad-9f10-d5e3485ca2ad','OpenID Connect 1.0 Demo','http://oauth.demo.maxkey.top:8080/demo-oauth/','CRM','d15b1f6f6590529f40a7f3955e9e2f182a453b3a241e460939ae532ef6d1068e','OAuth_v2.0',_binary 'PNG\r\n\Z\n\0\0\0\rIHDR\0\0\0P\0\0\0J\0\0\0,\\\P\0\0\0 pHYs\0\0\\0\0\+\0\0\0tIME\47\a~\0\0\0tEXtAuthor\0\H\0\0\0 tEXtDescription\0 !#\0\0\0\ntEXtCopyright\0\:\0\0\0tEXtCreation time\05 \0\0\0 tEXtSoftware\0]p:\0\0\0 tEXtDisclaimer\0\0\0\0tEXtWarning\0\\0\0\0tEXtSource\0\\0\0\0tEXtComment\0̖\0\0\0tEXtTitle\0\\\'\0\0#IDATxݜ\s\}\?݃)%jeDެq\\*@*Uyq9\/~IU^*o٪M\YZ\\:Eq\ \0qsu3\\0\UC\_w\ww\qBA>?yL\0\\|\\\\ZD6F*\\ 8\9SJ\r\I:D^J o15ֳr@M]\P.xC\0o\ ,I\\\\C\^\AN$\}\$(\J\4\\S \f*j{BARj <80*\ <122\Z)\\\\\hw\\\\\+q\-j2Iz\r T(\\\P\Z\$\\#:;Do*\gDO-[Ev\\4)Ρ\n!\\ \\\"JpQ\"Hy\$D\pxؾ/I$!!. |v՘\\ii`*wVp@}\ȇS\\n0X{p\ `\\rT*`\DJ8z\Yәg\"\VѾbp \2 \+~tf\⤔=m )U\n~\sy:){\\9*\@\0[@PJ\0fzjFZ\h\l\_|B^n*\\'2C\n묿}K~*O.7\T~ɉ rq4M\Ϝ~Rf\؎\Vcv\e\*\bbDeJ\´,ARJl\F\~m\8\nh\lm\P,\bdYrq\\\2;;\\\dH\\'M\3iD\\Qm\;@`x\r>{2\\p룛,.^\\6ϟ\\e44M\4\ w\Óo7x\JLWڔR(ljgQ,dѤDa\'\\'\*/ɠi\4q&5z\HFFˀ\n_=\\erbZR\79ibf\VDrVpP)%\v\~7\H\zw9\\0t\K\\\O\̡T.Sx\wi\0X_Ƅlޣo\D_wrpl[p\\m2\!;`p6Vŋ)\\~\ҡ\0mGbmj\a\cL\t;:N\r\\\~\YY޵oNz\\"U\%7܋ö\\\x\Fl6\T{).mYK\>#\\n#]\oU)\\\\R\rT,r/vWN199\\۷VT*U\Z&a\_\JQ !mN\`dd$LRBa\\0nj\w|\n\\. {Eb\'ϻ#{\.e\\\u\;\vr\\L\L\B\/\q^h$\"|\\`#!e\\tޝ\\\\qr\\[\G\\l\1\K3B~\ \tgiQ\'mO\\\YPB*7`r>\ݽP\1\\H$h\7 㫹^\yߴ*\\?W\@\A\u\\\݌HzRJ\Z\fP&z\ HZKw*\\};;;{GV\^)<< \1…s灣^W\\mO0BRJvҫAa5|v$.onK0\{?77\T~\=j!=Xi\\Y\Z4qO8\;P\ g^]\:\q _R\\3jzV\O-\\hə\w60ꅽ\/_]b:Dz,wq$}4M\\\G1@\"}\\ u̎d{v*溞aoȗ{a~\4\,\rL\pEVn,co\\\Qgkk\w\\r_SOW\\\?0j\\aqa\rW<ww\߰\/RFv}Z{t0\\u]\G~\\\Ԓ\l\/bu\F\0\\\\Q\,\rz=60H[u\\'c\\f]I\c!\\\7|\sͦ\7^>P\+\TxP0k\\c>\ʕKїN6ct ~\_\\\(K\UP\Q坾\s\cx*d fY>䧦xǗX\~\Wd,\X+afz \\ϑ\O0\iqp\\'zj7\D|/UB\޽\\\}2z&2Atp)Z6{\\";\ \\c䧦\秘\\EV*s$@57e\ \;]:\_O\Z3 w\˼z\ۍw\m4MC\pNJ\أin\ݾ(ӭp\B\ %\\\\h\raRɉ <\\\2\:ᄃ\h\09\?Ly\`gPHMQE\\\ߡ\d \0\'I}3\&GA\{ܼ\\\ᄃT*\1:Rj׹ >Ȩ\UU2\Zy\/\.}\M\\?>g\(\nZ\Q \\FY^\5**;\\\_\jmp\E\r\\le4d?%\\\𿭛xF:\Qh\\]{s\\fJBO\\i;\X(Ӯ\"d?9@\\\s\\O?-pI\Z\i{igN-Z\&VQf\y\\ݿm\\3AB`u8D\ R\\S0T\Ғm[`Gr\Z\s` Di(\nǙ\I&)肏Ci=U8柀\ \i\PvYI\0\0\0\0IENDB`',0,NULL,'2015-01-08 15:17:35',NULL,NULL,'','MaxKey','https://github.com/shimingxy/MaxKey',0,NULL,NULL,NULL,'0',NULL,11,0,0,0,'',NULL,NULL,NULL),('b32834accb544ea7a9a09dcae4a36403','OAuth v2.0_Demo','http://oauth.demo.maxkey.top:8080/demo-oauth/','HR','4e1d7eb7b14ad658e8d9066c95902c852ff6494512a742a8392d1d16adc5af551e698f87c64032dc548d6ec7dc3c4863','OAuth_v2.0',_binary 'PNG\r\n\Z\n\0\0\0\rIHDR\0\0\0|\0\0\0{\0\0\0\\0\04IDATx\\\U\Ȁ\X \m삽`\\n\;(`(\5\=Ϝ\\\3\\\p{=\O\O|\\\>\?\X\~]\?x\\w\\}V\w\\\\\w\}ᮻ\\pn}\[o\{o2o\W;\#6{ӛ޴k_\/ˏ~ы^t%\~Wt\A]\-X{\\=я\wxw߿+}٧\\\\]\\\\\x\n\w\\\/\mo{-oyˣov-o{\r|[w퓟\\\vЇ>t\{\<\\n\o}\[׽\u\\^\0\9\\Y\zVt%\0\<\\>;\?\Ca\{\\C\Kûmݶխn\m\6]>ozӛ\Mnr\[lq\\rox\C6\x\\6̷\N9唝/\x\g>󙕟\ݻ\\\\o{;ꨣ|\\ \'\}\[\\~\w\/\?[lY׿\?\]|\݊+|\\{\?\ \\k\\v\ur\fuol\i׽\u]\\y0\._\O~\O\N?S\ĉ\'\}\s\\n\\3\8\!׿ߡ\\\?]}\ʕCZjUw\%t^zi\[zu\o\7M/}{ի^5ڪ+\\\\:]izw\k_{\Fmtʆnx@=6y+ж\ ;\s/\\~7Ժ+л\\g\-Yd?\\\\-\\. \Z!\7_t\{\\Cm\\\n\l\\Ê̷\\\ߎ-\@j\\m?\L\ZT\1\k\:ӟ\-oyKw\G\ \\% @k\5*\<\\E\\0o\to]Ybe\Gwt袋.\򗿌p\\\\C߮}\+_J\\0\Z/]t\\~\7!\\0]\\td\\Ww7я~th\eL7-.3N \|~\gQ\(^W<[xq}\k_\\q{t\o@^8^~Z\.\\raTs=\i\вC6ځ]\\\O>oFgy&\-Rfri`\\\\\wQK^\\SO,Ϩ\\0\'D|m 8\\0\'kP?p)\0`|軫X\-ZH?\n\\\\E^-~߿YEه9\\0\>\\A@5\0\\9\a\IOzR< \L\t$h\>YG\ OUo\ݍnt#\ t\\7\;_Ztt!\\}\\GKC>hH\-\\w1\Z\\O}jW%Ty6\\0\LzUΗLJ\\UنW\khx :\Go\Cu\[W!34A [h_\\\\U;4`bIUɀ-\RO4t3\@\i_j\\/\\0G\;\\\x\\jgEI\FU̡↘sb-鷪^\0O4\Їv\\U<\0\\1\34\4@\n4t\Ue0RjWbb\rКT\Fv~\\w\h\Z=4\<\\02\\\0]㯙o&]V!m|$x\\\\ǔ\t5՛\\R\|jسN\ri\;m\'\"h\0Ay\y6\ZG=\?\T\F 4{&-`&m?tk\\\\\\*vi\y\k\f* \\\\:\\0\r\|\~5̺L\0\p4=\\?qx[Ct\IʲC_\v@>G}\#\vΜm\\\'\n\ou-\g_\Z\\4k\rU.)^\Z\IaT\q{\\W\v=\\K\\nlc\v\rĤET\ͥ\\q\}i\\h>\']Piuxт>w]\.G/}\\i\\Zje~s\\XsaȚx\U\\ΔpZ\Z(\\\Kʨ`\~f]\nZ)ճN\!܋\x\@\08Vv\w\"#\ _\\\h\\\G \\c&\R/U2 lL\p\0pN \\\s\aJ\;\rt\\Z-f_\W\mR8\Z\ͧ>\\|\-\b\" !J1\|x&?(^\Wg1\Ik?\Zk\\\\0G∡i2>軬w`;(tY݈v\\"l>Tz$p:A`\P\lʮ\9\g\r Kp\Tb}Ѓdh=\N\?Ǭ n\[U\0>\"8\"\\\}<@?\{1y\rRha\i\N;\Ĕ2<Js ̤l&\\\r-n-\\\i`\\\= I~\s#[Ӓh^ 8n@&\>>KRR\2\\\Z\v99s}y@\\\˭@\o;\\n#WB\E^\U0=\}\r\' Ftaϖ0:&;&?\pU<\\7ل\\\\\wے\ \\r\re\ܾ\ùT\\7,)\\tjp]y\\=\lS|q#c|w+[*2:f S;\0\\޶r|fv;6DJ>\cD\\Y`\\V4 g}A\}\t}s݋n}Q\TP\0{ \hl\l\"4LL\D\0`\\Nuhb⡊OBO\\a[&\\ xQ$\\7嗢_M\=j]>{h9O&} \#vWhQRk\'n \\\ЌhF\?O\\ch{4ԏ\b292\vV\sDH$p4ʧ>8h\L(u \ʡ@vYz\\\@0%LV\kG-[\ϸ\\0`\Z\8\\B96\I\h\I>C\5[`ߦ|\\QoQ\@V#5\0CeKt/\0&\\\\˩\r\`pS4\&sP\Sν:\rhg܉\\1\RgKƁ\\\Y=O} (\67;, \D+-\!ۣ\|9\\ɯ`\\\'0XpX`\\\\p\0\l \n\06\Z+R!\X\'\M[e\\e\ZG\\ps\t˘۬\9]UͫKNѪ1`um8\vv3:\z\G)s\nrN \\O\\L+\\w\]\r\0A\3$\@y>ߜ\-tx\}\xQ˗!\0\L뵮\nL:\@G\ns\X O\Qr4iݾcdI6D*Mgy^\\\\t\;\#\-\]@ h_Sy\\oPo<:Uj!-\:\rGvYfg>Ms\\~`0\\kⅼv5}\:ag\"+nF&1 \I\Kf}V\{\\0E\D\57\nz\nVpU\v(f=ԏ\:\6ULA\{[\r2\\\_\lx\@E,v\@F`cD-Q4nv a\\U;Mx՞\1\\\DHC\@oͺ\\\)\Q@ K-jID]K\\p%5\17Z\ ȴ]ɯOkI p\fޥxS&\FU\:o\\R`#\=\\\*FnD+\\a i?$JK0$\:_^ͤ˩\f\\%\Lv R/}\\s\\\Q糝#Sp׷}I\'&\PUUnÊqΟs p\X\\g^\4\ri\LzJI\ϡπ\nTQ_-4\ g&\9>[r-)k^8\g[\\w;^ժ\]\z[\'V,\uVC̹\\y\!\\)~\6y6l I\~\\\v\LqI\R\rk\\2!a\fu _$ȼ\\\\0\S\\\YJئe\\\6\`zءq9tE\\d\n3\45\\t!1#`\0\"6A! \\\'Jn})\4͒& y❚\\\\ZC\\\\\" \'5\)zL\\\\"gVg\Z \A\n@nfWt.w\`3\0\"\kc0\`mJ\q\Is.@r|\z1R3T;Mr{fϮ[,#\\F0B\4{F\33Z>W3k@\e%л\xբpLILǴp\Zؒ\@a*x}:\uXA p`\$\0\3\\=g\D U\\\\Xq}\Zݎt}<]t{_2.+WϘk5\\[g>ZZ2 {$\\\g\0PGQ|ʼ\v\n/\ah{\IR0\\9\\\\'\+6&WfL1\&ov.\' \\\O,}\*[΋|\\ǽd\.S7ۧi鮥:P\\Z جf!,R`uJɑ0\\w\k\\1;a\b^\9D\0Ċ2\\绥\s\0<`ƒ113ˡ_bMڛ6\z\h\4U2N v\M\n\sM\al>\\P|\\\CrhW(Fa\YHHP4K@\;c \\x?]Rq@ \\\\b 3nl\}]o*0GK]GZ|>%\\IۛrE3 %J\Z_Qr,\:w\?;\۔D\\:\ff\6\\\0]{\\0cH-ŷ3]i\(S?rQgrT\]Ш \>D\]\4Ӷ2O.}᳁\jI\0u\M\n\&\qAܨ\0[уW\/V;\ܻH\k\r\2Ԃ\g\u\J\SQ\0O\0\\\\\0\8s0ev5i?\x߁2]0\\Z\\\E \c\g*\9\~g>] x\'#\'\Ч\0?rLsA\S\\HK;߱+\D\h9\rh`=\h\:\Z\\'\Z ]q,\pE]S\0(6x\rPD;\0\\Z_*Z\0f|Kl*s]BIQǏ\\bd\ZG0IG\|:iԉPqEo\\x\aX\1l10ʚ9ΨV+{\n\\{2ν\4\\r\+ \|#c\0w\naDނI\\{ \F&`ﶅ\1\\5鐆9/#S(>;1s\[\LϔV~\<\" ٧\`G\v`\Xgpq@\'\F^Jj\D~43 \\Í\\nŷ`F@Bf_LHW\"jy\Fk\"P\Ah:/6\侢湂\},ߧ3/,\r!\`MUTׅll9圉\#\\ \rx\\'\ xͶX\r\\A1.6yPR\(\\\BE-\Oqh\\\\\\Z^@-\1 Ӏ6!\`JǏ\̏=t3[ĘV(bd\r4\9\,\n0\us\ $xOk\s\\\\E\0¸g/1˥\"}L9\\ä\\Z%r\5Yq򨀍 \n\5\\\=r<63__ X n`\[1]!\(#\#p1d:W3N;|hRu \0~3\\0\_*OK)`QBΤ\p.Y\\\x6-5\ (;Ϭ9*\LZsXe1#LsS1c1O0\\ZI$\\~\ejZs\LP\\Jc\\^F\ \Z r\ΧҵRPx\&Y!\=w\%?:/\ZzMB\\򷑴.<lRؚ`HD\a\\'a\\aN\9o\\nE*Psh%z~\wAf6\Z}t@\\ :\yK\Z\k&\}X\\Z>\VC \i\ͼ`vʍt\\ZPa>\\6}`^^v?Kiy5\"PۘE\Ze[,s\*\`e\\\2@\pn +ͻߣ\Wk\r|/-/b {E\\Jי\t6<ܛ\\j xG\\koo#y4\'\8@\/j-E/HC\gˣi{1JJǤ13Zl\w}\`W͡ ČMfᣌ\\0\{͉i>Z/\2h>㏴\i8 g#4\0=ZVogئfz%ծT\\ț~#m&Ĭ \ \\XM\1uIߒc\\v-40\hR L6\؞IɧLmvI\\C\\"4A\'H\\\\\Nڟ\\L\\\9y}xx\_7)\X\=\"#h`j FlhcR0\h<\\\?E\kbO+,S\\ 8toKT\\nZR=zV} ~[ \.m뗾\A |r)-\\F}\\܋K\bn2\\]xM\m\ͱaIEL8MBݱD 0 [=@f)*\0s\ZڜC3\ԺL\"\\\'`~vE)N\\% m_\җ>\\oo5y2~P+6\\^\'fj5G\h) -g21bRQ:o\O_\2ã\|̸\{a\"q\#O1\n>)M3$٧\\L\Dή!ȋ MDrSp۳\'\0\ZlG\'%{a%d(t\Y݄\@guGc>~\KqL0̿\׆tF)OLj\{q$f\'\N\\sif\\\Q7B\\#` &\6\\\\"4Lo\"l\:>}56a\\r\o*\Zox\D\"CS\\m\\ל\\\_t2ϬG@K\afrr\9\uRg1\4\ZC`c\"a\Z\;\j*\MJ1\Mn lob4,\\j홁KH]\'`\c\>o\\/2Mj\Zl5\_^VD3<\&8a-\6o\B\no\!}y\<\r#&Ra4L>^C\*d^w\Z\\C\\0s\Հ6E0h@%X\l \ǦHTDf\ \#V\0p7@ H1%\p,\\*~M\n6*_~:+\R\\\0\\j.;ɍip\\\Zb\_4]d>\\1[)@4\\@]NJ\~4P\\{\BLnA\e*\m4Ћ_K2?e=-\n \"d&\\\`\\cR@ODKS\W]<;L\׀O|L&\4T\ri%%;ը\* \=POAyi\\\\/kL \\\0 1u,\0\ՇgD_PB(;\v| $@R蒹d&\\1-\\n~S^ؠ$\TALtO\i1.a\t8):\\lE\뫆JU\07\Ё\\ ~j \\\1\7\_-B8~i[t@E\.9;ȑI\o\&$+- \0_5\\ %kR\j@\q`Ǘ#?{\0NKغv\lZ>V3u})\r ($xk5}\K\')4cBB\\0]:c!`\\\c\\Y\g}y)\0lv\0v\k0.\\\\Rjelm*[ZmNoSN\~X^O\<\BM\\,oXF\\1J0?qA>t\\\\j\07ʨL}E)<0?_撆!V\2C@\U)6\\\"\\x$\;\r\!\AU:\zS\ CKc_c\pL\32Eh\,\Z\"L!\\L-mfe\!)ߍ\"gw\da`H`ŸW\lJ\\2\R:o*\\\V ۙhe\NJ\nQ%\S\5(jb[@\\'\\cf\v;\Tc26 2\}9t(,Y\ \gek\؎yyYR\9k\\?fҏVs+Uf\`\\N\Z7‡IW\0Ƅh@\Z\"-E\0\9\\0\dm ,\\V H\Z-\/fڐAr}\򼬃\9Äs\jmeEfV٣N\c\\\'B\:@k3syO\(\0`48J(0\hF+ \0\J\\ߪ.1}I! \gx\\r\Ϣy\"\4ᑊ̍{-/ys;Z\r3>\1\y}fv\0\\>\4\g;\(\b\\\\#0A\\\\\0;\\Z~#hg@\}\0\\Z\˫DcD\,\\6Voܸ3[$Z\>\\>21M|z&`ah :\+weʁKXV\\;]3\\0v{\r\\"0\u<#`\\\=h4a 8\,\ߝ\3jds\\*ާ(`ֈ#\IaF5@\Qi3\F[\B\\\\Ϝ4TF\\CL\\e\\=[0c]w6 ï Xlʽ^R)=Wt\njF)QL \0\"\01J\\Lt4\T0\\(\\[ X֤\l\Z\bdks-\ke\8:<й\PRBϥ\0%\\1X\lZ\}@ 0 סypy/dDC2y0Dhx\0(\0-\ gni2\,_\\\e\0[\ʘua\\\w\~\\\]}ϬLIΟ}%\ʼ?\n3\\0u\e~\'\\Ӏ5\:\n\4, y\Ȗ\KJ\CFM(\0G}WH\\0\\"\\"pfm[\\RRgR#@۵w\Z웍(\\,X\>X׭\qЍ\\jcΫ,RerMTvc߾#> PJg%C&9\03:\5B\}\\_g\rv#4>\DꙂLPtH6@ZJ\?(\\-Js ЏR\\Ae\wCy\\0\4 Ҷ9*\\;\..Y,h\"\h=0T!|n_{L{\qA r\d\;lLp\楾\"\\i\ܐr,7g^1W\Z\I\\nGƔeDM-\Zv\oQ.&>\M\qys2ˤ\vZ\m\Qc\@\nw>\:\og\\E܈\;\;@\\>`\\\Z\j=\\5>+asA*|*\\I]\nv6-˧#\-6RKL3X\B`ٶ|r˸|&\tR\dG-Tj\Z \K\\n8G~\\w_aIs7\HdH\\0K\ \-k\ZE3\,2G\\m9X_ZEە_§yXVR\n\08&4\N\ǚ\$\BhɃ;+7QC^l2\`ݕ\9*\ v\XeP\BH=M~\\Yd\> \b\v\s\(\x&nkI\vU\K4LĚ94/U4\\"\1 ZS\,X>\R^D\ lo\0WH#R+\,@8\^-0i\'p\"ë-9#\\\xe\\-\%th\j\@NCu\Nf$Oт\w6\gifiPRPK\7\/\\\\y0\0\m\7\I\о%s\U\.R>^Z{ \&۵w\P :b\1;&!@\0M\Z8Ƃ\Nd\E~4`!\Z\ϻg1`\D8\"cԟ`<<R\K\\\TX/)e\upi\n3\\g \f\\4\n\Z@޶AQ\Nj)̞h&O 9ܴ4o\o߁.\n\\f\\b\JXk]\Z+0*O\rt#fz\'\\0LF\vT\\\0\i~۞\,\p6\\\\4\bp+;s\N\n5\\\\@W{3{#L\d0io,\\Z_\\"ecq|&r?֣OY\\Ժ7&tbYp t\=\'c\ǔg_[1*,\ET\00 \0&LdGTh#\Gy\\r<(Q\|DǍ\=m}\\n\\G\\\[\' //:h?\= \\\e< \liLKy\=h l\\wۙ\uaL\\ \ɳ~\9>dY\!gƬϙH&\Z\-.\k\/~)9rr`,m۷\#/\62jS\\\rh\\uf\14`:F\3\sii\o6\Z4&~\ts\CExA]1HSH\0m*\0SC\0\K\p֞\G\!\\\\ \\\\\/\9\\j\2G\\2˚E\G&Y\"ZM\\r>9O\/3ˎ\'(-\m\|\|r͹l Z-0}\\\n\.\_\\f#fu\m\,+\(1\b\0rj4Ṙ\n4*\Zاۧl\g&2f >5~q=Ñփ4\P~\\\䵸@.3 \5\\\0D֤\|Ѻhg\\\k?[\qPQ7\E\\\^\\\6#\ZZ\~Am޵\ƾM~0`\"o&N\\'Kt[?\Z[\?oش\\nπ2V.;+з̷DoQ~}A\r9%vG\3\\5\,,\70f\Q\# c\ߙ_\)\pH=\1*O\Fo1o;\\ğVھҸw&Ԙp1]-\',4O@\'g= ^&e:\\(Jj\>U\l1\/B_Y7U)tQ`]!ś\r\\\XR\~B:\\'\Z\&=\\pfX3\\rd\\I\\U5\N-]\N`ȷ\`\\3!BF.ϫB\ %D\;l8o\\g6+`(xwMs:`v\08\T\o%\x\\WiR_N.\\cӥݛ\r\\\(Wj\T_\b9i`\\]4}Yi\Jێ/ְ\\{\\ \\|o\*\;\'5\0\0\0\0IENDB`',0,'superadmin','2013-06-05 15:15:03',NULL,NULL,'','MaxKey','https://github.com/shimingxy/MaxKey',0,NULL,NULL,NULL,'0',NULL,10,0,0,0,'',NULL,NULL,NULL),('c1cabfaeb9a448028ffab2148da9f65c','QQ Login','QQ.exe','COMMUNICATION','7a1e2f19c8f21ca9405690d2fedf8c4d0d9f57e9a797732a074689ab39238a2d1e698f87c64032dc548d6ec7dc3c4863','Desktop',_binary 'PNG\r\n\Z\n\0\0\0\rIHDR\0\0\0B\0\0\0B\0\0\0\T\0\\0\0\0 pHYs\0\0\\0\0\+\0\0\0tIME\ \0,!C\0\0\0tEXtAuthor\0\H\0\0\0 tEXtDescription\0 !#\0\0\0\ntEXtCopyright\0\:\0\0\0tEXtCreation time\05 \0\0\0 tEXtSoftware\0]p:\0\0\0 tEXtDisclaimer\0\0\0\0tEXtWarning\0\\0\0\0tEXtSource\0\\0\0\0tEXtComment\0̖\0\0\0tEXtTitle\0\\\'\0\0+IDATx\yU՝\?\\\W\ZٛE`PP\HR#1q(5\\Q\dcQ \8\]ōHD\P޻_w\\\f1N\\\T\TW\\\\\9\>ẮdH(hW4\"!9\r\iDNC r\Z\@\4\"\'틼Ygg\'\ronax7\ \\bQWg\\ڼyL6\ &Fkk+\^}u=餁c;8\{R\"It,.\\"N=3\\\'b\MdSO\y6 B\0\-~r͵\r9\wW}_\+^~m\n\n\\ݍI\9&m\:&\\}\"c¤\u睌7nJ9&˟_#\7젨d \D\Z\sQ%M}(Rn.]JCC\\\M\\\b\\߰a\vB\/0Lt=\\RT6w\\\J$A{s?R:;;\x\wy? \\6g\:\t/Sc\\/\86\?\p]gE\<E \i\g?SAD\n\qn\ҩc\\cLvs y\x\\Gs\>RJl\\\[n\\=WqH\\\W^\\gپx\Wh߇i8k8I2\\i\\PE\<\KM*\0 f\9 .\k͟&g/>ش\\Nm\\\ V[y\\wן^O(\Mp\!<\rhصkP\ZM;\x$\g_q+Bp\WcO\:.X\[C\&P=\\'$sxU\\\\2(\rD@|\x \\\\U?\[Q\q=<\ð5\Zdɥye#\6\e\7ҡ%@*\Zi AYk$ZZ\\ORIJ\$R:\\ZckqƏRT*\\ ]=\nMq\NK\}@H\Z ddȣ(:!\eQѻ FS \2\el\'Ns\tS\ֆ(YaP6tH;-4\mJvG\r1R YĊ`m=\g@q G\$N?cʢ\\\Jb\\c2,\ɜ :Ԕ\qP\\ 0h*H \$BW7ttaB\0a{s֕fGE\X\()_ B9>\k\Z\\ۦJ\\Hv`\V\qn\Ž\\G\9jw7t$q1\0ĵ\jk\'\0H^v%jXvb\|-\Bg$z!Zؽ2:dl\\M\Htu| #XCT :J8 \gԨG\@6fl\\\\\Ȯ*\r\0\Z\\\Qlp\nu\C \ZE:B\ 1m\r3Ґ\\\L&4=RU\rT$ Z0\8l|\"O?F\#2\J }>п`y{\\$\\A\־8ΩsO\U\ܸu\ ʀ\0UUPU\\\'V(Jւ3$(Z\d?i86\\\\\LWQA\_\ c[ؖ\_\o㳃\K\Z;w歘\E gEL?n\Z+J\?g\/\\7T*U\< l>(HP\0,W\\tȴw\g_l$Yg1l\4m:a-\zJ&PU\r!\DUSy\u\\\_\q]t&W\f+P8İ\E[[I=\iݽ.Uw D(* |jo\n\\MT\#\Ɲt\\\\Ov<\`n6l)*)\']p - Dzx\7?\ (Alzo3i\{B\^,\DN\Jڱ#\\!bmITaǠa\\0\y\\`\\Q$6\5\S#뿺\\루\Z\H\i\wl\r\rf\M\\܂sh9\qpts3Z[\'TK\n)(p|\×}\Aj\%\\y>mC@lˤ;\߰\"J\:\aE2M{q\0_7\Y^\0G#MZ{=B\n#\Cp=\q=OeRٜЗ_$\\Χ }j\8˞w\c\n\߷ 0\bDۢ?\vڶL:\\Q#\˙:\\\Z\U\r 6ܼf?9\&\ny\&>\QOѼ3i9;L,\AƊ+jH AN\0\\t\\,\\rG\ƺW\4s.[~u31@r\\\'7,\n\\C87ͷ\\\\\0z\(\stǻ\\q\\\̘E˳Wf<=SO$\T>\,8aaXK8e\\\\aDp\K\"\*qI&\\|\E Ġ=(r\\Xy\Qa\1iUh B#낞\\8\b\\. \\r\\\\wp\Ya\2\:m&-m V\zɴ[\\~Z\\-,\\q}|)\$\K\K\tHkP ??\߬[.,=\\9\\u\'|\\\\l\\v<,\'; =!;$JaQ!\=g\X4%\5һP\B\~{3ϾjCõt\W\ O\+Xv[9Ͼk\⺫F\C@U\rM(^%\)\`\\r=\E\C}\qn\\r,\έ\ΐ? Tޚ\؋ \\T~d7h b\ƵϜK\`\\0\7|\~VQ:s6W*&O\8H\AE\\\)%$\\ˣ+~\\O\˵s{|S+!\jf9cAl\O|\\lx;^\v\+g˹\-d\\4\r\sU8BASUA\r!T[;y\Wx\\u_w%\n\T\n\H\\\ s\C1\\[+\LA ]6MPUf\\\c-^{+\\\\>AلYL1 j1XEQ0m\v\\K\w\{ql\\\'OP-,\w@\²<̝\Z\AtUB\\g\2P\\Q&8\3&\Sl\]G\\d1\\\n\\2TUÍw15\\qqL\rEQA\n \H\ \Us\? \'\\]\5/\\n\"T>\jip_R9LPefbL9f*\\\c\6\bFE\0MH\ TH\nH \$HӥP^\0\o#u4\\\\\\\y\Xu\4R\4\\0tSҕ\7 أ®9\q\D\"\\;O\ZE۞=\\4RP\t%=J]\^S8a\s\1TVVe,tvv\\\DKK tw`gRX}PXQ1\#H$B,##,2 a\\\KSS\M\$\]ئ(\B3bDZUUU7 \RJ2 L]\\ !D\"\(\p@/\\>ibc\v\I\\NX$B^^\ht\0L\~\@\4\"!9\r\\\0AN؆\rM\0\0\0\0IENDB`',1,'superadmin','2013-05-25 09:37:51','admin','2016-09-27 23:03:17','QQ登录','腾讯',' http://im.qq.com/pcqq/',3,'','','uid','0',NULL,14,0,1,1,'org.maxkey.authz.desktop.endpoint.adapter.DesktopQQAdapter',NULL,NULL,NULL),('c3d44bb1-e2c4-45dd-91ce-43e821f1321c','Liferay Portal','http://liferay.demo.connsec.com:8080/','OA','d9457a9a9017d2f92ce3d0b58e4328ea637dcc5a434d3bc900bd5f07cd1eda86','OAuth_v2.0',_binary 'PNG\r\n\Z\n\0\0\0\rIHDR\0\0\03\0\0\03\0\0\0:0*\0\0\0 pHYs\0\0 \0\0 \0\0\0\nOiCCPPhotoshop ICC profile\0\0xڝSgTS\=\BKKoR RB&*! J!\QEEȠQ, \n\\!\\{kּ\\\>\\ H3Q5 B\\\\\\.@\n$p\0d!s#\0~<<+\"\0x\ \0M0\B\\t8K\0@zB\0@F&S\0\0`\cb\\0P-\0`\'\\\0{\0[!\0 eD\0h;\0\VE\0X0\0fK\9\0\-\00IWfH\0\0\ \0 \00Q)\0{\0`\##x\0\0FW<+\*\0\0x<$9E[-qWW.(\I+6aa@.\y24\\\0\0\x\\\6_-\\"bb\\ϫp@\0\0\t~\,/\Z;m%\h^ uf@\0\\Wp~<\5\0j>{-]cK\'Xt\\0\0o\(h\\w\?G%\0fIq\0\0^D$.Tʳ?\\0\0D*A,\ `6B$\\BB\ndr`)B(Ͱ*`/\@4Qhp.\U=pa( A\a!ڈbX#!H$ ɈQ\"K5H1RT UH=r9\\F;\\02G1Q=\ C7\ZF \dt1\r\Z=6\Ыhڏ>C\0\3\l0.\\B8, c˱\" \\ZVcϱwE 6wB aAHXLXN\H $4\ 7 Q\\'\"K&\b21XH,#\/{C\7$C2\'IT\\F\nR#\,4H\Z#\\dk9, +ȅ\\\\3\\![\nb@qS\(R\jJ\\4\e2AURݨT5ZBRQ4u9̓IK\\Zhhi\tݕN\W\\\G\\w \rLjg(gwLӋ\T071\\oUX**|\\nJ&*/Tު UU\T^S}FU3S\ ԖUP\SSg;goT?~YY\L\OCQ_\\ cx,!k\ru5\&\\|v*=9C3J3WRf?\qtN \(~\\)\)4L1e\\kXHQG\6\EYA\J\'\\\'Gg\\S\Sݧ\nM=:.kDwn^Lo\y\}/TmG X $\ \<\5qo</\\QC]\@Caaᄑ\<\FFi\\\\$\m\mƣ&&!&KM\M\RM);L;L\\\͢\֙5=1\2\\כ߷`ZxZ,eI\ZYnZ9YXUZ]F%ֻNN\gðɶ\\ۮm}agbgŮ\}}=\r\Z~sr:V:ޚΜ\?}\\/gX\\\3\\)\iS\Gggs󈋉K\.>.\\Ƚ\Jtq]\z\\\ۯ\6\i\ܟ\4)Y3s\\\C\Q\\? 0k߬~OCOg\#/c/Wװwa\>>r\>\<7\2\Y_\7ȷ\O\o_\C#dz\\0%gA[z|!?:\e\\AAA\!h\쐭!\Α\iP~\\\a\a\~ \'W?pX\Z\15w\\Cs\DDDޛg1O9-J5*>.j<\74?\.fY\\XXIlK9.*6nl\\\\ \{/\]py\\.,:@LN8A*%w%\ny\\g\"/\6ш\C\\*NH*Mz쑼5y$\3,幄\'L\rLݛ:v m2=:1qB!Mg\g\fvˬe\n/\kY-\nB\TZ(\*geWf͉\9+\\̳\ې7\\\ᒶKW-X潬j9\\(\x\oʿܔĹd\f\f\\\-[\n\r\ڴ\r\V\E\/\(ۻCɾ\UUM\f\eI?\m]Nmq\\\#׹\\\=TR\+\G\\w-\r6\rU\\#pDy\\ \\r:\v{\\vg/jBFS[b[O\>\\\\zG\499\?r\C\d\&ˮ/~\\\\јѡ򗓿m|\\\\\\\x31^V\w\w\\O\| (hSЧc3-\\0\0\0 cHRM\0\0z%\0\0\0\0\0\0\\0\0u0\0\0\`\0\0:\0\0o_\F\0\0IDATx\\ڽJ\P\\$i\ҏY[\Ap\\^\\\\\\\]š\=\\j\~M!͇C\Z&m\y\{BÁo?\|\GV\\\]\%v ڗ&F!׻}\0P0a4ǵ\0\l-AP\\0\Vv{\\\\kF]\^W^\9;\MfɈ^9E~ c@1krcy\e )r\\ZJ*\'&(4T4\n*Tɇ !=J\n1nGb\a?r\c7\ZI \\\0}\,\\r`\.vRJ\F\'p]\\:\_0)= \T\l_Cp\nGad,w\u貑1\/θ s\wկ>i\\8t\prj:\|Ӿx<\ T\^\Nsp\kOR\\N\Xn\W\\:ɚ5NR\wLr |p #`\\n1,0駭R\\aX\>>: ?QAtɅ:јV}b\<1\1eǙXQX\"ux*\\}\Zz_o\Q\ay`~y;\\\\w\'Ó̳.~j\ \>0)\\\x.ZS\]x\Lt塎g]Kˬ:~\\~d;iLbnK\8z%iSg\\\Kb\Yp\rLŝ侯ϔh\,2\]\\א\ID\ՙc\Z\_QdQ}sN%_w\FP#щY\E?P\ =8ߘ.\"\OԦ\n\\nYfuR쏡/c\a2OA ob\wZ\\7n N>\]7x ~-醙hGy\n \\;:vQ1_\O\s\Dux\'\\N\Z3N̓I[m2<|.I鰬:&&…h\E\ӓs\\'!a~x\r m\2ay/\v\\Ӄ\g\b d5n\R\+mJM,\\\\;:&ݰv\m0`Ig%O\D\"Ff\r<?=\jͤ/=)5?vib\n\zY{\y\)&\m N9\KL@\nxt\0q;t\z\\f \[\'H\\M>\ueKqR坔}\?{\plGV\\6۶x@9\a)fMO7Gdxa5qܨfv)\nu\:Y1OvJ\%IΛO\\"[4%\;\r\\));̠DD\\0<6ز[\wl^\Cz\yij\ѯAղ1Yu\7\\~ U\ QݷFNn\؉ w\7\n<+Y٧,}\L\k5{P\'|h .ע\r\Dtn8-\'\\Ҍ-UV.˽&;%19\g~m\\02ނ\Yo]cJyY[&l\)f\0G \wH.J\DK#]EYA_ÍW Zd[PT7\<\@`\Q\6!oH\A\`%P&lFcL)\rk\ɃDdOL\!%,tH6?7\\\"\i\p]vj=7\ӧ0̈́^\'ٵA0K\?e\\2/[B\,\wl6ҽNg\\P\;..ݯo\)\\\\/\Ɯɶ2\N{nKi\)K\â[wJBZuT,̕#Mx`dW\d\z%,-xd\\\tHeU\y\+\$VOB}R\uo\r`\n\O\s\D7EK\B\\\z.%Ð Q ڃ\ \\07\\'voo1XM\\\ư\\$.%J }~\r7^\3v\,Ul \\b_\'r1\Z \Jy\\}_Ku7^el !{\V{n.\JY \r\35:S ZXq,\-&VH\\\\\\0 \r\q\q\;\JC0+g)\c\o6Yƶ];g<;,\\!ǽ O۪#\\eS2;\-[\#\F3\\"\mRxscJ)\\r\K~ \t7>iI^|\E!; $e\1\\\\klZz\UF\\m12D!;\w;N\h{qQ \O\i\'[aE\)\0^ӝP\\\*\\,;\GZz學D-\\Yw\l\ZႠ\KND7Iz /č[ޫy\(I\F~ \W\0 \f!˶\g\\xzoa/7\Gva1Tdw\n]MDK0]vT vw jS(l\Z0f\h^E/\x\n\\\dI%\G:i{]Q Զ\\oЍ܅&\\/>X\`R#[)2\rm\\=!\\%\qɤ~j㒡\\?oqq\\d\21J\l+h :Η.t=Yu\bnbQUl /\>غa4wwmem\fxT2X0lsb3iI&,\\dfs\"0lqvȦ6\^$\ nm)@Y6`&;ܪ\ǗNYU\\Rq ĪD v\q,3k6nsi\\ܐ\g,.Wll6 ׉)<2&r\\#P\u%tMIPO\ 0#ŽK\Œo\\.]qi\\ \\B\\\\O\\H-rѓn(OVYv\n7S\\\5.k\\\w\=]l\ߍP|}\ Iݷ& 2Qk\h&%\\\"amR\\\Z :`Y2͙A\ʵW4_6U7I=\0L@\_<\&i\i\L\[e|\͂\\\` m\er\j)\M*x\ҲjGLk\,\>F\rl\]\@Hɖ?\qVq\/Fn\k*G\\\Y\}$\\'\{ݲfA0\\3\\\\\"gDJ\\{t\|} `\\cMw+φ\rK=:ʤ|\'\w>Y\\O\\\\$n\3a[\;I\'PYy&\@SLK\\\7GKU\UA\'c\w8gڱCm̈́V{\+\$ epD\hϢ^\%uSU<ߏu\*X0\'>⎩b\鄞\}\r|F\f\\nW_\Iy\\\,C%ԗj&\\\}P\ΓpC=֛#(ς\ }\d\޲ZUμ-\eårO\s\%u4\/wB\0ǺKj\>XX%dݨ\=\J[TD\W\E8y>K#04\n\:ge\0=\0{:,ƿO\\a\:\VR\ץ\k|KG\`\\ .)\0\0\0\0IENDB`',1,'admin','2015-01-16 15:33:02',NULL,NULL,'','网易','http://note.youdao.com/',3,'','','username','0',NULL,8,0,1,1,'org.maxkey.authz.formbased.endpoint.adapter.FormBasedNeteaseNoteYoudaoAdapter',NULL,NULL,NULL),('f1e33b71-f553-42ab-ae91-2fd913854cda','Token_Based_Simple','http://tokenbased.demo.maxkey.top:8080/demo-tokenbase/sampletoken.jsp','E-COMMERCE','1729a1ee16e532d61e097c01054dcfe7','Token_Based',_binary 'PNG\r\n\Z\n\0\0\0\rIHDR\0\0\0D\0\0\0B\0\0\0\Jp\0\0\0 pHYs\0\0\\0\0\+\0\0\0tIME\ ,%6\\0\0\0tEXtAuthor\0\H\0\0\0 tEXtDescription\0 !#\0\0\0\ntEXtCopyright\0\:\0\0\0tEXtCreation time\05 \0\0\0 tEXtSoftware\0]p:\0\0\0 tEXtDisclaimer\0\0\0\0tEXtWarning\0\\0\0\0tEXtSource\0\\0\0\0tEXtComment\0̖\0\0\0tEXtTitle\0\\\'\0\0kIDATx՜y%W}\?\\\Ei\hX\0If@ $(\ IXr+N\ؐ\E06c,,M\9h4\h4o\\w߻ows\9ݷ\E#UIW\r\\\\\#tf %d\vM\ Q\\\ը\2m\uIJ%dtt0BF)pXkY^^׋R\')O\\'|Ng)%\Z\0,p\"\oւHcFk@ ;\Z\`p c!=Eq̺SkR!!w!XKReff\\Yg& `eu\\eFM&\&QJaq2\X\0m /PD\\Nr\\a?寿qG\\bA\rqr\\"@*~T~$(\nBIAH\#$ \bR\!@T*P\h4jm\V^W X\\Q2:61\OR+g\#`玭|\\\\S}\\\4X1\Z\_]r 7ͥtͰ@z\\]m 1\\\Ms\W2ſ\ezjfffl\`a~׿F:R*t7dH`H+\\\a0bh\lK2\"$\} \swȟ\\T+.\\\\wR\n [j\r/D%zk \\nR9\t-S5`\r\\`\\"\n{\N~OQ\+L \Zlq{>\2\a#B!D\RM%\/K9t\'x\\Q\.\X^ms\\\^m`EHPm5\JH(\\nH \\Z5XcJmK\"a7}@@\@P|e* \sjXc@\BEd:??\\\*\\G%\\Y[\'1(ܦ_ұY\H\0w\BH\0,MI4\0&\\\2 tq \"\"\((0pd\\'ya\n\\\]( \w0ư\8v{]npTZY\"FI 0\\g}.RD4\ZM1\\\AWR\r$+\4\hL\\VD\C`љ92\Rz7? O)&Y\\!$Ac\9J\`ʺ\)%\\\h\gzz\W\n\9\\'&VR\r\\#%9!\R6\>\ ,ÏW\ǟ\\\CtIYg\nu-I3\0`x\ \n^M\0\\1\fZ\byы.\o3W\\LLN>bt\ZXY\*y\J\&v\puWe{o~\i\\ 5o\\~wR\VXg{\IW_K y׻\\\\ш^\³T\njT@)WYRT\2aQJ\"NQJQDUHuY[6K\ɶ\\ \Z( \CF\"]|h \D!,&Kɲk2\~\Mt:t5Q!ZC\K\n\Ёl ku\S-.Z \\\/F&(\l*\\50_\={\\*\\`RŸ 4\n\\ZK \F3٪{Fe\X8.\ % H>\ORxtBeEŐ&)Z_r\Nj?z\\Z\0$MS C2diRZE%}V-$\\\{;k,\Z\RJ3[\)/d\\0Z\\[\"iیpNDQ\\U\x\m\عG~PHD&VcmT\\k\lE\66\n\Z/FGa\h4Ð(R(9<\Ic2 đP\rAPq\\!lE\ ۷o\\_\(v\\\iZB|zcV\>ʷ?nK\!MS\\QDAH5h6l\h061\\\\\\"\90\'ah5Ƨ,N1\S@H5A@w\u\fgg\o\\\n:\m\\2VdlF\\d\\gI\ \u\qJ\\@\\rϺBz#Xը\\O\bO\n\&Nx`C\%D\\i;G)T\\\\\\\jTHҌ(\n\\\\\_fskRi냇뮻i\[\u\$v\D\Z1&%JIz^\`\F\0rb\\x\{8w\W_}-3sB\g|,dqa\GIwD!y\\T \"Zk\\9RJքa\O4\ӕ\EZQ{C\0ƙw\\h4\n\\\%_\\3\ࡇ~\(>Z^\C.rZM:Fg,JJϓZ0%Vk\a\6\\<\qa\"+\:Z)]X=&&&\7\\W\;177\\\\n\f>\nu j9@x\"Κ\\\",xaג_\\/ l\\S\ĻO\ADl\0J$Ic gn\}x\\@X>\)\h0p5H9+yg K}>9\\\d\4 Q\Gxȳ\\&ri @Jv\\=g\_\u\\o$\h\\AhPFn,a3\4w@\\p\T7a J)\a\C\CP*(&\<\\_\\\\\Ǹ\X9\\\E\\0\]o^hdz:[H\\NarQ\;\2R>\(\B *-J9#9s\v>\>=\\\?\\]\zͳ\\\\ja\f\";\\᭰I8\0$|>6\ZK܏ɲf\} H\\Ӈ\wRZ0 M\qL\ZqÍ\%\\|\w>\Ν;Y\\\\\"DQ4w\*\\+٩\u\\\\txò\DQ\3TE9\\O\gOP\IS=Ě\|!OjaHӄ4M\2ͅ\\?\^>\ct\KK XkPRcp\\ol~2{TP:\K\ٯujҤ\\s\\\౟\Z\'E\=XA\n(A \`LJƌV׿~o~LJ\\@WF\\NR@k\ΣI\[k}\\\[ i\h49toy\-\_\CTk:3%2\s\ťyPx\#@g)i\grr}\\|+_fjjvR 0\n;{=\C\\ +ȩO\\IHF\806\ZʲQ:5\s\m\\\?0\nט\\bB\΋EA\n+|s\_q\E\nS~Rv=\'c\Yi\njdAם. 9(\'\Uh\\n\\]w}nx\\'yG\e]\0\\ߍd0\n{ ;vl\:Gܹ \'u\\;\`O\|\CW]j>\\\|n \\9֓\c2wdiZT\Jgv\a9\j \\u\:\Z\lGYߖ/^9cvxw \"\4#LMM\ _\\r7\n{/?Exfʫ*0]\\\~7EP\\\k {&s\\\pxi0@\" \\\\t]ܢI_#*3[1\=~\6n_\\1T \LP*D\l\>ˮ]\Y__G\\0%#0\\ Jez=\8& #k\"?Ӛtn\s_΃no@<\\d\hmE\׾ \r7\V\\u&\}^u\\P\rc\x\-H\U\\\HH{F1 40I\\f\\b}qڵkrIqw\z\lC\\] P/\eI*7l\\?\\Z,//s\wÏE2Yz!p逥H\06\\rt\\VK\)9q.2I\1$ +s>!g\\WO^\Y8!0y\r^G)ŏ~#|dYFY!X__\X;XTN.e@~\NS\|ϋB1J\U\$q\AQpy5r5F\\w>RK\޽3Rfɾ}\5_HҌc\\?X\\}SIH\\\|QnL \Z\,..*ޫ\= \Mϋ܀$$٠\\s\s޽IBR!\\bV\\\Y.\\\ϡC=\g\}V\Q\($\sF\W\\\IHy3F~\^{Ç3??\\\\Z\c6]\\׉{1kkkiJ&X\\ bfv[җ׽\\Z\\nt\\nրa\\G\\K/\}?\\#ϲun8A*WK&\n\\9A@Aߓ\\\؁ۭ\j\\Ӑ\\W$H\[]gnf\\\\\U$acK$I֚ԇ\aRֱVFk\\\Z^B\n !IeYckm\\WJ\\z\"u \:\\\ \\q\\ ȭoYןkU Ah`Z\ JAU\\nE\̩Z$$I~,\Bb\\z;\\=܆\2 (z_y(\ˑ\\Ic\u!\'P\%\RӬp%0IO\M\u,!\]o^9!B\\\\Z_\\:&X`/Raț\\\3\I<ۮTB2\0#?ԛ\\\'\\l^\=[(\nK\0\\l\,z(\ch=Xc|R:P\ 1FEժ3Yfx\G\w\\\\.XI*./re\26>F\JͿ\\)[1BvsX9\\;\ڵjJ \\ZJHs3\6Srm!\L\l6\O\o\\ͥ^¶m[\h\j\*Tkqɴ|ߏ\晟_\G\\\KQC\\\\\\Q\)l\\L7YXko$ QT!pe\\B\e6!72\d $IbTdi\<ȷ\J\\\'h4\hPVV4\Z\r*\*Q%UFe,--\n0\ѣ\t\$\\n*{O7\cl\$\\\\RBUQ\r\\r\f>0\2\<\c Akli\jmadd#\k!\\TXL~\dk4\#S\\䴷c,뽔\n-z\]\\\k\04\\W\%/\k$ܻ\(_hubd=AZM%t\x\qf/\"\"֑I?NY\#\oDTg\˴Z4\Zufff8\g\nf\cv#䒔9\\5\\ \Dt@.p\8\ʫq0 I\[\_la=l\D\lZfc\9T[h&+\\(:\"#\8fd\\\ v\\]\'B@QDC1\WxHM\:\b)9\\\u\\o\\"`\e/k$Ӑ$h\\]Xk\:4bր\T\\6_s,A%\\y\\W`m0R \r0`||;w\h\\\vPJ\P܆xܢ~/z\s8\~\\rQ.\\%I\-\ejb8Tu^~\:=4\*x$\Dl0)#/\\.:\U8{jQKhRp\\9&\ڤY\uZ\@m\lyڰ9u\Bk~Ϯ]\z#\\nc^m]qq_ ^s25F\^\1\oFt\\F\m\\(V.8U*\d,M\\"\P\\m077\\W\n.[)J\\ \M\oи\YZk,e\޽l\6`w\[È\\\\'Wgυ\~\\311\\Lm\Y`e~aLNN\\vYX\\deC\+pR~bֽ23_H8}\[ݮ\<1\q<{)K\\\\\\^\8-x!=XƎ%\V(:\r2@kH\.tKQ#\iw\T\3f>4ϮL\0\0\0\0IENDB`',1,'admin','2014-12-14 16:14:35',NULL,NULL,'','MaxKey','https://github.com/shimingxy/MaxKey',0,NULL,NULL,NULL,'0',NULL,5,0,1,1,'org.maxkey.authz.token.endpoint.adapter.TokenBasedSimpleAdapter',NULL,NULL,'uid,username,email,windowsAccount,employeeNumber,departmentId,department'),('fb1691c8-afc9-44ca-8b8a-65c13cc4e96f','Teambition(test)','https://account.teambition.com/login','SAAS','85d91f5f4cf5b2138da10a310148927c932b28703d753041cbf8acddd7535334','SAML_v2.0',_binary 'PNG\r\n\Z\n\0\0\0\rIHDR\0\0\04\0\0\04\0\0\0\x\\0\0\0sRGB\0\\\0\0\0gAMA\0\0 a\0\0\0 pHYs\0\0\\0\0\\od\0\0IDAThC\kU\}P}(\n!(,\\") %]4\а0\\6ڮZ\[5o{ij\] \\\ݧ3\컻ϼ =\\f\o\̙\\\t\#t\h\uF4ɣa\\\:sv\r\\"\'\K\ΐ^(xD\\;t\\\)\[߆\\ \k<:{^\nF~\zݗ~Bs;B:g~*\\\Ba\\^\\ҹ \\:\wOi\":α\\QɢLh\z.X\X ]E ]¥ \ud\nɢL\\jT\%Q\B-qFE 8-tRט\\r݇]ң?薏=܄o\0ח6 _\\U`(j\+\Z\}fEE ]f\\Zt\\>=\\\\B#W \]!\\Z\\\3[u@S6T\\Z\dOc\tߗ>\>\DΞ~\XЛ\\q+\\f\`L\GIp_D4%\Czb/4s{@\n\r\\\=U@!5էzR@j =\\\\NCE \r\P\\n\F\\E\\\\"ZJ\MT\*\@j֎f@j:Aj\n\|ЂW R,\\>I\Փ/F`cV*ŏưX/\Hzl:S+\z3Nx= !jR+._BE ͚px%G7k\Zj ]\*Zg\0A@j`ڐ;\{pIǗP\B~\e\$,4B1\\\\˸cF~\e\$|E\řgƬ9O\\ԉIf\\\Iǭ\s/3ffgv\jmŲ\$V\6\Q@`aH \7\Q R >ldL?\u\k\w=;;\}twU>T}MߙkE>R\\{ο\SksNX\0з{% G\@\(P[H\0\-vp+\"R~J*s\'.ia>@\\\2$o\\x\Zt\\\\\I\\VjF[&\4\>QvVq\nm\eα\Z\\焙\e\,\U\lȀn\\\\\W9\"Tٿ]\OMн\C27;b\&\0׬1x\Z\\F+;\D\Ǘ qS^UqA)\)x\a .]R>\\\Y9;/}z/\AK\\\/^`\`@kdaF#\3\\EjuM@a\l\'\\n~q&*zSwL\\\EȂ*.K6eZ\\]\\6wx\\/\\7>sWL\%ezqS%\b`\lgy\W\\i&QR\Ȭ+R᪫ϧ\,\rZ)\\Z\\0{\\s$ \cd\\#q`Q;u_>\\ūĵ:ցW\\\]\n\b\BT\'T N\GM\Z/~vF\\\$!s\9H\/2\'dƠˆ\\]Jm\ZBBH\[\'W9|\a*u\,\8\\#B\IfA+\\\\čF7JPQ\fֳ&03TnfsH\\68t\nI2\}\1^\\@+Tnr]\1\: 8г߫\SqYI\mijuHs\+\\ǰ\\b:\\\s9t\cۨTcLf=]W\\nU\WX\H\:3\Z)?c1J9Wv @|\`lJX9t\\*\\\\\bG5\\u[`~q4G:\\Q\R|ₔ7\2FJA\n:w\\3{\Jx\}3\wQf-( KR:\-2&_9+ \&ߍ\Z\a3ˑ׎1}d\Z\Itz\,\Vg1\\0\2Y*1\\/Z\4{l\uD{OTtX\8:k G/_PJ\rpDq\j\܉sI\\[C\\\'\!\-C. *.Ρ\5»vQ2\\N)|\!\ۍ\2uLb\+PiJ`2ln \M\D+EQ\\2\qK\'\*Ec\vt%\*\\Q!(\y\+\n;6Ezwڵ.\N\|\\;eiɐJ:zbsw(\3 Zu\UN>\c\4MCX2E\\\\\ݴ,e\ѷsP\\ \A\\\y\\И\ZG\:A+o ~9P\`V\r8K\'γw[V!*:֒Z\\qHr\\dH017\/\g\X\u@+0\\Rw60)YA|ݹ10w!AP!3OE\\\OEZ)\\wy\\Z:kb7\󏸵%0|]BA\\r1\5\0;ъji\yS46w\\!H\\n?\D\o6*\\&>g\KQ\\xXo\#\d\ZjNH#\M_\\j\W%\_W\r\*c\Y\S|\1fw%>u\\\r\"Ԟg\q`<@\< qN\ʶ*bJ߉l\M\n@x\%WㄝUͯhP Z\\6W\匯`\rY\\\,\\.ų\ܕ\Jj\S&PB6ιҕS\ϼ7Ȉ&\F(\\`,jZ,\\n\l0-\C(P:bRxg̳\ZL\\Z+B\q(\\\e1FqK\n\E/\w\\\إSl\h7p b0p_ߺ\T~6\d}\,c )\h;pBM΃թN0\Z\c\\ZcQu\\'>wW \\\m` \\Z\Z\?K9UCVipO;\=u@\zQ\\\U\v8(^ \6f׋\k$\ \҈_=\[\^\\\>Tw9bS)r\\ य&\< \`Uލ{\;j8Gv\\Ú\\\\k\]nmƀ\\w\n\"\\\e1\-w \;\OO\\Mw`2cI3K%\n\-wu\\PUۛ‰CoZ\95[ko?\Iغ[xXlQ\ZG\w\\pƺn9\;\n3W\\>\(\\\r|n\r넟\=V\o3)ۢfEچ jȪ}Ghg|\n\?M\7\J\\9\87RJ\02\C\߹Ɨ_e\,g>ǿs\rqH)3q\\o\F.\\#ՖQXo(^<\Wp\P-\L K\\\r+忊x\w\ Ytω^8U$\<5\\l\ߐ+L?\0\mn\\0~)_A\\\\\Z63,\g~\\q~\0u\\0\0+⢀?\\\\֊\0ͷ-\ \ x\\?zO\?٧Xe[Eŧi\p\\n !ϵ1TP~,O-\\Lju\\G8\o%_\A\\\0\?\1\\\g|u<ºkH;\'fR;\0\&K\\i\-\I9G =E\0~\W,\0{k_\kx5\Zn@\4^(1[\\0,Y\d\\/\e\0\\Mg~Nֻ\ H\0\\\n,\pǎ\j+\?c)(&/>J?6}(Jmuk5\Ls9\l8\\ހ\n(\n(\n(\n(\n(\n(\n(\n(\n(\\U\K|N\0PG:?l6ͬkVI($n\ƹ\0%A\0#Q\m>{ᵵi$p3 $\0\)\R\\\m~4x\\>\r\Zt\1\8E~2\0W\0\\\0TNE\$¶\5\n{\kRe\4\\\0i\0$_{j\Z?\[xvě-ǜKT;YM` 袀\n(\n(\n(\n(\n(\n(4<+\S#\4MKP\}6e{{Yx\BXE~\05\0\\_߲Ժo>3۷Ư\RA\[\\\`e\\p<\!E\0o_\?۟\n6mSǟ\c\&@\\rfg?w$bJس79<~\^ h~?w\-?\^}f\dG\"0*ѸX\޾\\00\0h6f\\uYݙ%2\ ՙXʷw\j^6&\:\\2^^\\L\\^O#YgvbIbI$k?iO~\Q+\ڴ׋<]z׷\\rNE\Z\\4 \Z \G:\0(\0(\0(\0(hzm?M\5 \6\\4\N瀨 f\'&*\_z~\\m?\ZCk{k\_hwIu?\Z܍#`\|H\"y\\g\\Gkq/\݅\Ο\=<\ı\\\\ڀ?(\\0e\àOm6\o:\\u]>\\s*~`\bA\H\{/\=\0R3@\}>x\ ٮ&\|uAc\\\\\n\bB3\2\Q_5s\0\Ho>z\u 6g\\Y;FKye\-m\d~ \_u~֟m\\}\"[\_j ox\\8Y\\c\]B\q<Fח\\\\Ew\^#P\u9<\/ C#\WC__jOً⽟\\\'UoW^8\\[\?w\\VV\0PINq\l,\0?*(\n(\n(\"L\\h\\ѥY\\\"D2Y\\0$}\0\V*g\y6{3|\'~i\R\7>\pwܲ)\0I\n1?v\_?|+}ǟ\Z!\\\Kh#+rp\\\\\E-\0QE\0QE\0QE\0U\xoQg\\Z}j3-\r=\Ԭp1$\0\0$\ \C\nK\\ 5K\n˨\\|?C-D\ ?\G#/ I\+]J\\\Ɵ\-j^1\- +8\amQ\>\0LO3\\ǫ?ş>w\s*xfc\7q\0\Vm\Y\`ᄲC\"\Z\?\\0\~[/\0\r]\qfW\6b\0\\'``Tq^\w\\\\Okج\?yux\br\FO\n3\\0\iҘRmP}yH蠰\\nf9\\\\g\>S\*ɕu/>^#gǟ;Jw\+C/nR\\w OV?~ H\o5LoKH?\Lc{k\\~.ԼiKk:9̗7sҿ՘j<xW\\:i_A\\\/\0oK\0>^\I)]b-\D\Mp/W~YQS\/8\/o\r\\'u+#?\\dP=؏¿*\\Y}k\\MU~\2\\v`Z\\n/OE/\'\O\]\N\ִjͿ孕\L\v\y\\\0\\Z,\0~hz\\pkv\lOMp\0\\b\qʑ_^~\mf=KDԯ~\Ť\ e o\\0mG\\\V\5N\y\n:C\\z{ͼ3\\Nj\ˣס>E\%K2\\^~z]}\͟S\4#\w\\ax\yw\6\ɠ\±x\1PN7\r\ǚz\tk\kZ~isaXL6\4S[ʌU\р*\A\ \\\\ \uk}F/=\3)pH\8\0\ \\\ ^X[\+>\\0ȕ06ܣ~mZJ3t\\Kt՚\\UIJ2\4GE{\|O\0x|s\>T\ƃڒ ,u{|\nmf\\boQSuGVQ\QE\0QE\0PU8#Gj(\[\r\079.~.|*;[y&mnȂ!Y\o\俽\\ۢ/^\˝sĚ歫]\qp9¨\2pV0\\)_ϽHdykR\"dKD\*RnFܞ[}\-$}\M\\\0\ZrKcL\P\\~}:cM\r)XI\nQR#\/\U\\t8n*@m\\U\\p\\q\:\0|A\6׆K/Q?,7\ã\>Y\0A\Vtp[\43䃶\rH\Þ\\I8Fq^U\rBm:Yq$SD\\'S\ÐAt\.\fԭQr\m%}ח\c\O1\k\|ԟ\~k\S&?ß*\\y\?Y\}Ɓ\Ħ\\ep&\0I;dQ\0\0? \05im[\\K\\l\Y\VL\\"%i2H\ \s\'\ \\gXiß4\WW\EQ\:\\B[_$\0\_χdK=7\7\[\0k.\r\Q\V\0٧؋ X\\0?\yY\2\\Uy?\S\\'\0٦\$}\O]\r\6\[K\\k\$\novm7RMY\\\9#q\e +\Z\\n(\n(\n\\O(l/\g\r\j ߉Q\ӟ\F\\\o\n\%\\0vC̀>\: \EQ@.x\\v\0\Z\0\Z?\+;&sA\X\nQ_]\\0\\HGPcl\\\I\8` I#X\ I\\09ɯ\W\nk/\\g\˦\%\bY>0\;1}2`<Ɗ((+\?coُ[\0j\0+\#Tεow-nٚ\bI#cd\\7\\0IޥTx\OI/5#>\HxT5\w`\\x!R~\~\~۟M\>^&}j\6=\0\\\Ge\\c \\_\_|-\ \.\\vFn91 aq& e\I<\0~\2~\Y\y>RR\׃\?J\ \\0\\\B\=\y_7\\<\o\lU)?\\݇\/uk\e\\0PoZkOS\n&l\1\1>\*l\`⿥\G\99Mݽ\r\\VjI \\0כh2\?dp5/#|k\rnj\\0+@|\ǩ|\~ݽke\:l;!X`{\00\nߊ_\Id׮\\3\\P7W\0_̼}\u<\,-\'Oߗ\\0’]{\\\\'\]Iԧ\\\"\0#o\\\\Ǣ\'\~э\[\\K7\Muiq\/AЎ\Ɵ#ρ]m5ǃu\rC\w\\A+\B]\\=+\O<;2\Z+\0,-ճ\0]׵*tM \/\)\0ޯ࿤Q\Z8|\\{Fo\\o\\X\\T\Ш\/\+\3?\bdFbxW=Zp\#bNOf2X\\bQk\7\gӱ\\\\\!,n\\\\ZW}7\\}Y\˻ l\*x$:W\\?%7<\MK)\[KLn-#?4n#\;x F\r~\ߴe\=r\\V\8/RV\\.T\r\\\2,;_ c\k\&\#\'\\Mo\\\^N\e\'M\m\ǰ\au\\M5\?g\\ZqT\a?\\i>\[F^]\)\0\\J\4ڣjDR(\0\@\Qoss\l 5_\\'\->sa\\ֿk獴\}T*$C2#aպ*ڋz׿d\\3\\ MxY\\aU\!U +;ՇEhxO\:|Iehz^k\Z K gH\@Y\0M~~iO\\'U-_\ z\0\n\l\Z6\)\B2@4g_V~\?E/\G\n+=\ÿ:~a\`\*)%A\m\V-I߰_C-~\&\T\0\\ uz\\']\\m\\V1\y?Ķ,q\`*?\0`\33\O¤\>=R(&VwVH\@9 \_?g~̞\\0\z\\K\rO\\ݕ\0\\6X&*(\0(\,\\<+>x9Z _\Vr\\#i+\ \|\0h\l\0\\\Z>GNo\ߧ\?\\0(\0(\0+ aZ|DͩY\0\rx}\"G_o\r\I\0y-\\0F\x\߉\"\A3:\\\0\=ñd}\?\\{Q\\`\/\\Xcp(}\7\?\~%z\0|Rfj*O\\\O~*W+_\\e\\{\[%_3\l\ⳟ\'\\I|߼\\,\j?n+_C\0:d6,:r xt%\\"_8|`G \UFUr8\\gK\\\\^nhQp\0UQ@+\\߳\\\\YX~1\lW\̡tʱ\X?W\K\ʹ[D\c\0\d{\\e,|ή\\oE\0=[\\^x_J֫U)MKt\\\&\N_\\\f\$\.Dq*\{w \w\\y=Wk\C\\3\Zu%%\EtK_\\|>\Z\nj%d(\(\0\ٻWA\\\wṜ)\r{ \0\Zw\ܯ\9\?`^Y\4\O\\7Q$70\:2\\ZᯧaoR_\\\xBR\j\Nf?/z\Rx\~\"*7M\\2_b\0\\gѫ|e0&\0\\07\\*\(hO\\`5\3\\\\ \ ԩF?{\\ c\\\\0& \O\{Yha5 \4Q-O\wEc=~B\ޯCs\frWze\\\iž\"p\r|\Ƃ*>]\{y4\\ϯ\RG;F\BJ\F\\\σ?g?c\\\\\M\'5\/~\ ݏ\C\\\|1\0\0\0c~F\w\Zc\\rkC\\\zkzh\]ɼ\"\2s\>\0S\\Z<#+ë[.zb\\0\\\⌵`sZ\xu;Ij\\gpnl,l\0\uW#7>\K\\~y#\\j1A\ꗪ;My)i\\\n\Tpkۨ|`(\0(\0(ho\\0`o\/\0\\:3>ӌw\\_\\rG{\\\\ZW@Q@Q@mF\0/\_%\\,\rl\0tk٢d\9n-#2\a\\\\sk\)\06K\0bf\00\\7;\g\?fK\6 ~3l>+\?\r4_\cۜ\0Ӝ\\[Ô<\r\0$?\\\*b/?\M/\f\\\\\\rI\Y\mmɕ|\ cW\r{\\0n\0\"p\+i;\]9yP֭\r\ ?6p\X\\p\'?k\\\}_\0<]\'xW{&*=y_\\Q_y\\\\J\0 kEO\rDO\C-,:\瞃ֿZ\0(\0(\0+\0vx\\\\fj\0A7 bM:\\\#88\\r \0\\\0b+\D\\\\[-X\\\hq⍀q\@\0VG\o_)\\\5\d\0ɷ¾x\r_it\t\rz5o#\\Z#\h%ul}#xɯR@M¸[(\T_\J\GOa] \\_&\r\'o\\Vk\d3pn?YExlU\0x\\\ \,dotۈ\\#S\rz\\:\\a\ڋ_z\\\\bQ\\?i_\\8\弐2\qo%Đȥ$:GW\/\0v?>x\Zk)Wۼ\ !\0i[*}\np\0\I{luo\\.X\kMpi\ْe(O˞\o\J6?8K 9B.\I5\\'s\h7>\(\0(\0*m6\][PwMs\"\\Z\0y\\\5\߱\Ç\\[\#\c\f#0_\膽\\*\,5Ey%vϊ\*4eV]v`^ojr\ı)\n\0ʿ?mC\\0\\\%\X\0nmр\Nb\S\fs\ۥ~\rkS\m\geBB1Ky\l` \0\\~ҟ\h\\\\\YR\\>\\A \r~\~\f|5Kk{iq\\ZXncntY\c\Tzk\b\UV>EپWz\Z\\A_\U\Q]=cџ)\\u{?P\\\r\ \#ס\Z\\\ݤkg\P&\/QsvI/\;d%\'\{ƏW\\K}\R\!\[\\3\\>\Y\>m\U\V1upfW\4/迦\\*)^\\]\N(\\\\(\0u\\\0-e#\Rj\\H%3\\\&ۋ\\\:\A+\\'\04\\܋ [\\V\'M-\(8.\h&_\|TXTTUV^\]lvWa\\\Vh\V\_\o\ ST\\"i\0\nt{̮Q\`?D}k\x\zIj\s_\z\uuq)\\#\\\MS\r\0E%\aj\y=\輒?=f3\OD\_e5 9\RoA?\5˵\\E}d\0׭ZiAԪ\\\\GRXѤ)4\۲G\\\\>\bh\\\> n{y\]F\HkvkXQm\el\I$6\\f\\#74L\vi܊4s_\Wo\zS#xM\\\?H\Ȳ4{\rq2L+?8\%\\\\\ɿE\|\˲8\>\\w\\\\@\|oL\\\\k\\5/忳\qkk#\~:OK>\톹AӤ\\79\0Q\\?\+\=S\?l[x\\\o\\D>ç\\6\j\O\r{\0O%\$n\\GSR9\W\?ͼ>\\\\.\j\)]fv$1/E\_ο\\0\D[{?HQ\kZI\\\]\]H)<~O\o\\O]hEKh\\&FO\\\\\zu27e~OtG\Y\\R\\ΗڍkDߝ\\7\\O\\M[[L\\h\o\n|~\^>f\coX\\0\< \0\:·\yW\[[g䂻\0\~Ƿ^M\\gۿ\Zg0=\\竖P\]a\\\?\g&&\ ~\\$Nwݳ\\~JB{\\ML{m\\c,H\8AܓW\?\?<|P\\rJ\V\5)<ۛ\\\0\0@\0\0\0\0\0+ 6i_d<3\i\\=\\0%\?\N*\3ةZ+h\"\\(nSV4䐥}\rϕq,,\O#O\\'#sC\\hBmX\R\Z<`?\\\D\\Z~#A4>\ڌ\\Z\p\\\2\럋]\\0\05-sZ\;\ \^\\\8\M2\\z,hO$##\no)\?z_]HߖO\<+\Nαqc4\\^-\0E\0\\0u}#P[_O\rxY42J^>\ 3\r7N\k{l\{Mp\%AD\k3ࢊ(\0(\0\g_\\7\7x\Y\lARU$U;c.\\{*ڀ?\04X{\0J\>$5o\Z\߉p\ک[Ke?씷2Ǿ_>h\0\0 \\Afiiўom\nC}N\=\ho\n\"i\W#\\\4im-.%M\ez\\U\pɎ3d?xV]\k\:\n\\\F\\\y0H\\c\k;\0n\>~\\OǯXy>yI\\#~\\0䴐ܱ\_4\0QE\0QE\0W\G\Z\\0\\'w\?u\\'ºȇ\\G\!9ӧ\o#\\[Bv2P\;=\|/\:SG\\\,2pT\0 uWS9W\\\\\0G\[\DW^1]3YD\g \9W7\{\|\]\R\\^<ؐac\\\\\\\\0|\_\\о,x*kB\N׼?[\\\`=\k\8_19=]=\R\\k丫p\\{ݫ_\-\[\09\&\rJz\\\\0N\|1sy\/Em,\Y|=<\v\ȷ%Q\\0 \PsjWnf\+[Zq\]z\\gK\\\'~\_\\\\L\ \eU}2\ֱ~\u@R+f]\\\IHcBSȤK`6\\85VzM\^8+\ \\0\rwPki67z\;{[HZio\(%\Q)$-Tܟ,U\ \\\"Q\\q\`L4\\rFN\򩜜+{\\a\0`ե\\66,v\_\M\\d_%yd )a\ |\Z\Ŧx\%!T% \'(BB2\\o{9\\\\\ָ?\*\^naҗyn\0\r\_| wú}\QyPA\GR\f\'$\$I&\: ֿ5\\\\\|=\n<\vR\ HdRCZD\\=%F>DM\083u_n?qզ\s\\'\h\֗\Ym,N[cѧ2U1\\'\~R\'9ov\ߩӌ\"dIl肊(((\0(\0+c \\/\\O\Ց}\5\g\\\ )\\mLUkW㿅|-x\\\Zn\\\jZu\y\\$qK30\0Կ\?O?&\\_\-\\\mΧ\kN\ծ0,ȇl(\\y\\0}5EPEP\0F\0a\F?co|%&\a%:uMͤ\K\\7t\' k7\߳7Ɵ|?&\\SiZr#&*JFFeq\++ \ry\\0l\\6~i^od!񥝴YVң%\e9<9$\0 ͭQ@Q@Q@~?\\_LCc\\0\\߃ѕt ˭n\r\\'\|\q3\\\r\T?R\0l|)񥎭yo˨hw$[k:Nx\w\@wF\\\\_\ß\M0\\\Z\Pj}\0Θ}=\_u\^0\E\}sX߈4|\-OK\\L9c*\\$eHthav#\$m\աQU\'-vz1\a\W\W^髧g\o\O e\\]|9\\eGHc\ J=Oq\į&\/r\߇֥ gm!WRW\\\Ҿ?\\\Q\\rpwi2k4B\\fK\\t\ }\\9h1j\nwa\;TPD=0\fɧrֵ\0\+pA <\\nF\ \0|\\\0\\x_Mi| \n\\>\68ǜxȉBļp\aƾ7־$^k\)QԮy%v>I\n(\n(\n(\n(t\0p0\0~\S\\\)|ORh\in.\\0pH\#F\\\0~?Jy>:|||eD;\\G.\\0\'_o\>+\\|p\r-eVbC\7/\ȬbC#I\@Q@Q@Q@Q@p\0\\\\\ி\\M\ۛk\\UtaG\"0) \A\0\qE\0!?[ W\; \tM -\\ 9+F5xz\'\/\&\\k%_\^\\\"0*\A +\\0\ %qLux;/u#qմU\Yr<\ ;$\=%լ72C4rC4,RH\J08 \ Q\EPEPEPEPEPEPEPEPE\k\\\x?\OfդMZ\4\n&$ n0B !\0icG#\?k\\k)g\}\\]^\\ q,\O`+\0\0\\- \\0Z\!\ucj.,|1\~췄aNR\"F\$\#\_O_oHe[Tj0 *)u|\=@%\8.\>\(((((((\_+o_\n~\(~ZK\6\\\B\*ǘ.ʡg\0\Z\07|z\0_H$xFi/$\i4K~_\\0 .ݣc\ \TE\\?\旫X\\f [\Y\As 2:0*\AE\0W%\0\0E~Է\!Gy7\\,m\\ۧM߈\\0\u}ӍʭLql<\0\0A|s\M\-wu\? XJj+\-ğ4vh\eFYJ\\a ~Ϳ\0\\0\\0\6\o~\\]-q\\2H\K\+`nFgc\bk\n(\n(\n(\n(\n(\n(\n(\n(\n(\n(>q\_o\\%\\\τ>\5{5ks\\Ov1\<\W9㓟Ϳ\O M\;g\I$-\"\\v0\ֈy\h\\v_~\Q@\O\3wp&š\?؆+\rbK \QG\_.|P\0\0l>g\\˿+\bE>\$ۺv\oQ_\\/ \0\\\\.h*8~lUnPw\0H\\s\<0\i\0&1s\B\\܃8\\\_\u\"韲G\mnx#c\nK)/$iI\\lWx \'QI\\0g\6Ԟ_\\ۓ뤉c=r\sQ@\o\5\$-7\\_ YM.\0X[\\9dc=\\g\2/\43|R\\\i-|/\j\H|m\ق7^v8t5Q@\\Zs\"~\\\yxwğHp\oj\\\\aVLz\~|+=\/\0|/\\h6\t\N\\.\,Q*\\]\0QE\0QE\0QE\0QE\0QE\0QE\',1,NULL,'2019-12-02 04:05:53',NULL,NULL,'','MaxKey','https://github.com/shimingxy/MaxKey',0,NULL,NULL,NULL,'0',NULL,0,0,1,1,'org.maxkey.authz.token.endpoint.adapter.TokenBasedJWTAdapter',NULL,NULL,'uid,username,displayName,picture,familyName,givenName,middleName,nickName,gender,married,website,birthDate,idtype,idCardNo,startWorkDate,preferredLanguage,timeZone,locale,mobile,email,userType,employeeNumber,division,organization,costCenter,jobTitle,manager,assistant,entryDate,departmentId,department,windowsAccount'); -/*!40000 ALTER TABLE `mxk_apps` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `mxk_apps_cas_details` --- - -DROP TABLE IF EXISTS `mxk_apps_cas_details`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `mxk_apps_cas_details` ( - `ID` varchar(45) NOT NULL, - `SERVICE` varchar(400) NOT NULL, - `CALLBACKURL` varchar(400) NOT NULL, - PRIMARY KEY (`ID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `mxk_apps_cas_details` --- - -LOCK TABLES `mxk_apps_cas_details` WRITE; -/*!40000 ALTER TABLE `mxk_apps_cas_details` DISABLE KEYS */; -INSERT INTO `mxk_apps_cas_details` VALUES ('3a93e28d-558d-4dc7-a3f2-9bf5255a1372','http://hr.maxkey.top','http://hr.maxkey.top'),('41065fe3-ae67-4172-a460-fd0079e88294','http://cas.demo.maxkey.top:8080/demo-cas/','http://cas.demo.maxkey.top:8080/demo-cas/'),('8e7e4a2f-9e7a-46ee-9dcf-ec02d69cb5e9','http://hr.maxkey.top','http://hr.maxkey.top'),('97d2ab32-b88f-41c4-9c6b-b8a53ac504ee','http://weaver.demo.maxkey.top:8080/weaver/','http://weaver.demo.maxkey.top:8080/weaver/Login.jsp'); -/*!40000 ALTER TABLE `mxk_apps_cas_details` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `mxk_apps_desktop_details` --- - -DROP TABLE IF EXISTS `mxk_apps_desktop_details`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `mxk_apps_desktop_details` ( - `ID` varchar(45) NOT NULL, - `PROGRAMPATH` varchar(400) NOT NULL, - `PARAMETER` varchar(400) DEFAULT NULL, - `USERNAMETYPE` varchar(45) NOT NULL, - `PREUSERNAME` varchar(45) DEFAULT NULL, - `USERNAMEPARAMETER` varchar(45) DEFAULT NULL, - `PASSWORDTYPE` varchar(45) NOT NULL, - `PREPASSWORD` varchar(45) DEFAULT NULL, - `PASSWORDPARAMETER` varchar(45) DEFAULT NULL, - `SUBMITTYPE` varchar(45) NOT NULL, - `SUBMITKEY` varchar(45) DEFAULT NULL, - `PRESUBMIT` varchar(45) DEFAULT NULL, - PRIMARY KEY (`ID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `mxk_apps_desktop_details` --- - -LOCK TABLES `mxk_apps_desktop_details` WRITE; -/*!40000 ALTER TABLE `mxk_apps_desktop_details` DISABLE KEYS */; -INSERT INTO `mxk_apps_desktop_details` VALUES ('c1cabfaeb9a448028ffab2148da9f65c','C:\\Program Files (x86)\\Tencent\\QQ\\Bin\\QQ.exe','','SIMULATION','','username','SIMULATION','','password','Enter','d',''); -/*!40000 ALTER TABLE `mxk_apps_desktop_details` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `mxk_apps_form_based_details` --- - -DROP TABLE IF EXISTS `mxk_apps_form_based_details`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `mxk_apps_form_based_details` ( - `ID` varchar(45) NOT NULL COMMENT 'ID', - `USERNAMEMAPPING` varchar(45) DEFAULT NULL COMMENT 'FORM LOGIN NAME', - `PASSWORDMAPPING` varchar(45) DEFAULT NULL COMMENT 'FORM LOGIN PASSWORD', - `REDIRECTURI` varchar(400) DEFAULT NULL COMMENT 'REDIRECTURI', - `AUTHORIZEVIEW` varchar(100) DEFAULT NULL COMMENT 'AUTHORIZEVIEW FOR LOCAL VIEW DEAL', - PRIMARY KEY (`ID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='FormBase details'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `mxk_apps_form_based_details` --- - -LOCK TABLES `mxk_apps_form_based_details` WRITE; -/*!40000 ALTER TABLE `mxk_apps_form_based_details` DISABLE KEYS */; -INSERT INTO `mxk_apps_form_based_details` VALUES ('850379a1-7923-4f6b-90be-d363b2dfd2ca','userNameIpt','password','https://ssl.mail.163.com/entry/coremail/fcg/ntesdoor2',NULL),('c8038bd4-12a4-4b45-9d43-61b3ecdc2eb4','username','password','http://note.youdao.com/signIn/',''); -/*!40000 ALTER TABLE `mxk_apps_form_based_details` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `mxk_apps_oauth_client_details` --- - -DROP TABLE IF EXISTS `mxk_apps_oauth_client_details`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `mxk_apps_oauth_client_details` ( - `CLIENT_ID` varchar(45) NOT NULL COMMENT 'appkey', - `RESOURCE_IDS` varchar(256) DEFAULT NULL COMMENT '资源ids', - `CLIENT_SECRET` varchar(256) DEFAULT NULL COMMENT 'appsecret', - `SCOPE` varchar(256) DEFAULT NULL COMMENT 'SCOPE', - `AUTHORIZED_GRANT_TYPES` varchar(256) DEFAULT NULL COMMENT '授权类型', - `WEB_SERVER_REDIRECT_URI` varchar(256) DEFAULT NULL COMMENT 'REDIRECT_URI认证返回地址', - `AUTHORITIES` varchar(256) DEFAULT NULL COMMENT 'AUTHORITIES', - `ACCESS_TOKEN_VALIDITY` int unsigned DEFAULT NULL COMMENT 'accesstoken有效时间', - `REFRESH_TOKEN_VALIDITY` int unsigned DEFAULT NULL, - `ADDITIONAL_INFORMATION` varchar(4096) DEFAULT NULL, - `APPROVALPROMPT` varchar(45) DEFAULT 'force', - `AUTOAPPROVE` varchar(45) DEFAULT NULL COMMENT '自动通过', - `IDTOKENENCRYPTEDALGORITHM` varchar(45) DEFAULT NULL, - `IDTOKENSIGNINGALGORITHM` varchar(45) DEFAULT NULL, - `IDTOKENENCRYPTIONMETHOD` varchar(45) DEFAULT NULL, - `USERINFOSIGNINGALGORITHM` varchar(45) DEFAULT NULL, - `USERINFOCRYPTEDALGORITHM` varchar(45) DEFAULT NULL, - `USERINFOENCRYPTIONMETHOD` varchar(45) DEFAULT NULL, - `JWKSURI` varchar(400) DEFAULT NULL, - PRIMARY KEY (`CLIENT_ID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='oauth_client_details'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `mxk_apps_oauth_client_details` --- - -LOCK TABLES `mxk_apps_oauth_client_details` WRITE; -/*!40000 ALTER TABLE `mxk_apps_oauth_client_details` DISABLE KEYS */; -INSERT INTO `mxk_apps_oauth_client_details` VALUES ('001bd032-d132-4747-b434-73f21b352c63','001bd032-d132-4747-b434-73f21b352c63','05681f23341b0676f0124a9d2f809af9df962b0983ae8557a6fe31a66c782983','read','authorization_code','http://www.ssss.com','ROLE_CLIENT,ROLE_TRUSTED_CLIENT',180,180,'{}','force','read','none','none','none','none','none','none','1'),('3a2c3f84-1df7-413a-8a42-f3add972e0d0','3a2c3f84-1df7-413a-8a42-f3add972e0d0','74a81906a41d3a89866edc237b3ffb2496d0aaf34af60931b942ef9c37cb9e71','read,trust,email,phone,address','authorization_code','http://o2oa.maxkey.top/x_desktop/oauth.html?oauth=MaxKey','ROLE_CLIENT,ROLE_TRUSTED_CLIENT',180,180,'{}','force','trust,read,address,phone,email','none','none','none','none','none','none',''),('ae20330a-ef0b-4dad-9f10-d5e3485ca2ad','ae20330a-ef0b-4dad-9f10-d5e3485ca2ad','d15b1f6f6590529f40a7f3955e9e2f182a453b3a241e460939ae532ef6d1068e','read,openid,profile','authorization_code','http://oauth.demo.maxkey.top:8080/demo-oauth/oidc10callback.jsp','ROLE_CLIENT,ROLE_TRUSTED_CLIENT',180,180,'{}','force','read,openid,profile','none','none','none','none','none','none',''),('b32834accb544ea7a9a09dcae4a36403','b32834accb544ea7a9a09dcae4a36403','4e1d7eb7b14ad658e8d9066c95902c852ff6494512a742a8392d1d16adc5af551e698f87c64032dc548d6ec7dc3c4863','read','authorization_code','http://oauth.demo.maxkey.top:8080/demo-oauth/oauth20callback.jsp','ROLE_CLIENT,ROLE_TRUSTED_CLIENT',180,180,'{}','force','read','none','none','none','none','none','none','http://'),('c3d44bb1-e2c4-45dd-91ce-43e821f1321c','c3d44bb1-e2c4-45dd-91ce-43e821f1321c','d9457a9a9017d2f92ce3d0b58e4328ea637dcc5a434d3bc900bd5f07cd1eda86','all,read,trust,write','authorization_code','http://liferay.demo.connsec.com:8080/','ROLE_CLIENT,ROLE_TRUSTED_CLIENT',180,180,'{}','force','trust,write,read,all','none','none','none','none','none','none',''),('my-client-with-registered-redirect',NULL,NULL,'trust','authorization_code,client_credentials','http://anywhere','ROLE_CLIENT',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),('my-less-trusted-client',NULL,NULL,NULL,'authorization_code,implicit','http://','ROLE_CLIENT',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),('my-trusted-client',NULL,NULL,'read,write,trust','password,authorization_code,refresh_token,implicit','http://','ROLE_CLIENT, ROLE_TRUSTED_CLIENT',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),('my-trusted-client-with-secret',NULL,'somesecret','read,write,trust','password,authorization_code,refresh_token,implicit','http://','ROLE_CLIENT, ROLE_TRUSTED_CLIENT',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),('my-untrusted-client-with-registered-redirect',NULL,NULL,'read','authorization_code','http://anywhere','ROLE_CLIENT',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); -/*!40000 ALTER TABLE `mxk_apps_oauth_client_details` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `mxk_apps_saml_v20_details` --- - -DROP TABLE IF EXISTS `mxk_apps_saml_v20_details`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `mxk_apps_saml_v20_details` ( - `ID` varchar(45) NOT NULL, - `CERTISSUER` varchar(200) DEFAULT NULL, - `CERTSUBJECT` varchar(200) DEFAULT NULL, - `CERTEXPIRATION` varchar(100) DEFAULT NULL, - `KEYSTORE` blob, - `SPACSURL` varchar(200) NOT NULL, - `ISSUER` varchar(300) DEFAULT NULL, - `ENTITYID` varchar(300) DEFAULT NULL, - `VALIDITYINTERVAL` int unsigned DEFAULT NULL, - `NAMEIDFORMAT` varchar(45) DEFAULT NULL, - `AUDIENCE` varchar(300) DEFAULT NULL, - `ENCRYPTED` tinyint unsigned DEFAULT NULL, - `BINDING` varchar(45) DEFAULT NULL, - `NAMEIDCONVERT` tinyint unsigned DEFAULT NULL, - `SIGNATURE` varchar(45) DEFAULT NULL, - `DIGESTMETHOD` varchar(45) DEFAULT NULL, - PRIMARY KEY (`ID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `mxk_apps_saml_v20_details` --- - -LOCK TABLES `mxk_apps_saml_v20_details` WRITE; -/*!40000 ALTER TABLE `mxk_apps_saml_v20_details` DISABLE KEYS */; -INSERT INTO `mxk_apps_saml_v20_details` VALUES ('525d261fa3b04d19af0debabbd5a1e2d','VeriSign Class 3 International Server CA - G3','CN=proxy.salesforce.com, OU=Applications, O=\"Salesforce.com, Inc.\", L=San Francisco, ST=California, C=US','17 Oct 2017 23:59:59 GMT',_binary '\\\0\0\0\0\0\0\0\0\0\0 https://sso.connsec.com/sec/saml\0\0CDF\\0X.509\0\0d0`0HC77hֺpBng0\r *H\r\001 0 UUS10U\nVeriSign, Inc.10U VeriSign Trust Network1;09U 2Terms of use at https://www.verisign.com/rpa (c)101604U-VeriSign Class 3 International Server CA - G30\r131018000000Z\r171017235959Z01 0 UUS10U\nCalifornia10U\rSan Francisco10U\nSalesforce.com, Inc.10U  Applications10Uproxy.salesforce.com0\"0\r *H\r\0\00\n\0mK-&c\\"\I\\\= =`Ӆu\j\\DG\\)\Y$\Z[U\`E\1_;\ne@\\\1VC]\\\BUpgT\@:<\\x\0b%dQ^12x2\\"\\\nu8ّ\Zd߯l4H\M>)#z\z!ݲD\0Rh\B!)z`,ě\D\Q\\\"-4 \\\~\\PAZg\\\\ pih5\r\\\5iJO^\sFRHq\000U0proxy.salesforce.com0 U0\00U0(U%!0++ `HB0CU <0:08\n`HE60*0(+https://www.verisign.com/cps0U#0כ|\\"ݭ_\)XüF\00AU:0806420http://SVRIntl-G3-crl.verisign.com/SVRIntlG3.crl0r+f0d0$+0http://ocsp.verisign.com0<+00http://SVRIntl-G3-aia.verisign.com/SVRIntlG3.cer0\r *H\r\0\02\yD~^\\Z8\pWc\D\Q\s6*\R/X (\\+=/T6t!¦!g2J+9\k\1m\\VW\iED\\\Z\!Dg P\ͱ5eye\H:1\Z;l \n\\zyEei\~{: @q=\\\\n\A K;\:;LiY3H.9]\\\\\ Jfarq6=gb`^˔\o\)\\S\'R\@w\0\0\0\0 connsec.com\0\0>\\r\0\0\000\n+*\0\\aM\-5Hfk<랓nH \%Њ{ 4#bz\;W\\rˊ2?0\QC#6wP@\\09CJ.*pA\a\\H/\CdB\\O @Ez\=\0h%\b:}\\\\N\\R\'C+ƚ*ks\wx\.\G\ k[wn_+\\0 s\=`wd@\ڇHte```\(5\'1Z\4LRhy_23yѿ!\M\,\&C\z\b_PB5ϴ\% \P}ŕc\qHb~\7M\yЁ`O=Y`/r\\\:P~˞4VoA7^/\KlbraS)$T C?\'V#i\Ĥgw\JR\\ \j4斪\n\\7oϷ=R]\\lzSЍu\~\ō>E.O\0\\ᐸEHתqZlNt*x\\t\6:?\\LU8\#g\Ѫ;\.\-R> 2R\j\\"߈P`\\QzV71U׻$RtD_4k\\,\\oUsh&p8k1ܢ4\Z85Y\1ޗ\\!E\UO 4/0ܡ6$ZhN: \_y\r\]MgU\`Cs\r\\\\8C\lW\ 8X?uhu= R$N\Azدe{\\\Z12\i\\:;`\Z-\0)z\'\\6]`\ aA\,(L\\qbp\\\"\Ej%Yȸ\8ɭDZ\ݚ O6D|xĿ\\f\i\\v\N\\m\\K8W\qI\$\ \F\\L\2,j\\\"\{A0yPa=kV\~9\W>o\ⵋ\U^keET3|n`\\\8!QjKOs{\r=lK/\J\.\\,\ǐ\\ ?Q\\"Zh9}B,\\ \\:\\suus )$f\\?ܨ-glk\^Ѽ O屰Ԏl\I\$\lKc\0\\?\",φ8\.\ՎIux t?nm]8J\2$\\0\0\0\0X.509\0\00\Z0Q0\r *H\r\00O1 0 UCN1 0 USH1 0 USH10U\nconnsec10U connsec.com0\r130509145555Z\r400924145555Z0O1 0 UCN1 0 USH1 0 USH10U\nconnsec10U connsec.com0\"0\r *H\r\0\00\n\0s~\\g9h\}@竦^\\\k\:\i\&^\W+br՚<KP\u\x7\\i\\\-.B\1l^D\~.\j\\FQ)#Y#\Z\X0`ط\\ZC\~<\ɔ#PktJ$uͯE\fx\䄿\:\\0\t6Lڳ/8\\\FQM\z |,\\J9 uuX?ꠎ\Dq\'n\\\k\a&\$sq\\00\r *H\r\0\0\rŎ8xU\\\\"\NKT\F؀\w^U_:!C|Eh\.Rt\u\d\Iwcz̊.\=\e\Z\0\\\nן\\OG-#qlB\U}EB\nj^ j\7\\x[3\%\s2HوEڑpzo\Z\:\\8pSSrR)\+h^Y R^\WDrOu sYZo>#\\Nzx\)Y|w-}\n\\mR}(\G% \U+V\H\ \\D','https://shikey-dev-ed.my.salesforce.com?so=00D90000000r4kw','https://sso.maxkey.org/maxkey/saml','https://sso.maxkey.org/maxkey/saml',15,'persistent','https://sso.connsec.com/sec/saml',0,'Redirect-Post',0,'RSAwithSHA1','SHA1'),('5649f603-f2ac-4b0c-8fc3-e80ddce8c443','cloud.tencent.com','EMAILADDRESS=qcloud@tencent.com, CN=cloud.tencent.com, OU=Tencent Cloud, O=Tencent Technology (Shenzhen) Company Limited, L=shenzhen, ST=guangdong, C=CN','Thu Aug 15 14:24:31 CST 2019',_binary '\\\0\0\0\0\0\0\0\0\0\0cloud.tencent.com\0\0p<\\n\0X.509\0\0_0[0C \0k\0\r *H\r\00\1 0 UCN10U guangdong10U shenzhen1604U\n -Tencent Technology (Shenzhen) Company Limited10U \rTencent Cloud1\Z0U cloud.tencent.com1!0 *H\r qcloud@tencent.com0\r180815062431Z\r190815062431Z0\1 0 UCN10U guangdong10U shenzhen1604U\n -Tencent Technology (Shenzhen) Company Limited10U \rTencent Cloud1\Z0U cloud.tencent.com1!0 *H\r qcloud@tencent.com0\"0\r *H\r\0\00\n\0\bK3X-% \nUqR\eƃ}g\ؘZ Ԗ\wzXd\1ag}1;K\\\(\ԇ\\ryH=\xz\\"Y<$\r\?\\"\b\i ]C~w c\X\\\Z4r<\\:}p}>\\ϣ\\ӱ08g\\OK@\~\M\-\<\n\P\X.3)\\E[\\E?\\0E\Ot\9UE|($_\rª\\\0P0N0U:{\\Q>\(_l\m4YH\0U#0:{\\Q>\(_l\m4YH\0 U00\r *H\r\0\0@!C\0j|ZiXt@m-7\\\D\4Oz\Z S\Z\ZcA\K)cv<\\r̥C]\*@\\D|&8ù\\!23ʸ}\\';Z9 \̽\R\E\ÖDБ)*\\)\c=.*{*P\\0Ki?\0=5\\)\Ti!nppG\m\\\#\kW\/,S=c\n\'6<\\k%]\fx\>|C?-y\R\Y.\ZfEq43\=]\\aڒY \\?\\eQ\z\0\0\0\0\nmaxkey.top\0\0r\$N\0\0\000\n+*\0\dc廅k;Tg,ා*u4\Z\\Z\\q`@\Z\^\Ss\\ZL\\\NpZW1E6\\Vh\z 3\#)ф\iB D+ ?i W\\\Z>N+\\m{޹9:M\\<\'B\rC+a54`\QWC/\'M;+ȵ\cnSW\ɠ \n\\ \\3{\'[Bv\c\\\\Ĕc_-[x[& c%\\\\\ `c\u>\r+U/f\81*\\3\Z\L\/!\ɣ@K\\\n\C7̵%\n\\kпi)\z(\=M#hJ[ď#F\\r}\\\^\)\"\\P \x\(i_~0j\޿$\\0{\\\$B@(\ZLxO|%ZLr\\\\":q\\\\֖\Z;\&kp\\a\\QޔQ\a\\;\md\.\"&(ה|\D5!\<\E\Ux\Z\r\X4ީi:0\'xg@#\\\J\Ze:!{հ7v7\@\X\D-\_,p\!\5@b[l,rD\\\4h!;H\0\~`/,bU\Qo\n\\\\ \\`m?0\\k}\FF(g5v\wm{ē\os\nssEI%5\E~S\#B5\\\y}0%\N u\g}R-fyo\#jlD+ \A\\\… Q\\\FyZ\`Tڊ4MaN\\\!;s\\4BIʃ\x2F(\5 _o+9Z$k\\\I\rj\soi*\ʒL\"\".f\4E0LB\riR\0HA\F\\TĢ/\05 \M8 Yþ^Fdo>kn\?Oݜ\ 4eȫCG\ 8H.\O\ND\r \u;8ZY2p\\\rc\0\0\0\0X.509\0\00~0f^W-0\r *H\r \001 0 *H\r shimingxy@163.com1 0 Ucn1 0 U sh1 0 U sh10\rU\n maxkey10\rU maxkey10U \nmaxkey.org0\r200227024731Z\r400227024731Z01 0 *H\r shimingxy@163.com1 0 Ucn1 0 U sh1 0 U sh10\rU\n maxkey10\rU maxkey10U \nmaxkey.org0\"0\r *H\r\0\00\n\03\QJ\O@\W\ P\z\ߍ\\gGEG^M=\\Q\h\U@~OX\pĦ\|&q\b\+!؆jKDh<\>=8\D~h_Zѹ\{R \np\"5_1/S/nc\8\ZVP\\\"5B@p-R|,WxD\w\\\\\L\D\ }?Б\\n\\`\1?E \In7<2{\r\\;Ҝ\0c\wdCD\r\\8\c\ *gcŀafԺϥhu϶62d\'Ujmnd~*U\Q٨\氄eAi\\\'n\(QI4\T/I-? \vx\ۿ/nA_ zb=ȟֺ \05\\|N]V\W:|^\\\\0 \\"\VQ\۸,L\'5\\\Z\߯l\֋;0$eia\K\n\\WuIP\M\P_ͫ\00\r *H\r \0\0O$\.\%pvAq,\,)cOV\P\\\ g\\g;\22\u.Z\\\N,\c_ \Ga^ F6D`څJy@?*B{|fe#Gw:jg{\Ep\$\'xb3Wloz\8\r\'Qb\}[\R0dMD\\E\\\ͣ\gPxkӎ6F%\Nk\CnBYZ\\"62>\wp (_x\q\"\"\f\,]\j+\4 \\+,A\0\0\0\0\nmaxkey.top\0\0r\\"\\0\0\000\n+*\0\ؐ\y \qa.VpW%.r\\n7b\~+\Z\y\\cF]lC\hٱbv\R)c\s\{ \PGFa]0!Ֆ}?ńF\\=|\w},\tz$f#dNcR@sQ\t\~F\<$\\\\\\P0-\Q\r uX;#ϲK-Ҫ\Z_\ޝf\n\RC@\` Gw,\0Bv7\\Z\\\9 e+|3.H\ <K\q\4L|m\"}wC6\\d\\,\?Ƶ?*WJAq{\`1\)\% \h q ִX\\XT0ʈv\\Y\nK\S6\]\"\'\^z:\H\<\Y#\?\VY\ܼ\d$+v\Zt˿^\rT\5n\!7wWR]W1\\F@&^i~\~\\"Tb\ZzE9ٗ`#\Cz\\\֬B\m\\G\i ^݊aۀBѲ\Ѱv\riKg\96\ц$db\gӕLFP\,\R\ɞ\YxQZ/\\p9S\"|jL\݅\*+\ZZO\{\2\N >\\\[&<\n(\\*v\Kvbr\o\%zd\'\\roc 1\r\Ga\R\@^Nn\\q\rz\\\\TYw8>\R /-˦C0jn\\\.\c&`V@\\\\c W\\*+&Rq.7\n\|\?WF\,`b[LҼ\с\-T\\ƙ\} tN\01\cJSAKj\n\,gWW\,\/n= t…Vc=؝MC\]\ggv\ĽM Ұ ?\qR\Z9\i椝n\DaX?„^̥p\r$\\e\`̠#s\\rMx)P\'\\+\"l\b\'{Z\&D]\L\*A’7:y\51\VX7\\ɩvRΉɻY.[\\\6wgp^\ /\3\fHa\d9z\,YԵQ>)ncv \RWv\U4F\ \65A\\N(\r\\&\V\/n;C0\n\N\Z>3g\\`Dk\\\\\r\i,\\0rڬ^x/\ 04 p\x\\\;o\Oe\2L$2\1*sD0\KE\b\n\ќ\hTpT]n\\\Q\rN\G\%!k eߟ8ZY2p\\\rc\0\0\0\0X.509\0\00~0f^W-0\r *H\r \001 0 *H\r shimingxy@163.com1 0 Ucn1 0 U sh1 0 U sh10\rU\n maxkey10\rU maxkey10U \nmaxkey.org0\r200227024731Z\r400227024731Z01 0 *H\r shimingxy@163.com1 0 Ucn1 0 U sh1 0 U sh10\rU\n maxkey10\rU maxkey10U \nmaxkey.org0\"0\r *H\r\0\00\n\03\QJ\O@\W\ P\z\ߍ\\gGEG^M=\\Q\h\U@~OX\pĦ\|&q\b\+!؆jKDh<\>=8\D~h_Zѹ\{R \np\"5_1/S/nc\8\ZVP\\\"5B@p-R|,WxD\w\\\\\L\D\ }?Б\\n\\`\1?E \In7<2{\r\\;Ҝ\0c\С\|ɒ\ \(͚\\ނ\8ر\x\X\\\\Ν\\\\\\l۵ބ\\\ \ذ߆\rݺ\X\ԪϞ\\\}֭ӧ\\\\:\\\V\\\\S\m\\\\P\t\xϟݻ\`\\Ԩ\]\y\9\ɒ\ƌ\\ӥ\oП\I\{\\'\-\Å޼\\ʔ\\\bС\:\Q\0ɓ\C\cҥ\O\\\ʼn\\ܸ\B\b\\\\\Ŋ۶\,\}\\Æ\R\@Ϡ\*\\ރ\k\s\uƍ\[Λ\n\!\^ϝز\\\oȏ\\\[ׯ\m\+\kլ\j\*\\\\Ĉ\\\ĉ\)\r\W\7ѣ\ć\+\cȒ\O݁ȑ\}\\ǎ! NETSCAPE2.0\0\0\0!-Made by Krasimira Nejcheva (www.loadinfo.net)\0!\0\n\0\0,\0\0\0\00\00\0\0\0HA\08\qÇ\r\kÎsu j\8P̔\0 G\"Ɇx0\\r06IJfK\rb\\J u\Zl\b2\3dIe\k5\0\0(\\%P\h6\hw,\"ħ)H>60\0x}dYW\8ȔQ\)\\0\ ^\\c $ 8er\\gE&\0\"ҌI%\F<\Z@1AK\n6R2\n\Z\iG/8\e\n+` iЂ;h$шA\\@xb|BE \.ŎiJ *&\NHqB 0\W\Ⱦaʧ\  A, #\\\AOo\w\A\0!\0\n\0\0,\0\0\0\00\00\0\0\0H*\\ȰCtر\Ë\n-x%@(0$@Ǔ\n\9JXd$+<\\BK\n\Z Q\02\3`@a20v\P!R\E\VŠm\a\R ]5u\0`Ax\\Z=8ce3^/ \s\Z7m\'\r\q\ H5n|\d X\J\@04gR\\Kmj8,5\o!mhtt\ɋXxЪ)mQ1e4\KT4L:sz<6bĉ[\\\7B\00@z\e\\\@\ZrC*Ƅ!\ P(b\0>Xs\]0;`&Ƥ4Kܗʋ\Zr!6<\\ 46x_.\\\Zͨ7~8@ckB\J#Z\B9\ R\\\\\B6\\'}wIP\X`\HAl\\\E4\0!u\U\$L:A e=\A.ɀP6A0\*\\ +\@JH$\04`:X\Au*^\A6HRa/\\Dvښ \~\0\\'\0ѮgD0oBN\\8oBL\\\ /pk?,\;\0!\0\n\0\0,\0\0\0\00\00\0\0\0H*\\ȰÇ#2P*$j$8*Rڸ HHJ\\\iU>P\%1\1g*M)P8RP\2\6E7\1H!\rv@6\L4\rH\!\\\"\\"¼9t\\B\2fJ_\aj#!\{32#N0@\.ZkdɂLMvg~@ \rdB\n $F@E\ǂ p\\8 \0%)Lт\z\8@ 6If(\\\"TQЀF\Z5\\\ZA\B}ʙ\1P\0y\\˄\\1\\\\nډ\;̀g\Aah2&  -At\!B\0p\\ny\\'D,S\CGpsű硃d\&Yl884 ʓ\nJA\BTz\W4\\'!l\im -#\|\\Rp\\664dϫz\\C/ت@D\\LJ\dc߬1P \\H \D#q\\niAKd@K fSrAa\) Ri>\\0|\QׅA/\7\MXPGXD\\lB,\$\0!\0\n\0\0,\0\0\0\00\00\0\0\0H*\\ȰÇ#:\\BŃR\ŏO(`\\Nj6B\I~\)\\#NppŐx\Y\npxFT\\B.8 b\J0-T\"@=I\0\#i]J\B |\\F\\+uH!WټA,y\C~ _A/w^z~_u\e\GBx!n*0\]\\:=\\\K\P\h_ \Z` o \0\ `5D)B+\B k`d , Rְ\:YDpA%\\@=&K2\Z&DYi\"PE Z\nA&8vbM2\\BLQE\ZJh\0A%\I)=\P,Ul@1\rO\Z>C(\\/x\\Z6+*2\dCd‡\:!&\\`\IJ\\-p\0<:9\:4꺊\0& D1P\0P\E1`.\Pй׶\%\r{ .zpc=1N/\\`EaŜ$N1fQ@\0!\0\n\0\0,\0\0\0\00\00\0\0\0H*\\ȰÇ#:4`@Ń\rL$Iŏ\0H\0DG}+9\(\b\\'4XpB$,\E1P1\Ġ\'6 @d\O\0bUdI†\n2R\#Ep(D˕\8c˞M6\ B`ct\"g FH\c|Ѐ/.Yǹ!\R- 6L\Zt\n@@<\n}\ \yEj=\\\{\ l\}d\D\o)m n q \/ 2n\\1DFd\0D`\\'R\"C\\n-\|\\(\q4$@ \0l\P` )%>*dDd\H9䉘\rDAqDKB`D8 \'\0{ PBI \(kj\0-dBs\n\0\0 \^\04@C8\0nF@VhqC|\\0.\\li\\0\\\KYI\nŠLD(\\0\km@ o \Cxz\0\0\:\@sP1?\\\P %\A!AE,\/\\\\h\{\0 \0\n\ZjLg0{>\\0y\2\\|Υr_~\0k\0\\\z\'E^{>7\u\=\2\dw7<1@.,P\uqY\[ry!\EC(kyB*\Di:$( $y\\\t;$ieHy7X\I<p\gI\ryPp\\SmZYfI\7\ղV*\ h\`p*%A(\ \'\7\r\\rU\r\A\'ʤ񭁧2i *f`\0f\2\=*\BP s hza ڪ WM⃟=8 \\\\T\@ `\u\vx.\$\0!\0\n\0\0,\0\0\0\00\00\0\0\0H*\\ȰÇ#JHq HM6@RQ!$\\\\0hA:LT7d\(p&T90C\0@1A N\"\D?J%h\\,8c\CZR\p\A\rI71\D\\'*.\HT7\\(RīEN\n+x\pRa4HEr9b\o\;*E\p\\"t8F;%QA\\ *c8CҜ\ Y q\#G( HtMq@4|\@y \޵\'pϟ5gw\\\_<@\@\`\QDw R\\\")x@/(\ JB\Ba)lP~7\\E 3\\"<|Jt_B\1#.^4B`J\\\D3`Q\\1-Ú_\\0x\n`\"t\Z$\W\r䙧@BF葆t-b<$D\n%Q@J@\¤y\%CwaD \0\ny*\:\zli\n.\\#@\D2&H\%K\"\0$\2\f>\nC8T @\rIBxF\d\`@TA@\\CXp\\\\A\nFK@?\0\r\jl*!0?A0q^/,\0l\\0;',0,NULL,NULL,NULL,NULL,'','MAXKEY','',0,NULL,NULL,NULL,'0',NULL,1,0,0,0,'',NULL,NULL,NULL,'IDP',NULL,0),('1327c121-cfad-49ba-bf61-afd3a1e09d5c','LTPA-Cookie','http://tokenbased.demo.maxkey.top:8080/demo-ltpa/ltpa.jsp','FINANCE','d6227a3d7756c255874ec7029678b8d1','Token_Based',_binary '\\\0JFIF\0\0\0\0\0\0\\0C\0 \n \r \Z\Z $.\' \",#(7),01444\'9=82<.342\\0C \r\r2!!22222222222222222222222222222222222222222222222222\0\0\0\"\0\\0\0\0\0\0\0\0\0\0\0\0 \n \\0\0\0\0}\0!1AQa\"q2#BR\$3br \n\Z%&\'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\0\0\0\0\0\0\0\0 \n \\0\0\0w\0!1AQaq\"2B #3Rbr\\n$4\%\Z&\'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz\\\\\\\\\\\\\\\\\\\\\\\\\\\\\0 \0\0?\0(\n(\n(\n(\n+\Z\'ouZhl\r\1`?L\\4֯MunC}\U(K0c\4QE\0QE\0QE\0QE\0QE\0QE\0QE\0TR\<\"fc\0\I\+\M2\uZ\\\rc^\\;H\\w\c\\n\;RР\"J\GК`H\r\08\0\h\vH\}\:٣o\pI\%cy,f)\<;0k)ɀh\\1ײg\&\ɺA\g?2C\~8#(\0(\0(\0(\0)v`I\'\0\nuy\\hnu\)\c\?\D{\3\\ZIܵ鑶28\w?\\\EwO\Q\P:6§O=Q\\\xQ\\$a,J-쳆P\޽CHuih%\g.~ae5\\C\Z\\ZE\0*\0t\0v-1\\\O6\;\;O8\t8\B*\8\y\0)\\\m` Yw@Q߮sӊ\Z(wH\\:\b >0G\\\i)\#N\ϰo\:\Z(\;Y\\\h\pAY\\X]\uk3E&Ӳc!\ه\W\\Z>[J:gC\\ w \wf2\Q@((-\Y,qf\'$\\:Χ&]\\,\0\nU^\\2\\ZOh\k\\ّ\\\"\\+[x\8bPP0y\\M45\rQ\\-\\07\G\^@0(QE\0QE\0WP\]\\Z@\'fѓ\\"k\*#\e\Q#\̕\\n5q\\2Zռȁ?Ǒ6\\F\+D\Ub?tM-q p{\r?U{QLAEP\\όR$F!T\ rO\O\ķQ\K4\ \ܣ><\\ڋj\ı\\dRJg\M\oL\\oP\o*Ȫ\9\r\ZX\\1pb\0\q\fa\Xd,edO\'=K-ƣ\tQ+2E#8r+\k\~i7\M{qr\"`\&UU,Fq\\\S$(\0(\0\\4w? 5EY/q\'>V\0\Mz|٣\\ڽo\\ۊ\6[\t֯2\\px?JhQE\0QE\0V->\{ɛCH\\ ժ>$UtgܬDU~\`=h\nn\\kNd\F$\0:\X\A!\\m3{m~\W|-\M.*\[\2:F%\HgESQE\0QE\0W\'\\r髩Zn\\P9.}GQ\yE\0|]_e/\flLg\?\eWҢ-hĴ\ݔw\\\\\i}3g{oZ\si2M(\r\]Oó,.6\\/ \\0U\}\\rz^SJUMJ)l\X$g\~4\c\)gW\\\\\tZݧeU_*Q\y\0\\Q\0@t\"\\MI\\9,{\\\zrڊN\-\q\\0\\iQOV!#۲\P#\=ZڲͩS?\\\zx\s<\#I,YݎK1\M1ٝ\ݙff9$\5sJү5B;;?ઽ\=Qs\\z\Vh`_y<\'\0\W\p\n5\ncgÖ\\ZҖ\V\ߝn\$(\0(\0(\0(\0B# םx\W%\R \K[7\0d\0 \F>gӯ4ˣm}m-\d\\g\{_K^\\z\+Jផ\\\nK^\[6=ց\\'\x\\>5(\SV;/\\5\f\r6V\'v aKtJC3\'z\(Tդq\`/\IU\\ \tfWY&^N|\\<\ns\|=\=[]d\kK#ɞe \0ez޽A\\/\C%n^C\O\+^b\n(\n(\n(\n(\n(\n(\n(2A&]i)\PA\~@7\0n=u5+\ \"HrrH\\H\+Ѩ(((((\',1,NULL,'2019-11-09 10:13:11',NULL,NULL,'Test','MaxKey','https://github.com/shimingxy/MaxKey',0,NULL,NULL,NULL,'0',NULL,7,0,1,1,'org.maxkey.authz.token.endpoint.adapter.TokenBasedDefaultAdapter',NULL,NULL,'uid,username,email,employeeNumber,departmentId,department,windowsAccount','IDP',NULL,0),('38c8a544eaa04aaeaa49d9c77ace40cd','Token_Based_Json','http://tokenbased.demo.maxkey.top:8080/demo-tokenbase/','FINANCE','c1f6adfcadd8ba23f73395f16a45dbe7','Token_Based',_binary 'PNG\r\n\Z\n\0\0\0\rIHDR\0\0\0U\0\0\0X\0\0\0k\0\0\0 pHYs\0\0\\0\0\+\0\0\0tIME\ !5\\0\0\0tEXtAuthor\0\H\0\0\0 tEXtDescription\0 !#\0\0\0\ntEXtCopyright\0\:\0\0\0tEXtCreation time\05 \0\0\0 tEXtSoftware\0]p:\0\0\0 tEXtDisclaimer\0\0\0\0tEXtWarning\0\\0\0\0tEXtSource\0\\0\0\0tEXtComment\0̖\0\0\0tEXtTitle\0\\\'\0\0 \0IDATx\yT\\s꽡\ZQ@EP\\\%\\}͘8\q3.u|\'!f\D\\\,*\,\@Uu\ܺ\2\\\|}n\,\9\y\\\\\G-\\f\0DS\\'m\\4}E2x`&M\y\\/I\"B*\\_Rr\\\_\\\\\Ek-\\Ð \Zz\aXr\\SJaY\_Tc\0Ƙh\\n\۶\\r(\\h{\i\\G>[ܱޒ),(R`PD\\~\ \0\Uߵ\\9f%\\mG\n\n9/feYIlܸ͛7~zF|夓N\\CɈX3.bbt\\\\\"/|hll\T*@EEC \\#aÆ%5aeY5\W-\av\\\m\6\3{lf͚\[o\\ۻe\QG\\\'0\"\ (D)$RE#BB hm\\\\]w\\m\eee?.>}eav\ޮe\sWw\*2\0\q6n\\%\\\oQreY%Sɲ,1TVV\g\i@PI\326h\\0-vdϞ=%}א^{\5^{\5|A{\1LXBѵ\\b&hioo\\/fѢE\i HF6 \D\i?\N\0B\\"ޔ2DA)\0d۶m]\C\~z.\\|M \35 p]3gh\\"\\\%\%\9 CȘ1c;v,5558\K\ZԐ|V+֛!\"!\"\Z Eҋ\(\jp\&\\\\ڵkYz5\~TR\y\a\Ν\w\}<\\kGH\b\\3ƈ1F\00 \SN(\OqG\nill\֖ \0)S\rCDL\)| C1atMN~d@\@v_\v#\\\\NfϞ-۶>(Nv\^I/\"\"^zX%=\Xʶm\Ɗ+i\\\_\M7\D:\"s#6ٺ\"i%C\. F!\\n\ X\\\\MMX\\rD}\ri \+ E_|1\\+\"QK\"Bcc#\vZb\\S\WX\ݻc\0>}z\0\6kl\\\WMy\Հ \0#RHK\C/}\&\\HgЯO\\x\\0Qb,Р-E\\\.B\r\ZDCC@\/ZSO=5atOT@%U)Eccc\\¢P[[ˑG\\Z\q>~XBק1SёTF&hbrRfS\\s3{Btљ|\˨V\چv\\_ǟ\\\\7\'>\ed@\0˲1:hh7n\r\r\r%f޶m\J\ԞX=bj\\I[[[\5\\ڤ%\\#QJ\ Tl*,TJaD\X\\\ߜł|A\:\|\A\u\\/l%\\\w9\+R\]\"h!\Z4h\>m\\\H\\u{^9\\\\\KӤR\#)b\.%Ur\\c*\\G\\KO3㛫?cO&H;lk\IR3h$ϼ\SV\r@+00vc\3JbjG//ZŊ`N{QP\nmi7\x|!8c\ v\\PF-|rXNG޴\\\'\f\\V\`\n΂\\.V\\}\9\c;\\\rOV%(Q\"FPZ(_t*\[ϼ\W%7~tY\Z?\e\"-B?U\/^\O }%(.1#\\\,,=^1X\ĞzN1 $ZH0\nˆH%\[\1C`P\r\lTڲq\\ -\\Zg\0Ra; d!\0v\\\Hj\AăLlJ!ɃʃѠ\H\n5\ò\rM,[\\T\ \0J!hA\\\~\q)ЉRJ] Ao$WL\\(A%p\\&-_\Ul\\ª;MӅA@)D\(U\\&h\RQA\HX`k\\ި%\u<\\n \rqhSE\Zٴv\d\BQK^*fL`p0\AD J\N\SW\}\Z-\\\E\"\]*Z\$7 ~\Zש\\\\\\ ]Ü\U\ZBE\"tP. \8R\)\E J[dv\\\~s7X\E\.(٢(\l\\\-b93EBp\\͋\r\=O\T \\\\j\\*ؗ\ 21Q\\\'2<\n\\}\UA[:\0>\\\\,9l`_m 0ThPJe\\r\WxuE :ݏ`Ojm&ߗGL\\/\\L\\(݁J\Z\m掯O\ל6cE U O7l\\e*\SyL\܍c GK\o%U1_\\_\wszO{K@&\!\4K\;G ,ZZ/_Ŭg̛0x͐\n\d>1 PCH,\D\R\R:AFfwq\\r\\'h m2V\D)\"9r&mذ]vQWW3;}gC8\>mj\*/^@dB?v\J<\@ᖕ\\]\f\\ML9iw\\;W\\\6\O\\-ܴC\,M,|\Ee\(\6ύ\+NgP\*\0\X0~ \kv\;\&\8W?׊5P\0P\U0r\\D8 \nh6551w\\\.\2<\\2\]\0s\A+\t:\rwމ\ 3EKkN;\H\Z;ezᒿ}\]Ͼ\ySaW O>\M\<=۶lG#\\0ġr\@\mU-|/pġA͢tem\rx,X).T\V\Z \\ӧ@F\\\vyABe\n\\"±\\Gu\m;3fpPYY\%|\q\C1\\!J\.\\.\t\\3}t~\\&(\u Ð?iN</ \\%glu\\ٲ\^͗\>/\\\~0l\\ob\ZB2e)K*SIv\VN\\/\\C\g0e\m!\Ũ \q2\G.ێFL&Ap \؂P\R\(++㪫B$J4SJa\6˗/\s\aX\8% Y/@\\QI J*m-9R\=EB4ƈFL#0؈!\\X\\\H\dP3ƐJ\\\߾9K C\èQ8\#$ C\8\.\G%L\rÐ\'_\\\f^x\\\./_H\̙3o4\\H\ɇx\n\㧠l ni%!J(EGT7XV\\8uHp\vx]7\ObTc\n|]-\nT\n/\'lّ%u4\w\\\>۶\O<\ߎ뺉g!\z\I(+)\\Ԓ\۩\\y\!UUU|\ _\\_fҤI\'۫95\\Q\Cpg\\fV\HEMȡ RfGbe𕍪\\\>_\\زr T\[@T@i \vQJXb#ڪDYUd%JAB뽑Y)\0)J\n\#1cF2\c̛7\ \Z4 \\\\\ \>:5\\(\\\,\{\%\8\\ /\hmc\#8\\q\2\\28\\4q\⠌B\"l;-\Z Sd\wwݿ\Z;\Bހ\n/׈m\X\kvʐ-.\ʎVca\6D\21m<+Wlٲ\nn>l6\ \8NIV\G.Tx\t\Zc z*cǎ-\\Xli4m\6\n#\464\mB-Z\kEh b\p\\\\u4n\Hi#rx\\\rߺ\IVmڍ\l \A(aq\#m\ho\L\\;뛹?+pql? <CI\r Ha\ڵ\*o}***袋0\\.m\'7\\1cx\g\0\}oET \\5<\ya\$]\\ \\"B\\\\p\\\\\ɇ\;\Zy\U,X\\?6\\g\O͸у)\Tyi\n\oYaPϩϐ,\\\K?\\+\SLr89\GE\ eЈ\+WH0d\Z\w\ЪeR\\QF%L.\\\\5 ,#\k\sWg\b\\ݴuVê8k\(.=\8>\ފ\ \OLd\6~\r~>g5۷Y_u s9\?-fĠ<\eL0w1{\Rv\0 z$K\o3{!wa2jԨf\/\\_I\F 0E1\Ү\"4y*\g\g\J3hF!FE\r\\y\\\\~Xy\-ǰ\ZN;\X\\aւ\\\0͑:n\i \˴c9Vqo\L\ӧO\"8=ݱs\bs1bP`d\\"bF$$\f1e\>CTb4\\p\\\Xc<o#x>ϭ_?\ۨV*˪\p-\3::27Ce*ք\g\(Z0Vͺ\h\rJ(\nv=\r(Hc\MwrGl7\zX4!(\> .OlZ=[\w:\Zu72.\N^\\]h\\bL\N^\$  *IUTtEKV61>\n\6k\\\\\!J\P\:0r\D\"Ji\.DK5(;ʏ,1Cj1A{\XJi;\/o-\݊\И@€͑ ۛ\c\>d)\\/C%(\8|s;G\Y\OEmqA\" J\w\co\#ƕVVVT\\\\ܥUV|\E ϰ<2\\nF\\A3NJc\\Z\\Z\0m\ٹ\ tJ\\:{\Ν%\\\Cf޷o\^CC7n\aŪaBuO,\\y>\'\_\7/>Am\\Z\\\\5\4\?>\\\4~u-\'՟\\\SFo5\R>\Dnj@=2\cĈ%;8b^`\\\r\\Uq\\\0i\zm\Wg\?\S,ZMJեt\0B\\7%\0: =\˪Xh|A @\r0a„\\r\\x_j2a„J)g}\\\\ng\=\'\"\\"aVL \f\$\;-w͚52n\8Dk[\RUU%6m \\\m /%K\0ջw\\3 g}6v\ZÇ\'\$\H hS(\0a|\A44J9hՇv^zx^˱\\4\\\+ʋ^ ۶K@\:\'c\}_\0-[H]]\0⺮h\9sx\CI5\.j$\3FF\H(&\Jv1y \@c$\\on\\8Nrgޫ*\\\rY\Ij}5AP__ϣ>Juu5\l\w\d2\\ץ$\@)7\ rPJPA\:R.ZG Lfٚ~)I8\\'? r\nAZJ{\[\ys\9\+\?`\ܹ\ z+DW\ %\nI>`\h\\ZסTyn\\%Y{)S\o3\<\?\+z\/~\ĸq\x\Gؾ};˗/gٲe\\\\f::: }뷏\u`\nVh*F|\IRL:vD\l۶MZ[[Y֯_/O?L/\J?߹Z|I\b\}\7,\\J\͛\\oͯk\&Ӷ\0\0IDAT\:\7h\ Re˖u\\\Z3\\'cƌBJ)fϞͲe˘\rt\n2Ch1\>w\\\\\}i]ar\-0i\$\o\#n\:|ߧ\}\\0y\\e((++ `\E)Euu5O<6m⤓N\\.K^Oq\$\\yCZ1rI-\2cFXx\ӧ3v\X,Y1}ү_?6m\DSSS2\_x≉Mjժ#E̊z3f\@k\5\\\CEEEI>.E%3r$!\<\#L:S]]\\0!޽\\\\c=֚}_#8t:\ԩS\;<?pRO}\G\wޡ*/\ò,QJɓO>\\\uוب6ll6\\1c@d\WUUɂ \\\\eӦM%\\7ߜ\;v\\$\{\I_|\bIV\G\N햩\\\{z\K\\ѣ?òj\*immcʚ5kdƌJJ\-++;\CVXܿc\?|\s؛3j\(yA\$fm\\SO\\͛\\?\n\0;\|$Sc@۶\㎓\[ZZZ\#+W˲J\\d2R__/&L#FH:\o\tZ?p?~|\\ \d2R^^.L&hR***OԘI=)в,ٰaC\җT\"5\v[WW\< u=\ĹC\\\-J\9\r(\,[\۷f\\Zz\!^~\\\quE\ K1ʵ_\\\jܧC\H6\tհ4 nx&!\\'*\\n@555O\f\\-ObhL\28`\@1u\\"3c j\\\0\0\0\0IENDB`',1,'superadmin','2013-05-25 03:45:54',NULL,NULL,'Test','MaxKey','https://github.com/shimingxy/MaxKey',0,NULL,NULL,NULL,'0',NULL,6,0,1,0,'',NULL,NULL,'uid,username,email,windowsAccount,employeeNumber,departmentId,department','IDP',NULL,0),('3a2c3f84-1df7-413a-8a42-f3add972e0d0','O2OA','http://o2oa.maxkey.top/x_desktop/oauth.html?oauth=MaxKey','OA','74a81906a41d3a89866edc237b3ffb2496d0aaf34af60931b942ef9c37cb9e71','OAuth_v2.0',_binary 'PNG\r\n\Z\n\0\0\0\rIHDR\0\0\0\\0\0\0\\0\0\0j\0\0 \IDATx\\}l]]\\6s\N@y)\\nc\'M\\"Ī&⟊uL\Q\q,\ ZZCCP\riRa-\XPA\"1\"$(I\ľ~ѹc硚\ν\T\\9^sK\ӯz\\7Gw\S\\!S\\\n9\0+d봙pC\\\ro\\YΊ_O\>,Ь\N\\\\4?\\\\_\\`Id\M\|׎D d)-=r&\k\kD \Z6\r\\F_\r=.ϓ=z\0 \&G\"\06Ѓ\0X\Ԟ>\0qKB\\0\V D0&!\\"D@a\"L B D0&!\\"D@nl.ٸo|6\u\1jn6\d.a\WdOO\{\yda\\э\C\\Yǩ\ED#}۾\ږ|\"ݧ^+0\\WDx\{&;:\1M\Z@\Y\}&\5F\\%@a\"L B D0eY\k\0&?03_h0ه\\\\0\ZLGGwf\Hry\\_\\\\50<\.\1]Z\^;\;G\ݸP\Ziɾgj)%\v=\J\y:w*\]]\\\ݣ\Z~\\\BO|\\կm\s\cgY\Dz\\BOT\\~Rb\10\<\\\38\z L4jt\0\T\h\0\d\,a\X[\ 0&!\\"D@aJL\0pDB]4D\C\0Q;B2n)\0D$9[⯄w߽\7$\[r,M=\\;/\\\]=EcN{ϴ}`Lk\ٰc\\\W7\H|O\3[T=\"]\p#e\,\^\\\ފs\20\UAw=z\nQ}ǓĞz&\)כ\a\"*foga\"6WB\\"D@a\"L B D0&!\\"D@\m\\8\I W\\].6\\%Lwm|xt\7\j\SKz̨\zԥ$/\s \[\{^\zsY\bpC[n\W+j\\0yswt}\w\\\=C}\Z\=\\\W+.dNQ\s=*]nwm\^\>%w(…9\΋\+?m߾p@\zħPdw~fzj\\gA|3$\.vavlS2F \ \\\\nWBρ&!\\"D@a\"L B D0swyk\9\ w\O\U+c\ Z\r)\e_E7ٗr\Y†\\Ԇ\"_(}\̅ o\7J\.̞\\\\\\]zA\h\wZysbrٵw:}\o\г\0Y*̛?;>7j(\ \n\Y\*@\nf\#?\"\\s\0y)\kL\\\\nB1\lk\<\"LI\0\S1\t@\<#L\&!\\"D@a\"\&\\۷07 X\l%\\3`y\\7\r}3X\lpIs\Rf?<\Z\9|1\>|\gB\\h\\N\/N<za\\4c\)w]\r=\R\ox^noI6޶{^\z㾲u`:1\?.o = a\I\>=9\J\97|\͟:;E a^%}\" b;(B\0,F@a\"L B D0&!¬ݴև׵ rH\p8 1 L\&oѮ\c4s`\z\\I\3O=K \k\|sț2J]G5\L sk;F\;$0g<\7\7!\\"D@a\"L B D0&!\\"D@a\"L B D0&y.\0hؗ\nbY\K\\\\*\@P/c)\n\\K\^\n=-݇\})KQ0Su/K>ˑ\U\g,l}*\ܾrܛ{{\Ƥ_wW{BυK_SE9R\+L\\\B\d0@3!L B D0&!\\"D@a\"L B D0er\Yy\\\0r)\Ss\\\d\\}G\\\q*\\t\ݘ\Z@f\QV|8ݧ^\:wx֋̹hÖI \nc\5妹#e\Q*\ 7|\r\\Xy,!\\"D@a\"L B D0&!\\"D@a\"L BIWC`A\d\"ӡ3\lhtfv\"qC m2i\\\N@py\\: \jI-\\4z&f\\'ʽ\%Cۧ\s͆\rhJE-sr\`\ZJv*\@IO_Uږ6xnRm\Κ\]u 4e봙pC\^M_R.\0\0(!dA\0\0\0\0IENDB`',0,NULL,'2020-06-28 08:58:42',NULL,NULL,'','兰德纵横','http://www.o2oa.net/',0,NULL,NULL,NULL,'0',NULL,18,0,0,0,'',NULL,NULL,NULL,'IDP',NULL,0),('3a93e28d-558d-4dc7-a3f2-9bf5255a1372','人力资源管理系统','http://hr.maxkey.top','HR','55738fd06aa1dd42d373f3c571adcd39','CAS',_binary '\\\0JFIF\0,,\0\0\\0C\0\n \n \n \Z\'!%\".\"%()+,+\Z /3/*2\'*+*\\0C\n \n ***************************************************\0\"\0\\0\0\0\0\0\0\0\0\0\0\0\0\0\0\\0K\0\n\0\0\0!1AQaq\"#26RtBrs\$347CSbU\c\\D\\0\0\0\0\0\0\0\0\0\0\0\0\0\\08\0\n\0\0\0\0\0\01!24Aqr3Qa\\"RS\#bc\\0 \0\0?\0\\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0cnw\m\\1\|bm\"$mV\\O\ \\\\\3Z(G|J\n9\1!\ĹU\\rW5 [5\\ϖ\0iw\,]\"\j\Zz\fV L\[^ȿ\\\0O\0,i*ImFF\}qi\\0\EUƊ+03T\JƼұ[T\\\\\\7Z)\\\\Zr\+\\\@PPb\տ$>dZ|vI%H\\\tVܧ\\\W% \1\;\S%^,\\'\'Z.\ \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0u4fCw\__\EZ 64;Qf_M^ϏP\&\[D\!k]\\⮎\\"vjƾZK ە\\\s\\\\\\UsUS\UU\\UU]N\0\0\0\0\0\0\0\0\0\0\0\0\0\z=V4sW%N\Oh\w*luߞ[c\\\{H\b+}\,\&\D~Ƿa(=H\\"{msW%E\RgaDzĭg,{*\ZS~q\Mdbʞ\Z54\'m{4S\\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0b\Z;\r6CIn\:O\,PrQ\\Z#\\Oi\Jzڗ\UJ\fz\\;n\^\ou\\lKUy8賫1\0\0\0\0;v\5]GF߽\\\J(juƿ%\\\0\0Ai\[4\*\J\Ώw3\\r\+OkDJj:x\"Dd2\8d\b\\Z$}SDDL2C(\$\MT:拹K\\k\'\"*s*E\VPS?bLAhW`=J*ӶZG\ݚw.dn\\*+\$}.\\&jJ)*\$OfF䧈\0\0\0\0K& Tkһ^.r@\_/Ih\ow\D\9?I&/O\SG\A_SleU⛕980xwS\\sLby\s:\P\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0O\"Q\ǫ%d\\w/G^\X\ھlM\w*\nꋕtuזE\W\'N΢j\Q#E\\r\U[L.L\B^\\E+,A,OY6\FfD\\\\\BX0\0\0\0uq\\ʱM\Z\\\'la\AnQ\GhW:\s\\cvOf\j\{xv\\\\\\\Qwxq(\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\09$lQIcQ\\\.\D=6?rq6\N\\"#\T\\\r\\\\[\_}:V4~L ^oizT\\0B@\0\\*\ͥY\U}\':1\\o\\IF\i$]빩\WVJk \vK,dw?W2\`ô\ZmXމ\L\\\\Nd\3 \0\0\0\0\0\0\0\0\0\0\0\0\0\0\$l72V\rd\3EC\X5\}u\T\\Eb\Nt\"%sp\\+k<®\\'\\\D\!(`\0\0\0 \sF\\ꍕ=\\\=DT\\\w*Ad`+\\(V\P\Y\8\~t|ݛb\0%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\_\r\5eB\-\TM\̉\Rr\V\U;\\/\Mtu\\\D\K)\\\0f1\\\j\TkZ\\UWrI-ީE\]\'h<+bg*\"\L;~\\\N3\\0\0\0\zvU\kU\\l] VshWD\ԍ\rm\)\A\mƹͧU\)\#N\ڽ%ܺ-G<0v&N\\ESi\\\HjʪڋsJlN\\"uqniAgx,\64k\\"\"dɁVm\\\\,s\~}j<\:m8\\\\1h8k\\xdqn\_;ir,o\V@zU\\\M98\\q\iʕ\%uh\ \Q MI\^\ץ,\Sy5\_\'\k\\Nm\\\ý\:\kL_6\E+&FY覭\U\?;=|Ǟk \\\\ݴ0-\w\۫$WyZ+н\u+\ik9 \'\Z&5>\\0/\V\Vhc5@\0\0U\\\;\0*a\YFȧv\O\;\\\\#E\]CŠZJk\+rr}e=w\gKGP\͏\c\HK\\0\0>e\[U\\n\uvj\;P\0-LUTӻZ9Zj)\BtwuY\JT \GUvbbP\0\0\0\0\0\0\0\0\0\0\0\0^\\{\\Z֦j\\ZW-\v\\\fevu\\SXU\dUoCw5;>0H\0\\\\\ࢇ=i\\L˞**H۩MF:\\ԭ\+}?3i=%\\;\0\0\0f2(\kS7*HΥ)t=\Y-jgCH\F7zqiG>\S-\2%թg&\")ǝzmfUeeNJ\ش\1\Z\\g\\e\cr\\0\0\0\0\0\0\0\0\]%\a#Jb\\\s|-\ose=Ǝ:)4Y1sG!\GX\\/pm|uwd\U}4\\N\\*bx\j{gb\v\ZU\\\ͰF\ƽG5ɛU4T\= \0\0\"\Ɨ+B\@\\Q\\ܷ9>\P\0\v{FA7vb\\02xzⶫ-VL\ԓ\.\{ yCo.-\\ 7G3ݭ\"3zgݟhC0\0$\0\0\0\0\0\0\0\0\0\0\nI5jTThKX\\\*\'Pc;UXγ(U\"DW&\T\̉M3V\9h\,և5/%_\\s܍bf\.H\y\?\C-P\\1Ȓr\ڍMo4#;\\e\\\\x\\0\=Җ/\\=`J:)U\n\VF\>stA:{W9Q7ɍ1&+W\@\,T\#j\W\˻\Ѥo\\k\O9\Z\֊\GgH\.6f\֮sO\\\0 U^z|\n\n\\A2~R|u B\-U\SKu\9LJcޣ۶\"\^\y_֫\\0_9\0\0U\)qL\jd\_^i*\rZ\\nn71{\P! ,;/#m\\/\\Z\\cOj99*\y\J\w*y @\0\0\0\0\0\0\0\0\0\nk6\\x?M`\޽^O;\f\0P߂eo\E\\T-~\(~_\ǭ_\ 6(\0lNN\0\0\\\\ҟ.\r:fr4\\]?\\L\Bx\\ݗ\\`\\\\\l=\\\{3\\ϓhp \0\0\0[5Z\g\:Xڍ\XDv_6qU\ry\\\\\"գw\z\`gDrq>\ꌺ\|L\!.\t-~j\\Ʋiԉ]#7[>`\\r=| crP\0\0i-\\;W\'{M\F\n\\\0\\n\0BCNE\T89jfqT@/f.lj\ᩓQ9\\0\0\0\0\0\0\0\0\0\08রco^^\'\ m\\\\$+\ڸ1\ka\0\r&Z&P\\aHi$7z;3\\X\DsU\*Q6&\\\\\\\g\\\^%\ifi&\\Hg\_;y?\?*C\\\\\\\>u|3\6\ʾ\02w~U\z_\\[N|\\\K\Ҡ,]*b\>&\\5Rΰ>E77$Tn[\9\\1.-\k\n.D\O|r\\ݗ\\`\\\\\l=\\\{3\\ϓhr\0\0\0\0܌bʈX귬Sq\g\\M\",\WZ(DfN\]D\kxG:\L\\\x5UՑ\\o\\\ CtkS]QKLg\\FT6mK\r\u|D5^-f\v]N-srD\6 \Y\5\{/>+\]qkL\=yv\c\<\\\0?j[^XI\Ls-zP[竗ц5z䛊E:Y#\'\\k\0\f\e<.wj\O\"兣z%\Y656W\\\0J\0\0\0\0\0\0\0\0\0\0pSX1W|\\\nk6\\x\\\m\\\5~\n\0\0\0\0\0\0\0\0\0\0\\ݗ\\`\\\\\l=\\\{3\\ϓhr\\\k**lT;\\\-e\Xqp\+cy\eᨼ;4\B:_W\\xYj\j]9Yff^[{>\_96+F\t\x5t~\0 r\0\0\'\e\4&\\\3ڽk0\\˒RۣՍz.IҼW\r\Xn \Anf\JI\H\.U\0\\ru\k\j1(v\Z\\\]\MgCACG F5\μ\\O\q\ZF\U5L\;\\\0\0\\汪\5L\Uv\"\\)\1\1\r\\D\\\\\V\S]\y\UEԅ9\0\06[fzdǛ\_\\D\8\\͓vW$.\0\0H\0\0\0\0\0\0\0\0\0\0゚z{\&\SX1W|Į\\G{j\\Y\ \0T7\`K-&!\ۊ=`9\W6U6\eo\E\\Tو\X;BĹU3\3\\0#WUܨa_\U\0r\ig\U9Wʏ\\_*O\\\0~%|\Bi;Z6\ZY+V\I9IU\Z\..\r:fr4\lbà\[\¦μ\ \0\\\sze39={\vq\\\\\<3\\܀&\\\.\\ئ\6k\S\O\E]\\\Ӹ\UݵH&\^\jߜ\L\\\\L\0\be\\(\7\\bf.TESj柤\\08ޛJ\'M \Z\n=\G\E,\\DV\M<^cq4Γ\\8M:k\\\U\n\N\x\Z\˵yץOq ў(\\GYT\\9C>kɗ\O)4\j%w9U\n\J\'\\\0=\0\0 Ƿ[U3\ʋ賛| \!\b\\dQg\\ԜJZ**W+\\y\0Hڤ\!U˭#&@\Ҕ\$O;VNis^\`y\!D\k\kZr\0\0\0\0\0\0\0\0\0\0\0\5zz\b3؍U\\\\ՙmr;j\Z\r\V&\0\\Z(\s>cvl\,n͹4\`\U~O@J U\KcY#\E򞿇I\]Kdc*̶D.^[\ʾ\Ut}Ul$\\\\D\w\\\nϫ~nvƷ\AB@\0\v/_\jիLݞ3~\0\xynu]V\\\ݱtNIKD \0\0\0\0\0\0\0\0\0\0\0\0\08রco^^\'\ m\\\\$+\ڸ1\ka\0\r&Z&P\\eHi2\7\\"\\*}m=\Ԯgɱ@brp\0G_\\\Y/J|4\\%iO9ݎ:?9\0*3#׻/\\ݗ\\{ӎ.gV\&\&\7 6W!\0\0y\+UQS,\ ⺪$fT/-N7.\\\\Ӱ٥Li_io\r\ \0SƫUn\k_M;7)ko\\\l\\\P\\C\*rn\05P\\Lױr^\<T\4\Gc\~\\\n\\Z6Ʀjjf8Q3W/W9\\ju\\\c]P\\\)ïQ]\o5;|tՕJ6lGU2\\dM\qr+\Z[\Z|r\9\W=\\*檫\0{c\0N\erm496R˖\7\\~\\W|3\ؠ98\0ӯ\o>\\\Zu^\\iO9ݎ:9\0*3#׻/\\ݗ\\{ӎ6gV\&\&\7 6W \0\01F\=rd*\Z\)\(UyZu\ʹwmN\^_\it\iu5Z\/J(\-rw&;Kdfz^-5OJ9>\\0\[>mj\W\2/\9ڻ\\*9Z*q+\U+z5zp\\o\0 +O\'=Gx\\z#&\i\쟄 ٣B\e֥=#6&\\\X?\\J\.=.\6\\eoR\\MEEx&^u^*\KdJzF\GzO^u \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0׆fcFq\\&\p\6#\\\\ՍU\1\\\#]/hzɯ\\4ߧݩ\Z]\5]컸\~F?\G#\&\\0?\05#U\˻SH9)Kw\\\\E\D=хĪ*\n1xG7\\kӍ\0j\0\nNMe\|仓?\e\\۹\v\\\pǗ\\\`^\\k\q.ޜ\|\խ\>}\9z\33\q\\yR\<)s`90O\\'e̓2\ÍyR\<)s`90O\\'e̓2\\f啤\n\PD-\] d\\/\\/\\\Gv\/ml{1\0\ WK9e\z\\tge03sh\J{˿\\Ib*\\q*cbŢ~\;i=;0^TVA13]u\l\靻\\Z9\Ӽ\\\^\o^w,}!L\\!\ <\~4\\q??$^\ yQ̹ ҏ\8$Bjs\x\'W\C1\E@g\\-n\.( f@`\IĽ_r% \p\H.QughH3{ǹn\\\\\l}n\cc\2 ٳ^3\rY\\E|\\n\ӹ⢳h,E g\1&~9V~x\\\ w\>\VZ_\ yJD!8X8|0f5s8\_>ƽ=_s&UMjRդ\L3>1\\~ F,+~ \\5:\n)f,\\{&Xuxy*c/G\\\\KjR6APSZ\q|n\kobo7%.*],v\1 5!Np!Ò\\rx\\G.mpѦ \\afh\d\r31ź%hw\jid\\bx3\5>or\C>@^,\"Ԥ%E;\y\UCj`\0f8{\\ /^HJeM\0x/\\_\\r,ZBh*3f8$9\s\\\\Sje\0(uP\X3\kV\wƞ\\ )_\\>\IVBAMڣ]/\϶0;uH\\I\Xg\\Zy\z\\\j߼6S\w\[o\C瞌YQRv&< ې+R\'y V\Erd\;\l|\GXbSU\\Z8 z\tDqU M,:),/k\vn}\ \Td$BY\Rh\KUuzv\ν\A{||a\"u\<63\E\+\"\\\ #q\ڥ\s\\!I|\G\jR\Z\&\\uYf,pyF\88\\\3\Qg\`8\ \KR?`7\I\P\{\V\+\X X`O\y\Rc\8fFF\\\\g%\\r(\h3\B\NI.\(\ \[\w\\Ƕ! \3o\Й6\'/~\n\ZM\x_Ч9.\\@2Lr\ZA\r>\\q\\;\j\4`\I\,\ҳ΄n\\j+|qt \\7¾}-nAT\W\0\0Si$:4ä\0\A\Z5H\t:\\/Ì?M\pH GȸvJ\ed\ N\\r\\0\'u\\zSrd*t\[\b[\D\\8\np\r.{ jpB\8ᵙD7)f\P\`Tk\"\pN\S 7>FhD\\]+\TI\=/R\\\H#G$\ \\>޾a矺\Յa\^:\\{slc(>\-z\,(Kpq\\\"B\ \@8P\6;_ރYb\* \Z{\z=\{\\n&W~\\ng<9AP*:\!\Wc\jR\\MԴ\\"kd\\v\f*D\\\)G*\\\.+K\Eړ\%o\̀նe\\=8\)2c\+! w\CBdJ&>x_p\v&M\ TXQ ct\(X\p850X\\\ݛ6b1b#>7D\Z\ۓwxܷ\\,\\\nU;r\\5|\ӈ\\f\\\O*g]\h>Y>Ps\偘⭃\nZ\g\?\/\\\֗\\Z-PF\\\[\>~y\ ,]3\\!*+.f\J\{\\\r\ml\ HL:v-?e: \1KX#GaU\\ \ɪei[\\իȲW8Jx}\0t;]6Z\g\\c!>}\\ ~ \mw\" \'@RL8$ 8g&=\P\=TKW\`y Sw TN\\\\%^:jb\\{)\r!Z\jzNgȩpD\Z\K\HQ\w\\.4>FR\\n\n\"\pJ\\cx\S_O\M$TJeYIiOO\MR8\Ċ\e=\\ϼO\q%#\\/|\n\.p\BQL\@9\e\nbqA%x\Q\>(B?)\n^=d]1\\"w1\"t\%\\_pD\\'ň44 \?E|P\ϗor\^u\j\L\)!tph\xk\!e\"\Ώz\Z-\\'i-\\gѠ\;2\lC\'IrT 2\K/LNu)઒O\\\n\\㒳NF^\:@\TV \pWp\??|aZ\9\0\-b\\\C\t\lQ8\'2=^A\!W\\Н\ñ1\>v/\\s0\ʜ0\(\\$X\j\b9*Srֆ\_\|o\w8e\\"ljf%ӑ]B\(|\\?]V8* -I9](\2\\ \#\d)\\\,e=^#y^\m\O!\2$/\"ue+99\\z-;G1+T\r\X\7\nT{\/L\HAw\\N!R\0e*iX\\gSN\[\\s \i$XHRBpН!5\\\\\%\Hx\ɑ!ѲwH]\e8/(\vB\r1!DHq:PiYB/K}\\;@2*\RNV\s#x)!eh5)k-\7L\".IE\ \Zf\>w\C|t&:\6\px&%$hϱ@0R\y[~\w jM=\Q\T&PH]RJ\HڏNE\q \s\#\7}CP ) lu1{FGض\vN-l\\5\\\0VO6\\IdM^\=\0\0TuL9k\\01 \n\\m\\1[0\\\pMӄWCTjqu`5\\e7n(\a\>N?k?b\t \П\\>\ Na8_ ݌\"/ȃC#o\t\\"6#W\\Osb\'UĤ8 \-*y|]H\\:\ ^D=\\\ru\$\S8Dxb\+\\\\\\ ߙFIΐ\dTjD5\9b۳\pQ\\\rdK#;\()\-\7| V\TU\U5Ĥ$\(4fx\@\\5wr]{v. Q\E\>\)s\\r\Vab^\\Zw o>~-qzB\`Ww40\\|7\\\15@h, \>Ox\&\98V|PP\QP\1sˑ\\I$Y\ݓd}\r< [*KfXX\pL㣉o\\v_KU y\\u\=\8\>Q.Wd-P)T\\9E̓k\| Є 6o9\N[?\7a #H&\r*5R\ɵ\\.~f\\HfXCguV@\h5\Z5!N@\V029w-Hel}b=\!U\h5qChU_\r\ZK}tN;l\\'MJ\V뽾9P\L~\\"~\'\\5+\F\D -pdD*\XQY\\úS\\q\t\#tۆ+ Y\Էp\\`\'u9\\f AU\_Pd\@\\9,AL;O3\WO\n70\-&+\R-\\"Ft\\M:{q\ۏ\~Xz*@\Sm\\r/\w]g\\La@rz|VKv>ddEɕ\u<+V sC\r6pI .Ç \J>\w>ypDb!\n\U9q0%\ϢM|U\DE,c\fբH\rc1C;U>bJtt`#\~\n\r4I:\0TzY#\r2 \4\\\\=\\+7\Onc3tZZ$\\\pPE.=}3\ݱWFaQ\"\cxۙ\'s\)kbI\``\lw]/nV@AH\6i\MrR9C\%CXY\0 8\i֩[ -[\b3x\\N19\V\\0)\{Q\j=d\ul޸mF\x\Wؾg\)\yDXU`}4\>xɦ^ਲ@LE\\\\r1E\2<9\zD? \ר\"[\;p\r*yO0=ΑG,g\\}͌N\I I$F\\e 9qx!}\Z>\ \ՑZo\e\ZM \6\*\+OL\{RC,KrO\\9P1!\[\~ UG\rM\\\^\\IvMgb[\\\U\r\4V,ǰ@J\\0!wIW\\\=գ 4Pu8\2P#VaH=_PA82\'=\Rrн{ˢ.T1|=Z@E I\cB\~,=;7N\)j]\!eĤ\J/xKd,G \\\\ގAL\9\Ջ\Z@Jk\\\"\{.\Z8rBf\0a\\\uo2)\\\Z\Z<\nx\uJ\"\\48ճ\:(@R\pAM^%x\Ũ\~ת|œ\\\B̃:*djxڦ\\\EN;0gNZ[\PsXJ\\\y&=w0\~_m\zN̓2\ÍyR\<)s`9HIzo\0\0\0\0IENDB`',1,'admin','2014-09-16 13:56:03',NULL,NULL,'','MaxKey','https://github.com/shimingxy/MaxKey',0,NULL,NULL,NULL,'0',NULL,17,0,1,1,'org.maxkey.authz.cas.endpoint.adapter.CasDefaultAdapter',NULL,NULL,NULL,'IDP','http://cas.demo.maxkey.top:8080/demo-cas//index.jsp',1),('525d261fa3b04d19af0debabbd5a1e2d','SalesForce ','https://login.salesforce.com/','SAAS','e8297041ca3347987bc739a2c9f33e7d4909881759ea590b0c091d4f645202e71e698f87c64032dc548d6ec7dc3c4863','SAML_v2.0',_binary 'PNG\r\n\Z\n\0\0\0\rIHDR\0\0\0O\0\0\0@\0\0\0[b*S\0\0\0 pHYs\0\0\\0\0\+\0\0\0tIME\ &\\R\0\0\0tEXtAuthor\0\H\0\0\0 tEXtDescription\0 !#\0\0\0\ntEXtCopyright\0\:\0\0\0tEXtCreation time\05 \0\0\0 tEXtSoftware\0]p:\0\0\0 tEXtDisclaimer\0\0\0\0tEXtWarning\0\\0\0\0tEXtSource\0\\0\0\0tEXtComment\0̖\0\0\0tEXtTitle\0\\\'\0\0 \0IDATxg\}\z\\\v\\\ᰊ\"\)S%[\U\F^`\\! `{ A\0\ 7XdBI%}ȩwn\S\\ %%6 νs\~> \\`\\8n.C\\\Y\׭C\!\5-Nx(w˙B8H@\-w?{\}Mi\\Z\+[\^\\np\fC9)n+H-E1%\TuES[d\"\ JbCXK$\%4%\"H\\믱~f\!jw\qcFA54E\܀4\\/ \A 8\3wCoAͷ\˛\7p,Jv\|lzI\6(B\Z5\nE$(g!ϡjڛI0k~c~쳜.>\KXY\u@<\0n^|\?\'8\\\c@K\!h\!\n\/n\L:\;S\L\R8^BB\Z\n*[\\\\ \\ـ-\7wv\1e\rXB \`EF\7H o@\  HPh \,xZ\\\\O8@\\75q.shYC4y mύi\1mfLtM\4D\]\3\\c\\\\\\,U\I\\֛?\\\"+\Z<\ZG\;\0$\\\rY8h\\\΃Ӭpn=\g\n!{iN\\ \\\Y0(im)%\>3I݀\\+\Z\̵|\\Z\\"!\+B\ \8\"XqSg\1 ꒨j\\\B^å\r\|q\\~\Rs`8/{\\HUV6x\\/s\8r\rEx7\A\k;c\rBh\\ \\Z\η\Z\R\5䝢w<\ʆX(Ph)-v.]hF£% L;#\ll\\x\[\\\\2ISc\ZcQ\8U4!vG!G~kw\֞2$$\\A#^)\\Zi$\ME^7x$*H\7!䦶}G\ $!A$@:80Xe\!Y1\y׿8O|\+\y$!6o\Z&bfjmPA{K\\n%\t\\H\\'Y_\?}\շHV\v\\\69\n\r7\C\-\n\ (AXMM&Xua\QB߁ʽB4M-{d\vi1DTk4\rDM tޔ\}ןyU\ZQ´2t{}3z.NX\*\' 5rC}+z\0IPN\'՞\\/~\.\\>\\\Z\ZO\K=0iqBGaЮD\\ƻ\\x\%j6\5\\FK\\\0hu\\þ%p\v\\Bd (f3jאv#F,XƻWH9[W|\ˏ􏞤8w\,Ǐ\=}\\nZDC\'<\D\+?{I6nإ\\p-\,a\%\&\XT\eAHEPV#\\Z_\xo(\\r\\Eε:\,}\  $ ag =~M\܏a^f\K\\\'?\\./r8\r\\\\{|\n^pX,jq\j@uPF\`*6G9eBGPRaYb=ŵmWy\]!MIR*Jo$\t\z+ \pr\\nv\*\E\\Z(Y\:CXs,.\P\0E\Q;\\\҅F\ZK}<\r[HL\\\O\ŧf{k \\\__\9|\!B8z\h:Fv(PS G8ApW^ߠB\Ay˸ܧWL8}+\,/ JWc(EY\d\r> M=$NZj\[ThёEقbz\\WY\2H{8cp\6Vci \1\6ho<\|\\\`\\\'\\.ƨ&&\nJaX9V\N\2\FjM\$b\W\0FP/\WNI\4oeO\=uha\ u\u$E6p_k}#()Y\q\=l]PW*3!ӞroH 4LTIABI]koѣ0\c\\\|\\Xp7tHz\\gy\~FiK\r#\\\:A\Pgj+\\'\ǟ<酷8\\LM\\r4\"Bb`I V5\\n\"}\Zmͳ_{ӿ;$߅˝jo\\K\^с# AY\Zg,)#%=S\_\+\A&= Fy@U*#\'yG4\1+\) \buԦdMu@%&\"AIl\\xӇ\)\VD“\Q\"vim#bC\L\:\"CaD\B\U;<\\=^\\ \¬o\\\\+/R\l\YS]\DxQ*\0\\fBu\\(i8,۹Q\Hn\re *d\\\}\9H!\bQcqa\\z f P[\"$\qN\\fS\Kz\WSQ#=:\rI+v\>Zj>E>P䑇\\Ns,֖\\7fcߺ\+/ Ѕ ؙYȌ4B\0\\R\nz\2پ\?B~G)-i ؛\y!y\r\'o\\'\3)\\b\>q\$\/\Ե+%\{\" s!\z4\[~\3{\r\"B0\S;i<آ\tR(aAuMs\\& VC\"߲n\"\;C\ǟ \_\\\-C\n\láCI\\&1:\'\" \ي\zB T=tD\ko\|]ׄ\A\yDu΁\$=^\ O| 7\#\ *\Z-\h\=㇑Q>\\&h qH\_Xd;ϹRl\0\%\\{׽ϱx\}\GS>Y}8~\5iȦ4\O\')vk\[p \;\!\n\\Zv{t( \R,!ZYg&eA(\!\zi{}\r:\\\΀\AM+6׮^\ҕ+( 1/\vᶓ\\G\\ v(%T0\\ Qz<G:\0\I\&fa\\$\"8s{`{~?\\r*KK+w\\b\rLw8nf\??\\}\ \o5ҩ\\\ѕ7\\\\a +\09v6\V9a.B\tm\Ë\+F\o\]\ѵ\\g\\lB\'Kw%i\0N`G3d\P\0\XXAB,\D=3\1dt\\i\s\8~\eq\\Z %FV\Vy\X>q\\wQ(A8~Ҩ\tw:\ࢌ\"\\iD\\C\\poAc \n\b2FQ\ Ⱥ:q\'\'-xRH%C7\\\ޅK jjGb\MQsۃ!W! 2H\4 <\"\X%NU QI\D\\V \0l.\\0G\M\!:s\'\\\ŧ^\\korl\CS\OtӺ@(\\.VT\\RQ)I!!\\\uƻ\8+H S\̆Z\e]TQȖ\Zs\o*P\?b\+J4\ IH/Kq\60AQ\K K\rm*Z\Q\G\ (\C4w020U\S S䌷w\N\\=|\l}Nmn?u\>Nj} &-\{4}h\Z\"*)6uD*A8h: \\ZRc#VcIg5ÑSb\M Xy x@ij\Z:p\\;ɬhRΦPIk<14\r4sSGӐے\YU36o)LA\\n\\0$\\I258\Z\Ր{)#\'\I >\oѿ\}T0\r׾o\\$\\Z!Ѯ?3C\\N\jIUJX:\` k``V)1\\\r&/n\E*h(\\D1|wiD\n\|\ \]}ݟu)\\\W%B2Љ\"YN\\n\\Pɚ#vاS-e>\1\HɄHǘi\ר\>{{3:\)TJ\\0A>\ R\\ن\\0]\(P\c \ \_z(bo4ckk\ֵݛ\i\C\ZT\ B Tw~@֊i\nO~\\ڵ6\+T `^Fв)\pG$MH+\y͡>fs\)\"\\wa\\Z\\\ōhC\\\ \\L R1\%BKE i]g)\٘\\.!Dt{\\9~\4\OOm[p(V\\06Y\PU][\\GJH\")\MC\[Wq\\:\\Z؜&@\nMd5B̼XIZ\Ż\0G*5)!\0*HT{(\\Zʑ%q ꚅ(\\G\\ҳT)Ԟg6\9|\QXԌ\./Dq*\\u\ZM :]bMNF\\&;AS`g{4 úF}\\':\Y\"[ ;Xim\H97\nlCu\\&d5\O ^~\es9T\' -Xh\nJ\C%\r\TcE\rfE lc(gS 4-a7!(\'U\ng⋈\rg\BWw_\'\\\\\\yrEyfgݫ\\'DK=AF9*Si\\WNqij(!\rt\x!J˛\!˶q@ymȦc\XK3R\F\$\6Ӫ`{\B@:\"\\n0 +\0f`rȇ0\p\ReD\\\\nU3\&L,\nCmc!\0G\; .Q:c1*t\mp\\\ZE\4\\\ԛo\g\J*B\%%\"@1mjܬ8Bt{}\lN\Z\\…\\w\C=6 \v\@VidXHChƻԓQB@m@6hcɧc\Ś4Ud^<-Z\UJP{8ŝ?\\Ϥֱ\Z(\DKۜ\e\^\Z\Mvl\ \n\vb\ )ZL2G\n\4@\\6\\\\"ݤ3A\ʂZ\" D \\>i呵\E\\\vU>\ݷs$\=\S[%~G{\Q}t@\\HE\a\LP\ (El\rkv\%Nh:ML!\ʄHU@hms\\\M\s @\4n\}#\b\H8i]\RԶ-hI)fḬ\\.t.Ëop\\\!\¸щf{gt\zsٵ]\~\R_c(Gc\"X\W_6GCЖ7\rz:$3CnFo\OЌtS\\3m6Yaϥ요Y\cR̦V\s_\V\Ep~\\|_Y\Zf#Ρ4L\n\a\0aS$\tL\cO(E3\m**U|\9wWBS\r\eP8K=\_\#\\\\ T\\'\ I_;D>0|i$I25n\+ 32\.\AEF2\ -g\\\A \<-\hmpt\\ ĝ Pj\BBm,r)\7BP5Q\\\\+\,\Y\'W\"u\R6\W\\>唾ѮѴ\7_|L(}@\Q<`q8c4*eٳ7/3k*e\\np|A\\\\ =\\\bqi:BQK\X)v\\]\8ч \\\W^{\l:$\b\9\i\\.{\\\0\aU1N@\aCE1\Z}op{m\\  %\V|nr\\,66\a\+\\\n \n#OtIk\0\0 hIDAT\\KDo\r\^K\N\\RWt\0I\S\\n^!ae@sS\?gg{C\\S\VlŚC\o\|F$ wL\\*\E\s3\"$\" h6B\D݀Q\b\';Pw\ٗy\d\;\"m\&\\\%\C\\\\\\\\\g|\c wv\\ڦ+\q*F\X9|K\'=,\ZtI\G1XXDmoE9\z4u\$Z\\\\{\ǥ\4* PLⴽl q+˨Pa\Y>EY\A\\\\ZR\\\,w \"$:Ķ87\? ^g9pHS\\\@\'ggy@\\\y\\|\4!X[%\\[c\\m\\\Hyەzv\WV\(Yx2x\^G\]\lmq@ \\!5\\3OHAOƈB\"\'S\ZzYB\\x\qJ\8\'\\\{\44%\\\\'x\ _d\ Sg&%>N\\:#l\0\WX?~u\$ئ!Bi\AS\\9Y\r\ 鷿Ra\\G\\\\ChA_{`<}\\\\S\\FY1w)~E\\A-\R;B\nE$t\P\":/}\?o}\\U\9{\\h\ñ\\\\NQz\\&A\\!\\Z,9`GE[(\T7\zLiw\.+kfռwVP\0\c8wDiU\\<@\YfC29B\H(-z:leA,\m@bZԐ\R_\γ/s\\p\\llr\\\{\?!\u0\w\Ω܏\<%\W_&]_؆В T\&ӕ&5Vi\7\ ]\\!xmS\Zm\'(/n6!\Aa\\\\ᕦ5\;\q\c\gbYAȩqz\\RB^֐\\\6Ͼ#. WYp!\\zq\O}\\u;vK\\e=\-pU;@k0`ˣր\l\\\\W\\\\yڍ)\ÍQmI\7S\<\\ňŸ\?\\ÿaeccM\\>ӥ4a{1\O겡\\r\~\ə\F1\]R\\TF\q wAR\FpS\|\M\0\9j\R%^!\1 \\Fy\\\n.\\M?w$h\@oiږ#\9s\gů\%N\\\W_aY\-;/k(JY\]>\*ūW\tɕ\*\? \g\\0$i\r\邊X c i\ U۠@I-\\J\\Z:7\ι\\\mǻG!Pbn߲ƠQ8,oU\Z3\?\\|\=\bbB\L BOnk\$ M\|\Pf\Gġ\\\G?\\}\mg\/)O,0\\\\-G˰QIOcBBT(Z1\r\\u\\\{[w _\W&?*b ֣|\\b\*vܶ\&TE4}S2*IYY[\G_#p,C`F\N9b=*hȅDŽITn\\x;w›V\;\\0ho\\Jd>!\Y\O2ƋL8|3\\ؚIYR\'!G1\S.8q\y\ч\C\\ zhJ4y_Fx\\\8tTX<9Q]ڜ\%\-փh!\-8\͋xy#\\\\\\0@]\0۾Å u\"\D\\\r@=\=}y\\M\0 \\\dˁ\\\#\3yD\5\\ፄy\ E$%Z\g؛\k{@8PS7)\o㜃?g܍\\\"DR\RlM$4ֵq-I\Q0LY9\\\\\\\gx\\]\ }t\|).\\\VTz# \6l.ԽH\\n.769}{<ʃvrq7\nntq\zS=\ys\4xC{\Ԟdd |\a\\+k ߠʛ9f7_oq/wh=\\\"\`\!%0g\Z\\\ 쫜<, \\n\kK\\r\)*\nB(d[h^ϣ8Ae\[<%<(\\Kn~\[\Y\@\ .)\0nݦv\9\\\hC0)\0\0\0\0IENDB`',1,'superadmin','2013-05-23 13:50:19','admin','2016-11-06 16:37:22','CRM','SalesForce',' http://www.salesforce.com',0,NULL,NULL,NULL,'0',NULL,13,0,1,0,'',NULL,NULL,NULL,'IDP',NULL,0),('5649f603-f2ac-4b0c-8fc3-e80ddce8c443','腾讯云','https://cloud.tencent.com/','SAAS','10364a9b7f02af7583a68cbc288d29b20f616f2154cbdf8c3d4852f4369b9d66','SAML_v2.0',_binary 'PNG\r\n\Z\n\0\0\0\rIHDR\0\0\0\\0\0\0O\0\0\0߅\f\0\0\0gAMA\0\0 a\0\0\0sRGB\0\\\0\0\0PLTE\0\0\0\0\\\0l\0\0\\\0 \0m\\\0\\\n/\\\\0\\\p\0\(((\\\0\0[[[\\ʏ\0\\\0\\0\\\0\\0\0\0\0\\0\܅\0_\\\LLLr\\㮮333\0j\\\ \0Q\\\\\ȫ\0W\0Z\0\\򧧧\0VVV\\\JJJ\0c\0U\\\777\0a\0\\\0h \\ň...@@@GGG\\0%%%uuuYEu\\0\חDDDOOOqqq|||\\\\0\\\0Y\\~~~;;;\\\\\ }f\\K\\\0e\\28\\\\\yyy\\\^\X\\x\'\hhh*\7\\\\\\\\lll\\\0\\\\\\\\\\\\\bbbRRRe\\\\\\ߞ\\s\\Q\\^^^\0\\lYYY\\\\-\\WB\\\\0\z(\ᢢ\\\\\[1\\e\\r\\\\\\\\n\\\\ ?\0\\0\\\\Z\\0jB(\\\[\0\0IIDATx\\{PT\\\\.ga\X\3[.\\*ĕ\n\EJ\\<\n>\#JAbM\\XcFmV\̨\\$G\'I;f:}̴t߹{\\ewA\H\\s\\\~\w~\$ \\\ \E\\\FGs\1b\\h)1&GCh=f\\ǁK\>T\\\\q\ȵS\/7\`c\6lh\3Xl \t\(<#ׇlmjZP*56l= nrrҁ\\!2\\YJ\`=\\妇@r\bQ+?Xm]{\h=æ3\Օj\'?Qt\Vy\1%^}\a1\\rZ9\\\;_K\uu\ZS* \,T v\J\M\\EC\d1lc\\Z3\\\hygų:_ƞ\^JCi\"oP\%=جa\0Axg\yTb\Cq6޲U\\1\Ӫ\r(7tq\qZB\\ϒp\I%b\\n\\@zxtxz$zW϶F\Z\\DV $wi\D\bw\\\c)\w~J\\ ɠEIA\n\"\'/\SXE\"I\rq\~t.QRGY\mV\oF)\dAQd\L\"\hp&\\"X\b\\uo\.\݃Κ\Eb06bc\Prq6\1rÔģ-2\,g4_\\jmi|cu8Jw0\P\9du|I\nE\\(q\@`\\n )m6\l#eߍ\rZ\\V\\xp8\x~;Φ\矿\\\|uqŋ\\v\\7>FAX\'jŮ-MeeM\r0\W\Юr?hX\r\Zh=\y{g\\\\n\qjx\\T\{wC\Hh\\\3o\{\WᖎKXJ\\#M\a˞v}f\\Z}\\SH2\\<]\\|*dV\\G=@XŽ\Fu,J^%\"&\N\z`MM\H۵\ZLX\'*п†\5 ~.u*$# WF\\\\ri\`V6u\^Y7l6W\n03\\'BB\^\'\d\H,\4219wV뫺Y3ft \@ a嶗`|*?h\5\qŦO;\\\L\\\\\\]?E>ǵ \A[׮ߎ榻~\P\f<\6\C\&\\_\n||MIII\(M79\$\0,\Zπ.=a\\\\.\\8\v6e쁵=\;\4\Z g;\t\\tP4\55 \\'\nڸSh\r%(\\\X\rK$5tJ&9\\Q\@v\r`FӞh!\%Y#sX\\\"\n!!y٘Tp!) 0#\0\r>*(\Vw=i͚\p\\GzêdRb 9A\a!\\k1i2naߗ{\)(񴢸ݯ\i9\ZM7d0֌\\\\>|~\۩\I\0Cf\~\\[Q\EN\s_j\&`\\\ݫc~.\p|ov(NGZd\诊rV\B\\~j^n`^>A\9\'\,\6 \ù/#Vs\r~\W^\YǚRǡ74\\9\| k\\F:\ʚv>\0<l(€V\ƃ4z\"h!U߸Z\\+\"U~U\"A\`\[d+\\\;:K=o=q1,H\O0uoT8\"b\\2$\4\n\\E$5\92VƬ`y?\\,V\\X5Y.\\\m{\> Ef2UgGfH\\.e\t\0\\"~P\4\0x^iYu\Nvn \\2\xr}\\$#\hF\\arxL\SQ\0xpwee>\\8%xkJ+݅y32\\\n 6nmزa&̦q\( #\Uؑ\\x\+\XL\p\tzq5}LT,\\J\\q\r4\r\\\&0 s\`\\,0Bt\9? rq\\7ט\(i9Z*\EkW B7kh\e\1$\T`ATز1u\˜\E\Ш\Ԙ\GYd\ls1\f\˖lsν-\m #YX\\\\rs{\\\\W\\g)[#3\+`~ۯjC\_*8\n+\\>98 RU\P\\ˆŊ\~9v\\^lgij\/\75KL\'~\8\ \EV\\\?\n4j{\f=fWY5ߦ\\\\Ӭcڞ\\l\\\\\х\-V\\\XAc5KŋxL7\:I2bqB\\V^`YG@a\nt\\-䡊,#j\"\ZU\'у \Ѭ\l!b5A+\x\r3[ip@U+ۑma\`y){UV\j\\e$a\}6v>y&Г\X D:$Fpz\hD%\\;I4Kem!\\3#q52\r&e\\\YeY*\ MYl$\\ҋ\KY⺺foƃ-e>7\h\'#\\\4D >i12D`\z]\5fM\H\ ( PL~\/eƘ\\'q!Y\\\:_Yyc\\Pi!H\nlVѐt:=\\"#_9f3r\cCE J\;د\u`\fx\*oDs>\Jș\'Vv\\f5HI1 IL\\0\\\\a k-^q<*q/l\ʽSd\0\\\=Ցһ\\HX\#&S8\N&++n:+R;U[S2%\\\\&d-7cbT\'Tk\e!$ǽ8\X+\Z&7\89׃\Ү\KtmO\\ie;6/wUF\ZRFWYUV\\g\Mk\ZG.Y\'\\\\\]l\L-\y\\#SK\@Ӆ\J\H\3~\A\AKˬwaV˩\8\\\k\Z1Wp__?Tҽ\\[KPiBFk.S\\0\\DöK\LmZbA\;\MfTO\"Cָ\̊?N/\\Dm`\2\ڟi/6\\ VS\\U4\br4(\\0\\\z \ =3\G\-2,y\\\K\<E%+M\cTtT\O2UmgЙk\2(L4S\Mj1\\\?𳱾j\+z-*\2]\u\\\-*O(۽k3jB5)e0\\;\*b\6b吸\m\7\n)sI\ \\kɺ\XK eHʜll!\j\\L}\RV-K#EEVWdM\-=\\HDRאw\\a\\ ,w\w\\qW\WMe\\\v\n\\\\0\Ƭ\lx\\\8tiˡ\\\0sФpS\6jvy+)\}\6mQ\Zy\\?🇝 \X[-3<\"R\0\0\0\0IENDB`',1,NULL,'2020-02-27 14:35:46',NULL,NULL,'腾讯云','腾讯','https://console.cloud.tencent.com/',0,NULL,NULL,NULL,'1','[{\"attr\":\"https://cloud.tencent.com/SAML/Attributes/Role\",\"type\":\"UNSPECIFIED\",\"value\":\"qcs::cam::uin/100013138092:roleName/cloud.tencent_maxkey,qcs::cam::uin/100013138092:saml-provider/maxkey\"},{\"attr\":\"https://cloud.tencent.com/SAML/Attributes/RoleSessionName\",\"type\":\"UNSPECIFIED\",\"value\":\"maxkey\"}]',1,0,1,0,'',NULL,NULL,NULL,'IDP',NULL,0),('75f724d1-d094-4c39-ba7d-221c46e65dec','SAML TEST','http://note.youdao.com/signIn/','SAAS','65abb20c2319576a9b9169a6d6dd5eb1eb7fd11cc36ad4e0e60f8db0d9c8e216','SAML_v2.0',_binary 'PNG\r\n\Z\n\0\0\0\rIHDR\0\0\0(\0\0\0\0\0\0rZ9\0\0IDATH\r\U_hG\\\\\\\9%iP\M՚6\n!(URD\(x\[\X\H4(\\ZB1\ք&\\d\\;wogg:kT0\ J}\|}ONûX]gBM Ŗ\Ӂ=\<\\@hAY \\nZ\\U^\(\]^`Y\0́Jpf ¥LAZ\0`o=\~زG\Qp\MUJ\훾\ΟI\6\cumWo\\"\"aU] ^z38\\\Z 2\@\"8\\rm\\j\\n!e\\ns.\'\\\\Z\U=Ǝ\+\"\\ӹnrO\\u~\\\oRt̴;FDZ\/F-BXV pX\']\\+1\\\\l\3lU\8H\0΋ zU\\)@\,D4e\QP8u\3JqU2\\g\5\cH/w\ \\y,}\'|;k*.@f[8fV&\\>;IS=ߟOɋ7\NlO\Xzy\0\:n\4],$3g֜\\~=\\1!;n\ev%58h5\dW\nh=\\jFC?ضEˆ.P\\\\ĐձdC&\Z߇\"}A! /\hY(jcI\\/wN\\\.\\\_^\ܥP\\a{\\Z\\2ĂFe/aU#W\jG١T4\)\nkԾ\\g\Y\Z\\nα?kx9K$U+C\?9\\\\& בGB-\F\\\\M\\T4\;N\n\ZAR ߉?@x0\'a\#\\q͙\0(!|RC:pw<i*\bEܮ;\V\z^\O0Lf\\N&c`sYF @\\\8׫ؚ,iכ y#jX8\_\0\0\0\0IENDB`',1,NULL,NULL,NULL,NULL,'','MaxKey','http://note.youdao.com/',0,NULL,NULL,NULL,'0',NULL,1,0,1,0,'',NULL,NULL,NULL,'IDP',NULL,0),('78917a82-1c86-4020-b86a-3b1b350357e3','JWT Demo','http://tokenbased.demo.maxkey.top:8080/demo-jwt/','COMMUNICATION','985e805bd49770e7e797209db3cc2767','Token_Based',_binary 'PNG\r\n\Z\n\0\0\0\rIHDR\0\0\0\0\0\0T\0\0\0d\0\0\0 pHYs\0\0\\0\0\+\0\0\0tIME\\n\rƏS\\0\0\0tEXtAuthor\0\H\0\0\0 tEXtDescription\0 !#\0\0\0\ntEXtCopyright\0\:\0\0\0tEXtCreation time\05 \0\0\0 tEXtSoftware\0]p:\0\0\0 tEXtDisclaimer\0\0\0\0tEXtWarning\0\\0\0\0tEXtSource\0\\0\0\0tEXtComment\0̖\0\0\0tEXtTitle\0\\\'\0\0 \0IDATx\Gv\?\eV1=\\\#$Y+\\PH\CC;9+B!\Aa)dG貭\{$\`f0W\twe>Y\Ճ ܝhLUY\|{%\q4QCU\0 !ppI(\\㒞%p.\EIEKB\r3Y㒾\T\Z>BRY\>i\\jW\r$\J@C.e\\IfJ\iH6!X\@\z\\\%]LjQ0\\\\咞4\7:\%=\'yͺN\9\<\]\\\Et*4]\$wʊ73\"/\/;/<\+ \Z\\-\#\\X\C\\\\\ջ+z\\\}\\I,j$\\\ڠ>NR0`\Tt\\\ǒI\!S\1K\\";~e`6\G\'@u\| ![مg0\\Lw\ yr\r\:ϝ\Q_<\W͗\S>ky\\\\c ͬ\\\CPMQ-p\N1\nu\"-\RG4Cv=\\Z{k@lr&\i\Dh$*e\0\n3\bv:L\\\r#\nH\\\\ZҜf\ZSۯ\k(XD\\\W\[>f\\0j+&Ҭ\Ԇz\%/Lu2\S\'Hkny\\&\ߌhHZs|\'.\'\rn:<ڀ\Z\\ěɪbd#e\)\\R\1C\\J\ \Dw#aq@$jQ,(\n.&`A %h\2\0eYĂt0T&RaT4\Z1&\\\MiiBl3O=f\Z*b5F.$ Q:}&\frD\@\rxb\\-Da&L/ \0g`!H:\?N \-HN\\U &H;M\"^\T QCs\gki\bޯV\-\06~\\0QE5μKA2\rQ?Bd=\uʼnatW\! 2\g=D*8lޡf$Q\\xT\nx\n\9o\"7 H\'ʔ/N8S\Z\\\2O{-\4o\(]Z5DcJk\a8 N\\|ތ23д[`\\&{G*BS\k\hV_\\:Q\:A\'4&qC\38ޥ_D<.\&ݹ-Bǘ\ _O\\1{{\n\ \\Y\\d\l{\\ PV0;M\\$EtDԹ$\ (\'\c#Pa3\8=:iĝ l9}#w\ f/GY\7 4\H6\\T\'d9\\(_E Vf9s\\"1p>G7Y:G k&:YY$\\ck\Z{\\\e9p\Xe%\q\'rU\\\<\\\\\MEEXbr\\-Ƨ\L<\/\X[(\nq(\EcfH0\\\*\\fMhY\h$\cTY$^\%8\ c\\ \\}\J}\h6DZssz\<7dhHVi1.\OQs\\\n \1;;\\\<1q|C!s\,n^G.%1\ _+[f\w\\& \?p\飻tf#1q\\\\1W16Y]\B|Lm\kq\\_F\?`hvԖW\\1fv{\\DՐ\=Eon #M@B\0ay-z?>\\1Q <>ߤ9\\G?\\\Z\(\eVW\`V`&\W\Ku\tHy>}ꉕ\\\D&OO8;UPE\q+ \4\tɔ\\\\n\|zlj TkttQ\ZvQȁY$u\nso-[\ɜ2\0L\A|ڭ6\'.M\\s\˛oy!R0\Z\T#\\\\jཀ8bKWXXq,灊ӓ\\\&G;\G\0\nz\̯\rB Q1a6:y\=c\\\,&kTV22cDhk\\q\iJP{e䔡\Ha\`茑K\\\H茡IDid`C1RU\LYoޠ̃9a5\"f\DZ\h zꙵ.\\\]JX,\kok\9,}p\\0j_z\kŹ~(\_N5!1RPG=9ٷ\Zɘ@+RxbVcE칩\\ŋ\n*\E\\ڔ}sK\)gW]+\Ëqv\\7x\$\06,Mģg׷_YgTED\r1\\\d82\"ЛYf~u\'\\\e|‘oR\\\[ea->*Lj\'\s\\:SB3e2\Ze0:\֣\+(QdX\5e\u(dž\rF k0c\7\S\oBuZH^\\\N8c`Dd~u\rb\Qh0N\"gqm\\\ \8ߡYQ6 1w\!ogʰ\\\-0\r.\\nŇ|HCē\\vH-\di1I[p)@\K\%=V\ Es4.\XN\zNs1M\\\Zo\D-\]\\\'\\kph\\\9b6O\蔽{\\}@,\\%k(Ern\\TV|\DVBw~\\\͵1\R\$Ÿ\sb)\n_cum\j3VꟇ\\\nn=HYi\Dֽ3,酧\fD!+U\O\<ɫ\},$\!ﲸ}\M\\pxH<}qI\1ϊävݸ\\\'q 1 \\\65 E!*\ g\\'jCw\rUR\0\,oQ\\\\Nf\l/.Ĕ<\\qVﳯ@2.\\QZ(!D\/u-f\(U\s\&\l\*%LjEKG(.\rVR`!GQ\Xܼv\ѡ\\$\U\\\"D\\oӤh\\\\n\\\$c\,[,\)0_4J[&\\ϺmO\\hLVSG\谺u\Z\S\U 6K\\w\\ *!z:3K,_\ \\N\uD\J-s;\*\\&*cͱq\\\Z&p)/<\\\\\?\5\Ai&dxz$\'EZڵ#\\\`a\*>\38x\G(U:\Z3\)Q,\H\\*\\\\\b:9\\n g\\\1e=֯\ f6k\\\tiy)ΟtK\$Rw\gz17U%?7|1\ڕ/Q1\w\#\#\\5bFOI.}\\\\h()B\Go\'`Xȩ%\Z\4)\qD\\H8ũr: ,o\\\UN\\'\\\\=s5||:HM\9\jRP\s3t7[\Y#\\\Am\Ħ\Izd+pR1s\&!q\SUކ>\pu-,󈂊a\ҍ9;\\\ۈU)Ya~\Z\]´Y\\Rml|\\1\NLʼn\\X uM)DIg~\7\\s\\\c\~ $!\\Hy)Y\\\{q\Z1\/Fag\|\m$r\ZJ,\TNعSFC¸3,>\2ž\rZ\O\K \ۑ\ q~>Ɩ\S\#\<3ћ_KF\6\\>+/ \b2\"9\\'C(TF)\!\;7 \U\,bB\\\{n\cfv+ }\"%\"Q2/(\\Qhԧ<\s\\s\2xʣ%UV^##\\0Tpp\6\Q\+\\\\\M\\!!\He8qHO\=\@ˆ8(\$5p{bX\=6_G\9L E\0\z\$\ Nw\eTj\\ ]\ORէ^\\h\<\\)\D \ZO\\'\a=dAaXu\\=G;\o#W\/n|`\\=oc\0\&6ªcvnS\\\\s+ۘuanRB\\ \@(5ՎJ\Z7M\3Gk\'My.>\r u-\\\\ g?~EYշ}3 \߄x8)\g\i\\~\\]\\\|N\:\[\9=X`y\h\\\rq\"\\9ڽ\\\m\p\\\\r\o1&\\1W\܈\mv\\\oL,8ٻ\hB SGgvŕ\ \\湑+Ƙ$}\\l\g\\SEH S\"\K%O?m+#R\2 C\\k3Tс \*\}bTXav\ޣ )#(;smA1\ڕ7\fQ\dp\\\\0O\rxxA Y\Jy\\Z o-\\F2\\>\@7O7$\\cR\]Zei\*\*\@\ \x\18\\>h!˛tWb\\\u:3kKٌǏnQ\q\\\br\3+We2_\\ׁf͕\r\\x\O]k-M0dtGF \\7\\tt\׾J\[s#\16\Gp{7eR3,,_ł\\1 \eat:峟=_Z` EHH=I.\n(Eo\r^/]\12\p#l< i\\\rU̺ء\`i:#F\p \cN\pwUB@}_?R\\\D\Dk\󘶬075\uPx\\\A]\Ŵ\\\ktf\V@\蘃Ov8ݽ\\\D\"7\\kK\\>E,7\EbP\nqy|\\\}\\'TcT9f\X]Q\"ۮ\:ig\\zʤU}\Z-7t\Z\.^&ԏ\Ep(n~Q, &Nr|\~c\\$uВ\mzKW0\\r9W3K[\.^DŅ3\\ \0Eu\wp%\R-\\0N/\z|~\\ɿ//\S\'\d=^jZ@9\\hg9T\C\v\\Lo\:,l[!XSq>\\\uD\A閎ӓ{ܽm\\8f\\+6X^\nf@k\Ӿ\\bt\oؤ_ḁXD, 0XFn\\SW \\b%O\51 d~\5\SE*$\"N\!nŵ\3\%\1ʠ\,1:E \T\5t̮\@|7rR\=8\\:Dc B 䋥\-4\v\vm\\54\TW=/V>K@p\m\"\9\(\\2\c\TQ*\őV\0\Z)\\魽\(\\\0 Ejr\n˫o\uR@QF\+\SZE:\\yba렾S0G5au\M3\$w\PyZx\\,_g:ml\\\=\Ok\Y.\Ls\S\r|`8<<\\d+}Sv\7ZQ\Pc\q##\ ,o\ ho!\-_[\p4\N 1F\\Wn0f-#\\\\WqR\_Ed}Qr:\Zr:JumO|UO4R4\\\'}\\\\\aVӄgf\t:M\ry\~\P\\iSkV|>ҡp\or4\!7ߠ\-bAjP &P.w\ncm\\wx\\k,\\\x/B\C\\rgz%\j\f\B\z\H`XN488<\\\VFߧ,KBHM\'ᄗE\m\z\\\J \pZf0|xGn\m\\\0\0IDAT1:$\\rP\rT*\\\QX\x7|J]|=|mJ$p_\ PQ/#^R\\f\1?f\>IL\1j<\9?Zb\ZJS9*\Zk=\#mCZ{x\y\5\\XLy\ ?\\0\\\\sJow?|\'YT\ YQ\\C(꼕I.I[a\#B\ z\ZIԯ\b}\0k*ا#OP1n9\x\kw\+1(,ݜv\38\u\fm\\\\78?\I\\*a4\\|\Ç\UD]-\}+sB1\ \}܄cy\ COQ[Mf\2osS\Q9iՙ$\:D\'\zU\-u\'`,G\=>D8\MeѰˣ4\0N\?\'\\?!J\#W6\\[\RO?MaZw\/\\-\jʏ_\DηDIxXZɔ\x\\\I\S۩w=&2d7\\\8&s=7o\W\\y\\v8<:dmm{w|21\Ȋv{(\2y\?\av\/C \)!^5n3E\orgumٳwY$N\#\\\]\<\\;w\s\\]b\1k\\L\\Ov㴞\|\\ \nc\ z>\et\Z\ZeXON\g\_cS|<3>1NNNP\\6\oοB\\Q]\if/\Eɓ(H@gcF!PtKJ)Wcp,/.}o\rK_ǩ\c8%\}\R/\ȇPa8b*\ma]\s3:=,\nf}\\Vy\\M\wY_]bqK\ܑSI7v\<\"gg\Wx\nN\';\xHKiZ>\'\0\"\Т)oc\g\C\u\Nj\Ƽ\U]\r[ڬd ΁k%~\3\EkM\0\\\"zq\KCi]SQrP&\4\\5jny\r~Q &\n\bY.r \\\xI/5\\ruҘL#Ŭ h\{<\\M\+\F^,W561#݊TQg\n툚q%b\-E\__S\?\\7S\0\0\0\0IENDB`',1,'admin','2016-10-13 14:29:10',NULL,NULL,'Test','MaxKey','https://github.com/shimingxy/MaxKey',0,NULL,NULL,NULL,'0',NULL,4,0,1,1,'org.maxkey.authz.token.endpoint.adapter.TokenBasedJWTAdapter',NULL,NULL,'uid,username,email,windowsAccount,employeeNumber,departmentId,department','IDP',NULL,0),('84f97a28-3526-415d-8ef9-9b5b53656b67','pac4j demo','http://app1.cas.com:8081/callback?client_name=pac4jclient1','cas','53ba31a64289221f9bc948d91f2f756e','CAS',_binary 'PNG\r\n\Z\n\0\0\0\rIHDR\0\0\0\0\0\0Z\0\0\0܉\0\0\0sRGB\0\\\0\0\0gAMA\0\0 a\0\0\0 pHYs\0\0\\0\0\\od\0\0$\IDATx^\\\eI^۶m\\\6gm۶m{ֶm۶m\\}nwߞ\Qu\Teeefem\M\ߦ?\O\M\\~\\_O\o\\~\կ~5qy\\\o\\PZm\Gk륯\\1W\;ϰz{\y]o3+:`]\\\?\"\?\?f\ ]e\ ÿ\/\_\A3װb:(m\\V\f&2/}A{\\FEXL_wBi\\\"ȋt\F/\#\z4~YHHUJx1\9!\Ha ]^B\\׾\ _\O}jЇ>4\\\7L|\+\\O}\\\O\G@\\7N/{\˦\\3\\ Ox\=lpozӛ%\\\*Wp+L\\K^\\.v\\=\t\ss:\\>\gN{\\N8\)\\\\=\t\cs:\11\hG|\#OG<\#\\\w鰇=\\Z\0?(]>G:ґ\я~\8\9Ψ\D\':\t|:\iN3g\zֳN\8\9\<\E.re/{\\00\bL\m{\\^\C\\g<\Ø\y׻\5\En:\5à\ lۡ|D\^Y*{\\\.w\t\]o\\\\2C(\>\,Cy\'=\I\qCL=\A\Ar,?\'<\ \dөO}\\ g8àumm¿.0]\.qK \\v!~x\0\n\{\\s\\0\\3z\;\G} ?tSj\\'80 |\\?G;G\Ї>0&mQa\Z<~x;\\\ ȗ~0Yo/\-\\rh([ؑ f0rkO|\G$\0=JJ\Oy\S\\1\:׹K_\C\\rox\\z\z׻N\}\n\\=\O\\d ~\񖷼eӇ?\ћ>O W\\~v\/~#,\|dl\\[\:\\5^Wzԧ\x\#9\󖷼\\<\\r\n\\xȃ\\ȇx!F\\5w\4\:ؖK\<C>\qNw\M\'9\I dɷխƘži?я\B(\w\!4\\ o|c\/y\ѓa\b\ N\ \;\Z\\793d\⵳vk\\\7#0P*>C\"mXI1ل\\Z׌&cMȠu\\\>\\Ҕ\I\\ZK\;\F\s~4po\\r\\׼4\\\⣲\`޾\\m\&\\\rt\n}l\ZUrc\\0\Z\)\\`!4\\u11\l\7\/M~h\\\\'=Wƌ]JW_0y+\Crt\Ѫ\[e\)t<\ ,\'\^4mC *c~\\\\|¶4<\[,\\\׶\\Te\\ BB\7\0\\\@Ӷm\\\Z\Y=L\\\xJ@\\HO\;$,2\Tgy* \<6G\љ\).\KJy=\Vt\k#Gس ao}\0`J\\\\2f8Wf(w\-Sf\>ol\ztyҼO\\\\{~\\\҅\\r\{2x*~a\h\\\{Fg3\wÓ-O\\\etN(۳K7O=ѝ,|,\N\Zih8$X\h\FK,_i 7\Z\@E\s\\E+z\H\/NRK\x\%\)\\h\΍0\BXHޢ\!}*)?e^\\r6\#*us1\j@B r\rq\힙\(G!&NBNs\Btl\\\\\P(zN5\o\/^OǣzL\ZЊ~(S\\M\0~yRz|ʏg?-\X/\\{(1t6B\坞\FJֳ\a\ַ؟+x\ll \S2A$@奙[\Z\\"F\8^\3b\\V\\x\q D\& CW<>M\\Q\\0l\8_:\x+!!\\\8\o+ے3Et\\mPc\K8\\N\S)=\y\z&\]l\O\ G\m(_Ǯ}\=\\ \\Zt\ч]\\w`w\҉Mt\cI>KDmNC`\\'=i,B\jm4l6q$=\Q \\ԳɌ=qF\7\rl\q\OӡX\'\Gy$ \'j/ˇ5S\\T3\xQh0[\\_\B\Z\'NɁ\rB<\r=Жy[3\sK]\R㝼at\\\Ce!\t1G:14٬\"C(\\-CۖAO&4 ąN\\\Z\<Ѡ\j D\\P\Gy*˚zxP\ \\{\0\ q\o\0^׍g\\:]K*\Hxq)!\Anʝ\\\\\M{\'e0Z\S.ѕ\ 4e \2l\\n:9F>OE\o_\\\΍\0Aў1\S/Œ5rT}GQ^QBg\\97`\0\k\\) \Z\\ǽ\0\'w\\\\ޗ=H!\ g\B\*)q\\\1\,܌^]1G\\Z*\Hc[OW~[v\Lt\\8m\!%FKsgs\ښ\\\,U77|z\\)lF˰.Z%pހޟ,Ay\S~2x\\x!\\ECy(w_\\S8\[~0cB1`vwx\b6\"\xpG\Z!\>я^d\r\v\K0fz.Q:ax詗A\Zڂ\\ū\\\\M\g\\y\\NO@\'`U)\<Q\Jdu<|G}<\i1x\Y|\bTfn-\\Uf3nc$0&Ĝ8\c>F\1R)ĕi!k gܭ|h(Kx\\\\\_m\\8\^;\\1n \\\\N\_xv+\Y~mIXU.\0\Rr\V<9 \f\\\Z;i\V\\(\KGO\\\+1NJ\ZJc҇Y)k\0e\Dy\nĤ\ H\3k\\\\\#\[(̋k\u:\\H!#RG\rNS򘽗\xnLE\>:%CÊ;\Q\B \\܀ 7\3,yx\Y\{\\\ӯ^saY\\r\iJT Iu-2y0(e\ AY\y\C#:\S\W\\&\\y\`2syL\\ =g#T^\Y[mn18|Uo<\#;\6\\\p\\K\0g1܈.U% N*,FzSn\#^Å7$i2X*[=B(rPåWгʪ`\KǯE\T>\ZʒtyM\\\QF6Y=8Q>\ Bh5ӣ\O\ژ\8A\\e42\kpWw\-})|+\hZ)-guU\@tkK\\Dn&Bw(\#7\% H\ܖxskn\0|!\\n4#`fTc6R\wO\>$\r]0YF_F\7\uCkCjr&|.;IK\`1_\ٚK+8\fX`Z\wJ?\\"\d\\EQ\\\\,\*\)\r}<\{\\;\ZY|(_\\\B \\>2B?Ûx\\\9\Ch\\W \\l\Z\Z_t\֔* d\b\b\\5\nNP\\\_\M\\t\͏\s\X\Z\\^RtkNJ% m`=\]}3h$ܻXn\:lxq@W-\\(;\fz\Q*s.ޕ\5\ݩx\\\\ [d!<Z2\\\\vr\ \\n\\0ϱ \\=\\NP\'!Q o\1}n\f#AKP7 ͆_8n\]\\\o\'\1 \\c\\\K\%\k)n\\\%\\\$mP<\3sw\R}\%\rɠ\7v`wI\\g \#yH\0\wgw[\c. tϾ\H\Z\\ɕ ,AD+\\f<\{\K\\.\vށ\<\uÐΓ[\\\\,\\]3\\5\C, \[\~*\\9O\G5~{\ը=\i^%bAԾA\,CT\\`}\\,!YK\'\Ƈ[\fI\\n\n\Fo\\42o0\\U\\ڥ<\\'Ո\cRê`eʯazߗ^1\{\s\5:\\n\q\\\U\b7V\w]\ \\h\\\nՃIͯJ%\\\E/*\{\79ut\"e\nVEK\\0wÏ?bF@/\UOaB\;ۯzn\nK6\\v-\Z\0HN\S<\~\\%\\S5Dhlf~O\\N\\Z=\rI~a͞\rރw\\xn\\\ \\ey\0\\9p\\+#Ѯ\B\4\! X\\\z>\ E\R\)!\m%l\'2\0up\s\\*\\E/`\\{\ZKJ$qiu\ns&C .t|eJX\/\4_N9~\ZeBT ķе?o\F\Qm\~]\a^\Q\'c|\mMڕqux\Վ;\\gG`ʏI\r\\;_\B\;\X 5~+O~É04\\S\z\\>c\\˗\q7\&X %sV>_3f~i㖑9\i\ L^9\N\\(y\\W\ŷ\:9\\=r\E\Rn\`\[\@\2\wX\\>\J_k\\GH\|~\劯V|\rɭiLJu\\l\\\E\\\_\G\VI7wѢE\S|\{N}\r2n2==\Z\{0D)_h\\Y~w/%\'\J11@v&/v\݇tj\(_^e1\R\XU\hss[\\_%[\\V Hְ910uWy;\,\탹[f뮜\0\\׫\\udYJ\Wa\0h\ (B\\8]_g\\\o\_^=\r_5Ұ\ı|\U)D1b@L-^3\g}\;\rDž`<\\ALI@e{\\ҡ߻[\\j&jK Pl\\"4_p1;\ _%\\\p\\\:\\\{\q[VjH\r\\\#z\\><\?w\h\\}\65oyV\\2c\sɣ&e\\\nV\lh\V{\\\υETHʹqkI\\0\e C\yY4\rY6o\i8\\V0ϓA _\C\*\W+QV\_(\\  fPQAKLϾ`\\f\\K7L^D(=\\%kݮSn|\\'\\n\Qj?!\*s G \ʒ6?\4۠+\0A.66\C3c\\"p\{\Co\}5Zf)\ݖ\ʘ2V{\~+ǔEV\\/+ˌF~\B.x414\jP/ٍ/s\J Ep &QΪ]zqgu.#0FRϲֶ\\#\S\Pay&g\\\ae\\Zzc3!\_\_V\\ٽdH$!]6]C1nalՀ&\Cv\X\\n\Z!cg\\:&\ }ϥ\ ,O8\=6\;(ݰr<\\]L8\r:v\\\RJHX\E|eٵOn$\腔P3TnQy\ʛPz7\\|e\\\2\kSwuGw=\\kGC־*Hp4#\M\\\d; \S0S3K\ k\@t\a\>\N)mgjfy6yF\ \f\2W%\v\a9E\r/; hC\tH\( .\(\\Pܟ-[.YJ\\h\k\k\I7tHeSiۋtEg\ !*w\\aG`أ,L\\0v\i\\nXq\0\0\0\0IENDB`',1,NULL,NULL,NULL,NULL,'pac4j ','pac4j ','pac4j ',0,NULL,NULL,NULL,'0',NULL,1,0,1,1,'org.maxkey.authz.cas.endpoint.adapter.CasDefaultAdapter',NULL,NULL,NULL,'IDP',NULL,0),('850379a1-7923-4f6b-90be-d363b2dfd2ca','网易163邮箱','http://email.163.com/','E-COMMERCE','57f4c775d02eb00e4f8c62ab79037d8f949a3ac684791843026cf902ec000e2a','Form_Based',_binary 'PNG\r\n\Z\n\0\0\0\rIHDR\0\0\0}\0\0\0~\0\0\0 \0\0\0 pHYs\0\0\\0\0\+\0\0\0tIME\ \Zq*Px\0\0\0tEXtAuthor\0\H\0\0\0 tEXtDescription\0 !#\0\0\0\ntEXtCopyright\0\:\0\0\0tEXtCreation time\05 \0\0\0 tEXtSoftware\0]p:\0\0\0 tEXtDisclaimer\0\0\0\0tEXtWarning\0\\0\0\0tEXtSource\0\\0\0\0tEXtComment\0̖\0\0\0tEXtTitle\0\\\'\0\0 \0IDATx\y|ř\\3#nKuٖ\}\H \0% #l ,X$+a $$BXp\c[>d˲eݚќ\\u\\:\\O\\\O?O=UO=\S*\\"{]\8RRj\\Z> \"8\f!f-Z@;:2!\\40\(+\?crZx\"Vvi&]OJB6P\S4>\"ֶ:<!Z5\RF\\R|ډ\Ο I\0j\]D7\\h\l%\\x\0 bc(\\s\W(;\lS\֚\\\ZG+\q\'@d\"\%G`Z}w\\nSs\M\\71.}\l?y\9)\=}\n]kM+o\\\kl3*\cVE\aʥaef\\֚\g\X )ll\Z\\}M믦\ܯzN_D\\dÕב\Ԓ8n\ȋ\4\y/S\'3a\\&5;}\\\rx\e\\r[ک8pK\ZkV\\S\ \e/1u#nBmvOdjk\\\\Ox[ZkW\Zk\m\x\ݺ.dC\\;D\\5Zk+?\e\0ֶ:k>GD\\[MDo[{\A~\0c\D Y ɘ5\\\9]V\DZڈn!yFs \@\\\4m\d\\4\Zִ\]|>oQ\&\5`d.Z@ glKK\((xP} Q@;6N,FG}=\jiS\\~\\Ux\\a\s*K\\\\\yz\νV.\0Qqh\\&\c\\Qp!\7,\\ר}\`*RjQlf!,5NK\i\\1S&Q~\^v\"Yee\#f\\1\ө\ [Ϧ~KO%#w:A\0 jht8tؗ1\"`; w6 \\⤖,Sx\"\Z\Ћu\~\W;\\u\z>!v6\p\\[9u\IPĪ\>\W_)\ބii;\+h\9\>!p9\ GW\O;uʘz? \`\_\\'x !\fQ蔭v\}\nsmb.\~ \\\q\쬱& 3s\\\_\0\w/Zw/\nڋX_(1}\\\9\kCu_\<,&֖\\?%/۟]}\U6ҒFh\\^K\n\?45R\n^? \3b\ \8(CׇgB1s\:@;OQ|\n\y\w0=~r ~;=Ԩ\'V\J\Zj\|?3ﻇI6*\\6oC\o!GH0 }L²^~\\7\s\!S$\\ \\'RWKއt<2H\\\wionH\hO;sGc|}\npwLȆ\]3x*\\Li:hsGLp#\\0rVŎ\\:\t;\'U#v\K6~,B+WCbv\\;\Ug˷._#i2|̺\Zeyhǜ\5eK\'k“uE|$ \\\\\@ c\Xe(`\L\\A BΔ\L6⾽axD\_\vﶩzˍ\\7-A;;\\s\.Y% <u?\N\\'\\#Ў3N ?Pn̤\+Ǔh\\\}/F!{\"6C\<\Kv%єAD\ӦNk\?9n*.\\\O{\\]\\0efҹ\`)=gCqw\n\i.3\?\~.\\\p/hM۶Z\\3\X}\1\rŸ|F\\oRp\ ]m0v(u\'翡ƀ\=en\ٟ.s\R\G@d]5\Z3\^y\g \\*\9&\q@#Pw\\큤\3 scM\hjz\8&p4\'7/7\t4J\\gw%\"D}&7]O\\)\\'3ٗ_\\(Ed\\>]<\"\Ο\Xl\\\^1\:(8\\nhZ\kD7[/@\\(;f\ur\?x\'\wm\nP[ﺆbtz\=Kvƈ cXD :7i]\L:? xu;:F\׾tKE|\\5\r?MN_:mc\g)DΜ0.0\\L`}x3ɪLzڔ5ӟ\\^\'\H6rF)X@? F{f&Na\"xכ\s\\:tk+\\sLӤ\?~J2J8ݼxs3\\\MtfYz\&\\K膐5c\q2IDk ~C)t$J\\SFӾ;oH^\\bfK\Fzu\\n2T2\\n5J+k)`0\nD N8RE#+k\yݯ>\MH(\P;Ƽ\&m\nIɈS\"\6$ᑢOh%\bN\k5:p\\U{41h\rnW[D-\h7M+/@lgLV\R\"\\\)v\ZpAM\\"^\ЂrsrɘTa(\\zhl؈H\ny\4*\\a0\\X{E\t\0\\p\Hlj7ƈ\\[KSt8\4|\\ؘ2܉0\r C\\B|Q\\\6\j\rۀ\\LO`%?\Z5\K\\\\\\\E\\څ\\"g\R\\n\06\0\WN(wTZ\\%\r=N\/:\E;/\\9R\\G\X\\\SZ2,Ig}\k[/J.7R]E)w_5\ i}ᵽ\J鉴r\\0`(Z^xxsKψP~\јf\=\\`\9kߢojva\YӁxK+\d\\Y{\Ŵ~q\ߥ`7\ھГ-\\M Z]C\3\Q\o$R\+5߿\Z3V)DCۛo\\;x&9}f\\\G)\v$Dv\\jbM\r\\Aw7r\"*R\Ŷ\1:t\7\\:!\`ףgҙc$IBɧD݋/\<:\`5MDX}+h=\\\ʛv\ϓ\?\\_F_H\oI1]\0 кM\z\\aɍi\G\=3@Tk\{:w?(\\Zv+.m\uD\\]rV\\\5cdD|\1}2}k\\騮N\\+\9\\\\"diSX\6h49\Z_z7\q턱\g(-5]\0\ک)`\)\o\\'C09\ښ-\ljH|l\a\\r\4iz%\|+\eȚT̑w\A\\79\\-T*F C\&n\'f\vK\^3\=ii-lN\\ \CSzԓ\s\f\X䟨}i\rdF`H¨\%\Qn\\"^L,b\qG3\eW-v\\%\rO?2c\۞\rY4Hh\fVM2ZR&D̼n\n:r@f;\Z%\\HˆjV\܁D\7)P^V~gP0y\NBF~>/\\3]\jͶ_\G흿F\z̦h#bL\\ZZ\Jo Q}\uL\?\!1\z\)/#)\.EN4\|npf_9b\n߲\;\Zw܎zR[vAA\]H\˯u b(֬\\8\`X\,w1-I\\OiӅK\EK\2\nD8\"z\\'H_B\N\f\%W\[G?!TV\\8\\g)\r\Z2 f\Ai;eD\"a\=,;?xh>\nE\\\,\,\_$v\߻9gһ\m&\'F+Gs\_d\\KH{0aZ%K\@]XI4vM,d\I\9\\\x\&Crf~\Z\嬾Z2\\ZU#l\&yݜF\s \Z\ɀ\d,Ŵ㎣\%d\FE_}{\\Ww{Q F߬\鮅7\S6h(\? t$\nRJɛV\\3)5\\Ix22ףWi~r 33\\r0\\\zH<7Z\0К\ Z~/~\\\\\"8wƽk\D2\˙\ XͅJcan)S\\]CZ\yÛ(oq \)Z\\CWVR_\(/!{\<\\\\ǖ\"}g1\\ß⋍\05j\\\\\a\\Y3)ծtl\+Hp\\(\B\q;\h\"\&X0^\\ݱ?HMF Y\x}\nf\J>L?umwO)\G{X\#=\9ͤoI\H\4*\UgOp\z\n\\\6\\!7݀\$Uc;lDk\1< e\[\\}3+kȴθ\\D\'\ 2Y%{\ZfYYw\ȭ6)Em=DOc6*nO)*._\=}A\ṗ\Z;\*]{\\eC&;\KG\Mc\0\8P^ oNΰ[\\p\7\d\\ eY&ෘyI) !B[\R\\XS\3Ne\\_ݫ!I\Nb\#4)?\ՆӃ!\"5[\7\ { v\\ ZN\\q\-\\\Ú.lj\zPh\`UW K#\撻hZ\O\Ȅ-e\]\qv>\n?|\\'))\n\Q\7ޤ\W WoC{jw\g\2\䖔ʩd\7\D{\Z\\JfA]e\'}?=\Gޒ5\]MoE /Srʉ)ucb\D\w\\? ջ\\&\3\+s\\0,\\m\ƚ\Ζ^c\\.M4Aꊷ\xj J1a|뮻ȶ A!Z\ܛ\\cI^QP\'\xJ\\S)E\\\>%M\i!V\[7#(*Xx\\\;b\U..h\\2\\%-\\m|z\؁0PM\rsgHp0O\\uz\Jzx/b晧3\/a|]\Sb\\l\W\=\w\ c0VRL\ɇ\jJ\pBa6\|;꭮ `*\"-͉}tfv\pFD\:g\\r1\& 6zZSO]\3\Į-\)gTqwf \]u\\\ф\Og\]M\\;6ĶY{\4\[tmz_t)\B1\\`\}wBxZ4q,fPTu\0s:3\\\\\W\')\#\= 5~\\]]\j:p\>8\*~\\t\o\\?#{~v,6i\\G\p\1}T(/ ќ,(\\[RH\\L: \-$gR1Fg6·RGoe\\^BY\^  Á|;@2\"\\\\Ay\dwC{@\&`Y٘\&\\Y\\+.\no\\\\\\O\i\n=#Qj5=H\\9f\ \Wơ7\H\4\\\G\|w\w\2K\mHvs \gÁ>lյkɼSn\r}\\\z\eW؉wM~t-ӎ:½\n-æ\\Ae\6ȜR>h\];\}рҪG\\\\o\7\\{\[;@.lǡ\\ \Y\'\'a\u7P\]\\"¢+5 \jG%^n\сoR!׳Ӆ\\>]M\SN\\\hM\Rd/=#/ \\\`\\wQ\k\<\r\\\s^d5(c\4@dl;M\h\Z\wO\rix\\<;\WI]zIX\*/\]\K\tO)\\w\\\\Xq5>!哘hw_\\0u\ڼKzLp\v\\|F\?ԥ\!ZV|®^\hpjE\\?\|\_2yyC\]a\/\\;w{\zFœ/X\{\~xSۀG\\rz\\zrԿK(\[\\\W8\\\GD[n\B\\\ڰ wPV\"#)\ˣ&\ɓ(9\\,\\.*\Zhl~QjyӀ18D+\ij\`<\;$g\ $Q0`Ll֏\E2?\"\L\\nDS3Mhx\]Z\\jð:(7\"B\\\\\/a\ \'\',U\EA`>*j0RcH\أ8\`$\+\vо30Í+h_\.\r,7\"$\\\\"vTe`z3CDhXCXt\)Tr0y]ׇ\'\\\5&-p-B!6U\\\q6-\'-N}L\F\\0e\c\n\i>zKm\\}Ku\2&͙\\\\"B石\iۮ_\ؚv3O 1p\\'2 }Ifrl|;q6u#\W\e:Mc0\)[\0\\0\1Yo\GhG~ܥIӡ\8SKu\Y\=T|9\\OE\\\\1gijOuR\}mD_c\}A\\F=r%}DsF*>\\\\\^\ \ T\~\_|h Ȭ[|=\PQ\@m\ֳ\kãT\yX]D&󮹂\\\ǰCk7\\O\o/onwbT\EnԈګYu\ \\\'l\\y\hzn\\"\^8P\jO>Z\\0-M6:Dh]]Ie\YH\"-\tQPx!e\rƉiY->$\\0Tˢ@;Qmw9rF\"¦\>Ʀ!\ޑ\a%c\\ dzw-_*\\&Z>\/H{uk6ݮ\.ح\tl\JޜԒ\n$њj6\\Z\lRjL \\\k\#Zl؈\8k\/O/\ceu\r\A)$\?\MEhs3\\f\B\\wI|y\ƶ5M蠪o\ 6 \-\\\4>-[q:\";N\0\5.\\I\$d\ZH׎Y;\A˪Ul\9\Z\}XK QMHVz9P\n\'\\\`-7]9uE:\Z%\\J`\F>?\"vC\"ㄙ8r;h\"%h{W|JŲ(^r2,eZ\\;#s\b-7mi\J\Z\\'\`1$zF\ߛ贳56)1\"\Z3\\\s\G\\'u++V\*B۶\X5u\\\qN\\! \p\Z! 4 Z\]C\޸S\j8\6\n o&:>\\ 5qn\\8l:+\ЎA1*\rW\\]\'WƬrmUM.BX3:<;MnU\#U>w$eVhk\\Zq9EQ 3NV)dO\\\\\\dr+aXHEAu\\%m\ry$\\d$~EeH[\+4\\=\\\?6p=QHXw\\fĎÊ\d,ݷ>y&!ce\\\\\mWu|ǡk熬b$a\Q\\}WΏ%\F~4Q0\\\\Ǯ_\2\^\\"\q\) \Z\#zH\ITO#BP~\\\)$ ztL\'\\׶4)\^&+{t?$4CN_HفKNEף\ CnJ\"D eDQu\\\\\\G\HBoH|Zt\(JDXzٮC\r*N\# !\\脶W\t\\Ŋ.\MS\w|\H>N\nCQN\'>\\"E7,Q\\\GBӏQw6 cb\Ò,\r\ \\ZC\\c?B\[\〨A\ѭ\\#|\ZG~\\H+\\o#07\S\ \\6ƹF5\\nMHb\ 0*\FQ\mZ7.<\Gƶ\|f\!/\0)\ITW+|[\9\\\o1U\A3\TܙR96\\"a\٘54=\=$4\\7suЄd2A@\b 5sQ\~G\x1,0<xJF3\\n*i9 \7~9|\&}\ivKE\"Gҟ\ E!C&(糾\]\Z=p\̇w\r\ri+67uIǍnZ$\~>$\ ܨp&\\g\8\;F\\\"\{\-}\+eׯR^H\Aˆw2}@\Q$!0a\\\`\ \\-;\\\Sb\h4\\{97õ_>9.\}t[_ :~$8\ _2Eà`Ntuv\oN\89r!*Xʑ[r17\\OjJ\7׿2?\\\\\!Te740\x=icb0o\7L>~f?3F\Xa>\ \r\\Vʧ7Oo}g\\#n\\NB\]Dfg#k,(\\\{J}\Z(mb-i`˦B\\Z9 `EyO0v `-+yt4vۦ\ `aDN)\ԗ\V\,;\\3C\3#!\\)\L’d\\\G\8\\ C\ \\ϋ%q՝\UtLgXr\1P,:- ;KӭU~\H0\ߵJ| ?..a\Ojӌ΢/CXka\ulT8=\\TK!%}\H8S\o,KϭI\\2Tkʲ\$rdx{||gMt\"D,\uh(# u\\d`a\Hױ7\ukpI]{\\όp`T\p\е\ٹ\ދ@>\'y\26\q!0\\PJv\\&?X\/J#\sE^\cUSPF\Q\0jr)4\$tâ],\VW\\}d\\\/\Zf[g]&\\\P[Oݩ|f$\i\u\'\\_un\{h\ղWRO\Re֍H\"2}\Z-\\voۉo\\Kjp1\-v\&\WQcj>8.\OpR$v/\Z;\{\Sv]\Z\.As\'*t`D\\fG\WI;V!\n2VFG.\دw=|\Ɏ\'\na=#9Y>\T=3\,K혃xTcD\\Z*\DR\ 3^~kׁ\;\\\\4cYU*Ie\'}ۓIItV\\)8o\!\Z%\X\\^{\\-w\0 nޑ\\\zPl\h޻\⹮ !U\@׮N\ϓT](씣X\\n#rD\n٠gL?:-1iM_\Kn9.\\;\GMo\J\!8 `L\\"\w\\R\\1\\\.\w/U\\\]\V.J\ և/,R7ĥxH(\>+\-mI/=\G\&\Ўn\ \i.ӊ\\\rc\FF [\c\\NzV\\Z,7O\9DyVU[嫥}\G}]\'GB.²\8\\\)G\{\YZ\{\{Ka\Jϧ\t\QS D\)\,,\\Y\rQ\ayJ2p`E\F\- rӾrZo9\KD:\\.\\\D\\ONl\u\d0\3\R1\A2ݨ\\.9\1\(%P\\r꽵\\ !ȐbAc~LőU?H\ ,Oo\"\Oqkl\pj\ښEGXїaT.A =\\'y:\[^\J_X횒w 4oI\ /W!\Z\Z\'\ S\f\'a)\dzg-5_iۈ4S=\)\Ľi*\XW_A!\@4\\_\y\\\\Qn5Sqt4\ A\ \*/\!t, \$<\0\p\Vp\ 8\svȲk\\Vh\~\\\"~&,VԦ#a\Z\Z[r\\P\\+J=W\P[E>f\\\r(\\\蕿~GJO@a ̇-\q\\\g\e\.ɑo\\\\\Uhfe$ndR8 R7\Zѭ- !aLVb\qU1R7>eQy\\\;\}}i\\&\/iiLLpӀCڮ\Uy\_\>\rfw: |\)@2\'K\\0mOT(e\sXQ/_ڳc#8}fh\\d\\c IW\T́sk\ݵs\\\޼3&=;\\`x$.nH\\\\eZMș 5[S\\ݷ E\Z`Q\Z\\0}>~N\\,\W \\Ct\\&g,=\\\0\Kh oТ_\tw\Um-~^Ӵ/\烮\ɰ\ \\@\2&c|R%&{\v\'w_=\\\]??݌\\8Bw&\0%\=[f2FHP(\JwG.R\&*\5,^AzK^\^h\\9 \"W7\}e^\\\\^$h\?P\\ZhX|sOwx\\\?77jƯ;\{iG\\ooxm\\'f\I$ak\\\䜎^O#\zdUG;\Z\`>?~\J\X\l&qQ:\z \$\\ _\:%aIfYj\Ÿ\{?;\'Uf\06RTKD_5oq) Qde1KLD:\rBK\\Gv\\\"ZtVl$l\sC{\-όzbJ3& \U\0M[\n\\\И\\\! zi\0\\6=l\W\=D\\F;bJ*aJcD\ŐP\\&\L\\YJ.8\(o\\;\x\Zib$ 6j^(\n\ZI.\)me3\.⻛~f~\BL/E\E&#x\\r\{\s2 \@L \*܌u6C\D~^\?}a#\\\>lT\&IX\\Ѱje@I5!q+3\4\87j|\"t\XY0R\\{\\\;;\gk\\"\x\\Z/iE#\\T\r\t\HH/#銩K}\\\\\'n\\V,&\\\\j𫗷-\"m\rwW\&-%(i581xѪy\0QXKڲ(\#\\J7\4\\+_\u\Jb<,\"\o\n d_1\n=\(K\H\P\nh+ڇt¦6!\0QWW\\Ɗ\foy|[[+\n\_*\N6m;C\!>5x&J\\\R\wr\\$\+\\\rO ij \%EWAZ[\:v2~p5?\\S}4\"h\)\_8Mj |X֤,ls \\A)_={y۲KaKBzGBw\6&k\].\\ \Z0r@GK @2D22\~U_j}}\ \\r\{\c\Rv\vJ 4\La\ ?U1\\'\\\a\/r}7\Xs)j\w׾g\-f\aP.:FMБR9\0a0(ʘ3:C1$4}\0\j-t̘̅ݙ\|\E\笨\c\i5) \AZ\q\E9~8\/_v\ٞf\ZkjS G!M\m\'d]8BBF9*GH\T])i\'XƮZpe_@e\rbTӼtwhp,7~A\萭ɤz)\U\Y W7\m\\\ś2mxJ@:E\aS)9*\nh\03O@[?\\T*\\g~m\\7\\~s=S\'\mp@!Ό\\Z25<)ej\pwK!\WlTJ\I/il[\\\\:-\\0Z`B8e\p(\Z\\UDVuY\'\\S\h\K\Dl1s\0\+\'\gp|LoS*HtI4Rs\Zl\Y|^\Z %7$\[@\-b$\|@y}$C\Z9\\[\8)C\Z*r*L3K;j\\;\ { q\f\<>6H\i\|{t\JL\\\\nH)28^uvY]\-K\\\,NLd&7}Q\ZN5c?\\r\r0a\Ua֜\MW{s\R\"* ϟ\_3Ӯz~o}o\+Kk\550w\\=\\ؗ2hJ*Qf\6\=R(~D:\\\\V9\YN\ 㧿կ[\\$SN+ q \AQ\"\_@u;Pn\,R10{y_03άvF\\X\\u<{KcN>\a.\.\0\~\]\;N4X\Mzy\\kYn\qgю`C\rGX\\\껒[e\\m\0L{\MIc\N4\\mLW\\#,|\\\M^Sl\\V?\\'\Fb)L:\\D\\n2&\0O W\\&\\|\\j\W\~}\ -~n;.J@)r\nE%KEGC\C\,T)d\\ÐЄ\ƴVIt]2wSˋ~sl\KN]qjrH\)U~2(\s<\r\Za\!\'P\\0\\"pKX,q\5gt\\\\\nmah \\bءH\XpҶ\݉3}ggϭO <\L\(٩D-\\W\>\\?\;|:r\\>H\\eϾ䩅5s\\J8^HbNPmv\$ԏf\'ÍbC,#肟\\0\0 \0IDAT\u~\ś\\U^Y\7ǝ2\\H \ QtZRn_bEzk<\\\05퐊r\\ \iM\nnp%c;>\++\DE ݑ\n $F9 !.\0 qH\\rzW{]\r\\% :o@éhm˒\Mefu\:H`}}˞S7k\#k#5-\z\?\\llKΨ~CY`gy`\'ǻ\?AdF&?])ě\imW\\Lkp F\ Bo\\\ZR89\\'\\\E\uƉ;8婫FB\Vt\" j\X&\ba骍\ k\J|\m0PwipA}b~s^l\ޗ;}\\v֥\S3Zf/վfc$\6\z\'TZlx* NӴb\$pqDŽځ\56\qg}\'ZN\Yдfβ->i\h\"L\jGaoNH$euU\0.\Z_\Ŏ\n\\v.\o\Zr>\ %>\]Onl\fVf،ZWT$]\\r\_I5 8\#TEv~:B\RPU^\\.hYUi\';V\Z\\]mт\\r3j\r&&6-P\2\{\{P\\{\Z\X6\ҁ͠Xx\ҹ\G\LSN\\m%\8Ȥ΢\qAos1\F(\\"ȭa\.F\X\B\>k YeX%d݈b6F\ /\I^! 2 \\nciy:\^\*\\Ds ӗֹnL/mf \ ɽIgd7xRj9Q\0\\+\64-_\K6uhۮ\G\ƃT*\\f\0]0yvq% \\"og{/\G\U\\eB%6UМĢ\0n\e \\$Eèfo4ƨ2S\pF<$p\Wu \&\n\\X`\L\\\X>c\?z\;\\^\y\dP\']\ =!g\P [ \+\kiGG\\ё3׊c\__B\T$h<\\½&.ɏjKu\LJ\47#@=5\B0\&V U\\Nr\ ϻTF\U,\\ƱZWCf)v}iIb\e&\GCޯ#\nxt$4Zb8&Y\_QEЙ\\'h&\ZYZǾ\G?8DH\/\\e=;6\\¬\$:K\}Eg%S\&\|nAFP00򕾁vL\0=k\8~\$W\\"D.f:gׄeA\ @aNYNϰ\\W\rˢ\\x\ys\rGSv~\\hAm\M\\~w( 3 FBN\DE:o`B\Õԁu F\ \":Io&\G\l8;D}iW:\h:8e\}(%){T\ݯNuAൄ \"\\\r\\\\\O\\\ CW\\B$ +%ZgKӓnk\\B2_\P_\Pj$H6\K+7hc\rQ\I\{yV\feܲE\7r\\.]9\˰ 8~5=\ *+6Ez\Z\qe\<Jr)\\"b]{\\#\ R\C\n\W\\]S]x\smr둝\/:[\ˆyn\G?\Ԛb\g\rp\ e)Q\ŕO?dCG\\XNhIL<>biQ\\^c/i#|\\\`\s#=\z.w]֗\ˎf\\O9efCKE\\$\rE, Ev}R* \nD\^R\ (l\) E~7f(4$\j\6NI&\2\nF\\VKVryr\*@,ݶ\\'IBڈكOpc>eB$`\]\\\=d<*Wp\J%!t9,{6>6cnW0`2N9jR&\ÐPlTà\rp>0\*rOBp.*\\\\աkW\:wy\xi6\\E׸%V w(\5E\aHHEFB>AE*3v`&/a]\\ҫ\Drv\ܵK{ cLXfР=HAˤ)n*\XU=(\/S\ c>!\`c\Z\n\'\Hk\_\kmkٽ\\\?\)ܠJB\\\<\\rs\Vy)† /3\,3U1DžI?J58+\OqX3j(%vr_Wn. \\Ow?Ca, 2\\® 8TLKDL\\rI 1}i\[>\b@կ\b8PT1,f\ҩo\;{F/o]Uo\\^cB)mITE0Ҳ\rqS\71J|\?cp&T\cړ\aho\\Zї\ߘ\2k m\"\\Zcgq(?vZש\'zϟ\\\l\N(#jBҚ|)Hf(% }^9i\Y\A4+IVТ\9\\x9U:\\_q_K0[p)/2W.\I1O\\xZ*!\^b?eKRf\@[@IRx\g\q\ؒL\əsj_>/\rub\[HnV\0 M\\\l;a2 il#ca\e-r\\\\\X\p\o{u]\\^Ҥl)\'f\,R(\\\0 1)o\\ fI\?\l6% \:\#g\\\\N]:;\\5>0T/B:ꄩ^ZhT\0~$G\0\|W\\'ێ9:UC[N\\\\\Ł1 0\\\\r\v\\Wm|cږ:\PiT0\0\9#шj\! xJ\e\2\̗a%[ \'\\f!LrL_v{R\/;781 \[\\n\f{x\'\ro\0p_Gh>QB?2. %.3\[+\9d\b{vupk\5n\\E\ \ \3\ue\\G\N|i\/uaf\4=\'fGkU,\Zic \\\"nB|\Y\jI:\LK\Ŷ$\XZ!L1P̜\g΁\׻\'C3\,cOkrc\7\\'\6>\mIqZ\I&\\\-sj\ˣn15\"&{\qHa\0\\O\ٻW:xn\\ R\r&&\'LE\\O!2ql芔;ۮA:,Q䩔)O\\\9gG#̖gMX\C\D1z̚[\\\\\m\f9\á|\折u 0zpA.,z/_|\¹+\=\\Q\\<ˆY\B 5\g뢒Jos.3\no1 $]\"7Q\+\%։\~\\΃] +`\\d/dؤ\܎b\*\).1s `\\}\_\ݕ/\6,\RƇ,\\\Q0ܕ2\\\\\}ʹL\\0*f l\f( ى\*ʮ.\' S&8BR֤^hܧ)\\d\\rm\wx \qZ6ov!Ȇ$\'οsWN\ɺEֻ\\\\j\^\\n(k\\\,TA:\pQ+S\|\\\w۰q&g/\\(\\x\\\_\Z\kM\ԃa\-nJ)|ľ5SA\ˊ#h8ל\0b@\\HjRT\\kF\~\c\\'<e<\3{à\e Ӛ85l\b\\\/\Z{ĻZ]¨/\\@hf\YDgo]rҌS\T?KkX\ؿ7b~T\9\\\}W\|U\Y\0Y\ZcK\=h^K\n[S\r\= JPOraFe\\0pTWMzʔ\p[\\7*$XM\\\bP8ԯ\UPc\\]v\w\y%30dM\V  T4$\01\0\QIPA\iZI4Y\'\ˠ\~\զ\j#D)\04rI\'\\\0rY\\\Z($`\R\\$˙D\޽A\j\b\В[\rŅOх`kC\ZqZO\ZjIU@8 ͱ\\\&+f՟\}m\\$4J\Z)\/\߃cM\0!\\V\?n\\\&t\\nh\֋\rb4\?K\r/\R/ ~\(\$\jv\ϭыmUCL\WSf\rA1 \Z\\0D\!ָ H)\\r_\yQ退/@7LBm\\gI~A;\0\k\d&eҲ膵}md۔tD\=Ȣ[]J6XU\\\ \X\5+\\P`sv\n\\^|rbq\r%a\0\hL`S\nZ\\u\\;t\Z\K) j2_Ԋ>뒹јp9hW\\^pYs>\\@JAٳȴip#P/\4נ?DCc\^\,2C 躁\U$~ӊ\u\nД%7KLr\Y(UKeH8\J\ƢS\gU7/h}圥Kj\Zg6&j,߶6ܛH\3l$\0SB0>oF\-u˅\\\\5Kܔ(a\0\~R;\ڀB?\i1R\Z\/iݫ\ZT=\n@\eltA\{ mu6S\{\ ؍\M\'\rյ ͫ\\/h]8wFkkz\ITE Qh4\ZSS|y{\\h3::L`ٺ.Ϯ^G\.\ȶ;GXPa\'x9]5Kw1\\b \_N\\PP\1x-\MK紛\aV\H\R\r\>fbNhN\Ԍ\\S\\wl\脤kՁ+\\Zړ\>)䰓3ڦ\ W\[51\J\0 B!\N4\3ρhOCy\\wI@&\9-$v\Ie:\G\㧷ص\ɠP*QP)Y\\\x\=r4M)@L33DDݦ\063x \f3@\\0Yq\yHmqP\l\\\"\)%V\J\ !ĔS\r\7xn9o&\\\5nM\V\j3[f\^89Զ̯knN\V\`U*rJ\hE۩~\\0\C\\h\{\c*2vXu\p0\wO m\ק\b*Q0I[y\ \\.\'w(ܧ\"F]\윎ψT\z\ $\nΚ\%3m\.4ڨ\\ \-\],Љn8ᔆ\\+Ƕ޹|\׵\Zxt4ͬkKב2q\n&-O\t 7l´\/\`\(ÒYww(\\}\PX\+fҥ\\\\\\\\kX\\\4I\g^3a\`\ny\r/c͚1zv\JWs\n/\Ns~i\\\2HQ\nh\,\,rnʯ4,&m\\n1N\zj>`\WWmzmUטԽXbx \\sVF,έi^1g\\\\5s.nh[5ίJ;zEV.ŝ\\&z\(\JŌ\ZK%|\\"x$X\"\J:\\\\-_\s\\'w\\S\:+lgF2\\'\U0c\,@,\v:S9yŲ\rm3㽞\;>\"a\\v_1.\e#@^ r\\7\\;r:w5hv\sC^\w\\U/=qmK\L>P \\ځiAq,ͮ3\.N\3M\N~mV~<_P4\An~P\\b;+F|\EBU\F\W\Z?0r\\;w;\W\faMTULn\NV{\\\ZdNwD-\\uv\sk_Y\\\KsGK\c}Y5Mm?\"Dж-\\\r\\\ӟƉ象ɨ-xv\Gݝ\-}\k+_U\\\}tSK;~.G\صwl\\<5k5Q}ۅ\JD-d j)ȣJ9\\li\2]\n=q\\\] !q\X\\\D;z\/o\\K\ \U@\\'Α\y!ԤwJ\n]\0\"-\0Uذ.HjYM_\4{͜D}\pÊ\b\\53.T:a&BÑ?g^_\Ynv!МgCotn\ot\s~vōv`n0Q+\r\\=\\cu<{\_[gYD@e\WF!\n0FW a쮝Iڧ\\.m\[^]۸6*ה*e&q`\ASjzc\s\S\\t`L\r)R1\fX)\\w\\߾\\=\?R%\M_\%\$(g%p\W\n\rQ}\`QlH8\U-\\g\\\ vFO{N\\Y\lzF+f]׬ttd7\r.y\NoW\Z/\8\nZ(_.\wvϮ; E\Į)ͬ\TA%\V4\N2\uז>\\-\a<\pOu\Ú@*\0D3Tw:\0\JBpn ;j\\kwܴꉯ.ܼqe5U\r݃\3\l )Z&Tn\i@1\=ơ\I\A??\\Ƕ\^\\Mʪ2{%oi~\\ Cd\ j\uQ\ZG\nwىcἪ\o?W>\ok\\"\k\\s<\\\'U\n=M\\;+-9oab\fXv&*Ô;8\x\\JaLJ\\\_\"0j\*p^*F*qD\.\9\\յƆ\s\r_\\K$N[+J\0\0IDAT\\*c\Џ0H;dC\\xߎw\\^_j\X򒿔\|\\P(#U\8pk\\C\;\PB\0\?nˇ\0\f\0,X6\rMƨ\0mP-\\9ɷN\^ Q]f/?\+^\\\0\J%Z\Xbq\o#aT{v\Z)%@\ Z\+jB^?s\\v$\ExW\3S^or\7fJ%\\3~\\;}\/\ƪY\I\\${\\n [`6rdi\2\\Zw Y\0\'l)~x3{\^L\JV\+B\n?0\n g\ ʯnق3Mpb\cd\ƕ$~<#\'qԧByIȌj\'^[쓳;fٵU,,4\HXP<\\\Tj\X\"\U4!>Ž%$Y1h\\ՍkZԒBPb[4\_$?\\[aw)!Т\M\\Դ\Hf,`\\_O[\\Y8e\\\=]\\R])wD/?D\'\3\\\r\0xH\\3\\rsV&\جQă\n8p\=S\0* ^ H-uA\\\@2%^4&\\a \}LX\\q}sǿ~\x\kO\-6?A\Y{\J+\\CXD\3g-`x[\^\0k6+\r\\Ex<\\ݎũ\d!\^02JP@ S7p\\C\}@TJ%S\\r\Hy\>+ :-Qe\$uM\\Z n@\\\'B\ns%N\\?!Y@s\ZꚢGu\\H!7D,Э!y\3kt\}\\vr\\fP&\\{\ƒTQk 岅U\\:/\1cWW\\rj\Cc/ȏ\FU8\.\n\dv\;\SK\0\\dk\™sk}K\S,驉\k\O\>w4!\\ZaI\R/cQ\t\\+\uDI D\6\L״u\\\l|\\\\~\D6 \'Ld\?֜mq1uBc\aUy9\m_0\}._|q\_Y\\\ųjPy\ \`\(\^\\-B\AN*h\2 țS\e\rmhn\3|v@p\n۵xf.\\g\\Z\UO\/\Wb㷿\\lN \0DbhE|%\bfq\0o\\zy\Oa,\b.lL)L}͏\\\o: \\[gv$ )\ZN\D+Fjb\֠u:6+\N\0.J~}\sQCCT|F\Zf\\ZX@e\nH\phkB#4\5;f]g\' U\j6\=|bih\Q!jCfpk\ \Z9bW\\r55-kڞ]\3\\?\ Q\\eA:\펦_~\?,z@\\\Қ\G\F\_85\BB\#(lj\eI\DAچ3\\Z\!@Y\N\\\\ÿ\\{BoЋ\aDUaQ\燊\n%;Sj\rMxuz\nn_\<7ړI:Y\\\>\%-\恸U2BQ\\r\Qd&zD\4%O廯vkz\r Z\4\}$kஅ\\A1TsZ,a|\|;!=I۳la}m-nG\\n&͎nU&|\\^Xa\\z^\\^9CH|C\5؄[F{#\$館 [\J2XF\0e\3Z\\\\"\\9ᾡ \\HT\\p%B՘9k; օh !R(\\̨j_׼v\r0>Wd\b R\\\0gH(q?08!\`Oҥ3{\=Nb\\mk\\ip\<n}k\#OzـhXVrc=-#_\oѺ\\ 7x⍃[w]8>X\7\/X\mMc?+E\nï $\rC\C\g\ّ+y\"&ԋ\njbhAD @\Qjpz^ى\5\ZG3\;\\bkjId7\i 2B0u\?6a\\Q;b\qSN@_P~\\\f?\}{\\K\\Nq[%4Y\Q\\PAdy\F (^[t)(=Du\\c=\'\\\\=g\k\7?`\,j=:khlf6:IO33ƒ\&ڼ晳{q\\gu/׾vQGs6Ͱ?yqO P\\mp\ggw\EL5jĜvS\2/s-2\KZe[{?eaڎ\rV{\_\ّs9?\]ʰBYA$fb\o\*&yK\c`\Z\\\Z@\S:\"!\F~\z9\Ǘؾ\;\w\|\\\\y!Z\S,j\rJ\\\\ǘ, IM\\,0\c@]@:B\1gIR!\'\h 7\whwt5Km3\\0,!\\\n\B\ T21uݮAV\\\\\\CVZW|\ Ӷ&\\\|\N.Kf5x\a\\=\d;*>\nNE0\58z\'\l\n\9!o\V\=R%U&\3ȫ\tN\\>qӬ\\\[DKX\vd[(\Dt\x wK\z NZ\؆!\̘̤f\)T]\\".\1`\rbDWܣ\J{g f\%PbAݠ\8\\s\9AN\Ypq\\m?s\D\J!ML-ce\\"\0d\\a\r&R\\˖=Aƒ}Aʃ(0\4\1/\\w\Ԭ\_Y`]v\,dI^\$$יB $J 0bj\v\$0R?\<)%6\\m @r\|0RQKRLfEĖ]N?.\S\\\^;\}L\>\OYH1L`?\k[v$x{8v,^J_j &B<pDd*0]\O(\4݌8:ѣP! 3\\B\K>vw왉D1=~\˞ٞv\ߗ\\kSQP%Q\\ \8 \eni\Z1*RC\]t\d.\| \\خ29|L\\R\\\\\>\|ՉXSg\Lm\\\R\n ;]Z\6\D\;~k$*l\l19\r\C\ ;\\fQy\"H\+8\n\\?y\cWO;\sw\]ا3ʩN\\dS\ȩv\Ԣe\ª~\\q\^\O\0L\-F@\tܢ[*YI젊r0d+q\K`7eZ3ӿ\~; Qp\\0 I\\nn4.uw]\OY\N+D\r#wd\X\zOf?B\w Q]\0{ٟ=\uMw\nӍQL \QX\]\\rT\”yvÌ\y_Oqx\GݧG\m\OJbOӝ74g!cl\ Pa /s;\\\-(1\\V\\‘s\򼗑њ\Z\rC\0p2\y\Z;*tZ~\L\~3\\ wGdk(`iٟ>O6&ᜬuktiVat6\̜!\\qϥ:\N4\}z}\\mW \\عMwIԔ\\.v齟MTs Ui]\w\ލVy\ƏiψѢ>\2\ #BƠ~^d\kY2^ \L9W\\\0\\K\#l=\\VU0|0\dd\r\\=9s+$\Щ 42*VD\\ZB8\0\\\\rbaZ\ķ\ozy\uf\K#ve\dJi&\4\Z[x\n\GuRHM\0\\\ͭmܥ\\?yť\z6^ؖl&\0@>/g\Wʫg%\Ȭ\0EZWLA@\\\ӫ4E榡u]1J\\O\/I3xĦ\-x\9jŒR\\K\\9^&ٲ\usW|xfﶳΎtȢWF\$=! a1\w\bw曛\\\[v\Lv\\\\G\⛠b\\\\´W\硟^\S5DڸE}o\r\`\ &6\%wy\+Br5\*&$C\}\?\\\\\\oaHOVq-*TM~\8\\^2LmNz|\\\\?S{q\\5l.\\\\\ZW3\d\@3Vw((G^Mw\!O\RL$7-\\\?\[ʦ|T\qȆ!i(\8tZ\TJP@;H$\JX\syG[a\noտr\ƪꅸb\\\!\3*\Y!MJ\zn]셙֯X\\G[\<\[@\c.+HIֲ\Z )H\TsИ͔:ZE\\n\m\\?_Zz<{<%KT\"q\M Ҙ(OaFMP u\5$I*\"j\\[ 67\=Í\lOEF\'BOS12i\'\\uۼ͏?܂?ν?~$\\~nS\n\T9 \W5y\OA?=w}&\\X>g\\o\X١\D9\&\n%ZFR2\#3:J\cV\QFh*Q\\\ߚF/z\3d\f,\OveO_\[ Z2e;5QӜO\Zuq\\ptP\\Z\bY\?Ħߥ\~RkQ\0(&=\Zl*9g\—76/\\\4\N\Ě<9H%\;Ȅ \Ej\›\0/\I^\\S\Y\\HcW, q8\\n\\%X\\<4\O$(H`\xAy\\gV\\\uw\\\>n\/#^rBw9}\\\\[zTTUW5\ʙ\Wς#\/cù P\IT #X\N m\D.eejVT+_\չp`\Aṙ C\;\"62\") \\'c-`ՌM폽wjGWn\de_\\\_0D٘NFN1<\ʤgډ\'\\\\\m\\/ng#\a^mI4LJbn^)L\n/Q֚\\\k7攫\\\\\.j\Z^ E \@yQVUCM\\rs\Kj\\߉;\\gFB|o7\r\n%Q,\-9\\&f6\\yx\G1Q\i\\"pFYނ\\d\M\?XzCgTj T\96\K6\0GRAA\HXA cjwq}Z׌<+-|\iB>KVaq\r=*1KMɤ\\\k{֥;Ǟ\?f)\ lV\Z\[t\7\\\\w.\\0f\\jdmA\\'J\\5.\ )!v\<(\Z\^ w/z0\vq\l\\L?2n҃>3)D#2S$@O\\$}Wϲ\Ċ/\\~;\v0\\#xVk\M\os\F\Z-(QiL_ c\\\\\"7?n`Y3U/M\9`<`\\/nZUS1;@K\$Ez3,\"Y g%_\9I!W`\\Z׾wq\oN|ti`( t\K\ڂ\\Zaj$\Cɜ>~ \\>O\l\e\ґ\T\(P\ \7{ځ\\3\i|\(y3>\\"\'\ZV\6k\\\[΁^\ʦx5\$~\\rT#\"{\\\\G۾!\R P2Y#2YG\J\\L/_L&\Z\U&b()\0\$\yDI2H\@\ z/o\JvS3P\ l\tdT0c,# bh:\釹)P+&E\4\\u\a+%6\F?*?\_`Tܧ*\TE!i\:1W\ɤpYb|GF\*4a# !>\7$U= fp*4\SB\a9\#Y\x( _\Z%kSEC%&\33d\\3ƩdӐQ\\2%b]4_\?g$\S\LVH~\Ow\pC+\y\\Ed\f&*I/^<I)Еe*hpМ5 ;C̔\\Ⱥa8޴\Z\\ONRXG7\>eRB\0.\eev\\\X\*W#0!J\1Q\"K\\J\n.k.#\\f ̻\\'\n\4~z\G\@=en_!\\q1\䚼^jLj\\\Őد`@/\`1F\JR\S1T\\C\A&\ۅ°LU\ٰxӳW׍^lAF¸Y«M\"JF^LB 7:YX\P%J\zɎs‚u-MM\\\\'f<^\\\Zv?g\'se!E\)ޠ\}7\"\'\!V6\w͍\\rǠybAN.\Z\ԓ\\O\zf\\?=3{{e|xW=C\\"GCc\Qt\ƯG\H\\Q\noz(&*\\Ͳk\ \\E뷜ڵk\P_c$[\\4E\&8\W7\\P\\w/\n؅ȝ9ofÚM\O\[\ܾOfY\9\\'\tE@)0$4j]\ZɄcT\\\ϯo[kޡstb\#;<(Ro&U0\疄S$Mǔ\O\&WfScُtnj\\\ ~ܦG\\Z_tw\7П2T %\\\\[:M ʃ\7e}\ڔ6FWA cbV}Hx/\3\\0[ưV\n3Y6m8\$-X\#\"!(b\\"x\WS?\Uϧw]\`{@\\VV\ p\2B\\rU(~\NeX\\}t`e\XhU\"\&Pouӥ\\GL_NCݙ\`B\0\\ݢp\\0\0\0\0IENDB`',1,NULL,'2020-07-03 15:00:18',NULL,NULL,'','泛微','https://www.weaver.com.cn/',0,NULL,NULL,NULL,'0',NULL,19,0,1,1,'org.maxkey.authz.cas.endpoint.adapter.CasDefaultAdapter',NULL,NULL,NULL,'IDP',NULL,0),('9e36af33-11b8-4208-a902-6bf7a635ecce','阿里云','https://www.aliyun.com','SAAS','452c3a975fa92bbd1cd47a08ab167fe9a3cdca4c6c6a1c24f6be4882c558fecb','SAML_v2.0',_binary 'PNG\r\n\Z\n\0\0\0\rIHDR\0\0\0\0\0\06\0\0\0F1\\0\0\IDATx\oHU\/C\|!JQ m-(X\^D!wOޖ2ɍtlK\ʵ!n9q\\\\Jf\ru\M\O\%\p9Ϲ<\9\\\^\ {\\\y>>Ϲ\\AXt HB HB HB HB HBL\!\\@\\z\wι\x\r8:\_\|\:\ o\\,~t\\E_Y\Ï\0\\u\\\7\Gm&0֣.# \*v\\\\*\^T^2g!\Ɓtv\Q\]fmRK\͹\\w׺\\\\0G\9_a\.\ =\\\\ۨdj!@\\r\L\"S\\\r\O\o(XZ\i⃇؍<(\\ ;\\V\'/ 8-c0M^?\'_#\\iB!t兩l p\rLŲ\LWUavl\(\\o#S53͹E\K$1D-\GO\oB~2\Z\0\N\}sȄ8[Ət\\0V\!\r\\u\\\X\1w\r$YuǨk\\#\A^\lPrB\(\ !T^\}9\\r6\T+\\(\4\\%ֽr$\p\'\fϴZ\\{:Bdy\Ĕ\\$B=1\\,e \nRm/\\Nv1)D,\\V\\\&Q\-!\0\\upZ\ڳ\&/n3ϧxCt\/W!Lݔe^?;x\Y\b\na?Ta>a41.79\0;l&\\zqrl_=\U\\¿6 g*g!CG[19 ?Ym`\\\q-r![B2:K\~\;Xyo\OU\B\V;\Wp\f\j\D?P?V\\}9[E`J;\\Z8wY.\[#e,-Ȟ:|]\\\f\̂Z\"^\þ\\}9p}]\`1\\\\\\\\1RJ\m\׳IΏ\Tu\\S⻜\o/ϥ\gw\\\U?g~Nn\u, \ż}\\j!LT\%-\R\\.h_~{i{*gYFą-Sl\\m|\Ų[\k@e[\>;\%1=\\\$:\\j!\06 ̳\ƇG\u~ٮ\R\?z^nN[\"xzr\\B\0\w>k\h<.\ԛ\&Bz{\\:K\wWn\\6&\\}\8BOk\:J\`s\\\ӛ^_eٍQ\~5ck\03! ! ! ! ! ! ! !ML\\\ I\\0\0\0\0IENDB`',1,NULL,'2020-02-28 01:42:20',NULL,NULL,'阿里云','阿里','https://www.aliyun.com',0,NULL,NULL,NULL,'1','[{\"attr\":\"https://www.aliyun.com/SAML-Role/Attributes/RoleSessionName\",\"type\":\"UNSPECIFIED\",\"value\":\"2037230828547234327\"},{\"attr\":\"https://www.aliyun.com/SAML-Role/Attributes/Role\",\"type\":\"UNSPECIFIED\",\"value\":\"acs:ram::1729982683323703:role/maxkey,acs:ram::1729982683323703:saml-provider/maxkey\"},{\"attr\":\"https://www.aliyun.com/SAML-Role/Attributes/SessionDuration\",\"type\":\"UNSPECIFIED\",\"value\":\"1800\"}]',2,0,1,0,'',NULL,NULL,NULL,'IDP',NULL,0),('a40388d23cea4c5ba93bed865b81d255','Basic_Demo','http://www.baidu.com','E-COMMERCE','a3ac51c6653ec2eb0afa9ebd0ccb966f539d16e64c7450775399330aa19a8dc81e698f87c64032dc548d6ec7dc3c4863','Basic',_binary 'PNG\r\n\Z\n\0\0\0\rIHDR\0\0\0G\0\0\0G\0\0\0UZ\0\0\0 pHYs\0\0\\0\0\+\0\0\0tIME\ 0-څ5>\0\0\0tEXtAuthor\0\H\0\0\0 tEXtDescription\0 !#\0\0\0\ntEXtCopyright\0\:\0\0\0tEXtCreation time\05 \0\0\0 tEXtSoftware\0]p:\0\0\0 tEXtDisclaimer\0\0\0\0tEXtWarning\0\\0\0\0tEXtSource\0\\0\0\0tEXtComment\0̖\0\0\0tEXtTitle\0\\\'\0\0IDATx\keUu\k\}\{^\0\`!L͌ (F X$C$V>h%|$)-c\P1)+GAA\ \0\{u\9{\\w\\[\U5\{\\\_\\[n\\n`{O\AD11\y\s!\QǪڻz\0UEU{\\Ͻn\\"\!5\\\Uk-FF\Υ n`ӦMl޼V\3bE;عs\'E7 \)ضmWZ\%k-\"–-[8餓ؾ};###,ٸq#\֭#\p TU\\Q\\\ٳg\\0>>N\'g\"0\`a||\=\ZK\\PB#?\yN%pG\Č\nH\1̯~g\.z dV\\L\\7T\g\Q\4D \8C\cFR!H*B\ntA2T  `\ p\{ E$DsQ \\06Y\"\`%\\055n!ϤBO0c KB!E\"1& Xz/NQAL>y\nr 2ZX[\da\TDpH-ep\ \ZJ\D\\A\2%.ו5;b\r IʟlhzO,,A\nIDR\\(\\p6\Z bbȴ`0L\\|\@TGο$\\\\X`$HƱ\ȩg<\\>gAL02;~=Y^P\\\nKW`oՔ\(@, \hi83\ja\i7w)\\1Z\\ ΋\9\"/\\\K\\׾s/\Q4ė%\hZ\"\nY,p\\,+NA$DKNiꕼ\\-\\ڭ?hc 8Y-\,)P\Z[T\'Y]\\[O\]W\2d:HN\rXУٽP\h7-=kfMCi\ȠF\ #M>|\\\g\G:-&Q6v2(\s\V9\\Z2?ŨNW\UQrx̸힟\o\ɝ<ʁP\n\\nb\X*\\r\Zs\.|\) %e\\m\]\{\ܷ\\0G\(ю,\ ״\J!\ϟ_da\\\\{;>\\Z \Ji8pi ~\av\7غqwޅX+6m\J\\\\ lB3\f` \IF,->\u\'y2\\Ƈ>mxC4 8sM~\XoY\WL\"cs<-pBr\\-pqo\r%\<6\u:oq_\;[|G\\ EH\0-ҿX\\j9ۛ\[{o\\np}k_ f\0\xt\DXR,jC\'HTM\Xf9\Jz\WMj\4ip\W\\M\\rI})rӄ\Qb*(My\r)\ xi\5mn|ຯpDcb\\/9p \p\CN\4V|a^t\NjYs<\'aB,\}\\|.|>1AԒgK)U\"tSM\nDK)\YI\\x\\8`s2_\"66p=!̩CkLe4\"ZR\G\\\[Mi1\R\MbĆ.k k[RcJ\KƀU\d!gkԗ\;0\\o{6Y,(y_0\0\ы\"L)|ꋷW\!f\H`kFv\i.ٺ\_x#a,NcU)NR;\5\\0\r81/\JȎ:űң!ԟ\\\`3~w\0\"WQT$\"\ii6o\L\9O3\D\%԰kY3̷\\};U0ʖ\ؼfa >,Ri:\|,\\\\"\"| HU\JB0R 2-h\\[/\E8ey\/]\ǺH4H\\\0t\t*\i2\x?\n\Z\"Un{\3\e&e9\\\;\p\?KJ=B_>PЈ3\\r\Y\Uϧ\=m:\\r\\\i\T=G 1ڥ\\.34\]*^L=\\0\$8W0,6 h\na\\\}\|0\1e\]Pejz\Z&\j\b4ell\0xigo?\?\dج q5!n\3ha1dY\"QSؔ\Z{\O\\(;\\\3Eq\bP\"\\l+\b \iPw\y,] _\!FZlkp\ӵ-bm? \\e~\_}\\|e\-\\AB,\L z:6\}\ngWJ&\WĔV%\\I3{\lO}N9\ÓLE7\'\Z\{\$2#M$!\eM=f!\\x\\\'r^i R:mr׾)\_\ɜ \c\c$a\(kF\\r\.\,~Ges7N3jE\2SL#\(]SV)^*\KĻ4)a-\\i&l?=4Y\?0Ѻ\\T\\q\ZxΩϢ\S!s)e*\Y-qZ\b\2A\$I-m \\\\H1i\\r~2\y\~ f\go\_LPrӤ\TTiT\b9\;|\\0,CY,=@ꔊ\O\V\0Z\S\Fu m:\8D\__w\a\`/\\(Q\i\Z\I^[8\\\Ng\yT=9\4\XԳ9\a\xќ\vWUQuHc\\p͌;7\doBJ]\\\t\/\\ɭf\ K9i\^q\Jb5C7,U\1 o\P\t!qw\nSٲ.:L `E\V\z\(1ۧdQQZq7\{\YAN \Z\r$x\jq jdee]D\"Q2 \\"\?\_e1Ҵ\\|\^\\GN\!\Q\\Io\\\-GBF,Y\P\s\\\r i \\\r1Uvzz4S:\/K\Zivh \goZõo\\'\аx\JeB\\"T\\\rtD5 \n\B\\u?;lՙ\L;-i\ \\0%\\\-Y% !5yGdMҾOBЄShP\ \QV\\\9;`:9F{FXٴRCcL^\D\>XK\|˂>\" r\\\Zf+b)h/벎~\e!{\=b3LV\r8̢\\ A\T\Gi\{eys\\'b:|@f\}8 ~?*@\+yLe!\"D\u}^ذ̴ͩТ}\\BD޸\GXO(\\n,itX ȬH\07l.;b@Ca@,!9r)K(\aJY^i\^=ڦեÓ\S\"UMEN|:7\N(\\ǟ5+s9x\"X\\\lpRq\4Mv\؁1&u<՝\\61?0v\\ݻٷo\S\\SF:cػw/w\\9\0\~;7nd||gWK]p\cܿ\Y}<\u\C{\x\\ېl\4w\\̰k\.v\\ŪUҸ۷Wcڵ-011q\\\9Bw\/F8sws{<\\M_ؐ@\"\"=\\\ZFN\0\0\0\0IENDB`',1,'admin','2013-07-18 15:51:46','admin','2016-11-06 15:49:25','Test','baidu','http://www.baidu.com',0,NULL,NULL,NULL,'0',NULL,16,0,1,0,'',NULL,NULL,NULL,'IDP',NULL,0),('ae20330a-ef0b-4dad-9f10-d5e3485ca2ad','OpenID Connect 1.0 Demo','http://oauth.demo.maxkey.top:8080/demo-oauth/','CRM','d15b1f6f6590529f40a7f3955e9e2f182a453b3a241e460939ae532ef6d1068e','OAuth_v2.0',_binary 'PNG\r\n\Z\n\0\0\0\rIHDR\0\0\0P\0\0\0J\0\0\0,\\\P\0\0\0 pHYs\0\0\\0\0\+\0\0\0tIME\47\a~\0\0\0tEXtAuthor\0\H\0\0\0 tEXtDescription\0 !#\0\0\0\ntEXtCopyright\0\:\0\0\0tEXtCreation time\05 \0\0\0 tEXtSoftware\0]p:\0\0\0 tEXtDisclaimer\0\0\0\0tEXtWarning\0\\0\0\0tEXtSource\0\\0\0\0tEXtComment\0̖\0\0\0tEXtTitle\0\\\'\0\0#IDATxݜ\s\}\?݃)%jeDެq\\*@*Uyq9\/~IU^*o٪M\YZ\\:Eq\ \0qsu3\\0\UC\_w\ww\qBA>?yL\0\\|\\\\ZD6F*\\ 8\9SJ\r\I:D^J o15ֳr@M]\P.xC\0o\ ,I\\\\C\^\AN$\}\$(\J\4\\S \f*j{BARj <80*\ <122\Z)\\\\\hw\\\\\+q\-j2Iz\r T(\\\P\Z\$\\#:;Do*\gDO-[Ev\\4)Ρ\n!\\ \\\"JpQ\"Hy\$D\pxؾ/I$!!. |v՘\\ii`*wVp@}\ȇS\\n0X{p\ `\\rT*`\DJ8z\Yәg\"\VѾbp \2 \+~tf\⤔=m )U\n~\sy:){\\9*\@\0[@PJ\0fzjFZ\h\l\_|B^n*\\'2C\n묿}K~*O.7\T~ɉ rq4M\Ϝ~Rf\؎\Vcv\e\*\bbDeJ\´,ARJl\F\~m\8\nh\lm\P,\bdYrq\\\2;;\\\dH\\'M\3iD\\Qm\;@`x\r>{2\\p룛,.^\\6ϟ\\e44M\4\ w\Óo7x\JLWڔR(ljgQ,dѤDa\'\\'\*/ɠi\4q&5z\HFFˀ\n_=\\erbZR\79ibf\VDrVpP)%\v\~7\H\zw9\\0t\K\\\O\̡T.Sx\wi\0X_Ƅlޣo\D_wrpl[p\\m2\!;`p6Vŋ)\\~\ҡ\0mGbmj\a\cL\t;:N\r\\\~\YY޵oNz\\"U\%7܋ö\\\x\Fl6\T{).mYK\>#\\n#]\oU)\\\\R\rT,r/vWN199\\۷VT*U\Z&a\_\JQ !mN\`dd$LRBa\\0nj\w|\n\\. {Eb\'ϻ#{\.e\\\u\;\vr\\L\L\B\/\q^h$\"|\\`#!e\\tޝ\\\\qr\\[\G\\l\1\K3B~\ \tgiQ\'mO\\\YPB*7`r>\ݽP\1\\H$h\7 㫹^\yߴ*\\?W\@\A\u\\\݌HzRJ\Z\fP&z\ HZKw*\\};;;{GV\^)<< \1…s灣^W\\mO0BRJvҫAa5|v$.onK0\{?77\T~\=j!=Xi\\Y\Z4qO8\;P\ g^]\:\q _R\\3jzV\O-\\hə\w60ꅽ\/_]b:Dz,wq$}4M\\\G1@\"}\\ u̎d{v*溞aoȗ{a~\4\,\rL\pEVn,co\\\Qgkk\w\\r_SOW\\\?0j\\aqa\rW<ww\߰\/RFv}Z{t0\\u]\G~\\\Ԓ\l\/bu\F\0\\\\Q\,\rz=60H[u\\'c\\f]I\c!\\\7|\sͦ\7^>P\+\TxP0k\\c>\ʕKїN6ct ~\_\\\(K\UP\Q坾\s\cx*d fY>䧦xǗX\~\Wd,\X+afz \\ϑ\O0\iqp\\'zj7\D|/UB\޽\\\}2z&2Atp)Z6{\\";\ \\c䧦\秘\\EV*s$@57e\ \;]:\_O\Z3 w\˼z\ۍw\m4MC\pNJ\أin\ݾ(ӭp\B\ %\\\\h\raRɉ <\\\2\:ᄃ\h\09\?Ly\`gPHMQE\\\ߡ\d \0\'I}3\&GA\{ܼ\\\ᄃT*\1:Rj׹ >Ȩ\UU2\Zy\/\.}\M\\?>g\(\nZ\Q \\FY^\5**;\\\_\jmp\E\r\\le4d?%\\\𿭛xF:\Qh\\]{s\\fJBO\\i;\X(Ӯ\"d?9@\\\s\\O?-pI\Z\i{igN-Z\&VQf\y\\ݿm\\3AB`u8D\ R\\S0T\Ғm[`Gr\Z\s` Di(\nǙ\I&)肏Ci=U8柀\ \i\PvYI\0\0\0\0IENDB`',0,NULL,'2015-01-08 15:17:35',NULL,NULL,'','MaxKey','https://github.com/shimingxy/MaxKey',0,NULL,NULL,NULL,'0',NULL,11,0,0,0,'',NULL,NULL,NULL,'IDP',NULL,0),('b32834accb544ea7a9a09dcae4a36403','OAuth v2.0_Demo','http://oauth.demo.maxkey.top:8080/demo-oauth/','HR','4e1d7eb7b14ad658e8d9066c95902c852ff6494512a742a8392d1d16adc5af551e698f87c64032dc548d6ec7dc3c4863','OAuth_v2.0',_binary 'PNG\r\n\Z\n\0\0\0\rIHDR\0\0\0|\0\0\0{\0\0\0\\0\04IDATx\\\U\Ȁ\X \m삽`\\n\;(`(\5\=Ϝ\\\3\\\p{=\O\O|\\\>\?\X\~]\?x\\w\\}V\w\\\\\w\}ᮻ\\pn}\[o\{o2o\W;\#6{ӛ޴k_\/ˏ~ы^t%\~Wt\A]\-X{\\=я\wxw߿+}٧\\\\]\\\\\x\n\w\\\/\mo{-oyˣov-o{\r|[w퓟\\\vЇ>t\{\<\\n\o}\[׽\u\\^\0\9\\Y\zVt%\0\<\\>;\?\Ca\{\\C\Kûmݶխn\m\6]>ozӛ\Mnr\[lq\\rox\C6\x\\6̷\N9唝/\x\g>󙕟\ݻ\\\\o{;ꨣ|\\ \'\}\[\\~\w\/\?[lY׿\?\]|\݊+|\\{\?\ \\k\\v\ur\fuol\i׽\u]\\y0\._\O~\O\N?S\ĉ\'\}\s\\n\\3\8\!׿ߡ\\\?]}\ʕCZjUw\%t^zi\[zu\o\7M/}{ի^5ڪ+\\\\:]izw\k_{\Fmtʆnx@=6y+ж\ ;\s/\\~7Ժ+л\\g\-Yd?\\\\-\\. \Z!\7_t\{\\Cm\\\n\l\\Ê̷\\\ߎ-\@j\\m?\L\ZT\1\k\:ӟ\-oyKw\G\ \\% @k\5*\<\\E\\0o\to]Ybe\Gwt袋.\򗿌p\\\\C߮}\+_J\\0\Z/]t\\~\7!\\0]\\td\\Ww7я~th\eL7-.3N \|~\gQ\(^W<[xq}\k_\\q{t\o@^8^~Z\.\\raTs=\i\вC6ځ]\\\O>oFgy&\-Rfri`\\\\\wQK^\\SO,Ϩ\\0\'D|m 8\\0\'kP?p)\0`|軫X\-ZH?\n\\\\E^-~߿YEه9\\0\>\\A@5\0\\9\a\IOzR< \L\t$h\>YG\ OUo\ݍnt#\ t\\7\;_Ztt!\\}\\GKC>hH\-\\w1\Z\\O}jW%Ty6\\0\LzUΗLJ\\UنW\khx :\Go\Cu\[W!34A [h_\\\\U;4`bIUɀ-\RO4t3\@\i_j\\/\\0G\;\\\x\\jgEI\FU̡↘sb-鷪^\0O4\Їv\\U<\0\\1\34\4@\n4t\Ue0RjWbb\rКT\Fv~\\w\h\Z=4\<\\02\\\0]㯙o&]V!m|$x\\\\ǔ\t5՛\\R\|jسN\ri\;m\'\"h\0Ay\y6\ZG=\?\T\F 4{&-`&m?tk\\\\\\*vi\y\k\f* \\\\:\\0\r\|\~5̺L\0\p4=\\?qx[Ct\IʲC_\v@>G}\#\vΜm\\\'\n\ou-\g_\Z\\4k\rU.)^\Z\IaT\q{\\W\v=\\K\\nlc\v\rĤET\ͥ\\q\}i\\h>\']Piuxт>w]\.G/}\\i\\Zje~s\\XsaȚx\U\\ΔpZ\Z(\\\Kʨ`\~f]\nZ)ճN\!܋\x\@\08Vv\w\"#\ _\\\h\\\G \\c&\R/U2 lL\p\0pN \\\s\aJ\;\rt\\Z-f_\W\mR8\Z\ͧ>\\|\-\b\" !J1\|x&?(^\Wg1\Ik?\Zk\\\\0G∡i2>軬w`;(tY݈v\\"l>Tz$p:A`\P\lʮ\9\g\r Kp\Tb}Ѓdh=\N\?Ǭ n\[U\0>\"8\"\\\}<@?\{1y\rRha\i\N;\Ĕ2<Js ̤l&\\\r-n-\\\i`\\\= I~\s#[Ӓh^ 8n@&\>>KRR\2\\\Z\v99s}y@\\\˭@\o;\\n#WB\E^\U0=\}\r\' Ftaϖ0:&;&?\pU<\\7ل\\\\\wے\ \\r\re\ܾ\ùT\\7,)\\tjp]y\\=\lS|q#c|w+[*2:f S;\0\\޶r|fv;6DJ>\cD\\Y`\\V4 g}A\}\t}s݋n}Q\TP\0{ \hl\l\"4LL\D\0`\\Nuhb⡊OBO\\a[&\\ xQ$\\7嗢_M\=j]>{h9O&} \#vWhQRk\'n \\\ЌhF\?O\\ch{4ԏ\b292\vV\sDH$p4ʧ>8h\L(u \ʡ@vYz\\\@0%LV\kG-[\ϸ\\0`\Z\8\\B96\I\h\I>C\5[`ߦ|\\QoQ\@V#5\0CeKt/\0&\\\\˩\r\`pS4\&sP\Sν:\rhg܉\\1\RgKƁ\\\Y=O} (\67;, \D+-\!ۣ\|9\\ɯ`\\\'0XpX`\\\\p\0\l \n\06\Z+R!\X\'\M[e\\e\ZG\\ps\t˘۬\9]UͫKNѪ1`um8\vv3:\z\G)s\nrN \\O\\L+\\w\]\r\0A\3$\@y>ߜ\-tx\}\xQ˗!\0\L뵮\nL:\@G\ns\X O\Qr4iݾcdI6D*Mgy^\\\\t\;\#\-\]@ h_Sy\\oPo<:Uj!-\:\rGvYfg>Ms\\~`0\\kⅼv5}\:ag\"+nF&1 \I\Kf}V\{\\0E\D\57\nz\nVpU\v(f=ԏ\:\6ULA\{[\r2\\\_\lx\@E,v\@F`cD-Q4nv a\\U;Mx՞\1\\\DHC\@oͺ\\\)\Q@ K-jID]K\\p%5\17Z\ ȴ]ɯOkI p\fޥxS&\FU\:o\\R`#\=\\\*FnD+\\a i?$JK0$\:_^ͤ˩\f\\%\Lv R/}\\s\\\Q糝#Sp׷}I\'&\PUUnÊqΟs p\X\\g^\4\ri\LzJI\ϡπ\nTQ_-4\ g&\9>[r-)k^8\g[\\w;^ժ\]\z[\'V,\uVC̹\\y\!\\)~\6y6l I\~\\\v\LqI\R\rk\\2!a\fu _$ȼ\\\\0\S\\\YJئe\\\6\`zءq9tE\\d\n3\45\\t!1#`\0\"6A! \\\'Jn})\4͒& y❚\\\\ZC\\\\\" \'5\)zL\\\\"gVg\Z \A\n@nfWt.w\`3\0\"\kc0\`mJ\q\Is.@r|\z1R3T;Mr{fϮ[,#\\F0B\4{F\33Z>W3k@\e%л\xբpLILǴp\Zؒ\@a*x}:\uXA p`\$\0\3\\=g\D U\\\\Xq}\Zݎt}<]t{_2.+WϘk5\\[g>ZZ2 {$\\\g\0PGQ|ʼ\v\n/\ah{\IR0\\9\\\\'\+6&WfL1\&ov.\' \\\O,}\*[΋|\\ǽd\.S7ۧi鮥:P\\Z جf!,R`uJɑ0\\w\k\\1;a\b^\9D\0Ċ2\\绥\s\0<`ƒ113ˡ_bMڛ6\z\h\4U2N v\M\n\sM\al>\\P|\\\CrhW(Fa\YHHP4K@\;c \\x?]Rq@ \\\\b 3nl\}]o*0GK]GZ|>%\\IۛrE3 %J\Z_Qr,\:w\?;\۔D\\:\ff\6\\\0]{\\0cH-ŷ3]i\(S?rQgrT\]Ш \>D\]\4Ӷ2O.}᳁\jI\0u\M\n\&\qAܨ\0[уW\/V;\ܻH\k\r\2Ԃ\g\u\J\SQ\0O\0\\\\\0\8s0ev5i?\x߁2]0\\Z\\\E \c\g*\9\~g>] x\'#\'\Ч\0?rLsA\S\\HK;߱+\D\h9\rh`=\h\:\Z\\'\Z ]q,\pE]S\0(6x\rPD;\0\\Z_*Z\0f|Kl*s]BIQǏ\\bd\ZG0IG\|:iԉPqEo\\x\aX\1l10ʚ9ΨV+{\n\\{2ν\4\\r\+ \|#c\0w\naDނI\\{ \F&`ﶅ\1\\5鐆9/#S(>;1s\[\LϔV~\<\" ٧\`G\v`\Xgpq@\'\F^Jj\D~43 \\Í\\nŷ`F@Bf_LHW\"jy\Fk\"P\Ah:/6\侢湂\},ߧ3/,\r!\`MUTׅll9圉\#\\ \rx\\'\ xͶX\r\\A1.6yPR\(\\\BE-\Oqh\\\\\\Z^@-\1 Ӏ6!\`JǏ\̏=t3[ĘV(bd\r4\9\,\n0\us\ $xOk\s\\\\E\0¸g/1˥\"}L9\\ä\\Z%r\5Yq򨀍 \n\5\\\=r<63__ X n`\[1]!\(#\#p1d:W3N;|hRu \0~3\\0\_*OK)`QBΤ\p.Y\\\x6-5\ (;Ϭ9*\LZsXe1#LsS1c1O0\\ZI$\\~\ejZs\LP\\Jc\\^F\ \Z r\ΧҵRPx\&Y!\=w\%?:/\ZzMB\\򷑴.<lRؚ`HD\a\\'a\\aN\9o\\nE*Psh%z~\wAf6\Z}t@\\ :\yK\Z\k&\}X\\Z>\VC \i\ͼ`vʍt\\ZPa>\\6}`^^v?Kiy5\"PۘE\Ze[,s\*\`e\\\2@\pn +ͻߣ\Wk\r|/-/b {E\\Jי\t6<ܛ\\j xG\\koo#y4\'\8@\/j-E/HC\gˣi{1JJǤ13Zl\w}\`W͡ ČMfᣌ\\0\{͉i>Z/\2h>㏴\i8 g#4\0=ZVogئfz%ծT\\ț~#m&Ĭ \ \\XM\1uIߒc\\v-40\hR L6\؞IɧLmvI\\C\\"4A\'H\\\\\Nڟ\\L\\\9y}xx\_7)\X\=\"#h`j FlhcR0\h<\\\?E\kbO+,S\\ 8toKT\\nZR=zV} ~[ \.m뗾\A |r)-\\F}\\܋K\bn2\\]xM\m\ͱaIEL8MBݱD 0 [=@f)*\0s\ZڜC3\ԺL\"\\\'`~vE)N\\% m_\җ>\\oo5y2~P+6\\^\'fj5G\h) -g21bRQ:o\O_\2ã\|̸\{a\"q\#O1\n>)M3$٧\\L\Dή!ȋ MDrSp۳\'\0\ZlG\'%{a%d(t\Y݄\@guGc>~\KqL0̿\׆tF)OLj\{q$f\'\N\\sif\\\Q7B\\#` &\6\\\\"4Lo\"l\:>}56a\\r\o*\Zox\D\"CS\\m\\ל\\\_t2ϬG@K\afrr\9\uRg1\4\ZC`c\"a\Z\;\j*\MJ1\Mn lob4,\\j홁KH]\'`\c\>o\\/2Mj\Zl5\_^VD3<\&8a-\6o\B\no\!}y\<\r#&Ra4L>^C\*d^w\Z\\C\\0s\Հ6E0h@%X\l \ǦHTDf\ \#V\0p7@ H1%\p,\\*~M\n6*_~:+\R\\\0\\j.;ɍip\\\Zb\_4]d>\\1[)@4\\@]NJ\~4P\\{\BLnA\e*\m4Ћ_K2?e=-\n \"d&\\\`\\cR@ODKS\W]<;L\׀O|L&\4T\ri%%;ը\* \=POAyi\\\\/kL \\\0 1u,\0\ՇgD_PB(;\v| $@R蒹d&\\1-\\n~S^ؠ$\TALtO\i1.a\t8):\\lE\뫆JU\07\Ё\\ ~j \\\1\7\_-B8~i[t@E\.9;ȑI\o\&$+- \0_5\\ %kR\j@\q`Ǘ#?{\0NKغv\lZ>V3u})\r ($xk5}\K\')4cBB\\0]:c!`\\\c\\Y\g}y)\0lv\0v\k0.\\\\Rjelm*[ZmNoSN\~X^O\<\BM\\,oXF\\1J0?qA>t\\\\j\07ʨL}E)<0?_撆!V\2C@\U)6\\\"\\x$\;\r\!\AU:\zS\ CKc_c\pL\32Eh\,\Z\"L!\\L-mfe\!)ߍ\"gw\da`H`ŸW\lJ\\2\R:o*\\\V ۙhe\NJ\nQ%\S\5(jb[@\\'\\cf\v;\Tc26 2\}9t(,Y\ \gek\؎yyYR\9k\\?fҏVs+Uf\`\\N\Z7‡IW\0Ƅh@\Z\"-E\0\9\\0\dm ,\\V H\Z-\/fڐAr}\򼬃\9Äs\jmeEfV٣N\c\\\'B\:@k3syO\(\0`48J(0\hF+ \0\J\\ߪ.1}I! \gx\\r\Ϣy\"\4ᑊ̍{-/ys;Z\r3>\1\y}fv\0\\>\4\g;\(\b\\\\#0A\\\\\0;\\Z~#hg@\}\0\\Z\˫DcD\,\\6Voܸ3[$Z\>\\>21M|z&`ah :\+weʁKXV\\;]3\\0v{\r\\"0\u<#`\\\=h4a 8\,\ߝ\3jds\\*ާ(`ֈ#\IaF5@\Qi3\F[\B\\\\Ϝ4TF\\CL\\e\\=[0c]w6 ï Xlʽ^R)=Wt\njF)QL \0\"\01J\\Lt4\T0\\(\\[ X֤\l\Z\bdks-\ke\8:<й\PRBϥ\0%\\1X\lZ\}@ 0 סypy/dDC2y0Dhx\0(\0-\ gni2\,_\\\e\0[\ʘua\\\w\~\\\]}ϬLIΟ}%\ʼ?\n3\\0u\e~\'\\Ӏ5\:\n\4, y\Ȗ\KJ\CFM(\0G}WH\\0\\"\\"pfm[\\RRgR#@۵w\Z웍(\\,X\>X׭\qЍ\\jcΫ,RerMTvc߾#> PJg%C&9\03:\5B\}\\_g\rv#4>\DꙂLPtH6@ZJ\?(\\-Js ЏR\\Ae\wCy\\0\4 Ҷ9*\\;\..Y,h\"\h=0T!|n_{L{\qA r\d\;lLp\楾\"\\i\ܐr,7g^1W\Z\I\\nGƔeDM-\Zv\oQ.&>\M\qys2ˤ\vZ\m\Qc\@\nw>\:\og\\E܈\;\;@\\>`\\\Z\j=\\5>+asA*|*\\I]\nv6-˧#\-6RKL3X\B`ٶ|r˸|&\tR\dG-Tj\Z \K\\n8G~\\w_aIs7\HdH\\0K\ \-k\ZE3\,2G\\m9X_ZEە_§yXVR\n\08&4\N\ǚ\$\BhɃ;+7QC^l2\`ݕ\9*\ v\XeP\BH=M~\\Yd\> \b\v\s\(\x&nkI\vU\K4LĚ94/U4\\"\1 ZS\,X>\R^D\ lo\0WH#R+\,@8\^-0i\'p\"ë-9#\\\xe\\-\%th\j\@NCu\Nf$Oт\w6\gifiPRPK\7\/\\\\y0\0\m\7\I\о%s\U\.R>^Z{ \&۵w\P :b\1;&!@\0M\Z8Ƃ\Nd\E~4`!\Z\ϻg1`\D8\"cԟ`<<R\K\\\TX/)e\upi\n3\\g \f\\4\n\Z@޶AQ\Nj)̞h&O 9ܴ4o\o߁.\n\\f\\b\JXk]\Z+0*O\rt#fz\'\\0LF\vT\\\0\i~۞\,\p6\\\\4\bp+;s\N\n5\\\\@W{3{#L\d0io,\\Z_\\"ecq|&r?֣OY\\Ժ7&tbYp t\=\'c\ǔg_[1*,\ET\00 \0&LdGTh#\Gy\\r<(Q\|DǍ\=m}\\n\\G\\\[\' //:h?\= \\\e< \liLKy\=h l\\wۙ\uaL\\ \ɳ~\9>dY\!gƬϙH&\Z\-.\k\/~)9rr`,m۷\#/\62jS\\\rh\\uf\14`:F\3\sii\o6\Z4&~\ts\CExA]1HSH\0m*\0SC\0\K\p֞\G\!\\\\ \\\\\/\9\\j\2G\\2˚E\G&Y\"ZM\\r>9O\/3ˎ\'(-\m\|\|r͹l Z-0}\\\n\.\_\\f#fu\m\,+\(1\b\0rj4Ṙ\n4*\Zاۧl\g&2f >5~q=Ñփ4\P~\\\䵸@.3 \5\\\0D֤\|Ѻhg\\\k?[\qPQ7\E\\\^\\\6#\ZZ\~Am޵\ƾM~0`\"o&N\\'Kt[?\Z[\?oش\\nπ2V.;+з̷DoQ~}A\r9%vG\3\\5\,,\70f\Q\# c\ߙ_\)\pH=\1*O\Fo1o;\\ğVھҸw&Ԙp1]-\',4O@\'g= ^&e:\\(Jj\>U\l1\/B_Y7U)tQ`]!ś\r\\\XR\~B:\\'\Z\&=\\pfX3\\rd\\I\\U5\N-]\N`ȷ\`\\3!BF.ϫB\ %D\;l8o\\g6+`(xwMs:`v\08\T\o%\x\\WiR_N.\\cӥݛ\r\\\(Wj\T_\b9i`\\]4}Yi\Jێ/ְ\\{\\ \\|o\*\;\'5\0\0\0\0IENDB`',0,'superadmin','2013-06-05 15:15:03',NULL,NULL,'','MaxKey','https://github.com/shimingxy/MaxKey',0,NULL,NULL,NULL,'0',NULL,10,0,0,0,'',NULL,NULL,NULL,'IDP',NULL,0),('c1cabfaeb9a448028ffab2148da9f65c','QQ Login','QQ.exe','COMMUNICATION','7a1e2f19c8f21ca9405690d2fedf8c4d0d9f57e9a797732a074689ab39238a2d1e698f87c64032dc548d6ec7dc3c4863','Desktop',_binary 'PNG\r\n\Z\n\0\0\0\rIHDR\0\0\0B\0\0\0B\0\0\0\T\0\\0\0\0 pHYs\0\0\\0\0\+\0\0\0tIME\ \0,!C\0\0\0tEXtAuthor\0\H\0\0\0 tEXtDescription\0 !#\0\0\0\ntEXtCopyright\0\:\0\0\0tEXtCreation time\05 \0\0\0 tEXtSoftware\0]p:\0\0\0 tEXtDisclaimer\0\0\0\0tEXtWarning\0\\0\0\0tEXtSource\0\\0\0\0tEXtComment\0̖\0\0\0tEXtTitle\0\\\'\0\0+IDATx\yU՝\?\\\W\ZٛE`PP\HR#1q(5\\Q\dcQ \8\]ōHD\P޻_w\\\f1N\\\T\TW\\\\\9\>ẮdH(hW4\"!9\r\iDNC r\Z\@\4\"\'틼Ygg\'\ronax7\ \\bQWg\\ڼyL6\ &Fkk+\^}u=餁c;8\{R\"It,.\\"N=3\\\'b\MdSO\y6 B\0\-~r͵\r9\wW}_\+^~m\n\n\\ݍI\9&m\:&\\}\"c¤\u睌7nJ9&˟_#\7젨d \D\Z\sQ%M}(Rn.]JCC\\\M\\\b\\߰a\vB\/0Lt=\\RT6w\\\J$A{s?R:;;\x\wy? \\6g\:\t/Sc\\/\86\?\p]gE\<E \i\g?SAD\n\qn\ҩc\\cLvs y\x\\Gs\>RJl\\\[n\\=WqH\\\W^\\gپx\Wh߇i8k8I2\\i\\PE\<\KM*\0 f\9 .\k͟&g/>ش\\Nm\\\ V[y\\wן^O(\Mp\!<\rhصkP\ZM;\x$\g_q+Bp\WcO\:.X\[C\&P=\\'$sxU\\\\2(\rD@|\x \\\\U?\[Q\q=<\ð5\Zdɥye#\6\e\7ҡ%@*\Zi AYk$ZZ\\ORIJ\$R:\\ZckqƏRT*\\ ]=\nMq\NK\}@H\Z ddȣ(:!\eQѻ FS \2\el\'Ns\tS\ֆ(YaP6tH;-4\mJvG\r1R YĊ`m=\g@q G\$N?cʢ\\\Jb\\c2,\ɜ :Ԕ\qP\\ 0h*H \$BW7ttaB\0a{s֕fGE\X\()_ B9>\k\Z\\ۦJ\\Hv`\V\qn\Ž\\G\9jw7t$q1\0ĵ\jk\'\0H^v%jXvb\|-\Bg$z!Zؽ2:dl\\M\Htu| #XCT :J8 \gԨG\@6fl\\\\\Ȯ*\r\0\Z\\\Qlp\nu\C \ZE:B\ 1m\r3Ґ\\\L&4=RU\rT$ Z0\8l|\"O?F\#2\J }>п`y{\\$\\A\־8ΩsO\U\ܸu\ ʀ\0UUPU\\\'V(Jւ3$(Z\d?i86\\\\\LWQA\_\ c[ؖ\_\o㳃\K\Z;w歘\E gEL?n\Z+J\?g\/\\7T*U\< l>(HP\0,W\\tȴw\g_l$Yg1l\4m:a-\zJ&PU\r!\DUSy\u\\\_\q]t&W\f+P8İ\E[[I=\iݽ.Uw D(* |jo\n\\MT\#\Ɲt\\\\Ov<\`n6l)*)\']p - Dzx\7?\ (Alzo3i\{B\^,\DN\Jڱ#\\!bmITaǠa\\0\y\\`\\Q$6\5\S#뿺\\루\Z\H\i\wl\r\rf\M\\܂sh9\qpts3Z[\'TK\n)(p|\×}\Aj\%\\y>mC@lˤ;\߰\"J\:\aE2M{q\0_7\Y^\0G#MZ{=B\n#\Cp=\q=OeRٜЗ_$\\Χ }j\8˞w\c\n\߷ 0\bDۢ?\vڶL:\\Q#\˙:\\\Z\U\r 6ܼf?9\&\ny\&>\QOѼ3i9;L,\AƊ+jH AN\0\\t\\,\\rG\ƺW\4s.[~u31@r\\\'7,\n\\C87ͷ\\\\\0z\(\stǻ\\q\\\̘E˳Wf<=SO$\T>\,8aaXK8e\\\\aDp\K\"\*qI&\\|\E Ġ=(r\\Xy\Qa\1iUh B#낞\\8\b\\. \\r\\\\wp\Ya\2\:m&-m V\zɴ[\\~Z\\-,\\q}|)\$\K\K\tHkP ??\߬[.,=\\9\\u\'|\\\\l\\v<,\'; =!;$JaQ!\=g\X4%\5һP\B\~{3ϾjCõt\W\ O\+Xv[9Ͼk\⺫F\C@U\rM(^%\)\`\\r=\E\C}\qn\\r,\έ\ΐ? Tޚ\؋ \\T~d7h b\ƵϜK\`\\0\7|\~VQ:s6W*&O\8H\AE\\\)%$\\ˣ+~\\O\˵s{|S+!\jf9cAl\O|\\lx;^\v\+g˹\-d\\4\r\sU8BASUA\r!T[;y\Wx\\u_w%\n\T\n\H\\\ s\C1\\[+\LA ]6MPUf\\\c-^{+\\\\>AلYL1 j1XEQ0m\v\\K\w\{ql\\\'OP-,\w@\²<̝\Z\AtUB\\g\2P\\Q&8\3&\Sl\]G\\d1\\\n\\2TUÍw15\\qqL\rEQA\n \H\ \Us\? \'\\]\5/\\n\"T>\jip_R9LPefbL9f*\\\c\6\bFE\0MH\ TH\nH \$HӥP^\0\o#u4\\\\\\\y\Xu\4R\4\\0tSҕ\7 أ®9\q\D\"\\;O\ZE۞=\\4RP\t%=J]\^S8a\s\1TVVe,tvv\\\DKK tw`gRX}PXQ1\#H$B,##,2 a\\\KSS\M\$\]ئ(\B3bDZUUU7 \RJ2 L]\\ !D\"\(\p@/\\>ibc\v\I\\NX$B^^\ht\0L\~\@\4\"!9\r\\\0AN؆\rM\0\0\0\0IENDB`',1,'superadmin','2013-05-25 09:37:51','admin','2016-09-27 23:03:17','QQ登录','腾讯',' http://im.qq.com/pcqq/',3,'','','uid','0',NULL,14,0,1,1,'org.maxkey.authz.desktop.endpoint.adapter.DesktopQQAdapter',NULL,NULL,NULL,'IDP',NULL,0),('c3d44bb1-e2c4-45dd-91ce-43e821f1321c','Liferay Portal','http://liferay.demo.connsec.com:8080/','OA','d9457a9a9017d2f92ce3d0b58e4328ea637dcc5a434d3bc900bd5f07cd1eda86','OAuth_v2.0',_binary 'PNG\r\n\Z\n\0\0\0\rIHDR\0\0\03\0\0\03\0\0\0:0*\0\0\0 pHYs\0\0 \0\0 \0\0\0\nOiCCPPhotoshop ICC profile\0\0xڝSgTS\=\BKKoR RB&*! J!\QEEȠQ, \n\\!\\{kּ\\\>\\ H3Q5 B\\\\\\.@\n$p\0d!s#\0~<<+\"\0x\ \0M0\B\\t8K\0@zB\0@F&S\0\0`\cb\\0P-\0`\'\\\0{\0[!\0 eD\0h;\0\VE\0X0\0fK\9\0\-\00IWfH\0\0\ \0 \00Q)\0{\0`\##x\0\0FW<+\*\0\0x<$9E[-qWW.(\I+6aa@.\y24\\\0\0\x\\\6_-\\"bb\\ϫp@\0\0\t~\,/\Z;m%\h^ uf@\0\\Wp~<\5\0j>{-]cK\'Xt\\0\0o\(h\\w\?G%\0fIq\0\0^D$.Tʳ?\\0\0D*A,\ `6B$\\BB\ndr`)B(Ͱ*`/\@4Qhp.\U=pa( A\a!ڈbX#!H$ ɈQ\"K5H1RT UH=r9\\F;\\02G1Q=\ C7\ZF \dt1\r\Z=6\Ыhڏ>C\0\3\l0.\\B8, c˱\" \\ZVcϱwE 6wB aAHXLXN\H $4\ 7 Q\\'\"K&\b21XH,#\/{C\7$C2\'IT\\F\nR#\,4H\Z#\\dk9, +ȅ\\\\3\\![\nb@qS\(R\jJ\\4\e2AURݨT5ZBRQ4u9̓IK\\Zhhi\tݕN\W\\\G\\w \rLjg(gwLӋ\T071\\oUX**|\\nJ&*/Tު UU\T^S}FU3S\ ԖUP\SSg;goT?~YY\L\OCQ_\\ cx,!k\ru5\&\\|v*=9C3J3WRf?\qtN \(~\\)\)4L1e\\kXHQG\6\EYA\J\'\\\'Gg\\S\Sݧ\nM=:.kDwn^Lo\y\}/TmG X $\ \<\5qo</\\QC]\@Caaᄑ\<\FFi\\\\$\m\mƣ&&!&KM\M\RM);L;L\\\͢\֙5=1\2\\כ߷`ZxZ,eI\ZYnZ9YXUZ]F%ֻNN\gðɶ\\ۮm}agbgŮ\}}=\r\Z~sr:V:ޚΜ\?}\\/gX\\\3\\)\iS\Gggs󈋉K\.>.\\Ƚ\Jtq]\z\\\ۯ\6\i\ܟ\4)Y3s\\\C\Q\\? 0k߬~OCOg\#/c/Wװwa\>>r\>\<7\2\Y_\7ȷ\O\o_\C#dz\\0%gA[z|!?:\e\\AAA\!h\쐭!\Α\iP~\\\a\a\~ \'W?pX\Z\15w\\Cs\DDDޛg1O9-J5*>.j<\74?\.fY\\XXIlK9.*6nl\\\\ \{/\]py\\.,:@LN8A*%w%\ny\\g\"/\6ш\C\\*NH*Mz쑼5y$\3,幄\'L\rLݛ:v m2=:1qB!Mg\g\fvˬe\n/\kY-\nB\TZ(\*geWf͉\9+\\̳\ې7\\\ᒶKW-X潬j9\\(\x\oʿܔĹd\f\f\\\-[\n\r\ڴ\r\V\E\/\(ۻCɾ\UUM\f\eI?\m]Nmq\\\#׹\\\=TR\+\G\\w-\r6\rU\\#pDy\\ \\r:\v{\\vg/jBFS[b[O\>\\\\zG\499\?r\C\d\&ˮ/~\\\\јѡ򗓿m|\\\\\\\x31^V\w\w\\O\| (hSЧc3-\\0\0\0 cHRM\0\0z%\0\0\0\0\0\0\\0\0u0\0\0\`\0\0:\0\0o_\F\0\0IDATx\\ڽJ\P\\$i\ҏY[\Ap\\^\\\\\\\]š\=\\j\~M!͇C\Z&m\y\{BÁo?\|\GV\\\]\%v ڗ&F!׻}\0P0a4ǵ\0\l-AP\\0\Vv{\\\\kF]\^W^\9;\MfɈ^9E~ c@1krcy\e )r\\ZJ*\'&(4T4\n*Tɇ !=J\n1nGb\a?r\c7\ZI \\\0}\,\\r`\.vRJ\F\'p]\\:\_0)= \T\l_Cp\nGad,w\u貑1\/θ s\wկ>i\\8t\prj:\|Ӿx<\ T\^\Nsp\kOR\\N\Xn\W\\:ɚ5NR\wLr |p #`\\n1,0駭R\\aX\>>: ?QAtɅ:јV}b\<1\1eǙXQX\"ux*\\}\Zz_o\Q\ay`~y;\\\\w\'Ó̳.~j\ \>0)\\\x.ZS\]x\Lt塎g]Kˬ:~\\~d;iLbnK\8z%iSg\\\Kb\Yp\rLŝ侯ϔh\,2\]\\א\ID\ՙc\Z\_QdQ}sN%_w\FP#щY\E?P\ =8ߘ.\"\OԦ\n\\nYfuR쏡/c\a2OA ob\wZ\\7n N>\]7x ~-醙hGy\n \\;:vQ1_\O\s\Dux\'\\N\Z3N̓I[m2<|.I鰬:&&…h\E\ӓs\\'!a~x\r m\2ay/\v\\Ӄ\g\b d5n\R\+mJM,\\\\;:&ݰv\m0`Ig%O\D\"Ff\r<?=\jͤ/=)5?vib\n\zY{\y\)&\m N9\KL@\nxt\0q;t\z\\f \[\'H\\M>\ueKqR坔}\?{\plGV\\6۶x@9\a)fMO7Gdxa5qܨfv)\nu\:Y1OvJ\%IΛO\\"[4%\;\r\\));̠DD\\0<6ز[\wl^\Cz\yij\ѯAղ1Yu\7\\~ U\ QݷFNn\؉ w\7\n<+Y٧,}\L\k5{P\'|h .ע\r\Dtn8-\'\\Ҍ-UV.˽&;%19\g~m\\02ނ\Yo]cJyY[&l\)f\0G \wH.J\DK#]EYA_ÍW Zd[PT7\<\@`\Q\6!oH\A\`%P&lFcL)\rk\ɃDdOL\!%,tH6?7\\\"\i\p]vj=7\ӧ0̈́^\'ٵA0K\?e\\2/[B\,\wl6ҽNg\\P\;..ݯo\)\\\\/\Ɯɶ2\N{nKi\)K\â[wJBZuT,̕#Mx`dW\d\z%,-xd\\\tHeU\y\+\$VOB}R\uo\r`\n\O\s\D7EK\B\\\z.%Ð Q ڃ\ \\07\\'voo1XM\\\ư\\$.%J }~\r7^\3v\,Ul \\b_\'r1\Z \Jy\\}_Ku7^el !{\V{n.\JY \r\35:S ZXq,\-&VH\\\\\\0 \r\q\q\;\JC0+g)\c\o6Yƶ];g<;,\\!ǽ O۪#\\eS2;\-[\#\F3\\"\mRxscJ)\\r\K~ \t7>iI^|\E!; $e\1\\\\klZz\UF\\m12D!;\w;N\h{qQ \O\i\'[aE\)\0^ӝP\\\*\\,;\GZz學D-\\Yw\l\ZႠ\KND7Iz /č[ޫy\(I\F~ \W\0 \f!˶\g\\xzoa/7\Gva1Tdw\n]MDK0]vT vw jS(l\Z0f\h^E/\x\n\\\dI%\G:i{]Q Զ\\oЍ܅&\\/>X\`R#[)2\rm\\=!\\%\qɤ~j㒡\\?oqq\\d\21J\l+h :Η.t=Yu\bnbQUl /\>غa4wwmem\fxT2X0lsb3iI&,\\dfs\"0lqvȦ6\^$\ nm)@Y6`&;ܪ\ǗNYU\\Rq ĪD v\q,3k6nsi\\ܐ\g,.Wll6 ׉)<2&r\\#P\u%tMIPO\ 0#ŽK\Œo\\.]qi\\ \\B\\\\O\\H-rѓn(OVYv\n7S\\\5.k\\\w\=]l\ߍP|}\ Iݷ& 2Qk\h&%\\\"amR\\\Z :`Y2͙A\ʵW4_6U7I=\0L@\_<\&i\i\L\[e|\͂\\\` m\er\j)\M*x\ҲjGLk\,\>F\rl\]\@Hɖ?\qVq\/Fn\k*G\\\Y\}$\\'\{ݲfA0\\3\\\\\"gDJ\\{t\|} `\\cMw+φ\rK=:ʤ|\'\w>Y\\O\\\\$n\3a[\;I\'PYy&\@SLK\\\7GKU\UA\'c\w8gڱCm̈́V{\+\$ epD\hϢ^\%uSU<ߏu\*X0\'>⎩b\鄞\}\r|F\f\\nW_\Iy\\\,C%ԗj&\\\}P\ΓpC=֛#(ς\ }\d\޲ZUμ-\eårO\s\%u4\/wB\0ǺKj\>XX%dݨ\=\J[TD\W\E8y>K#04\n\:ge\0=\0{:,ƿO\\a\:\VR\ץ\k|KG\`\\ .)\0\0\0\0IENDB`',1,'admin','2015-01-16 15:33:02',NULL,NULL,'','网易','http://note.youdao.com/',3,'','','username','0',NULL,8,0,1,1,'org.maxkey.authz.formbased.endpoint.adapter.FormBasedNeteaseNoteYoudaoAdapter',NULL,NULL,NULL,'IDP',NULL,0),('f1e33b71-f553-42ab-ae91-2fd913854cda','Token_Based_Simple','http://tokenbased.demo.maxkey.top:8080/demo-tokenbase/sampletoken.jsp','E-COMMERCE','1729a1ee16e532d61e097c01054dcfe7','Token_Based',_binary 'PNG\r\n\Z\n\0\0\0\rIHDR\0\0\0D\0\0\0B\0\0\0\Jp\0\0\0 pHYs\0\0\\0\0\+\0\0\0tIME\ ,%6\\0\0\0tEXtAuthor\0\H\0\0\0 tEXtDescription\0 !#\0\0\0\ntEXtCopyright\0\:\0\0\0tEXtCreation time\05 \0\0\0 tEXtSoftware\0]p:\0\0\0 tEXtDisclaimer\0\0\0\0tEXtWarning\0\\0\0\0tEXtSource\0\\0\0\0tEXtComment\0̖\0\0\0tEXtTitle\0\\\'\0\0kIDATx՜y%W}\?\\\Ei\hX\0If@ $(\ IXr+N\ؐ\E06c,,M\9h4\h4o\\w߻ows\9ݷ\E#UIW\r\\\\\#tf %d\vM\ Q\\\ը\2m\uIJ%dtt0BF)pXkY^^׋R\')O\\'|Ng)%\Z\0,p\"\oւHcFk@ ;\Z\`p c!=Eq̺SkR!!w!XKReff\\Yg& `eu\\eFM&\&QJaq2\X\0m /PD\\Nr\\a?寿qG\\bA\rqr\\"@*~T~$(\nBIAH\#$ \bR\!@T*P\h4jm\V^W X\\Q2:61\OR+g\#`玭|\\\\S}\\\4X1\Z\_]r 7ͥtͰ@z\\]m 1\\\Ms\W2ſ\ezjfffl\`a~׿F:R*t7dH`H+\\\a0bh\lK2\"$\} \swȟ\\T+.\\\\wR\n [j\r/D%zk \\nR9\t-S5`\r\\`\\"\n{\N~OQ\+L \Zlq{>\2\a#B!D\RM%\/K9t\'x\\Q\.\X^ms\\\^m`EHPm5\JH(\\nH \\Z5XcJmK\"a7}@@\@P|e* \sjXc@\BEd:??\\\*\\G%\\Y[\'1(ܦ_ұY\H\0w\BH\0,MI4\0&\\\2 tq \"\"\((0pd\\'ya\n\\\]( \w0ư\8v{]npTZY\"FI 0\\g}.RD4\ZM1\\\AWR\r$+\4\hL\\VD\C`љ92\Rz7? O)&Y\\!$Ac\9J\`ʺ\)%\\\h\gzz\W\n\9\\'&VR\r\\#%9!\R6\>\ ,ÏW\ǟ\\\CtIYg\nu-I3\0`x\ \n^M\0\\1\fZ\byы.\o3W\\LLN>bt\ZXY\*y\J\&v\puWe{o~\i\\ 5o\\~wR\VXg{\IW_K y׻\\\\ш^\³T\njT@)WYRT\2aQJ\"NQJQDUHuY[6K\ɶ\\ \Z( \CF\"]|h \D!,&Kɲk2\~\Mt:t5Q!ZC\K\n\Ёl ku\S-.Z \\\/F&(\l*\\50_\={\\*\\`RŸ 4\n\\ZK \F3٪{Fe\X8.\ % H>\ORxtBeEŐ&)Z_r\Nj?z\\Z\0$MS C2diRZE%}V-$\\\{;k,\Z\RJ3[\)/d\\0Z\\[\"iیpNDQ\\U\x\m\عG~PHD&VcmT\\k\lE\66\n\Z/FGa\h4Ð(R(9<\Ic2 đP\rAPq\\!lE\ ۷o\\_\(v\\\iZB|zcV\>ʷ?nK\!MS\\QDAH5h6l\h061\\\\\\"\90\'ah5Ƨ,N1\S@H5A@w\u\fgg\o\\\n:\m\\2VdlF\\d\\gI\ \u\qJ\\@\\rϺBz#Xը\\O\bO\n\&Nx`C\%D\\i;G)T\\\\\\\jTHҌ(\n\\\\\_fskRi냇뮻i\[\u\$v\D\Z1&%JIz^\`\F\0rb\\x\{8w\W_}-3sB\g|,dqa\GIwD!y\\T \"Zk\\9RJքa\O4\ӕ\EZQ{C\0ƙw\\h4\n\\\%_\\3\ࡇ~\(>Z^\C.rZM:Fg,JJϓZ0%Vk\a\6\\<\qa\"+\:Z)]X=&&&\7\\W\;177\\\\n\f>\nu j9@x\"Κ\\\",xaג_\\/ l\\S\ĻO\ADl\0J$Ic gn\}x\\@X>\)\h0p5H9+yg K}>9\\\d\4 Q\Gxȳ\\&ri @Jv\\=g\_\u\\o$\h\\AhPFn,a3\4w@\\p\T7a J)\a\C\CP*(&\<\\_\\\\\Ǹ\X9\\\E\\0\]o^hdz:[H\\NarQ\;\2R>\(\B *-J9#9s\v>\>=\\\?\\]\zͳ\\\\ja\f\";\\᭰I8\0$|>6\ZK܏ɲf\} H\\Ӈ\wRZ0 M\qL\ZqÍ\%\\|\w>\Ν;Y\\\\\"DQ4w\*\\+٩\u\\\\txò\DQ\3TE9\\O\gOP\IS=Ě\|!OjaHӄ4M\2ͅ\\?\^>\ct\KK XkPRcp\\ol~2{TP:\K\ٯujҤ\\s\\\౟\Z\'E\=XA\n(A \`LJƌV׿~o~LJ\\@WF\\NR@k\ΣI\[k}\\\[ i\h49toy\-\_\CTk:3%2\s\ťyPx\#@g)i\grr}\\|+_fjjvR 0\n;{=\C\\ +ȩO\\IHF\806\ZʲQ:5\s\m\\\?0\nט\\bB\΋EA\n+|s\_q\E\nS~Rv=\'c\Yi\njdAם. 9(\'\Uh\\n\\]w}nx\\'yG\e]\0\\ߍd0\n{ ;vl\:Gܹ \'u\\;\`O\|\CW]j>\\\|n \\9֓\c2wdiZT\Jgv\a9\j \\u\:\Z\lGYߖ/^9cvxw \"\4#LMM\ _\\r7\n{/?Exfʫ*0]\\\~7EP\\\k {&s\\\pxi0@\" \\\\t]ܢI_#*3[1\=~\6n_\\1T \LP*D\l\>ˮ]\Y__G\\0%#0\\ Jez=\8& #k\"?Ӛtn\s_΃no@<\\d\hmE\׾ \r7\V\\u&\}^u\\P\rc\x\-H\U\\\HH{F1 40I\\f\\b}qڵkrIqw\z\lC\\] P/\eI*7l\\?\\Z,//s\wÏE2Yz!p逥H\06\\rt\\VK\)9q.2I\1$ +s>!g\\WO^\Y8!0y\r^G)ŏ~#|dYFY!X__\X;XTN.e@~\NS\|ϋB1J\U\$q\AQpy5r5F\\w>RK\޽3Rfɾ}\5_HҌc\\?X\\}SIH\\\|QnL \Z\,..*ޫ\= \Mϋ܀$$٠\\s\s޽IBR!\\bV\\\Y.\\\ϡC=\g\}V\Q\($\sF\W\\\IHy3F~\^{Ç3??\\\\Z\c6]\\׉{1kkkiJ&X\\ bfv[җ׽\\Z\\nt\\nրa\\G\\K/\}?\\#ϲun8A*WK&\n\\9A@Aߓ\\\؁ۭ\j\\Ӑ\\W$H\[]gnf\\\\\U$acK$I֚ԇ\aRֱVFk\\\Z^B\n !IeYckm\\WJ\\z\"u \:\\\ \\q\\ ȭoYןkU Ah`Z\ JAU\\nE\̩Z$$I~,\Bb\\z;\\=܆\2 (z_y(\ˑ\\Ic\u!\'P\%\RӬp%0IO\M\u,!\]o^9!B\\\\Z_\\:&X`/Raț\\\3\I<ۮTB2\0#?ԛ\\\'\\l^\=[(\nK\0\\l\,z(\ch=Xc|R:P\ 1FEժ3Yfx\G\w\\\\.XI*./re\26>F\JͿ\\)[1BvsX9\\;\ڵjJ \\ZJHs3\6Srm!\L\l6\O\o\\ͥ^¶m[\h\j\*Tkqɴ|ߏ\晟_\G\\\KQC\\\\\\Q\)l\\L7YXko$ QT!pe\\B\e6!72\d $IbTdi\<ȷ\J\\\'h4\hPVV4\Z\r*\*Q%UFe,--\n0\ѣ\t\$\\n*{O7\cl\$\\\\RBUQ\r\\r\f>0\2\<\c Akli\jmadd#\k!\\TXL~\dk4\#S\\䴷c,뽔\n-z\]\\\k\04\\W\%/\k$ܻ\(_hubd=AZM%t\x\qf/\"\"֑I?NY\#\oDTg\˴Z4\Zufff8\g\nf\cv#䒔9\\5\\ \Dt@.p\8\ʫq0 I\[\_la=l\D\lZfc\9T[h&+\\(:\"#\8fd\\\ v\\]\'B@QDC1\WxHM\:\b)9\\\u\\o\\"`\e/k$Ӑ$h\\]Xk\:4bր\T\\6_s,A%\\y\\W`m0R \r0`||;w\h\\\vPJ\P܆xܢ~/z\s8\~\\rQ.\\%I\-\ejb8Tu^~\:=4\*x$\Dl0)#/\\.:\U8{jQKhRp\\9&\ڤY\uZ\@m\lyڰ9u\Bk~Ϯ]\z#\\nc^m]qq_ ^s25F\^\1\oFt\\F\m\\(V.8U*\d,M\\"\P\\m077\\W\n.[)J\\ \M\oи\YZk,e\޽l\6`w\[È\\\\'Wgυ\~\\311\\Lm\Y`e~aLNN\\vYX\\deC\+pR~bֽ23_H8}\[ݮ\<1\q<{)K\\\\\\^\8-x!=XƎ%\V(:\r2@kH\.tKQ#\iw\T\3f>4ϮL\0\0\0\0IENDB`',1,'admin','2014-12-14 16:14:35',NULL,NULL,'','MaxKey','https://github.com/shimingxy/MaxKey',0,NULL,NULL,NULL,'0',NULL,5,0,1,1,'org.maxkey.authz.token.endpoint.adapter.TokenBasedSimpleAdapter',NULL,NULL,'username','IDP',NULL,0),('fb1691c8-afc9-44ca-8b8a-65c13cc4e96f','Teambition(test)','https://account.teambition.com/login','SAAS','85d91f5f4cf5b2138da10a310148927c932b28703d753041cbf8acddd7535334','SAML_v2.0',_binary 'PNG\r\n\Z\n\0\0\0\rIHDR\0\0\04\0\0\04\0\0\0\x\\0\0\0sRGB\0\\\0\0\0gAMA\0\0 a\0\0\0 pHYs\0\0\\0\0\\od\0\0IDAThC\kU\}P}(\n!(,\\") %]4\а0\\6ڮZ\[5o{ij\] \\\ݧ3\컻ϼ =\\f\o\̙\\\t\#t\h\uF4ɣa\\\:sv\r\\"\'\K\ΐ^(xD\\;t\\\)\[߆\\ \k<:{^\nF~\zݗ~Bs;B:g~*\\\Ba\\^\\ҹ \\:\wOi\":α\\QɢLh\z.X\X ]E ]¥ \ud\nɢL\\jT\%Q\B-qFE 8-tRט\\r݇]ң?薏=܄o\0ח6 _\\U`(j\+\Z\}fEE ]f\\Zt\\>=\\\\B#W \]!\\Z\\\3[u@S6T\\Z\dOc\tߗ>\>\DΞ~\XЛ\\q+\\f\`L\GIp_D4%\Czb/4s{@\n\r\\\=U@!5էzR@j =\\\\NCE \r\P\\n\F\\E\\\\"ZJ\MT\*\@j֎f@j:Aj\n\|ЂW R,\\>I\Փ/F`cV*ŏưX/\Hzl:S+\z3Nx= !jR+._BE ͚px%G7k\Zj ]\*Zg\0A@j`ڐ;\{pIǗP\B~\e\$,4B1\\\\˸cF~\e\$|E\řgƬ9O\\ԉIf\\\Iǭ\s/3ffgv\jmŲ\$V\6\Q@`aH \7\Q R >ldL?\u\k\w=;;\}twU>T}MߙkE>R\\{ο\SksNX\0з{% G\@\(P[H\0\-vp+\"R~J*s\'.ia>@\\\2$o\\x\Zt\\\\\I\\VjF[&\4\>QvVq\nm\eα\Z\\焙\e\,\U\lȀn\\\\\W9\"Tٿ]\OMн\C27;b\&\0׬1x\Z\\F+;\D\Ǘ qS^UqA)\)x\a .]R>\\\Y9;/}z/\AK\\\/^`\`@kdaF#\3\\EjuM@a\l\'\\n~q&*zSwL\\\EȂ*.K6eZ\\]\\6wx\\/\\7>sWL\%ezqS%\b`\lgy\W\\i&QR\Ȭ+R᪫ϧ\,\rZ)\\Z\\0{\\s$ \cd\\#q`Q;u_>\\ūĵ:ցW\\\]\n\b\BT\'T N\GM\Z/~vF\\\$!s\9H\/2\'dƠˆ\\]Jm\ZBBH\[\'W9|\a*u\,\8\\#B\IfA+\\\\čF7JPQ\fֳ&03TnfsH\\68t\nI2\}\1^\\@+Tnr]\1\: 8г߫\SqYI\mijuHs\+\\ǰ\\b:\\\s9t\cۨTcLf=]W\\nU\WX\H\:3\Z)?c1J9Wv @|\`lJX9t\\*\\\\\bG5\\u[`~q4G:\\Q\R|ₔ7\2FJA\n:w\\3{\Jx\}3\wQf-( KR:\-2&_9+ \&ߍ\Z\a3ˑ׎1}d\Z\Itz\,\Vg1\\0\2Y*1\\/Z\4{l\uD{OTtX\8:k G/_PJ\rpDq\j\܉sI\\[C\\\'\!\-C. *.Ρ\5»vQ2\\N)|\!\ۍ\2uLb\+PiJ`2ln \M\D+EQ\\2\qK\'\*Ec\vt%\*\\Q!(\y\+\n;6Ezwڵ.\N\|\\;eiɐJ:zbsw(\3 Zu\UN>\c\4MCX2E\\\\\ݴ,e\ѷsP\\ \A\\\y\\И\ZG\:A+o ~9P\`V\r8K\'γw[V!*:֒Z\\qHr\\dH017\/\g\X\u@+0\\Rw60)YA|ݹ10w!AP!3OE\\\OEZ)\\wy\\Z:kb7\󏸵%0|]BA\\r1\5\0;ъji\yS46w\\!H\\n?\D\o6*\\&>g\KQ\\xXo\#\d\ZjNH#\M_\\j\W%\_W\r\*c\Y\S|\1fw%>u\\\r\"Ԟg\q`<@\< qN\ʶ*bJ߉l\M\n@x\%WㄝUͯhP Z\\6W\匯`\rY\\\,\\.ų\ܕ\Jj\S&PB6ιҕS\ϼ7Ȉ&\F(\\`,jZ,\\n\l0-\C(P:bRxg̳\ZL\\Z+B\q(\\\e1FqK\n\E/\w\\\إSl\h7p b0p_ߺ\T~6\d}\,c )\h;pBM΃թN0\Z\c\\ZcQu\\'>wW \\\m` \\Z\Z\?K9UCVipO;\=u@\zQ\\\U\v8(^ \6f׋\k$\ \҈_=\[\^\\\>Tw9bS)r\\ य&\< \`Uލ{\;j8Gv\\Ú\\\\k\]nmƀ\\w\n\"\\\e1\-w \;\OO\\Mw`2cI3K%\n\-wu\\PUۛ‰CoZ\95[ko?\Iغ[xXlQ\ZG\w\\pƺn9\;\n3W\\>\(\\\r|n\r넟\=V\o3)ۢfEچ jȪ}Ghg|\n\?M\7\J\\9\87RJ\02\C\߹Ɨ_e\,g>ǿs\rqH)3q\\o\F.\\#ՖQXo(^<\Wp\P-\L K\\\r+忊x\w\ Ytω^8U$\<5\\l\ߐ+L?\0\mn\\0~)_A\\\\\Z63,\g~\\q~\0u\\0\0+⢀?\\\\֊\0ͷ-\ \ x\\?zO\?٧Xe[Eŧi\p\\n !ϵ1TP~,O-\\Lju\\G8\o%_\A\\\0\?\1\\\g|u<ºkH;\'fR;\0\&K\\i\-\I9G =E\0~\W,\0{k_\kx5\Zn@\4^(1[\\0,Y\d\\/\e\0\\Mg~Nֻ\ H\0\\\n,\pǎ\j+\?c)(&/>J?6}(Jmuk5\Ls9\l8\\ހ\n(\n(\n(\n(\n(\n(\n(\n(\n(\\U\K|N\0PG:?l6ͬkVI($n\ƹ\0%A\0#Q\m>{ᵵi$p3 $\0\)\R\\\m~4x\\>\r\Zt\1\8E~2\0W\0\\\0TNE\$¶\5\n{\kRe\4\\\0i\0$_{j\Z?\[xvě-ǜKT;YM` 袀\n(\n(\n(\n(\n(\n(4<+\S#\4MKP\}6e{{Yx\BXE~\05\0\\_߲Ժo>3۷Ư\RA\[\\\`e\\p<\!E\0o_\?۟\n6mSǟ\c\&@\\rfg?w$bJس79<~\^ h~?w\-?\^}f\dG\"0*ѸX\޾\\00\0h6f\\uYݙ%2\ ՙXʷw\j^6&\:\\2^^\\L\\^O#YgvbIbI$k?iO~\Q+\ڴ׋<]z׷\\rNE\Z\\4 \Z \G:\0(\0(\0(\0(hzm?M\5 \6\\4\N瀨 f\'&*\_z~\\m?\ZCk{k\_hwIu?\Z܍#`\|H\"y\\g\\Gkq/\݅\Ο\=<\ı\\\\ڀ?(\\0e\àOm6\o:\\u]>\\s*~`\bA\H\{/\=\0R3@\}>x\ ٮ&\|uAc\\\\\n\bB3\2\Q_5s\0\Ho>z\u 6g\\Y;FKye\-m\d~ \_u~֟m\\}\"[\_j ox\\8Y\\c\]B\q<Fח\\\\Ew\^#P\u9<\/ C#\WC__jOً⽟\\\'UoW^8\\[\?w\\VV\0PINq\l,\0?*(\n(\n(\"L\\h\\ѥY\\\"D2Y\\0$}\0\V*g\y6{3|\'~i\R\7>\pwܲ)\0I\n1?v\_?|+}ǟ\Z!\\\Kh#+rp\\\\\E-\0QE\0QE\0QE\0U\xoQg\\Z}j3-\r=\Ԭp1$\0\0$\ \C\nK\\ 5K\n˨\\|?C-D\ ?\G#/ I\+]J\\\Ɵ\-j^1\- +8\amQ\>\0LO3\\ǫ?ş>w\s*xfc\7q\0\Vm\Y\`ᄲC\"\Z\?\\0\~[/\0\r]\qfW\6b\0\\'``Tq^\w\\\\Okج\?yux\br\FO\n3\\0\iҘRmP}yH蠰\\nf9\\\\g\>S\*ɕu/>^#gǟ;Jw\+C/nR\\w OV?~ H\o5LoKH?\Lc{k\\~.ԼiKk:9̗7sҿ՘j<xW\\:i_A\\\/\0oK\0>^\I)]b-\D\Mp/W~YQS\/8\/o\r\\'u+#?\\dP=؏¿*\\Y}k\\MU~\2\\v`Z\\n/OE/\'\O\]\N\ִjͿ孕\L\v\y\\\0\\Z,\0~hz\\pkv\lOMp\0\\b\qʑ_^~\mf=KDԯ~\Ť\ e o\\0mG\\\V\5N\y\n:C\\z{ͼ3\\Nj\ˣס>E\%K2\\^~z]}\͟S\4#\w\\ax\yw\6\ɠ\±x\1PN7\r\ǚz\tk\kZ~isaXL6\4S[ʌU\р*\A\ \\\\ \uk}F/=\3)pH\8\0\ \\\ ^X[\+>\\0ȕ06ܣ~mZJ3t\\Kt՚\\UIJ2\4GE{\|O\0x|s\>T\ƃڒ ,u{|\nmf\\boQSuGVQ\QE\0QE\0PU8#Gj(\[\r\079.~.|*;[y&mnȂ!Y\o\俽\\ۢ/^\˝sĚ歫]\qp9¨\2pV0\\)_ϽHdykR\"dKD\*RnFܞ[}\-$}\M\\\0\ZrKcL\P\\~}:cM\r)XI\nQR#\/\U\\t8n*@m\\U\\p\\q\:\0|A\6׆K/Q?,7\ã\>Y\0A\Vtp[\43䃶\rH\Þ\\I8Fq^U\rBm:Yq$SD\\'S\ÐAt\.\fԭQr\m%}ח\c\O1\k\|ԟ\~k\S&?ß*\\y\?Y\}Ɓ\Ħ\\ep&\0I;dQ\0\0? \05im[\\K\\l\Y\VL\\"%i2H\ \s\'\ \\gXiß4\WW\EQ\:\\B[_$\0\_χdK=7\7\[\0k.\r\Q\V\0٧؋ X\\0?\yY\2\\Uy?\S\\'\0٦\$}\O]\r\6\[K\\k\$\novm7RMY\\\9#q\e +\Z\\n(\n(\n\\O(l/\g\r\j ߉Q\ӟ\F\\\o\n\%\\0vC̀>\: \EQ@.x\\v\0\Z\0\Z?\+;&sA\X\nQ_]\\0\\HGPcl\\\I\8` I#X\ I\\09ɯ\W\nk/\\g\˦\%\bY>0\;1}2`<Ɗ((+\?coُ[\0j\0+\#Tεow-nٚ\bI#cd\\7\\0IޥTx\OI/5#>\HxT5\w`\\x!R~\~\~۟M\>^&}j\6=\0\\\Ge\\c \\_\_|-\ \.\\vFn91 aq& e\I<\0~\2~\Y\y>RR\׃\?J\ \\0\\\B\=\y_7\\<\o\lU)?\\݇\/uk\e\\0PoZkOS\n&l\1\1>\*l\`⿥\G\99Mݽ\r\\VjI \\0כh2\?dp5/#|k\rnj\\0+@|\ǩ|\~ݽke\:l;!X`{\00\nߊ_\Id׮\\3\\P7W\0_̼}\u<\,-\'Oߗ\\0’]{\\\\'\]Iԧ\\\"\0#o\\\\Ǣ\'\~э\[\\K7\Muiq\/AЎ\Ɵ#ρ]m5ǃu\rC\w\\A+\B]\\=+\O<;2\Z+\0,-ճ\0]׵*tM \/\)\0ޯ࿤Q\Z8|\\{Fo\\o\\X\\T\Ш\/\+\3?\bdFbxW=Zp\#bNOf2X\\bQk\7\gӱ\\\\\!,n\\\\ZW}7\\}Y\˻ l\*x$:W\\?%7<\MK)\[KLn-#?4n#\;x F\r~\ߴe\=r\\V\8/RV\\.T\r\\\2,;_ c\k\&\#\'\\Mo\\\^N\e\'M\m\ǰ\au\\M5\?g\\ZqT\a?\\i>\[F^]\)\0\\J\4ڣjDR(\0\@\Qoss\l 5_\\'\->sa\\ֿk獴\}T*$C2#aպ*ڋz׿d\\3\\ MxY\\aU\!U +;ՇEhxO\:|Iehz^k\Z K gH\@Y\0M~~iO\\'U-_\ z\0\n\l\Z6\)\B2@4g_V~\?E/\G\n+=\ÿ:~a\`\*)%A\m\V-I߰_C-~\&\T\0\\ uz\\']\\m\\V1\y?Ķ,q\`*?\0`\33\O¤\>=R(&VwVH\@9 \_?g~̞\\0\z\\K\rO\\ݕ\0\\6X&*(\0(\,\\<+>x9Z _\Vr\\#i+\ \|\0h\l\0\\\Z>GNo\ߧ\?\\0(\0(\0+ aZ|DͩY\0\rx}\"G_o\r\I\0y-\\0F\x\߉\"\A3:\\\0\=ñd}\?\\{Q\\`\/\\Xcp(}\7\?\~%z\0|Rfj*O\\\O~*W+_\\e\\{\[%_3\l\ⳟ\'\\I|߼\\,\j?n+_C\0:d6,:r xt%\\"_8|`G \UFUr8\\gK\\\\^nhQp\0UQ@+\\߳\\\\YX~1\lW\̡tʱ\X?W\K\ʹ[D\c\0\d{\\e,|ή\\oE\0=[\\^x_J֫U)MKt\\\&\N_\\\f\$\.Dq*\{w \w\\y=Wk\C\\3\Zu%%\EtK_\\|>\Z\nj%d(\(\0\ٻWA\\\wṜ)\r{ \0\Zw\ܯ\9\?`^Y\4\O\\7Q$70\:2\\ZᯧaoR_\\\xBR\j\Nf?/z\Rx\~\"*7M\\2_b\0\\gѫ|e0&\0\\07\\*\(hO\\`5\3\\\\ \ ԩF?{\\ c\\\\0& \O\{Yha5 \4Q-O\wEc=~B\ޯCs\frWze\\\iž\"p\r|\Ƃ*>]\{y4\\ϯ\RG;F\BJ\F\\\σ?g?c\\\\\M\'5\/~\ ݏ\C\\\|1\0\0\0c~F\w\Zc\\rkC\\\zkzh\]ɼ\"\2s\>\0S\\Z<#+ë[.zb\\0\\\⌵`sZ\xu;Ij\\gpnl,l\0\uW#7>\K\\~y#\\j1A\ꗪ;My)i\\\n\Tpkۨ|`(\0(\0(ho\\0`o\/\0\\:3>ӌw\\_\\rG{\\\\ZW@Q@Q@mF\0/\_%\\,\rl\0tk٢d\9n-#2\a\\\\sk\)\06K\0bf\00\\7;\g\?fK\6 ~3l>+\?\r4_\cۜ\0Ӝ\\[Ô<\r\0$?\\\*b/?\M/\f\\\\\\rI\Y\mmɕ|\ cW\r{\\0n\0\"p\+i;\]9yP֭\r\ ?6p\X\\p\'?k\\\}_\0<]\'xW{&*=y_\\Q_y\\\\J\0 kEO\rDO\C-,:\瞃ֿZ\0(\0(\0+\0vx\\\\fj\0A7 bM:\\\#88\\r \0\\\0b+\D\\\\[-X\\\hq⍀q\@\0VG\o_)\\\5\d\0ɷ¾x\r_it\t\rz5o#\\Z#\h%ul}#xɯR@M¸[(\T_\J\GOa] \\_&\r\'o\\Vk\d3pn?YExlU\0x\\\ \,dotۈ\\#S\rz\\:\\a\ڋ_z\\\\bQ\\?i_\\8\弐2\qo%Đȥ$:GW\/\0v?>x\Zk)Wۼ\ !\0i[*}\np\0\I{luo\\.X\kMpi\ْe(O˞\o\J6?8K 9B.\I5\\'s\h7>\(\0(\0*m6\][PwMs\"\\Z\0y\\\5\߱\Ç\\[\#\c\f#0_\膽\\*\,5Ey%vϊ\*4eV]v`^ojr\ı)\n\0ʿ?mC\\0\\\%\X\0nmр\Nb\S\fs\ۥ~\rkS\m\geBB1Ky\l` \0\\~ҟ\h\\\\\YR\\>\\A \r~\~\f|5Kk{iq\\ZXncntY\c\Tzk\b\UV>EپWz\Z\\A_\U\Q]=cџ)\\u{?P\\\r\ \#ס\Z\\\ݤkg\P&\/QsvI/\;d%\'\{ƏW\\K}\R\!\[\\3\\>\Y\>m\U\V1upfW\4/迦\\*)^\\]\N(\\\\(\0u\\\0-e#\Rj\\H%3\\\&ۋ\\\:\A+\\'\04\\܋ [\\V\'M-\(8.\h&_\|TXTTUV^\]lvWa\\\Vh\V\_\o\ ST\\"i\0\nt{̮Q\`?D}k\x\zIj\s_\z\uuq)\\#\\\MS\r\0E%\aj\y=\輒?=f3\OD\_e5 9\RoA?\5˵\\E}d\0׭ZiAԪ\\\\GRXѤ)4\۲G\\\\>\bh\\\> n{y\]F\HkvkXQm\el\I$6\\f\\#74L\vi܊4s_\Wo\zS#xM\\\?H\Ȳ4{\rq2L+?8\%\\\\\ɿE\|\˲8\>\\w\\\\@\|oL\\\\k\\5/忳\qkk#\~:OK>\톹AӤ\\79\0Q\\?\+\=S\?l[x\\\o\\D>ç\\6\j\O\r{\0O%\$n\\GSR9\W\?ͼ>\\\\.\j\)]fv$1/E\_ο\\0\D[{?HQ\kZI\\\]\]H)<~O\o\\O]hEKh\\&FO\\\\\zu27e~OtG\Y\\R\\ΗڍkDߝ\\7\\O\\M[[L\\h\o\n|~\^>f\coX\\0\< \0\:·\yW\[[g䂻\0\~Ƿ^M\\gۿ\Zg0=\\竖P\]a\\\?\g&&\ ~\\$Nwݳ\\~JB{\\ML{m\\c,H\8AܓW\?\?<|P\\rJ\V\5)<ۛ\\\0\0@\0\0\0\0\0+ 6i_d<3\i\\=\\0%\?\N*\3ةZ+h\"\\(nSV4䐥}\rϕq,,\O#O\\'#sC\\hBmX\R\Z<`?\\\D\\Z~#A4>\ڌ\\Z\p\\\2\럋]\\0\05-sZ\;\ \^\\\8\M2\\z,hO$##\no)\?z_]HߖO\<+\Nαqc4\\^-\0E\0\\0u}#P[_O\rxY42J^>\ 3\r7N\k{l\{Mp\%AD\k3ࢊ(\0(\0\g_\\7\7x\Y\lARU$U;c.\\{*ڀ?\04X{\0J\>$5o\Z\߉p\ک[Ke?씷2Ǿ_>h\0\0 \\Afiiўom\nC}N\=\ho\n\"i\W#\\\4im-.%M\ez\\U\pɎ3d?xV]\k\:\n\\\F\\\y0H\\c\k;\0n\>~\\OǯXy>yI\\#~\\0䴐ܱ\_4\0QE\0QE\0W\G\Z\\0\\'w\?u\\'ºȇ\\G\!9ӧ\o#\\[Bv2P\;=\|/\:SG\\\,2pT\0 uWS9W\\\\\0G\[\DW^1]3YD\g \9W7\{\|\]\R\\^<ؐac\\\\\\\\0|\_\\о,x*kB\N׼?[\\\`=\k\8_19=]=\R\\k丫p\\{ݫ_\-\[\09\&\rJz\\\\0N\|1sy\/Em,\Y|=<\v\ȷ%Q\\0 \PsjWnf\+[Zq\]z\\gK\\\'~\_\\\\L\ \eU}2\ֱ~\u@R+f]\\\IHcBSȤK`6\\85VzM\^8+\ \\0\rwPki67z\;{[HZio\(%\Q)$-Tܟ,U\ \\\"Q\\q\`L4\\rFN\򩜜+{\\a\0`ե\\66,v\_\M\\d_%yd )a\ |\Z\Ŧx\%!T% \'(BB2\\o{9\\\\\ָ?\*\^naҗyn\0\r\_| wú}\QyPA\GR\f\'$\$I&\: ֿ5\\\\\|=\n<\vR\ HdRCZD\\=%F>DM\083u_n?qզ\s\\'\h\֗\Ym,N[cѧ2U1\\'\~R\'9ov\ߩӌ\"dIl肊(((\0(\0+c \\/\\O\Ց}\5\g\\\ )\\mLUkW㿅|-x\\\Zn\\\jZu\y\\$qK30\0Կ\?O?&\\_\-\\\mΧ\kN\ծ0,ȇl(\\y\\0}5EPEP\0F\0a\F?co|%&\a%:uMͤ\K\\7t\' k7\߳7Ɵ|?&\\SiZr#&*JFFeq\++ \ry\\0l\\6~i^od!񥝴YVң%\e9<9$\0 ͭQ@Q@Q@~?\\_LCc\\0\\߃ѕt ˭n\r\\'\|\q3\\\r\T?R\0l|)񥎭yo˨hw$[k:Nx\w\@wF\\\\_\ß\M0\\\Z\Pj}\0Θ}=\_u\^0\E\}sX߈4|\-OK\\L9c*\\$eHthav#\$m\աQU\'-vz1\a\W\W^髧g\o\O e\\]|9\\eGHc\ J=Oq\į&\/r\߇֥ gm!WRW\\\Ҿ?\\\Q\\rpwi2k4B\\fK\\t\ }\\9h1j\nwa\;TPD=0\fɧrֵ\0\+pA <\\nF\ \0|\\\0\\x_Mi| \n\\>\68ǜxȉBļp\aƾ7־$^k\)QԮy%v>I\n(\n(\n(\n(t\0p0\0~\S\\\)|ORh\in.\\0pH\#F\\\0~?Jy>:|||eD;\\G.\\0\'_o\>+\\|p\r-eVbC\7/\ȬbC#I\@Q@Q@Q@Q@p\0\\\\\ி\\M\ۛk\\UtaG\"0) \A\0\qE\0!?[ W\; \tM -\\ 9+F5xz\'\/\&\\k%_\^\\\"0*\A +\\0\ %qLux;/u#qմU\Yr<\ ;$\=%լ72C4rC4,RH\J08 \ Q\EPEPEPEPEPEPEPEPE\k\\\x?\OfդMZ\4\n&$ n0B !\0icG#\?k\\k)g\}\\]^\\ q,\O`+\0\0\\- \\0Z\!\ucj.,|1\~췄aNR\"F\$\#\_O_oHe[Tj0 *)u|\=@%\8.\>\(((((((\_+o_\n~\(~ZK\6\\\B\*ǘ.ʡg\0\Z\07|z\0_H$xFi/$\i4K~_\\0 .ݣc\ \TE\\?\旫X\\f [\Y\As 2:0*\AE\0W%\0\0E~Է\!Gy7\\,m\\ۧM߈\\0\u}ӍʭLql<\0\0A|s\M\-wu\? XJj+\-ğ4vh\eFYJ\\a ~Ϳ\0\\0\\0\6\o~\\]-q\\2H\K\+`nFgc\bk\n(\n(\n(\n(\n(\n(\n(\n(\n(\n(>q\_o\\%\\\τ>\5{5ks\\Ov1\<\W9㓟Ϳ\O M\;g\I$-\"\\v0\ֈy\h\\v_~\Q@\O\3wp&š\?؆+\rbK \QG\_.|P\0\0l>g\\˿+\bE>\$ۺv\oQ_\\/ \0\\\\.h*8~lUnPw\0H\\s\<0\i\0&1s\B\\܃8\\\_\u\"韲G\mnx#c\nK)/$iI\\lWx \'QI\\0g\6Ԟ_\\ۓ뤉c=r\sQ@\o\5\$-7\\_ YM.\0X[\\9dc=\\g\2/\43|R\\\i-|/\j\H|m\ق7^v8t5Q@\\Zs\"~\\\yxwğHp\oj\\\\aVLz\~|+=\/\0|/\\h6\t\N\\.\,Q*\\]\0QE\0QE\0QE\0QE\0QE\0QE\',1,NULL,'2019-12-02 04:05:53',NULL,NULL,'','MaxKey','https://github.com/shimingxy/MaxKey',0,NULL,NULL,NULL,'0',NULL,0,0,1,1,'org.maxkey.authz.token.endpoint.adapter.TokenBasedJWTAdapter',NULL,NULL,'uid,username,displayName,picture,familyName,givenName,middleName,nickName,gender,married,website,birthDate,idtype,idCardNo,startWorkDate,preferredLanguage,timeZone,locale,mobile,email,userType,employeeNumber,division,organization,costCenter,jobTitle,manager,assistant,entryDate,departmentId,department,windowsAccount','IDP',NULL,0); +/*!40000 ALTER TABLE `mxk_apps` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `mxk_apps_cas_details` +-- + +DROP TABLE IF EXISTS `mxk_apps_cas_details`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `mxk_apps_cas_details` ( + `ID` varchar(45) NOT NULL, + `SERVICE` varchar(400) NOT NULL, + `CALLBACKURL` varchar(400) NOT NULL, + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `mxk_apps_cas_details` +-- + +LOCK TABLES `mxk_apps_cas_details` WRITE; +/*!40000 ALTER TABLE `mxk_apps_cas_details` DISABLE KEYS */; +INSERT INTO `mxk_apps_cas_details` VALUES ('3a93e28d-558d-4dc7-a3f2-9bf5255a1372','http://hr.maxkey.top','http://hr.maxkey.top'),('41065fe3-ae67-4172-a460-fd0079e88294','http://cas.demo.maxkey.top:8080/demo-cas/','http://cas.demo.maxkey.top:8080/demo-cas/'),('84f97a28-3526-415d-8ef9-9b5b53656b67','http://app1.cas.com:8081/callback?client_name=pac4jclient1','http://app1.cas.com:8081/callback?client_name=pac4jclient1&'),('8e7e4a2f-9e7a-46ee-9dcf-ec02d69cb5e9','http://hr.maxkey.top','http://hr.maxkey.top'),('97d2ab32-b88f-41c4-9c6b-b8a53ac504ee','http://weaver.demo.maxkey.top:8080/weaver/','http://weaver.demo.maxkey.top:8080/weaver/Login.jsp'); +/*!40000 ALTER TABLE `mxk_apps_cas_details` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `mxk_apps_desktop_details` +-- + +DROP TABLE IF EXISTS `mxk_apps_desktop_details`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `mxk_apps_desktop_details` ( + `ID` varchar(45) NOT NULL, + `PROGRAMPATH` varchar(400) NOT NULL, + `PARAMETER` varchar(400) DEFAULT NULL, + `USERNAMETYPE` varchar(45) NOT NULL, + `PREUSERNAME` varchar(45) DEFAULT NULL, + `USERNAMEPARAMETER` varchar(45) DEFAULT NULL, + `PASSWORDTYPE` varchar(45) NOT NULL, + `PREPASSWORD` varchar(45) DEFAULT NULL, + `PASSWORDPARAMETER` varchar(45) DEFAULT NULL, + `SUBMITTYPE` varchar(45) NOT NULL, + `SUBMITKEY` varchar(45) DEFAULT NULL, + `PRESUBMIT` varchar(45) DEFAULT NULL, + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `mxk_apps_desktop_details` +-- + +LOCK TABLES `mxk_apps_desktop_details` WRITE; +/*!40000 ALTER TABLE `mxk_apps_desktop_details` DISABLE KEYS */; +INSERT INTO `mxk_apps_desktop_details` VALUES ('c1cabfaeb9a448028ffab2148da9f65c','C:\\Program Files (x86)\\Tencent\\QQ\\Bin\\QQ.exe','','SIMULATION','','username','SIMULATION','','password','Enter','d',''); +/*!40000 ALTER TABLE `mxk_apps_desktop_details` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `mxk_apps_form_based_details` +-- + +DROP TABLE IF EXISTS `mxk_apps_form_based_details`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `mxk_apps_form_based_details` ( + `ID` varchar(45) NOT NULL COMMENT 'ID', + `USERNAMEMAPPING` varchar(45) DEFAULT NULL COMMENT 'FORM LOGIN NAME', + `PASSWORDMAPPING` varchar(45) DEFAULT NULL COMMENT 'FORM LOGIN PASSWORD', + `REDIRECTURI` varchar(400) DEFAULT NULL COMMENT 'REDIRECTURI', + `AUTHORIZEVIEW` varchar(100) DEFAULT NULL COMMENT 'AUTHORIZEVIEW FOR LOCAL VIEW DEAL', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='FormBase details'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `mxk_apps_form_based_details` +-- + +LOCK TABLES `mxk_apps_form_based_details` WRITE; +/*!40000 ALTER TABLE `mxk_apps_form_based_details` DISABLE KEYS */; +INSERT INTO `mxk_apps_form_based_details` VALUES ('850379a1-7923-4f6b-90be-d363b2dfd2ca','userNameIpt','password','https://ssl.mail.163.com/entry/coremail/fcg/ntesdoor2',NULL),('c8038bd4-12a4-4b45-9d43-61b3ecdc2eb4','username','password','http://note.youdao.com/signIn/',''); +/*!40000 ALTER TABLE `mxk_apps_form_based_details` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `mxk_apps_oauth_client_details` +-- + +DROP TABLE IF EXISTS `mxk_apps_oauth_client_details`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `mxk_apps_oauth_client_details` ( + `CLIENT_ID` varchar(45) NOT NULL COMMENT 'appkey', + `RESOURCE_IDS` varchar(256) DEFAULT NULL COMMENT '资源ids', + `CLIENT_SECRET` varchar(256) DEFAULT NULL COMMENT 'appsecret', + `SCOPE` varchar(256) DEFAULT NULL COMMENT 'SCOPE', + `AUTHORIZED_GRANT_TYPES` varchar(256) DEFAULT NULL COMMENT '授权类型', + `WEB_SERVER_REDIRECT_URI` varchar(256) DEFAULT NULL COMMENT 'REDIRECT_URI认证返回地址', + `AUTHORITIES` varchar(256) DEFAULT NULL COMMENT 'AUTHORITIES', + `ACCESS_TOKEN_VALIDITY` int unsigned DEFAULT NULL COMMENT 'accesstoken有效时间', + `REFRESH_TOKEN_VALIDITY` int unsigned DEFAULT NULL, + `ADDITIONAL_INFORMATION` varchar(4096) DEFAULT NULL, + `APPROVALPROMPT` varchar(45) DEFAULT 'force', + `AUTOAPPROVE` varchar(45) DEFAULT NULL COMMENT '自动通过', + `IDTOKENENCRYPTEDALGORITHM` varchar(45) DEFAULT NULL, + `IDTOKENSIGNINGALGORITHM` varchar(45) DEFAULT NULL, + `IDTOKENENCRYPTIONMETHOD` varchar(45) DEFAULT NULL, + `USERINFOSIGNINGALGORITHM` varchar(45) DEFAULT NULL, + `USERINFOCRYPTEDALGORITHM` varchar(45) DEFAULT NULL, + `USERINFOENCRYPTIONMETHOD` varchar(45) DEFAULT NULL, + `JWKSURI` varchar(400) DEFAULT NULL, + PRIMARY KEY (`CLIENT_ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='oauth_client_details'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `mxk_apps_oauth_client_details` +-- + +LOCK TABLES `mxk_apps_oauth_client_details` WRITE; +/*!40000 ALTER TABLE `mxk_apps_oauth_client_details` DISABLE KEYS */; +INSERT INTO `mxk_apps_oauth_client_details` VALUES ('001bd032-d132-4747-b434-73f21b352c63','001bd032-d132-4747-b434-73f21b352c63','05681f23341b0676f0124a9d2f809af9df962b0983ae8557a6fe31a66c782983','read','authorization_code','http://www.ssss.com','ROLE_CLIENT,ROLE_TRUSTED_CLIENT',18000,18000,'{}','force','read','none','none','none','none','none','none','1'),('3a2c3f84-1df7-413a-8a42-f3add972e0d0','3a2c3f84-1df7-413a-8a42-f3add972e0d0','74a81906a41d3a89866edc237b3ffb2496d0aaf34af60931b942ef9c37cb9e71','read,trust,email,phone,address','authorization_code','http://o2oa.maxkey.top/x_desktop/oauth.html?oauth=MaxKey','ROLE_CLIENT,ROLE_TRUSTED_CLIENT',180,180,'{}','force','trust,read,address,phone,email','none','none','none','none','none','none',''),('ae20330a-ef0b-4dad-9f10-d5e3485ca2ad','ae20330a-ef0b-4dad-9f10-d5e3485ca2ad','d15b1f6f6590529f40a7f3955e9e2f182a453b3a241e460939ae532ef6d1068e','read,openid,profile','authorization_code,password','http://oauth.demo.maxkey.top:8080/demo-oauth/oidc10callback.jsp','ROLE_CLIENT,ROLE_TRUSTED_CLIENT',180,180,'{}','force','read,openid,profile','none','none','none','none','none','none',''),('b32834accb544ea7a9a09dcae4a36403','b32834accb544ea7a9a09dcae4a36403','4e1d7eb7b14ad658e8d9066c95902c852ff6494512a742a8392d1d16adc5af551e698f87c64032dc548d6ec7dc3c4863','read,all','authorization_code,password','http://oauth.demo.maxkey.top:8080/demo-oauth/oauth20callback.jsp','ROLE_CLIENT,ROLE_TRUSTED_CLIENT',180,180,'{}','force','all,read','none','none','none','none','none','none','http://'),('c3d44bb1-e2c4-45dd-91ce-43e821f1321c','c3d44bb1-e2c4-45dd-91ce-43e821f1321c','d9457a9a9017d2f92ce3d0b58e4328ea637dcc5a434d3bc900bd5f07cd1eda86','all,read,trust,write','authorization_code','http://liferay.demo.connsec.com:8080/','ROLE_CLIENT,ROLE_TRUSTED_CLIENT',180,180,'{}','force','trust,write,read,all','none','none','none','none','none','none',''),('my-client-with-registered-redirect',NULL,NULL,'trust','authorization_code,client_credentials','http://anywhere','ROLE_CLIENT',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),('my-less-trusted-client',NULL,NULL,NULL,'authorization_code,implicit','http://','ROLE_CLIENT',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),('my-trusted-client',NULL,NULL,'read,write,trust','password,authorization_code,refresh_token,implicit','http://','ROLE_CLIENT, ROLE_TRUSTED_CLIENT',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),('my-trusted-client-with-secret',NULL,'somesecret','read,write,trust','password,authorization_code,refresh_token,implicit','http://','ROLE_CLIENT, ROLE_TRUSTED_CLIENT',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),('my-untrusted-client-with-registered-redirect',NULL,NULL,'read','authorization_code','http://anywhere','ROLE_CLIENT',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); +/*!40000 ALTER TABLE `mxk_apps_oauth_client_details` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `mxk_apps_saml_v20_details` +-- + +DROP TABLE IF EXISTS `mxk_apps_saml_v20_details`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `mxk_apps_saml_v20_details` ( + `ID` varchar(45) NOT NULL, + `CERTISSUER` varchar(200) DEFAULT NULL, + `CERTSUBJECT` varchar(200) DEFAULT NULL, + `CERTEXPIRATION` varchar(100) DEFAULT NULL, + `KEYSTORE` blob, + `SPACSURL` varchar(200) NOT NULL, + `ISSUER` varchar(300) DEFAULT NULL, + `ENTITYID` varchar(300) DEFAULT NULL, + `VALIDITYINTERVAL` int unsigned DEFAULT NULL, + `NAMEIDFORMAT` varchar(45) DEFAULT NULL, + `NAMEIDCONVERT` tinyint unsigned DEFAULT NULL, + `NAMEIDSUFFIX` varchar(150) DEFAULT NULL, + `AUDIENCE` varchar(300) DEFAULT NULL, + `ENCRYPTED` tinyint unsigned DEFAULT NULL, + `BINDING` varchar(45) DEFAULT NULL, + `SIGNATURE` varchar(45) DEFAULT NULL, + `DIGESTMETHOD` varchar(45) DEFAULT NULL, + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `mxk_apps_saml_v20_details` +-- + +LOCK TABLES `mxk_apps_saml_v20_details` WRITE; +/*!40000 ALTER TABLE `mxk_apps_saml_v20_details` DISABLE KEYS */; +INSERT INTO `mxk_apps_saml_v20_details` VALUES ('525d261fa3b04d19af0debabbd5a1e2d','VeriSign Class 3 International Server CA - G3','CN=proxy.salesforce.com, OU=Applications, O=\"Salesforce.com, Inc.\", L=San Francisco, ST=California, C=US','17 Oct 2017 23:59:59 GMT',_binary '\\\0\0\0\0\0\0\0\0\0\0 https://sso.connsec.com/sec/saml\0\0CDF\\0X.509\0\0d0`0HC77hֺpBng0\r *H\r\001 0 UUS10U\nVeriSign, Inc.10U VeriSign Trust Network1;09U 2Terms of use at https://www.verisign.com/rpa (c)101604U-VeriSign Class 3 International Server CA - G30\r131018000000Z\r171017235959Z01 0 UUS10U\nCalifornia10U\rSan Francisco10U\nSalesforce.com, Inc.10U  Applications10Uproxy.salesforce.com0\"0\r *H\r\0\00\n\0mK-&c\\"\I\\\= =`Ӆu\j\\DG\\)\Y$\Z[U\`E\1_;\ne@\\\1VC]\\\BUpgT\@:<\\x\0b%dQ^12x2\\"\\\nu8ّ\Zd߯l4H\M>)#z\z!ݲD\0Rh\B!)z`,ě\D\Q\\\"-4 \\\~\\PAZg\\\\ pih5\r\\\5iJO^\sFRHq\000U0proxy.salesforce.com0 U0\00U0(U%!0++ `HB0CU <0:08\n`HE60*0(+https://www.verisign.com/cps0U#0כ|\\"ݭ_\)XüF\00AU:0806420http://SVRIntl-G3-crl.verisign.com/SVRIntlG3.crl0r+f0d0$+0http://ocsp.verisign.com0<+00http://SVRIntl-G3-aia.verisign.com/SVRIntlG3.cer0\r *H\r\0\02\yD~^\\Z8\pWc\D\Q\s6*\R/X (\\+=/T6t!¦!g2J+9\k\1m\\VW\iED\\\Z\!Dg P\ͱ5eye\H:1\Z;l \n\\zyEei\~{: @q=\\\\n\A K;\:;LiY3H.9]\\\\\ Jfarq6=gb`^˔\o\)\\S\'R\@w\0\0\0\0 connsec.com\0\0>\\r\0\0\000\n+*\0\\aM\-5Hfk<랓nH \%Њ{ 4#bz\;W\\rˊ2?0\QC#6wP@\\09CJ.*pA\a\\H/\CdB\\O @Ez\=\0h%\b:}\\\\N\\R\'C+ƚ*ks\wx\.\G\ k[wn_+\\0 s\=`wd@\ڇHte```\(5\'1Z\4LRhy_23yѿ!\M\,\&C\z\b_PB5ϴ\% \P}ŕc\qHb~\7M\yЁ`O=Y`/r\\\:P~˞4VoA7^/\KlbraS)$T C?\'V#i\Ĥgw\JR\\ \j4斪\n\\7oϷ=R]\\lzSЍu\~\ō>E.O\0\\ᐸEHתqZlNt*x\\t\6:?\\LU8\#g\Ѫ;\.\-R> 2R\j\\"߈P`\\QzV71U׻$RtD_4k\\,\\oUsh&p8k1ܢ4\Z85Y\1ޗ\\!E\UO 4/0ܡ6$ZhN: \_y\r\]MgU\`Cs\r\\\\8C\lW\ 8X?uhu= R$N\Azدe{\\\Z12\i\\:;`\Z-\0)z\'\\6]`\ aA\,(L\\qbp\\\"\Ej%Yȸ\8ɭDZ\ݚ O6D|xĿ\\f\i\\v\N\\m\\K8W\qI\$\ \F\\L\2,j\\\"\{A0yPa=kV\~9\W>o\ⵋ\U^keET3|n`\\\8!QjKOs{\r=lK/\J\.\\,\ǐ\\ ?Q\\"Zh9}B,\\ \\:\\suus )$f\\?ܨ-glk\^Ѽ O屰Ԏl\I\$\lKc\0\\?\",φ8\.\ՎIux t?nm]8J\2$\\0\0\0\0X.509\0\00\Z0Q0\r *H\r\00O1 0 UCN1 0 USH1 0 USH10U\nconnsec10U connsec.com0\r130509145555Z\r400924145555Z0O1 0 UCN1 0 USH1 0 USH10U\nconnsec10U connsec.com0\"0\r *H\r\0\00\n\0s~\\g9h\}@竦^\\\k\:\i\&^\W+br՚<KP\u\x7\\i\\\-.B\1l^D\~.\j\\FQ)#Y#\Z\X0`ط\\ZC\~<\ɔ#PktJ$uͯE\fx\䄿\:\\0\t6Lڳ/8\\\FQM\z |,\\J9 uuX?ꠎ\Dq\'n\\\k\a&\$sq\\00\r *H\r\0\0\rŎ8xU\\\\"\NKT\F؀\w^U_:!C|Eh\.Rt\u\d\Iwcz̊.\=\e\Z\0\\\nן\\OG-#qlB\U}EB\nj^ j\7\\x[3\%\s2HوEڑpzo\Z\:\\8pSSrR)\+h^Y R^\WDrOu sYZo>#\\Nzx\)Y|w-}\n\\mR}(\G% \U+V\H\ \\D','https://shikey-dev-ed.my.salesforce.com?so=00D90000000r4kw','https://sso.maxkey.org/maxkey/saml','https://sso.maxkey.org/maxkey/saml',15,'persistent',0,NULL,'https://sso.connsec.com/sec/saml',0,'Redirect-Post','RSAwithSHA1','SHA1'),('5649f603-f2ac-4b0c-8fc3-e80ddce8c443','cloud.tencent.com','EMAILADDRESS=qcloud@tencent.com, CN=cloud.tencent.com, OU=Tencent Cloud, O=Tencent Technology (Shenzhen) Company Limited, L=shenzhen, ST=guangdong, C=CN','Thu Aug 15 14:24:31 CST 2019',_binary '\\\0\0\0\0\0\0\0\0\0\0cloud.tencent.com\0\0p<\\n\0X.509\0\0_0[0C \0k\0\r *H\r\00\1 0 UCN10U guangdong10U shenzhen1604U\n -Tencent Technology (Shenzhen) Company Limited10U \rTencent Cloud1\Z0U cloud.tencent.com1!0 *H\r qcloud@tencent.com0\r180815062431Z\r190815062431Z0\1 0 UCN10U guangdong10U shenzhen1604U\n -Tencent Technology (Shenzhen) Company Limited10U \rTencent Cloud1\Z0U cloud.tencent.com1!0 *H\r qcloud@tencent.com0\"0\r *H\r\0\00\n\0\bK3X-% \nUqR\eƃ}g\ؘZ Ԗ\wzXd\1ag}1;K\\\(\ԇ\\ryH=\xz\\"Y<$\r\?\\"\b\i ]C~w c\X\\\Z4r<\\:}p}>\\ϣ\\ӱ08g\\OK@\~\M\-\<\n\P\X.3)\\E[\\E?\\0E\Ot\9UE|($_\rª\\\0P0N0U:{\\Q>\(_l\m4YH\0U#0:{\\Q>\(_l\m4YH\0 U00\r *H\r\0\0@!C\0j|ZiXt@m-7\\\D\4Oz\Z S\Z\ZcA\K)cv<\\r̥C]\*@\\D|&8ù\\!23ʸ}\\';Z9 \̽\R\E\ÖDБ)*\\)\c=.*{*P\\0Ki?\0=5\\)\Ti!nppG\m\\\#\kW\/,S=c\n\'6<\\k%]\fx\>|C?-y\R\Y.\ZfEq43\=]\\aڒY \\?\\eQ\z\0\0\0\0\nmaxkey.top\0\0r\$N\0\0\000\n+*\0\dc廅k;Tg,ා*u4\Z\\Z\\q`@\Z\^\Ss\\ZL\\\NpZW1E6\\Vh\z 3\#)ф\iB D+ ?i W\\\Z>N+\\m{޹9:M\\<\'B\rC+a54`\QWC/\'M;+ȵ\cnSW\ɠ \n\\ \\3{\'[Bv\c\\\\Ĕc_-[x[& c%\\\\\ `c\u>\r+U/f\81*\\3\Z\L\/!\ɣ@K\\\n\C7̵%\n\\kпi)\z(\=M#hJ[ď#F\\r}\\\^\)\"\\P \x\(i_~0j\޿$\\0{\\\$B@(\ZLxO|%ZLr\\\\":q\\\\֖\Z;\&kp\\a\\QޔQ\a\\;\md\.\"&(ה|\D5!\<\E\Ux\Z\r\X4ީi:0\'xg@#\\\J\Ze:!{հ7v7\@\X\D-\_,p\!\5@b[l,rD\\\4h!;H\0\~`/,bU\Qo\n\\\\ \\`m?0\\k}\FF(g5v\wm{ē\os\nssEI%5\E~S\#B5\\\y}0%\N u\g}R-fyo\#jlD+ \A\\\… Q\\\FyZ\`Tڊ4MaN\\\!;s\\4BIʃ\x2F(\5 _o+9Z$k\\\I\rj\soi*\ʒL\"\".f\4E0LB\riR\0HA\F\\TĢ/\05 \M8 Yþ^Fdo>kn\?Oݜ\ 4eȫCG\ 8H.\O\ND\r \u;8ZY2p\\\rc\0\0\0\0X.509\0\00~0f^W-0\r *H\r \001 0 *H\r shimingxy@163.com1 0 Ucn1 0 U sh1 0 U sh10\rU\n maxkey10\rU maxkey10U \nmaxkey.org0\r200227024731Z\r400227024731Z01 0 *H\r shimingxy@163.com1 0 Ucn1 0 U sh1 0 U sh10\rU\n maxkey10\rU maxkey10U \nmaxkey.org0\"0\r *H\r\0\00\n\03\QJ\O@\W\ P\z\ߍ\\gGEG^M=\\Q\h\U@~OX\pĦ\|&q\b\+!؆jKDh<\>=8\D~h_Zѹ\{R \np\"5_1/S/nc\8\ZVP\\\"5B@p-R|,WxD\w\\\\\L\D\ }?Б\\n\\`\1?E \In7<2{\r\\;Ҝ\0c\\ODP93~,N\nSs_I-b\ $\;nn@\\r_\S<\\05@\齠kI}5ܩi\\`T\\*}\\\%x\\J0\䒂\:=,pke-kL\|v} (\e\WA\ ]\0!00UX޵\\*Ր) \'E0\r *H\r \0\00%-\Ȏdٯ_NRoJP<¨\)\I(\gĎ&g9)\_\\ӷ\f\eָq(+\\nK\r91zn(_\6R4\Td\\;\tK< q\eV%-\NqӠRQ7\\L\N[*)⼺7*.=h\1Ru%-5ޑi\(\\&\)\ic\ CA\\G9v8\=FLQӉ=g \5)S\"ECaVju\0 \;\\\n?\\\fE\Tz\0\0\0\0\nmaxkey.top\0\0r\\^\0\0\000\n+*\0\)4\1]\\"\E]z\졃\4\0,? \\`\;35C\?,e\"^Rov\ [\\+t\z\~\FM\\'\14}4\W)Y\~\kE\; t%!C\P p\`\Yo\K\\M#R`5סߧQ\-\\dZ cwC4h\DZ4N\p\#D|V=\nv ˞o\\nCZ8\Z\f\"\yNi\\\/u\ \0\nڂG>؍\+m\t! ͊\"\\V\:_\B,҆d\׽pxw9lOd<\\r9uW \\\7\'Qhv*&ǁ9 k ^jnaV\L{\N~\0#+a\MqF\Z)\P\\f PӬ~)A_4\\\>\A3\=!/ȴt\'E\'_\re*\nc>k~5dӲϥ\n▄\ x\n_HY\!_\}և%(fձw=\^M䙦 L@Q,9Y\\Jn=n1m\.\r\07\\\ՇN[\\ط\U6mz\L#Vwu\\D\nV{7Bl\҆L\)TэY\VQ\\Ki21`>\\1\\P\{\O]T\3j\K\n6SY\p\X}Fz1ʻU\ \+Di\\peo\i\t>.obI/ 0wQD 2\n;\0\'\\ fS\o}齸l\n\\y<\\\\\R2|\\o8 Sr\\Y&p\{\.\4Q+E)zΆā*e\U/\3LH\/9\\"`3#1e\:Lu\Z)CJrf\D75$N\y\\#\\\,\u<&/\\}{2B&%xl}$7\\߆\\\/$3\Z\\\=U(Ue\Z\UW*d#\\\\ZT\\;s\"9eG\'?\C7XT\T2n\Lo\-,-㱭XIY\/i\z^\#@\ݠl1M\y\\pvt\\ _A1\޳\D\,τ#m0St\Q Z\u\\\U˿\Bof\x\0\"X=b-9Y)|\\\\KD\\5u5q#4i@\j\\hURio\ebӊi\R\@B* \}E]-\\{#\\_߿Vf(#\u-N\܊ Ț~\gڨ3\!\{Q<\ \\~i\0*\IKc^0x\R5\ 5\;~8ZY2p\\\rc\0\0\0\0X.509\0\00~0f^W-0\r *H\r \001 0 *H\r shimingxy@163.com1 0 Ucn1 0 U sh1 0 U sh10\rU\n maxkey10\rU maxkey10U \nmaxkey.org0\r200227024731Z\r400227024731Z01 0 *H\r shimingxy@163.com1 0 Ucn1 0 U sh1 0 U sh10\rU\n maxkey10\rU maxkey10U \nmaxkey.org0\"0\r *H\r\0\00\n\03\QJ\O@\W\ P\z\ߍ\\gGEG^M=\\Q\h\U@~OX\pĦ\|&q\b\+!؆jKDh<\>=8\D~h_Zѹ\{R \np\"5_1/S/nc\8\ZVP\\\"5B@p-R|,WxD\w\\\\\L\D\ }?Б\\n\\`\1?E \In7<2{\r\\;Ҝ\0c\wdCD\r\\8\c\ *gcŀafԺϥhu϶62d\'Ujmnd~*U\Q٨\氄eAi\\\'n\(QI4\T/I-? \vx\ۿ/nA_ zb=ȟֺ \05\\|N]V\W:|^\\\\0 \\"\VQ\۸,L\'5\\\Z\߯l\֋;0$eia\K\n\\WuIP\M\P_ͫ\00\r *H\r \0\0O$\.\%pvAq,\,)cOV\P\\\ g\\g;\22\u.Z\\\N,\c_ \Ga^ F6D`څJy@?*B{|fe#Gw:jg{\Ep\$\'xb3Wloz\8\r\'Qb\}[\R0dMD\\E\\\ͣ\gPxkӎ6F%\Nk\CnBYZ\\"62>\wp (_x\q\"\"\f\,]\j+\4 \\+,A\0\0\0\0\nmaxkey.top\0\0r\\"\\0\0\000\n+*\0\ؐ\y \qa.VpW%.r\\n7b\~+\Z\y\\cF]lC\hٱbv\R)c\s\{ \PGFa]0!Ֆ}?ńF\\=|\w},\tz$f#dNcR@sQ\t\~F\<$\\\\\\P0-\Q\r uX;#ϲK-Ҫ\Z_\ޝf\n\RC@\` Gw,\0Bv7\\Z\\\9 e+|3.H\ <K\q\4L|m\"}wC6\\d\\,\?Ƶ?*WJAq{\`1\)\% \h q ִX\\XT0ʈv\\Y\nK\S6\]\"\'\^z:\H\<\Y#\?\VY\ܼ\d$+v\Zt˿^\rT\5n\!7wWR]W1\\F@&^i~\~\\"Tb\ZzE9ٗ`#\Cz\\\֬B\m\\G\i ^݊aۀBѲ\Ѱv\riKg\96\ц$db\gӕLFP\,\R\ɞ\YxQZ/\\p9S\"|jL\݅\*+\ZZO\{\2\N >\\\[&<\n(\\*v\Kvbr\o\%zd\'\\roc 1\r\Ga\R\@^Nn\\q\rz\\\\TYw8>\R /-˦C0jn\\\.\c&`V@\\\\c W\\*+&Rq.7\n\|\?WF\,`b[LҼ\с\-T\\ƙ\} tN\01\cJSAKj\n\,gWW\,\/n= t…Vc=؝MC\]\ggv\ĽM Ұ ?\qR\Z9\i椝n\DaX?„^̥p\r$\\e\`̠#s\\rMx)P\'\\+\"l\b\'{Z\&D]\L\*A’7:y\51\VX7\\ɩvRΉɻY.[\\\6wgp^\ /\3\fHa\d9z\,YԵQ>)ncv \RWv\U4F\ \65A\\N(\r\\&\V\/n;C0\n\N\Z>3g\\`Dk\\\\\r\i,\\0rڬ^x/\ 04 p\x\\\;o\Oe\2L$2\1*sD0\KE\b\n\ќ\hTpT]n\\\Q\rN\G\%!k eߟ8ZY2p\\\rc\0\0\0\0X.509\0\00~0f^W-0\r *H\r \001 0 *H\r shimingxy@163.com1 0 Ucn1 0 U sh1 0 U sh10\rU\n maxkey10\rU maxkey10U \nmaxkey.org0\r200227024731Z\r400227024731Z01 0 *H\r shimingxy@163.com1 0 Ucn1 0 U sh1 0 U sh10\rU\n maxkey10\rU maxkey10U \nmaxkey.org0\"0\r *H\r\0\00\n\03\QJ\O@\W\ P\z\ߍ\\gGEG^M=\\Q\h\U@~OX\pĦ\|&q\b\+!؆jKDh<\>=8\D~h_Zѹ\{R \np\"5_1/S/nc\8\ZVP\\\"5B@p-R|,WxD\w\\\\\L\D\ }?Б\\n\\`\1?E \In7<2{\r\\;Ҝ\0c\