diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..7c64f52
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,11 @@
+# Dependency directories
+node_modules
+*.log*
+*.lock
+.eslintrc.js
+package-lock.json
+.history
+dist/
+h5/
+dist.zip
+wxAppPatient.zip
diff --git a/TUIService/TUIKit/.github/README.md b/TUIService/TUIKit/.github/README.md
new file mode 100644
index 0000000..869844c
--- /dev/null
+++ b/TUIService/TUIKit/.github/README.md
@@ -0,0 +1,374 @@
+## 关于腾讯云即时通信 IM
+
+腾讯云即时通信(Instant Messaging,IM)基于 QQ 底层 IM 能力开发,仅需植入 SDK 即可轻松集成聊天、会话、群组、资料管理能力,帮助您实现文字、图片、短语音、短视频等富媒体消息收发,全面满足通信需要。
+
+## 关于 chat-uikit-wechat
+
+chat-uikit-wechat 是基于腾讯云 IM SDK 的一款 小程序 UI 组件库,它提供了一些通用的 UI 组件,包含会话、聊天、群组、音视频通话等功能。基于 UI 组件您可以像搭积木一样快速搭建起自己的业务逻辑。
+chat-uikit-wechat 中的组件在实现 UI 功能的同时,会调用 IM SDK 相应的接口实现 IM 相关逻辑和数据的处理,因而开发者在使用 chat-uikit-wechat 时只需关注自身业务或个性化扩展即可。
+chat-uikit-wechat 效果如下图所示:
+
+
+本文介绍如何快速集成腾讯云 Web IM SDK 的 VUE UI 组件库。对于其他平台,请参考文档:
+
+[**chat-uikit-vue**](https://github.com/TencentCloud/chat-uikit-vue)
+
+[**chat-uikit-react**](https://github.com/TencentCloud/chat-uikit-react)
+
+[**chat-uikit-uniapp**](https://github.com/TencentCloud/chat-uikit-uniapp)
+
+[**chat-uikit-ios**](https://github.com/TencentCloud/chat-uikit-ios)
+
+[**chat-uikit-android**](https://github.com/TencentCloud/chat-uikit-android)
+
+[**chat-uikit-flutter**](https://github.com/TencentCloud/chat-uikit-flutter)
+
+
+
+## 发送您的第一条消息
+
+### 开发环境要求
+
+- 微信开发者工具
+- JavaScript
+
+
+### TUIKit 源码集成 - github方式集成
+
+#### 步骤1:创建项目
+
+在微信开发者工具上创建一个小程序项目,选择不使用模版。
+
+
+
+#### 步骤2:下载 TUIKit 组件
+
+在微信开发者工具内新建终端。
+
+
+
+通过 `git clone` 方式下载 TUIKit 组件及其相关依赖, 为了方便您的后续使用,建议您通过以下命令将整个 `chat-uikit-wechat` 复制到您项目的根目录下,并重命名为 TUIKit:
+
+
+ ```shell
+ # 项目根目录命令行执行
+ git clone https://github.com/TencentCloud/chat-uikit-wechat.git
+
+
+# 移动并重命名到项目的根目录下
+ # macOS
+ mv chat-uikit-wechat ./TUIKit
+ # windows
+ move chat-uikit-wechat .\TUIKit
+
+ ```
+
+成功后目录结构如图所示:
+
+
+#### 步骤3:引入 TUIKit 组件
+
+##### 方式一: 主包引入 (适用于业务逻辑简单的小程序)
+在 page 页面引用 TUIKit 组件,为此您需要分别修改 index.wxml 、index.js 和 index.json。
+
+wxml 文件
+
+
+
+```javascript
+
+
+
+```
+
+js 文件
+
+
+
+```javascript
+import TIM from '../../TUIKit/lib/tim-wx-sdk';
+import { genTestUserSig } from '../../TUIKit/debug/GenerateTestUserSig';
+import TIMUploadPlugin from '../../TUIKit/lib/tim-upload-plugin';
+import TIMProfanityFilterPlugin from '../../TUIKit/lib/tim-profanity-filter-plugin';
+
+
+Page({
+ data: {
+ config: {
+ userID: '', //User ID
+ SDKAPPID: 0, // Your SDKAppID
+ SECRETKEY: '', // Your secretKey
+ EXPIRETIME: 604800,
+ }
+ },
+
+ onLoad() {
+ const userSig = genTestUserSig(this.data.config).userSig
+ wx.$TUIKit = TIM.create({
+ SDKAppID: this.data.config.SDKAPPID
+ })
+ wx.$chat_SDKAppID = this.data.config.SDKAPPID;
+ wx.$chat_userID = this.data.config.userID;
+ wx.$chat_userSig = userSig;
+ wx.$TUIKitTIM = TIM;
+ wx.$TUIKit.registerPlugin({ 'tim-upload-plugin': TIMUploadPlugin });
+ wx.$TUIKit.registerPlugin({ 'tim-profanity-filter-plugin': TIMProfanityFilterPlugin });
+ wx.$TUIKit.login({
+ userID: this.data.config.userID,
+ userSig
+ });
+ wx.setStorage({
+ key: 'currentUserID',
+ data: [],
+ });
+ wx.$TUIKit.on(wx.$TUIKitTIM.EVENT.SDK_READY, this.onSDKReady,this);
+ },
+ onUnload() {
+ wx.$TUIKit.off(wx.$TUIKitTIM.EVENT.SDK_READY, this.onSDKReady,this);
+ },
+ onSDKReady() {
+ const TUIKit = this.selectComponent('#TUIKit');
+ TUIKit.init();
+ }
+});
+```
+ json 文件
+
+
+
+```javascript
+{
+ "usingComponents": {
+ "TUIKit": "../../TUIKit/index"
+ },
+ "navigationStyle": "custom"
+}
+```
+
+##### 方式二:分包引入 (适用于业务逻辑复杂,按需载入的小程序)
+小程序分包有如下好处:
+- 规避所有逻辑代码放主包,导致主包文件体积超限问题
+- 支持按需载入,降低小程序载入耗时和页面渲染耗时
+- 支持更加复杂的功能
+分包流程:
+1.在自己项目里创建分包,本文以 TUI-CustomerService 为例。和 pages 同级创建 TUI-CustomerService 文件夹,并在文件夹内部创建 pages 文件夹并且在其下创建 index 页面。
+创建后的目录结构:
+
+
+
+2.在 app.json 文件注册分包。
+
+```javascript
+{
+ "pages": [
+ "pages/index/index"
+ ],
+ "subPackages": [
+ {
+ "root": "TUI-CustomerService",
+ "name": "TUI-CustomerService",
+ "pages": [
+ "pages/index"
+ ],
+ "independent": false
+ }
+ ],
+ "window": {
+ "backgroundTextStyle": "light",
+ "navigationBarBackgroundColor": "#fff",
+ "navigationBarTitleText": "Weixin",
+ "navigationBarTextStyle": "black"
+ },
+ "style": "v2",
+ "sitemapLocation": "sitemap.json"
+}
+```
+3.将 TUIKit 文件夹复制到分包目录下。
+成功后的目录结构:
+
+
+
+4.将 TUIKit 文件夹下的 debug 和 lib 文件夹复制到主包。
+
+
+
+5. 在分包内引用 TUIKit组件,为此需要分别修改分包内部 index.wxml 、index.js 、index.json 文件,以及 app.js 文件。
+
+wxml 文件
+
+
+
+```javascript
+
+
+
+```
+
+ js 文件
+
+
+
+```javascript
+Page({
+
+// 其他代码
+
+ onLoad() {
+ const TUIKit = this.selectComponent('#TUIKit');
+ TUIKit.init();
+ },
+});
+```
+
+ json 文件
+
+
+
+```javascript
+ {
+ "usingComponents": {
+ "TUIKit": "../TUIKit/index"
+ },
+ "navigationStyle": "custom"
+ }
+```
+app.js 文件
+
+
+
+```javascript
+import TIM from './lib/tim-wx-sdk';
+import TIMUploadPlugin from './lib/tim-upload-plugin';
+import TIMProfanityFilterPlugin from './lib/tim-profanity-filter-plugin';
+import { genTestUserSig } from './debug/GenerateTestUserSig';
+App({
+ onLaunch: function () {
+ wx.$TUIKit = TIM.create({
+ SDKAppID: this.globalData.config.SDKAPPID,
+ });
+ const userSig = genTestUserSig(this.globalData.config).userSig
+ wx.$chat_SDKAppID = this.globalData.config.SDKAPPID;
+ wx.$TUIKitTIM = TIM;
+ wx.$chat_userID = this.globalData.config.userID;
+ wx.$chat_userSig = userSig;
+ wx.$TUIKit.registerPlugin({ 'tim-upload-plugin': TIMUploadPlugin });
+ wx.$TUIKit.registerPlugin({ 'tim-profanity-filter-plugin': TIMProfanityFilterPlugin });
+ wx.$TUIKit.login({
+ userID: this.globalData.config.userID,
+ userSig
+ });
+ // 监听系统级事件
+ wx.$TUIKit.on(wx.$TUIKitTIM.EVENT.SDK_READY, this.onSDKReady);
+ },
+ globalData: {
+ config: {
+ userID: '', //User ID
+ SECRETKEY: '', // Your secretKey
+ SDKAPPID: 0, // Your SDKAppID
+ EXPIRETIME: 604800,
+ },
+ },
+ onSDKReady() {
+ },
+});
+```
+6. 按需载入分包,您需要修改主包 pages 下的 index.wxml 、index.js。
+
+wxml 文件
+
+
+
+```javascript
+
+ 载入腾讯云 IM 分包
+
+```
+
+js 文件
+
+
+
+```javascript
+Page({
+ handleJump() {
+ app.method.navigateTo({
+ url: '../../TUI-CustomerService/pages/index',
+ })
+ }
+})
+```
+
+#### 步骤4: 获取 SDKAppID 、密钥与 userID
+
+设置步骤3示例代码中的相关参数 SDKAPPID、SECRETKEY 以及 userID ,其中 SDKAppID 和密钥等信息,可通过 [即时通信 IM 控制台](https://console.cloud.tencent.com/im) 获取,单击目标应用卡片,进入应用的基础配置页面。例如:
+
+userID 信息,可通过 [即时通信 IM 控制台](https://console.cloud.tencent.com/im) 进行创建和获取,单击目标应用卡片,进入应用的账号管理页面,即可创建账号并获取 userID。例如:
+
+
+### 步骤5:编译小程序
+
+- 请在本地设置里面勾选上“不校验合法域名、web-view (业务域名)、 TLS 版本以及 HTTPS 证书”。
+
+
+
+- 点击【清缓存】->【全部清除】,避免开发者工具的缓存造成渲染异常。
+
+
+
+- 点击【编译】。
+
+
+
+### 步骤6:发送您的第一条消息
+
+
+
+### 常见问题
+#### 1. 什么是 UserSig?
+
+UserSig 是用户登录即时通信 IM 的密码,其本质是对 UserID 等信息加密后得到的密文。
+
+#### 2. 如何生成 UserSig?
+
+ UserSig 签发方式是将 UserSig 的计算代码集成到您的服务端,并提供面向项目的接口,在需要 UserSig 时由您的项目向业务服务器发起请求获取动态 UserSig。更多详情请参见 [服务端生成 UserSig](https://cloud.tencent.com/document/product/269/32688#GeneratingdynamicUserSig)。
+
+> !
+>
+> 本文示例代码采用的获取 UserSig 的方案是在客户端代码中配置 SECRETKEY,该方法中 SECRETKEY 很容易被反编译逆向破解,一旦您的密钥泄露,攻击者就可以盗用您的腾讯云流量,因此**该方法仅适合本地跑通功能调试**。 正确的 UserSig 签发方式请参见上文。
+
+### 3. 小程序如果需要上线或者部署正式环境怎么办?
+请在**微信公众平台**>**开发**>**开发管理**>**开发设置**>**服务器域名**中进行域名配置:
+
+从v2.11.2起 SDK 支持了 WebSocket,WebSocket 版本须添加以下域名到 **socket 合法域名**:
+
+| 域名 | 说明 | 是否必须 |
+|-------|---------|----|
+|`wss://wss.im.qcloud.com`| Web IM 业务域名 | 必须|
+|`wss://wss.tim.qq.com`| Web IM 业务域名 | 必须|
+
+将以下域名添加到 **request 合法域名**:
+
+| 域名 | 说明 | 是否必须 |
+|-------|---------|----|
+|`https://web.sdk.qcloud.com`| Web IM 业务域名 | 必须|
+|`https://webim.tim.qq.com` | Web IM 业务域名 | 必须|
+|`https://api.im.qcloud.com` | Web IM 业务域名 | 必须|
+
+
+将以下域名添加到 **uploadFile 合法域名**:
+
+| 域名 | 说明 | 是否必须 |
+|-------|---------|----|
+|`https://cos.ap-shanghai.myqcloud.com` | 文件上传域名 | 必须|
+|`https://cos.ap-shanghai.tencentcos.cn` | 文件上传域名 | 必须|
+|`https://cos.ap-guangzhou.myqcloud.com` | 文件上传域名 | 必须|
+
+
+将以下域名添加到 **downloadFile 合法域名**:
+
+| 域名 | 说明 | 是否必须 |
+|-------|---------|----|
+|`https://cos.ap-shanghai.myqcloud.com` | 文件下载域名 | 必须|
+|`https://cos.ap-shanghai.tencentcos.cn` | 文件下载域名 | 必须|
+|`https://cos.ap-guangzhou.myqcloud.com` | 文件下载域名 | 必须|
+
diff --git a/TUIService/TUIKit/CHANGELOG.md b/TUIService/TUIKit/CHANGELOG.md
new file mode 100644
index 0000000..f8b50c5
--- /dev/null
+++ b/TUIService/TUIKit/CHANGELOG.md
@@ -0,0 +1,37 @@
+## 1.0.12 (2023-1-4)
+### 新增
+- 支持本地消息审核[需在控制台开启](https://console.cloud.tencent.com/im/local-audit-setting)
+### 修复
+- 修复发送图片重复问题
+- 修复群提示消息展示问题
+
+## 1.0.10 (2022-12-10)
+### 新增
+- 支持群通话[音视频通话](https://cloud.tencent.com/document/product/269/68378)
+### 修复
+- 修复已知问题,提升稳定性
+
+## 1.0.8 (2022-11-20)
+### 新增
+- 支持 github 仓库形式接入源码
+### 修复
+- 修复已知问题,提升稳定性
+
+
+## 1.0.5 (2022-10-10)
+
+### 新增
+- 支持集成 1V1 音视频通话[音视频通话](https://cloud.tencent.com/document/product/269/68378)
+- 提供分包接入解决方案
+### 修复
+- 修复已知问题,提升稳定性
+
+## 1.0.0 (2022-09-15)
+
+- 支持组件形式集成
+
+### 新增
+- [TUIKit界面库 - 小程序](https://cloud.tencent.com/document/product/269/79721)
+- [集成基础功能 - 小程序](https://cloud.tencent.com/document/product/269/62768)
+- [设置界面风格 - 小程序](https://cloud.tencent.com/document/product/269/79083)
+- [添加自定义消息 - 小程序](https://cloud.tencent.com/document/product/269/62789)
\ No newline at end of file
diff --git a/TUIService/TUIKit/README.md b/TUIService/TUIKit/README.md
new file mode 100644
index 0000000..8eaa676
--- /dev/null
+++ b/TUIService/TUIKit/README.md
@@ -0,0 +1,358 @@
+## 关于腾讯云即时通信 IM
+
+腾讯云即时通信(Instant Messaging,IM)基于 QQ 底层 IM 能力开发,仅需植入 SDK 即可轻松集成聊天、会话、群组、资料管理能力,帮助您实现文字、图片、短语音、短视频等富媒体消息收发,全面满足通信需要。
+
+## 关于 chat-uikit-wechat
+
+chat-uikit-wechat 是基于腾讯云 IM SDK 的一款 小程序 UI 组件库,它提供了一些通用的 UI 组件,包含会话、聊天、群组、音视频通话等功能。基于 UI 组件您可以像搭积木一样快速搭建起自己的业务逻辑。
+chat-uikit-wechat 中的组件在实现 UI 功能的同时,会调用 IM SDK 相应的接口实现 IM 相关逻辑和数据的处理,因而开发者在使用 chat-uikit-wechat 时只需关注自身业务或个性化扩展即可。
+chat-uikit-wechat 效果如下图所示:
+
+
+
+## 发送您的第一条消息
+
+### 开发环境要求
+
+- 微信开发者工具
+- JavaScript
+- node(12.13.0 <= node版本 <= 17.0.0, 推荐使用 Node.js 官方 LTS 版本 16.17.0)
+- npm(版本请与 node 版本匹配)
+
+### TUIKit 源码集成
+
+#### 步骤1:创建项目
+
+在微信开发者工具上创建一个小程序项目,选择不使用模版。
+
+
+
+#### 步骤2:下载 TUIKit 组件
+
+微信开发者工具创建的小程序不会默认创建 package.json 文件,因此您需要先创建 package.json 文件。新建终端,如下:
+
+
+
+输入:
+
+```javascript
+npm init
+```
+然后通过 npm 方式下载 TUIKit 组件, 为了方便您后续的拓展,建议您将 TUIKit 组件复制到自己的小程序目录下:
+
+macOS端
+```javascript
+npm i @tencentcloud/chat-uikit-wechat
+```
+```javascript
+mkdir -p ./TUIKit && cp -r node_modules/@tencentcloud/chat-uikit-wechat/ ./TUIKit
+```
+Windows端
+```javascript
+npm i @tencentcloud/chat-uikit-wechat
+```
+```javascript
+xcopy node_modules\@tencentcloud\chat-uikit-wechat .\TUIKit /i /e
+```
+成功后目录结构如图所示:
+
+
+#### 步骤3:引入 TUIKit 组件
+
+##### 方式一: 主包引入 (适用于业务逻辑简单的小程序)
+在 page 页面引用 TUIKit 组件,为此您需要分别修改 index.wxml 、index.js 和 index.json。
+
+wxml 文件
+
+
+
+```javascript
+
+
+
+```
+
+js 文件
+
+
+
+```javascript
+import TIM from '../../TUIKit/lib/tim-wx-sdk';
+import { genTestUserSig } from '../../TUIKit/debug/GenerateTestUserSig';
+import TIMUploadPlugin from '../../TUIKit/lib/tim-upload-plugin';
+import TIMProfanityFilterPlugin from '../../TUIKit/lib/tim-profanity-filter-plugin';
+
+Page({
+ data: {
+ config: {
+ userID: '', //User ID
+ SDKAPPID: 0, // Your SDKAppID
+ SECRETKEY: '', // Your secretKey
+ EXPIRETIME: 604800,
+ }
+ },
+
+ onLoad() {
+ const userSig = genTestUserSig(this.data.config).userSig
+ wx.$TUIKit = TIM.create({
+ SDKAppID: this.data.config.SDKAPPID
+ })
+ wx.$chat_SDKAppID = this.data.config.SDKAPPID;
+ wx.$chat_userID = this.data.config.userID;
+ wx.$chat_userSig = userSig;
+ wx.$TUIKitTIM = TIM;
+ wx.$TUIKit.registerPlugin({ 'tim-upload-plugin': TIMUploadPlugin });
+ wx.$TUIKit.registerPlugin({ 'tim-profanity-filter-plugin': TIMProfanityFilterPlugin });
+ wx.$TUIKit.login({
+ userID: this.data.config.userID,
+ userSig
+ });
+ wx.setStorage({
+ key: 'currentUserID',
+ data: [],
+ });
+ wx.$TUIKit.on(wx.$TUIKitTIM.EVENT.SDK_READY, this.onSDKReady,this);
+ },
+ onUnload() {
+ wx.$TUIKit.off(wx.$TUIKitTIM.EVENT.SDK_READY, this.onSDKReady,this);
+ },
+ onSDKReady() {
+ const TUIKit = this.selectComponent('#TUIKit');
+ TUIKit.init();
+ }
+});
+```
+ json 文件
+
+
+
+```javascript
+{
+ "usingComponents": {
+ "TUIKit": "../../TUIKit/index"
+ },
+ "navigationStyle": "custom"
+}
+```
+
+##### 方式二:分包引入 (适用于业务逻辑复杂,按需载入的小程序)
+小程序分包有如下好处:
+- 规避所有逻辑代码放主包,导致主包文件体积超限问题
+- 支持按需载入,降低小程序载入耗时和页面渲染耗时
+- 支持更加复杂的功能
+分包流程:
+1.在自己项目里创建分包,本文以 TUI—CustomerService 为例。和 pages 同级创建 TUI—CustomerService 文件夹,并在文件夹内部创建 pages 文件夹并且其下创建 index 页面。
+创建后的目录结构:
+
+
+2.在 app.json 文件注册分包。
+
+```javascript
+{
+ "pages": [
+ "pages/index/index"
+ ],
+ "subPackages": [
+ {
+ "root": "TUI-CustomerService",
+ "name": "TUI-CustomerService",
+ "pages": [
+ "pages/index"
+ ],
+ "independent": false
+ }
+ ],
+ "window": {
+ "backgroundTextStyle": "light",
+ "navigationBarBackgroundColor": "#fff",
+ "navigationBarTitleText": "Weixin",
+ "navigationBarTextStyle": "black"
+ },
+ "style": "v2",
+ "sitemapLocation": "sitemap.json"
+}
+```
+3.将 TUIKit 文件夹复制到分包目录下。
+成功后的目录结构:
+
+
+4.将 TUIKit 文件夹下的 debug 和 lib 文件夹复制到主包。
+
+
+5. 在分包内引用 TUIKit组件,为此需要分别修改分包内部 index.wxml 、index.js 、index.json 文件,以及 app.js 文件。
+
+wxml 文件
+
+
+
+```javascript
+
+
+
+```
+
+ js 文件
+
+
+
+```javascript
+Page({
+
+// 其他代码
+
+ onLoad() {
+ const TUIKit = this.selectComponent('#TUIKit');
+ TUIKit.init();
+ },
+});
+```
+
+ json 文件
+
+
+
+```javascript
+ {
+ "usingComponents": {
+ "TUIKit": "../TUIKit/index"
+ },
+ "navigationStyle": "custom"
+ }
+```
+app.js 文件
+
+
+
+```javascript
+import TIM from './lib/tim-wx-sdk';
+import TIMUploadPlugin from './lib/tim-upload-plugin';
+import TIMProfanityFilterPlugin from './lib/tim-profanity-filter-plugin';
+import { genTestUserSig } from './debug/GenerateTestUserSig';
+App({
+ onLaunch: function () {
+ wx.$TUIKit = TIM.create({
+ SDKAppID: this.globalData.config.SDKAPPID,
+ });
+ const userSig = genTestUserSig(this.globalData.config).userSig
+ wx.$chat_SDKAppID = this.globalData.config.SDKAPPID;
+ wx.$TUIKitTIM = TIM;
+ wx.$chat_userID = this.globalData.config.userID;
+ wx.$chat_userSig = userSig;
+ wx.$TUIKit.registerPlugin({ 'tim-upload-plugin': TIMUploadPlugin });
+ wx.$TUIKit.registerPlugin({ 'tim-profanity-filter-plugin': TIMProfanityFilterPlugin });
+ wx.$TUIKit.login({
+ userID: this.globalData.config.userID,
+ userSig
+ });
+ // 监听系统级事件
+ wx.$TUIKit.on(wx.$TUIKitTIM.EVENT.SDK_READY, this.onSDKReady);
+ },
+ globalData: {
+ config: {
+ userID: '', //User ID
+ SECRETKEY: '', // Your secretKey
+ SDKAPPID: 0, // Your SDKAppID
+ EXPIRETIME: 604800,
+ },
+ },
+ onSDKReady() {
+ },
+});
+```
+6. 按需载入分包,您需要修改主包 pages 下的 index.wxml 、index.js。
+
+wxml 文件
+
+
+
+```javascript
+
+ 载入腾讯云 IM 分包
+
+```
+
+js 文件
+
+
+
+```javascript
+Page({
+ handleJump() {
+ app.method.navigateTo({
+ url: '../../TUI-CustomerService/pages/index',
+ })
+ }
+})
+```
+
+#### 步骤4: 获取 SDKAppID 、密钥与 userID
+
+设置步骤3示例代码中的相关参数 SDKAPPID、SECRETKEY 以及 userID ,其中 SDKAppID 和密钥等信息,可通过 [即时通信 IM 控制台](https://console.cloud.tencent.com/im) 获取,单击目标应用卡片,进入应用的基础配置页面。例如:
+
+userID 信息,可通过 [即时通信 IM 控制台](https://console.cloud.tencent.com/im) 进行创建和获取,单击目标应用卡片,进入应用的账号管理页面,即可创建账号并获取 userID。例如:
+
+
+### 步骤5:编译小程序
+
+- 请在本地设置里面勾选上“不校验合法域名、web-view (业务域名)、 TLS 版本以及 HTTPS 证书”。
+
+
+
+- 点击【清缓存】->【全部清除】,避免开发者工具的缓存造成渲染异常。
+
+
+
+- 点击【编译】。
+
+
+
+### 步骤6:发送您的第一条消息
+
+
+
+### 常见问题
+#### 1. 什么是 UserSig?
+
+UserSig 是用户登录即时通信 IM 的密码,其本质是对 UserID 等信息加密后得到的密文。
+
+#### 2. 如何生成 UserSig?
+
+ UserSig 签发方式是将 UserSig 的计算代码集成到您的服务端,并提供面向项目的接口,在需要 UserSig 时由您的项目向业务服务器发起请求获取动态 UserSig。更多详情请参见 [服务端生成 UserSig](https://cloud.tencent.com/document/product/269/32688#GeneratingdynamicUserSig)。
+
+> !
+>
+> 本文示例代码采用的获取 UserSig 的方案是在客户端代码中配置 SECRETKEY,该方法中 SECRETKEY 很容易被反编译逆向破解,一旦您的密钥泄露,攻击者就可以盗用您的腾讯云流量,因此**该方法仅适合本地跑通功能调试**。 正确的 UserSig 签发方式请参见上文。
+
+### 3. 小程序如果需要上线或者部署正式环境怎么办?
+请在**微信公众平台**>**开发**>**开发管理**>**开发设置**>**服务器域名**中进行域名配置:
+
+从v2.11.2起 SDK 支持了 WebSocket,WebSocket 版本须添加以下域名到 **socket 合法域名**:
+
+| 域名 | 说明 | 是否必须 |
+|-------|---------|----|
+|`wss://wss.im.qcloud.com`| Web IM 业务域名 | 必须|
+|`wss://wss.tim.qq.com`| Web IM 业务域名 | 必须|
+
+将以下域名添加到 **request 合法域名**:
+
+| 域名 | 说明 | 是否必须 |
+|-------|---------|----|
+|`https://web.sdk.qcloud.com`| Web IM 业务域名 | 必须|
+|`https://webim.tim.qq.com` | Web IM 业务域名 | 必须|
+|`https://api.im.qcloud.com` | Web IM 业务域名 | 必须|
+
+
+| 域名 | 说明 | 是否必须 |
+|-------|---------|----|
+|`https://cos.ap-shanghai.myqcloud.com` | 文件上传域名 | 必须|
+|`https://cos.ap-shanghai.tencentcos.cn` | 文件上传域名 | 必须|
+|`https://cos.ap-guangzhou.myqcloud.com` | 文件上传域名 | 必须|
+
+
+将以下域名添加到 **downloadFile 合法域名**:
+
+| 域名 | 说明 | 是否必须 |
+|-------|---------|----|
+|`https://cos.ap-shanghai.myqcloud.com` | 文件下载域名 | 必须|
+|`https://cos.ap-shanghai.tencentcos.cn` | 文件下载域名 | 必须|
+|`https://cos.ap-guangzhou.myqcloud.com` | 文件下载域名 | 必须|
diff --git a/TUIService/TUIKit/components/TUICallKit/TUICallKit/TUICallKit.js b/TUIService/TUIKit/components/TUICallKit/TUICallKit/TUICallKit.js
new file mode 100644
index 0000000..4b43351
--- /dev/null
+++ b/TUIService/TUIKit/components/TUICallKit/TUICallKit/TUICallKit.js
@@ -0,0 +1,3 @@
+Component({
+
+})
\ No newline at end of file
diff --git a/TUIService/TUIKit/components/TUICallKit/TUICallKit/TUICallKit.json b/TUIService/TUIKit/components/TUICallKit/TUICallKit/TUICallKit.json
new file mode 100644
index 0000000..52dd6e0
--- /dev/null
+++ b/TUIService/TUIKit/components/TUICallKit/TUICallKit/TUICallKit.json
@@ -0,0 +1,7 @@
+{
+ "component": true,
+ "usingComponents": {
+ },
+ "navigationStyle": "custom",
+ "disableScroll": true
+}
\ No newline at end of file
diff --git a/TUIService/TUIKit/components/TUICallKit/TUICallKit/TUICallKit.wxml b/TUIService/TUIKit/components/TUICallKit/TUICallKit/TUICallKit.wxml
new file mode 100644
index 0000000..e69de29
diff --git a/TUIService/TUIKit/components/TUICallKit/TUICallKit/TUICallKit.wxss b/TUIService/TUIKit/components/TUICallKit/TUICallKit/TUICallKit.wxss
new file mode 100644
index 0000000..e69de29
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessageElements/AudioMessage/index.js b/TUIService/TUIKit/components/TUIChat/components/MessageElements/AudioMessage/index.js
new file mode 100644
index 0000000..30ae25a
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessageElements/AudioMessage/index.js
@@ -0,0 +1,151 @@
+import { parseAudio } from '../../../../../utils/message-parse';
+
+// 创建audio控件
+const myaudio = wx.createInnerAudioContext();
+// eslint-disable-next-line no-undef
+Component({
+ /**
+ * 组件的属性列表
+ */
+ properties: {
+ message: {
+ type: Object,
+ value: {},
+ observer(newVal) {
+ this.setData({
+ renderDom: parseAudio(newVal),
+ message: newVal,
+ });
+ },
+ },
+ messageList: {
+ type: Object,
+ value: {},
+ observer(newVal) {
+ this.filtterAudioMessage(newVal);
+ this.setData({
+ audioMessageList: newVal,
+ });
+ },
+ },
+ isMine: {
+ type: Boolean,
+ value: true,
+ },
+ },
+
+ lifetimes: {
+ detached() {
+ myaudio.stop();
+ },
+ },
+
+ /**
+ * 组件的初始数据
+ */
+ data: {
+ message: '',
+ renderDom: [],
+ Audio: [],
+ audioMessageList: [],
+ audioSave: [],
+ audKey: '', // 当前选中的音频key
+ indexAudio: Number,
+ isPlay: false,
+ },
+
+ /**
+ * 组件的方法列表
+ */
+ methods: {
+ // 过滤语音消息,从消息列表里面筛选出语音消息
+ filtterAudioMessage(messageList) {
+ const list = [];
+ for (let index = 0; index < messageList.length; index++) {
+ if (messageList[index].type === 'TIMSoundElem') {
+ list.push(messageList[index]);
+ Object.assign(messageList[index], {
+ isPlaying: false,
+ }),
+ this.data.audioSave = list;
+ this.setData({
+ audioSave: this.data.audioSave,
+ });
+ }
+ }
+ },
+
+ // 音频播放
+ audioPlay(e) {
+ const { id } = e.currentTarget.dataset;
+ const { audioSave } = this.data;
+
+ // 设置状态
+ audioSave.forEach((message, index) => {
+ message.isPlaying = false;
+ if (audioSave[index].ID == id) {
+ message.isPlaying = true;
+ const indexAudio = audioSave.findIndex(value => value.ID == audioSave[index].ID);
+ this.setData({
+ indexAudio,
+ isPlay: false,
+ });
+ }
+ });
+ this.setData({
+ audioSave,
+ audKey: this.data.indexAudio,
+ isPlay: true,
+ });
+ myaudio.autoplay = true;
+ const { audKey } = this.data;
+ const playSrc = audioSave[audKey].payload.url;
+ myaudio.src = playSrc;
+ myaudio.play();
+ // 开始监听
+ myaudio.onPlay(() => {
+ console.log('开始播放');
+ });
+
+ // 结束监听
+ myaudio.onEnded(() => {
+ console.log('自动播放完毕');
+ audioSave[this.data.indexAudio].isPlaying = false;
+ this.setData({
+ audioSave,
+ isPlay: false,
+ });
+ });
+
+ // 错误回调
+ myaudio.onError((err) => {
+ console.log(err);
+ audioSave[this.data.indexAudio].isPlaying = false;
+ this.setData({
+ audioSave,
+ });
+ return;
+ });
+ },
+
+ // 音频停止
+ audioStop(e) {
+ const { key } = e.currentTarget.dataset;
+ const { audioSave } = this.data;
+ // 设置状态
+ audioSave.forEach((message, index) => {
+ message.isPlaying = false;
+ });
+ this.setData({
+ audioSave,
+ isPlay: false,
+ });
+ myaudio.stop();
+
+ // 停止监听
+ myaudio.onStop(() => {
+ console.log('停止播放');
+ });
+ },
+ },
+});
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessageElements/AudioMessage/index.json b/TUIService/TUIKit/components/TUIChat/components/MessageElements/AudioMessage/index.json
new file mode 100644
index 0000000..e8cfaaf
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessageElements/AudioMessage/index.json
@@ -0,0 +1,4 @@
+{
+ "component": true,
+ "usingComponents": {}
+}
\ No newline at end of file
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessageElements/AudioMessage/index.wxml b/TUIService/TUIKit/components/TUIChat/components/MessageElements/AudioMessage/index.wxml
new file mode 100644
index 0000000..a9764ea
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessageElements/AudioMessage/index.wxml
@@ -0,0 +1,14 @@
+
+
+
+
+ {{renderDom[0].second}}s
+
+
+
+ {{renderDom[0].second}}s
+
+
+
+
+
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessageElements/AudioMessage/index.wxss b/TUIService/TUIKit/components/TUIChat/components/MessageElements/AudioMessage/index.wxss
new file mode 100644
index 0000000..4bfe7d2
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessageElements/AudioMessage/index.wxss
@@ -0,0 +1,32 @@
+.audio-message {
+ padding: 10rpx 18rpx;
+ border-radius: 2px 10px 10px 10px;
+ border: 1px solid #D9D9D9;
+}
+.my-audio {
+ border-radius: 10px 2px 10px 10px;
+ background: rgba(0,110,255,0.10);
+ border: 1px solid rgba(0,110,255,0.30);
+}
+.audio {
+ /*border-radius: 2px 10px 10px 10px;*/
+ height: 60rpx;
+ font-family: PingFangSC-Medium;
+ font-size: 28rpx;
+ color: #000000;
+ line-height: 28rpx;
+ display: flex;
+ align-items: center;
+ justify-content: flex-end;
+}
+.image{
+ width: 16px;
+ height: 16px;
+ padding-left: 2px;
+ padding-right: 2px;
+}
+.my-image{
+ width: 16px;
+ height: 16px;
+ transform:rotate(180deg)
+}
\ No newline at end of file
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessageElements/CustomMessage/index.js b/TUIService/TUIKit/components/TUIChat/components/MessageElements/CustomMessage/index.js
new file mode 100644
index 0000000..3385bd7
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessageElements/CustomMessage/index.js
@@ -0,0 +1,329 @@
+import formateTime from '../../../../../utils/formate-time';
+import constant from '../../../../../utils/constant';
+import {
+ getCurrentPageUrl,
+ getCurrentPageParam
+} from "../../../../../../../utils/getUrl"
+import {
+ getRate
+} from "../../../../../../../api/consultOrder"
+const app = getApp()
+// eslint-disable-next-line no-undef
+Component({
+ /**
+ * 组件的属性列表
+ */
+ properties: {
+ message: {
+ type: Object,
+ value: {},
+ observer(newVal) {
+ this.setData({
+ message: newVal,
+ renderDom: this.parseCustom(newVal),
+ });
+ },
+ },
+ patient_data:{
+ type: Object,
+ value: {},
+ observer(newVal) {
+ this.setData({
+ patient_data: newVal,
+ });
+ }
+ },
+ isMine: {
+ type: Boolean,
+ value: true,
+ },
+ },
+ pageLifetimes:{
+ show: function() {
+ this.setData({
+ img_host:app.hostConfig().imghost
+ });
+
+ },
+ },
+
+ /**
+ * 组件的初始数据
+ */
+ data: {
+ displayServiceEvaluation: false,
+ score: 0,
+ img_host:'https://oss.prod.applets.igandanyiyuan.com/applet/patient/static',
+ commentDetail: null
+ },
+
+ /**
+ * 组件的方法列表
+ */
+ methods: {
+ // async getDom(id,renderDom){
+ // let result = await this.handleGetRate(id,renderDom);
+ // return result
+ // },
+ handleGetRate(id) {
+ getRate(id).then(data => {
+ let commentDetail = null;
+ if (data) {
+ commentDetail = data
+ } else {
+ commentDetail = {
+ avg_score: 0,
+ content: "",
+ evaluation_id: "",
+ is_evaluation: false,
+ order_inquiry_id:id,
+ reply_progress: 0,
+ reply_quality: 0,
+ service_attitude: 0
+
+ }
+ }
+ this.triggerEvent("popComment",commentDetail);
+ })
+ },
+ async handleAllRate(id, renderDom) {
+ let result = null;
+ await getRate(id).then(data => {
+ if (data) {
+ renderDom[0].is_evaluation = true;
+ renderDom[0].score = data.avg_score;
+ }
+ })
+
+ this.setData({
+ renderDom: renderDom
+ })
+ },
+ showPop(event) {
+ let id = event.currentTarget.dataset.id;
+ console.log(id);
+ this.handleGetRate(id);
+ },
+
+ // 解析音视频通话消息
+ extractCallingInfoFromMessage(message) {
+ const callingmessage = JSON.parse(message.payload.data);
+ if (callingmessage.businessID !== 1) {
+ return '';
+ }
+ const objectData = JSON.parse(callingmessage.data);
+ switch (callingmessage.actionType) {
+ case 1: {
+ if (objectData.call_end >= 0) {
+ return `通话时长:${formateTime(objectData.call_end)}`;
+ }
+ if (objectData.data && objectData.data.cmd === 'switchToAudio') {
+ return '切换语音通话';
+ }
+ if (objectData.data && objectData.data.cmd === 'switchToVideo') {
+ return '切换视频通话';
+ }
+ return '发起通话';
+ }
+ case 2:
+ return '取消通话';
+ case 3:
+ if (objectData.data && objectData.data.cmd === 'switchToAudio') {
+ return '切换语音通话';
+ }
+ if (objectData.data && objectData.data.cmd === 'switchToVideo') {
+ return '切换视频通话';
+ }
+ return '已接听';
+ case 4:
+ return '拒绝通话';
+ case 5:
+ if (objectData.data && objectData.data.cmd === 'switchToAudio') {
+ return '切换语音通话';
+ }
+ if (objectData.data && objectData.data.cmd === 'switchToVideo') {
+ return '切换视频通话';
+ }
+ return '无应答';
+ default:
+ return '';
+ }
+ },
+ parseCustom(message) {
+ const {
+ BUSINESS_ID_TEXT
+ } = constant;
+ // 群消息解析
+ if (message.payload.data === BUSINESS_ID_TEXT.CREATE_GROUP) {
+ const renderDom = [{
+ type: 'group_create',
+ text: message.payload.extension,
+ }];
+ return renderDom;
+ }
+ try {
+ const customMessage = JSON.parse(message.payload.data);
+ let avastar = '';
+ if (message.flow == "in") {
+ avastar = message.avatar;
+ }
+ // 约定自定义消息的 data 字段作为区分,不解析的不进行展示
+ if (customMessage.businessID === BUSINESS_ID_TEXT.ORDER) {
+ const renderDom = [{
+ type: 'order',
+ name: 'custom',
+ title: customMessage.title || '',
+ imageUrl: customMessage.imageUrl || '',
+ price: customMessage.price || 0,
+ description: customMessage.description,
+ }];
+ return renderDom;
+ }
+ // 服务评价
+ if (customMessage.businessID === BUSINESS_ID_TEXT.EVALUATION) {
+ const renderDom = [{
+ type: 'evaluation',
+ title: message.payload.description,
+ score: customMessage.score,
+ description: customMessage.comment,
+ }];
+ return renderDom;
+ }
+ // native 自定义消息解析
+ if (customMessage.businessID === BUSINESS_ID_TEXT.LINK) {
+ const renderDom = [{
+ type: 'text_link',
+ text: customMessage.text,
+ }];
+ return renderDom;
+ }
+ // 自定义消息类型(1:消息内页横条 2:订单结束评价弹出 3:医生端系统通知 4:医生端服务通知 5:患者端系统消息 6:处方开具成功(医生端) 7:处方审核通过(患者端))",
+ if (customMessage.message_type == 1) {
+ const renderDom = [{
+ type: 'msg_tip',
+ text: customMessage.title,
+ desc: customMessage.desc
+ }];
+ return renderDom;
+ }
+
+ if (customMessage.message_type == 2) {
+ let renderDom = [{
+ type: 'msg_comment',
+ text: customMessage.title,
+ order_inquiry_id: customMessage.data.order_inquiry_id,
+ is_evaluation: false,
+ score: 0,
+ desc: customMessage.desc,
+ avatar: avastar
+ }];
+
+ this.handleAllRate(customMessage.data.order_inquiry_id, renderDom);
+
+ return renderDom;
+ };
+ if (customMessage.message_type == 7) {
+ let data = customMessage.data;
+ const renderDom = [{
+ type: 'msg_prescribe',
+ product_name: data.product_name,
+ order_inquiry_id: data.order_inquiry_id,
+ order_prescription_id: data.order_prescription_id,
+ pharmacist_verify_time: data.pharmacist_verify_time.substring(0, 10),
+ }];
+ return renderDom;
+ };
+ if (customMessage.message_type == 10) {
+ let data = customMessage.data;
+ const renderDom = [{
+ type: 'msg_checksugar',
+ title:customMessage.title,
+ order_no:data.order_no,
+ message_path:data.message_path,
+ disease_class_names: data.disease_class_names
+ }];
+ return renderDom;
+ }
+
+ } catch (error) {}
+ // 客服咨询
+ try {
+ const extension = JSON.parse(message.payload.extension);
+ if (message.payload.data === BUSINESS_ID_TEXT.CONSULTION) {
+ const renderDom = [{
+ type: 'consultion',
+ title: extension.title || '',
+ item: extension.item || 0,
+ description: extension.description,
+ }];
+ return renderDom;
+ }
+ } catch (error) {}
+ // 音视频通话消息解析
+ try {
+ const callingmessage = JSON.parse(message.payload.data);
+ if (callingmessage.businessID === 1) {
+ if (message.conversationType === wx.$TUIKitTIM.TYPES.CONV_GROUP) {
+ if (message.payload.data.actionType === 5) {
+ message.nick = message.payload.data.inviteeList ? message.payload.data.inviteeList.join(',') : message.from;
+ }
+ const _text = this.extractCallingInfoFromMessage(message);
+ const groupText = `${_text}`;
+ const renderDom = [{
+ type: 'groupCalling',
+ text: groupText,
+ userIDList: [],
+ }];
+ return renderDom;
+ }
+ if (message.conversationType === wx.$TUIKitTIM.TYPES.CONV_C2C) {
+ const c2cText = this.extractCallingInfoFromMessage(message);
+ const renderDom = [{
+ type: 'c2cCalling',
+ text: c2cText,
+ }];
+ return renderDom;
+ }
+ }
+ return [{
+ type: 'notSupport',
+ text: '[自定义消息]',
+ }];
+ } catch (error) {}
+ },
+ openLink(e) {
+ if (e.currentTarget.dataset.value.key === '立即前往') {
+ app.method.navigateTo({
+ url: '/pages/TUI-User-Center/webview/webview?url=https://cloud.tencent.com/act/pro/imnew?from=16975&wechatMobile',
+ });
+ } else if (e.currentTarget.dataset.value.key === '立即体验') {
+ app.method.navigateTo({
+ url: '/pages/TUI-User-Center/webview/webview?url=https://cloud.tencent.com/document/product/269/68091',
+ });
+ }
+ },
+ goReport(event){
+ let {url,id} = event.currentTarget.dataset;
+ app.method.navigateTo({
+ url: '/pages/checkOrderDetail/checkOrderDetail?order_detection_id='+id
+ })
+ },
+ goPrescriptDetail(event) {
+ let url = event.currentTarget.dataset.url;
+ let redirectUrl = getCurrentPageUrl();
+ let options = getCurrentPageParam();
+ let params = ""
+ for (const key in options) {
+ if (params) {
+ params = params + '&' + key + '=' + options[key];
+ } else {
+ params = params + key + '=' + options[key];
+ }
+ };
+ //console.log(url + "&fromType=" + redirectUrl + "?" + params)
+ app.method.navigateTo({
+ url: url + "&fromType=" + encodeURIComponent(redirectUrl + "?" + params)
+ })
+ }
+ },
+});
\ No newline at end of file
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessageElements/CustomMessage/index.json b/TUIService/TUIKit/components/TUIChat/components/MessageElements/CustomMessage/index.json
new file mode 100644
index 0000000..785d068
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessageElements/CustomMessage/index.json
@@ -0,0 +1,6 @@
+{
+ "component": true,
+ "usingComponents": {
+ "van-rate": "@vant/weapp/rate/index"
+ }
+}
\ No newline at end of file
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessageElements/CustomMessage/index.wxml b/TUIService/TUIKit/components/TUIChat/components/MessageElements/CustomMessage/index.wxml
new file mode 100644
index 0000000..680e1d4
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessageElements/CustomMessage/index.wxml
@@ -0,0 +1,98 @@
+
+
+
+
+ {{renderDom[0].title}}
+ {{renderDom[0].description}}
+ {{renderDom[0].price}}
+
+
+
+
+
+ {{renderDom[0].title}}
+ {{renderDom[0].hyperlinks_text.key}}
+ {{item.key}}
+
+
+ {{renderDom[0].description}}
+
+
+
+
+ {{renderDom[0].title}}
+
+
+
+ {{renderDom[0].description}}
+
+
+
+ {{renderDom[0].text}}
+ 查看详情>>
+
+
+ {{renderDom[0].text}}
+
+
+ {{renderDom[0].text}}
+
+
+ {{renderDom[0].text}}
+
+
+ {{renderDom[0].text}}
+ {{renderDom[0].desc}}
+
+
+
+
+
+
+
+ 处方已开具
+
+
+
+
+
+
+
+ RP:{{renderDom[0].product_name}}
+ 开方日期: {{renderDom[0].pharmacist_verify_time}}
+
+
+ 去购买
+
+
+
+
+
+
+
+ {{renderDom[0].title}}报告
+
+
+ 就诊人:{{patient_data.patient_name}}(男女未知|{{patient_data.patient_age}}岁)
+ 所患疾病:{{renderDom[0].disease_class_names}}
+
+
+
+ 查看报告
+
+
+
+
+
+
\ No newline at end of file
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessageElements/CustomMessage/index.wxss b/TUIService/TUIKit/components/TUIChat/components/MessageElements/CustomMessage/index.wxss
new file mode 100644
index 0000000..b9492d9
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessageElements/CustomMessage/index.wxss
@@ -0,0 +1,324 @@
+.custom-message {
+ background: #FBFBFB;
+ border-radius: 4rpx 20rpx 20rpx 20rpx;
+ display: flex;
+ padding: 10rpx 24rpx;
+ background-color: #fff;
+ border: 1px solid #D9D9D9;
+}
+.content_prescribe{
+ margin:0 20rpx;
+ display: flex;
+}
+.prescribeImg{
+ margin-top: 25rpx;
+ flex-shrink: 0;
+ width:68rpx;
+ height:68rpx;
+}
+.my-custom {
+ border-radius: 10px 2px 10px 10px;
+ border: 1px solid rgba(0, 110, 255, 0.30);
+}
+
+.custom-content-title {
+ font-family: PingFangSC-Medium;
+ max-width: 268rpx;
+ height: 34rpx;
+ font-size: 28rpx;
+ color: #000000;
+ letter-spacing: 0;
+ margin-bottom: 12rpx;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ white-space: nowrap;
+}
+
+.custom-content-description {
+ font-family: PingFangSC-Regular;
+ width: 278rpx;
+ line-height: 34rpx;
+ font-size: 28rpx;
+ color: #999999;
+ letter-spacing: 0;
+ line-height: 40rpx;
+ font-size: 24rpx;
+ margin-bottom: 12rpx;
+ word-break: break-word;
+}
+
+.custom-content-price {
+ font-family: PingFangSC-Medium;
+ line-height: 50rpx;
+ color: #FF7201;
+ letter-spacing: 0;
+}
+
+.custom-image {
+ width: 135rpx;
+ height: 135rpx;
+ border-radius: 6rpx;
+ margin-right: 10rpx;
+ margin-top: 4rpx;
+}
+
+.custom-content-score {
+ display: flex;
+ align-items: center;
+ padding-bottom: 12rpx;
+}
+
+.custom-content-score .score-star {
+ width: 36rpx;
+ height: 36rpx;
+ margin-right: 10rpx;
+}
+
+.text-message {
+ display: inline-flex;
+ max-width: 60vw;
+ line-height: 52rpx;
+ padding: 12rpx 24rpx;
+ background: #F8F8F8;
+ border: 1px solid #D9D9D9;
+ border-radius: 2px 10px 10px 10px;
+}
+
+.my-text {
+ border-radius: 10px 2px 10px 10px;
+ border: 1px solid rgba(0, 110, 255, 0.30);
+ background: rgba(0, 110, 255, 0.10);
+}
+
+.message-body-span {
+ display: flex;
+ align-items: center;
+ /*justify-content: flex-start;*/
+ flex-wrap: wrap;
+ outline: none;
+ font-size: 28rpx;
+ color: #333333;
+ position: relative;
+ max-width: 60vw;
+}
+
+.message-body-span-text {
+ /* width: 434rpx; */
+ font-family: PingFangSC-Regular;
+ font-weight: 400;
+ font-size: 32rpx;
+ color: #000000;
+ letter-spacing: 0;
+ line-height: 42rpx;
+}
+
+.message-body-span-link {
+ color: blue;
+}
+
+.message-body-span-link {
+ color: blue;
+}
+
+.message-body-span-link {
+ color: blue;
+}
+
+.custom-content-text {
+ font-family: PingFangSC-Regular;
+ height: 25px;
+ line-height: 25px;
+ font-size: 28rpx;
+ letter-spacing: 0;
+}
+
+.custom-content-hyperlinks {
+ font-family: PingFangSC-Regular;
+ font-weight: 400;
+ line-height: 40rpx;
+ font-size: 28rpx;
+ color: #006EFF;
+ letter-spacing: 0;
+ margin-bottom: 12rpx;
+}
+.custom-tip-message {
+ border: none;
+ border-radius: 0;
+ font-size: 28rpx;
+ font-family: PingFangSC-Regular;
+ font-weight: 400;
+ color: #333333;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ max-width:95vw;
+ background: none;
+ flex-wrap: nowrap;
+}
+.custom-tip-message .message-body-span-text{
+ max-width:95vw;
+ min-width: 60vw;
+ height: 40rpx;
+ text-align: center;
+ background: #E1E1E1;
+}
+.message-body-span-desc{
+ margin-top: 30rpx;
+ width:90vw;
+ font-size: 24rpx;
+ text-align: center;
+font-family: PingFangSC-Regular;
+color: #666666;
+line-height: 36rpx;
+}
+.commentbox{
+ margin-top: 30rpx;
+ width:590rpx;
+ height:240rpx;
+ overflow: hidden;
+ background-color: #fff;
+ border-radius: 20rpx;
+ box-shadow: 0 0 10rpx 0 #ccc;
+}
+.commentbox .title{
+ padding: 15rpx 0;
+ text-align: center;
+ font-size: 28rpx;
+font-weight: 400;
+
+color: #333333;
+}
+.commentbox .ratebox{
+ width:100%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ margin-bottom: 32rpx;
+}
+.commentbox .button{
+ height: 75rpx;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ background:#ebf9f8;
+ font-weight:500;
+ font-size: 34rpx;
+ color: #3CC7C0;
+}
+.custom_wrap{
+ display: flex;
+ width:100%;
+ justify-content: flex-end;
+}
+.your-custom{
+ justify-content: flex-start;
+}
+
+.custom_wrap .custom-tip-message{
+ margin:0 auto;
+}
+/* 开具处方样式 */
+.gdxz_custom_order_prescribe_message{
+ width: 60vw;
+ position: relative;
+ border-radius: 10px 10px 10px 10px;
+ background: rgb(255, 255, 255);
+ border: 1rpx solid #D8D8D8;
+ /* background: rgb(255, 255, 255);
+ border: 1rpx solid #E7E7E7; */
+}
+.gdxz_custom_order_prescribe_message::after{
+ content:'';
+ position: absolute;
+ top: 35rpx;
+ left: 0;
+ transform: translate(-50%,-50%) rotate(45deg);
+ width: 16rpx;
+ height: 16rpx;
+ background: rgb(255, 255, 255);
+ border: 1rpx solid #D8D8D8;
+ border-style: none none solid solid
+}
+.prescribe_title{
+ font-size: 34rpx;
+ border-bottom: 1px solid #E7E7E7;
+ margin: 0 20rpx;
+ padding: 20rpx 0;
+}
+.prescribe_box{
+ margin: 0 20rpx;
+ padding: 20rpx 0;
+ font-size: 28rpx;
+}
+.prescribe_box_top_pharmacist_verify_time{
+ margin-top: 20rpx;
+}
+.prescribe_box_bottom{
+ display: flex;
+ justify-content: center;
+}
+.prescribe_box_buy{
+ margin: 20rpx 20rpx 0 20rpx;
+ background-color: #3CC7C0;
+ color: #fff;
+ padding: 15rpx 30rpx;
+ border-radius: 40rpx;
+ font-size: 30rpx;
+}
+/* 糖组检测 */
+
+.back{
+ width:24rpx;
+ height:48rpx;
+ transform: rotate(180deg);
+}
+.sugarbox{
+
+ position: relative;
+ width: 420rpx;
+ background: rgb(212, 239, 241);
+ border: 1rpx solid #1ACAD3;
+ border-radius: 12rpx;
+}
+.sugarbox::after{
+ content:'';
+ position: absolute;
+ top: 35rpx;
+ right: -19rpx;
+ transform: translate(-50%,-50%) rotate(-135deg);
+ width: 16rpx;
+ height: 16rpx;
+ background: rgb(212, 239, 241);
+ border: 1rpx solid #1ACAD3;
+ border-style: none none solid solid
+}
+.sugarcon{
+ margin:0rpx 24rpx 0;
+
+}
+.patient_info{
+ font-size: 28rpx;
+font-weight: 400;
+color: rgba(0,0,0,0.65);
+line-height: 40rpx;
+}
+.sugarcon{
+ border-bottom: 1rpx solid rgba(0,0,0,0.12);
+ padding-bottom: 24rpx;
+}
+.sugarcon .title{
+ margin:24rpx 0 20rpx;
+ font-size: 32rpx;
+ font-weight: 500;
+color: #3CC7C0;
+}
+.sugarbox .detail{
+ display: flex;
+ margin:0 24rpx;
+ height:88rpx;
+ font-size: 32rpx;
+font-weight: 400;
+color: rgba(0,0,0,0.85);
+ justify-content: space-between;
+ align-items: center;
+}
\ No newline at end of file
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessageElements/Emoji/index.js b/TUIService/TUIKit/components/TUIChat/components/MessageElements/Emoji/index.js
new file mode 100644
index 0000000..612fc80
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessageElements/Emoji/index.js
@@ -0,0 +1,42 @@
+import { emojiName, emojiUrl, emojiMap } from '../../../../../utils/emojiMap';
+// eslint-disable-next-line no-undef
+Component({
+ /**
+ * 组件的属性列表
+ */
+ properties: {
+
+ },
+
+ /**
+ * 组件的初始数据
+ */
+ data: {
+ emojiList: [],
+ },
+
+ lifetimes: {
+ attached() {
+ for (let i = 0; i < emojiName.length; i++) {
+ this.data.emojiList.push({
+ emojiName: emojiName[i],
+ url: emojiUrl + emojiMap[emojiName[i]],
+ });
+ }
+ this.setData({
+ emojiList: this.data.emojiList,
+ });
+ },
+ },
+
+ /**
+ * 组件的方法列表
+ */
+ methods: {
+ handleEnterEmoji(event) {
+ this.triggerEvent('enterEmoji', {
+ message: event.currentTarget.dataset.name,
+ });
+ },
+ },
+});
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessageElements/Emoji/index.json b/TUIService/TUIKit/components/TUIChat/components/MessageElements/Emoji/index.json
new file mode 100644
index 0000000..e8cfaaf
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessageElements/Emoji/index.json
@@ -0,0 +1,4 @@
+{
+ "component": true,
+ "usingComponents": {}
+}
\ No newline at end of file
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessageElements/Emoji/index.wxml b/TUIService/TUIKit/components/TUIChat/components/MessageElements/Emoji/index.wxml
new file mode 100644
index 0000000..2fde9b9
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessageElements/Emoji/index.wxml
@@ -0,0 +1,5 @@
+
+
+
+ >
+
\ No newline at end of file
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessageElements/Emoji/index.wxss b/TUIService/TUIKit/components/TUIChat/components/MessageElements/Emoji/index.wxss
new file mode 100644
index 0000000..4709c69
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessageElements/Emoji/index.wxss
@@ -0,0 +1,19 @@
+.TUI-Emoji {
+ display: flex;
+ justify-content: flex-start;
+ flex-wrap: wrap;
+ width: 100%;
+ height: 100%;
+ margin-left: 4vw;
+}
+
+.TUI-emoji-image {
+ width: 9vw;
+ height: 9vw;
+ margin: 2vw;
+}
+
+.TUI-emoji-image > image {
+ width: 100%;
+ height: 100%;
+}
\ No newline at end of file
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessageElements/FaceMessage/index.js b/TUIService/TUIKit/components/TUIChat/components/MessageElements/FaceMessage/index.js
new file mode 100644
index 0000000..6ece322
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessageElements/FaceMessage/index.js
@@ -0,0 +1,54 @@
+// eslint-disable-next-line no-undef
+Component({
+ /**
+ * 组件的属性列表
+ */
+ properties: {
+ message: {
+ type: Object,
+ value: {},
+ observer(newVal) {
+ this.setData({
+ renderDom: this.parseFace(newVal),
+ });
+ },
+ },
+ isMine: {
+ type: Boolean,
+ value: true,
+ },
+ },
+
+ /**
+ * 组件的初始数据
+ */
+ data: {
+ renderDom: [],
+ percent: 0,
+ faceUrl: 'https://web.sdk.qcloud.com/im/assets/face-elem/',
+ },
+
+ /**
+ * 组件的方法列表
+ */
+ methods: {
+ // 解析face 消息
+ parseFace(message) {
+ // 兼容android的大表情格式
+ if (message.payload.data.indexOf('@2x') < 0) {
+ message.payload.data = `${message.payload.data}@2x`;
+ }
+ const renderDom = {
+ src: `${this.data.faceUrl + message.payload.data}.png`,
+ };
+ return renderDom;
+ },
+
+ previewImage() {
+ wx.previewImage({
+ current: this.data.renderDom[0].src, // 当前显示图片的http链接
+ urls: [this.data.renderDom[0].src],
+ });
+ },
+ },
+});
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessageElements/FaceMessage/index.json b/TUIService/TUIKit/components/TUIChat/components/MessageElements/FaceMessage/index.json
new file mode 100644
index 0000000..e8cfaaf
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessageElements/FaceMessage/index.json
@@ -0,0 +1,4 @@
+{
+ "component": true,
+ "usingComponents": {}
+}
\ No newline at end of file
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessageElements/FaceMessage/index.wxml b/TUIService/TUIKit/components/TUIChat/components/MessageElements/FaceMessage/index.wxml
new file mode 100644
index 0000000..02e81e4
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessageElements/FaceMessage/index.wxml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessageElements/FaceMessage/index.wxss b/TUIService/TUIKit/components/TUIChat/components/MessageElements/FaceMessage/index.wxss
new file mode 100644
index 0000000..f228025
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessageElements/FaceMessage/index.wxss
@@ -0,0 +1,13 @@
+.TUI-faceMessage {
+ width: 150px;
+ height: 110px;
+ max-width: 60vw;
+}
+.face-message {
+ width: 100%;
+ height: 100%;
+ border-radius: 10px 10px 10px 10px;
+}
+.my-image {
+ border-radius: 10px 2px 10px 10px;
+}
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessageElements/FileMessage/index.js b/TUIService/TUIKit/components/TUIChat/components/MessageElements/FileMessage/index.js
new file mode 100644
index 0000000..964e4fa
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessageElements/FileMessage/index.js
@@ -0,0 +1,58 @@
+// eslint-disable-next-line no-undef
+Component({
+ /**
+ * 组件的属性列表
+ */
+ properties: {
+ message: {
+ type: Object,
+ value: {},
+ observer(newVal) {
+ this.setData({
+ filePayload: newVal.payload,
+ });
+ },
+ },
+ isMine: {
+ type: Boolean,
+ value: true,
+ },
+ },
+
+ /**
+ * 组件的初始数据
+ */
+ data: {
+ Show: false,
+ filePayload: {},
+ },
+
+ /**
+ * 组件的方法列表
+ */
+ methods: {
+ download() {
+ this.setData({
+ Show: true,
+ });
+ },
+ downloadConfirm() {
+ wx.downloadFile({
+ url: this.data.filePayload.fileUrl,
+ success(res) {
+ const filePath = res.tempFilePath;
+ wx.openDocument({
+ filePath,
+ success() {
+ },
+ });
+ },
+ });
+ },
+ cancel() {
+ this.setData({
+ Show: false,
+ });
+ },
+ },
+});
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessageElements/FileMessage/index.json b/TUIService/TUIKit/components/TUIChat/components/MessageElements/FileMessage/index.json
new file mode 100644
index 0000000..e8cfaaf
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessageElements/FileMessage/index.json
@@ -0,0 +1,4 @@
+{
+ "component": true,
+ "usingComponents": {}
+}
\ No newline at end of file
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessageElements/FileMessage/index.wxml b/TUIService/TUIKit/components/TUIChat/components/MessageElements/FileMessage/index.wxml
new file mode 100644
index 0000000..c976dec
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessageElements/FileMessage/index.wxml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+ 下载
+
+
+ 取消
+
+
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessageElements/FileMessage/index.wxss b/TUIService/TUIKit/components/TUIChat/components/MessageElements/FileMessage/index.wxss
new file mode 100644
index 0000000..cbe32aa
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessageElements/FileMessage/index.wxss
@@ -0,0 +1,57 @@
+.TUI-fileMessage {
+ display: flex;
+ padding: 10rpx 24rpx;
+ background-color: #fff;
+ border-radius: 2px 10px 10px 10px;
+ border: 1px solid #D9D9D9;
+}
+.fileMessage{
+ display: flex;
+}
+.fileMessage-box{
+ display: flex;
+ background: white;
+ align-items: center;
+ height: 150rpx;
+}
+.file-icon {
+ width: 80rpx;
+ height: 80rpx;
+}
+.pop{
+ position: fixed;
+ width: 50%;
+ bottom: 400rpx;
+ margin-left: 90rpx;
+ background: rgba(0, 0, 0, 0.3);
+ z-index: 99999;
+}
+.text-box{
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ height: 112rpx;
+}
+.download-confirm{
+ font-family: PingFangSC-Regular;
+ font-size: 16px;
+ color: #E85454;
+ letter-spacing: 0;
+ text-align: center;
+ line-height: 22px;
+}
+.abandon{
+ opacity: 0.8;
+ font-family: PingFangSC-Regular;
+ font-size: 16px;
+ color: #FFFFFF;
+ letter-spacing: 0;
+ text-align: center;
+ line-height: 22px;
+}
+.file-title {
+ max-width: 53vw;
+ display: inline;
+ word-wrap: break-word;
+ word-break: break-all;
+}
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessageElements/ImageMessage/index.js b/TUIService/TUIKit/components/TUIChat/components/MessageElements/ImageMessage/index.js
new file mode 100644
index 0000000..298c4f7
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessageElements/ImageMessage/index.js
@@ -0,0 +1,54 @@
+import { parseImage } from '../../../../../utils/message-parse';
+// eslint-disable-next-line no-undef
+Component({
+ /**
+ * 组件的属性列表
+ */
+ properties: {
+ message: {
+ type: Object,
+ value: {},
+ observer(newVal) {
+ this.setData({
+ renderDom: parseImage(newVal),
+ percent: newVal.percent,
+ });
+ },
+ },
+ isMine: {
+ type: Boolean,
+ value: true,
+ },
+ },
+
+ /**
+ * 组件的初始数据
+ */
+ data: {
+ renderDom: [],
+ percent: 0,
+ showSave: false,
+ },
+
+ /**
+ * 组件的方法列表
+ */
+ methods: {
+ previewImage() {
+ wx.previewImage({
+ current: this.data.renderDom[0].src, // 当前显示图片的http链接
+ urls: [this.data.renderDom[0].src], // 图片链接必须是数组
+ success: () => {
+ this.setData({
+ showSave: true,
+ });
+ },
+ complete: () => {
+ this.setData({
+ showSave: false,
+ });
+ },
+ });
+ },
+ },
+});
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessageElements/ImageMessage/index.json b/TUIService/TUIKit/components/TUIChat/components/MessageElements/ImageMessage/index.json
new file mode 100644
index 0000000..2d67c18
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessageElements/ImageMessage/index.json
@@ -0,0 +1,8 @@
+{
+ "component": true,
+ "usingComponents": {
+ "van-image": "@vant/weapp/image/index",
+ "van-loading": "@vant/weapp/loading/index"
+
+ }
+}
\ No newline at end of file
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessageElements/ImageMessage/index.wxml b/TUIService/TUIKit/components/TUIChat/components/MessageElements/ImageMessage/index.wxml
new file mode 100644
index 0000000..8f5ae07
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessageElements/ImageMessage/index.wxml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessageElements/ImageMessage/index.wxss b/TUIService/TUIKit/components/TUIChat/components/MessageElements/ImageMessage/index.wxss
new file mode 100644
index 0000000..4573549
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessageElements/ImageMessage/index.wxss
@@ -0,0 +1,25 @@
+.TUI-ImageMessage {
+ width: 150px;
+}
+.image-message {
+ width: 100%;
+ max-height: 300rpx;
+ height: 300rpx;
+ border-radius: 10px 10px 10px 10px;
+}
+.my-image {
+ height: 300rpx;
+ border-radius: 10px 10px 10px 10px;
+}
+.big-image {
+ width: 100vw;
+ height: 100vh;
+ position: fix;
+ top: 0;
+ left: 0;
+}
+van-image__error, .van-image__img, .van-image__loading {
+ display: block;
+ height: 100%;
+ width: 100%;
+}
\ No newline at end of file
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessageElements/MergerMessage/index.js b/TUIService/TUIKit/components/TUIChat/components/MessageElements/MergerMessage/index.js
new file mode 100644
index 0000000..8eb5bd6
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessageElements/MergerMessage/index.js
@@ -0,0 +1,33 @@
+// eslint-disable-next-line no-undef
+Component({
+ /**
+ * 组件的属性列表
+ */
+ properties: {
+ message: {
+ type: Object,
+ value: {},
+ observer(newVal) {
+ this.setData({
+ message: newVal,
+ });
+ },
+ },
+ isMine: {
+ type: Boolean,
+ value: true,
+ },
+ },
+
+ /**
+ * 组件的初始数据
+ */
+ data: {
+ },
+
+ /**
+ * 组件的方法列表
+ */
+ methods: {
+ },
+});
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessageElements/MergerMessage/index.json b/TUIService/TUIKit/components/TUIChat/components/MessageElements/MergerMessage/index.json
new file mode 100644
index 0000000..e8cfaaf
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessageElements/MergerMessage/index.json
@@ -0,0 +1,4 @@
+{
+ "component": true,
+ "usingComponents": {}
+}
\ No newline at end of file
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessageElements/MergerMessage/index.wxml b/TUIService/TUIKit/components/TUIChat/components/MessageElements/MergerMessage/index.wxml
new file mode 100644
index 0000000..e90ca67
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessageElements/MergerMessage/index.wxml
@@ -0,0 +1,2 @@
+
+[聊天记录]
\ No newline at end of file
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessageElements/MergerMessage/index.wxss b/TUIService/TUIKit/components/TUIChat/components/MessageElements/MergerMessage/index.wxss
new file mode 100644
index 0000000..cc017bb
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessageElements/MergerMessage/index.wxss
@@ -0,0 +1,21 @@
+/* TUI-CustomerService/components/tui-chat/message-elements/relay-message/index.wxss */
+.message-body-span {
+ display: flex;
+ align-items: center;
+ /*justify-content: flex-start;*/
+ flex-wrap: wrap;
+ outline: none;
+ font-size: 28rpx;
+ color: #333333;
+ position: relative;
+ max-width: 60vw;
+}
+.text-message {
+ display: inline-flex;
+ max-width: 60vw;
+ line-height: 52rpx;
+ padding: 12rpx 24rpx;
+ background: #F8F8F8;
+ border: 1px solid #D9D9D9;
+ border-radius: 2px 10px 10px 10px;
+}
\ No newline at end of file
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessageElements/RevokeMessage/index.js b/TUIService/TUIKit/components/TUIChat/components/MessageElements/RevokeMessage/index.js
new file mode 100644
index 0000000..cd2f5d5
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessageElements/RevokeMessage/index.js
@@ -0,0 +1,39 @@
+// eslint-disable-next-line no-undef
+Component({
+ /**
+ * 组件的属性列表
+ */
+ properties: {
+ message: {
+ type: Object,
+ value: {},
+ observer(newVal) {
+ this.setData({
+ message: newVal,
+ });
+ },
+ },
+ isMine: {
+ type: Boolean,
+ value: true,
+ },
+ },
+
+ /**
+ * 组件的初始数据
+ */
+ data: {
+ message: ''
+ },
+
+ /**
+ * 组件的方法列表
+ */
+ methods: {
+ resendMessage(e) {
+ this.triggerEvent('resendMessage', {
+ message: e.currentTarget.dataset.value.payload.text
+ });
+ }
+ },
+});
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessageElements/RevokeMessage/index.json b/TUIService/TUIKit/components/TUIChat/components/MessageElements/RevokeMessage/index.json
new file mode 100644
index 0000000..e8cfaaf
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessageElements/RevokeMessage/index.json
@@ -0,0 +1,4 @@
+{
+ "component": true,
+ "usingComponents": {}
+}
\ No newline at end of file
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessageElements/RevokeMessage/index.wxml b/TUIService/TUIKit/components/TUIChat/components/MessageElements/RevokeMessage/index.wxml
new file mode 100644
index 0000000..c4a31f8
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessageElements/RevokeMessage/index.wxml
@@ -0,0 +1,6 @@
+
+
+
+ 撤回了一条消息
+ 重新编辑
+
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessageElements/RevokeMessage/index.wxss b/TUIService/TUIKit/components/TUIChat/components/MessageElements/RevokeMessage/index.wxss
new file mode 100644
index 0000000..192a5b7
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessageElements/RevokeMessage/index.wxss
@@ -0,0 +1,18 @@
+
+.revoke{
+ display: flex;
+ justify-content: center;
+ align-items: center
+ }
+.name {
+ border-radius: 8px;
+ font-size: 14px;
+ padding: 6px 0px;
+ }
+.edit{
+ font-family: PingFangSC-Regular;
+ font-size: 14px;
+ color: #006eff;
+ letter-spacing: 0;
+ padding-left: 8px
+}
\ No newline at end of file
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessageElements/SystemMessage/index.js b/TUIService/TUIKit/components/TUIChat/components/MessageElements/SystemMessage/index.js
new file mode 100644
index 0000000..addb341
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessageElements/SystemMessage/index.js
@@ -0,0 +1,79 @@
+import { parseGroupSystemNotice } from '../../../../../utils/message-parse';
+import { caculateTimeago } from '../../../../../utils/common';
+// eslint-disable-next-line no-undef
+Component({
+ /**
+ * 组件的属性列表
+ */
+ properties: {
+ message: {
+ type: Object,
+ value: {},
+ observer(newVal) {
+ this.setData({
+ message: newVal,
+ messageTime: caculateTimeago(newVal.time * 1000),
+ renderDom: parseGroupSystemNotice(newVal),
+ });
+ },
+ },
+ },
+
+ /**
+ * 组件的初始数据
+ */
+ data: {
+ message: {},
+ options: '处理',
+ messageTime: '',
+ renderDom: '',
+ },
+ lifetimes: {
+ attached() {
+ // 在组件实例进入页面节点树时执行
+ },
+ detached() {
+ // 在组件实例被从页面节点树移除时执行
+ },
+ },
+ /**
+ * 组件的方法列表
+ */
+ methods: {
+ handleClick() {
+ wx.showActionSheet({
+ itemList: ['同意', '拒绝'],
+ success: (res) => {
+ this.triggerEvent('changeSystemMessageList', {
+ message: this.data.message,
+ });
+ const option = {
+ handleAction: 'Agree',
+ handleMessage: '欢迎进群',
+ message: this.data.message,
+ };
+ if (res.tapIndex === 1) {
+ this.triggerEvent('changeSystemMessageList', {
+ message: this.data.message,
+ });
+ option.handleAction = 'Reject';
+ option.handleMessage = '拒绝申请';
+ }
+ wx.$TUIKit.handleGroupApplication(option)
+ .then(() => {
+ wx.showToast({ title: option.handleAction === 'Agree' ? '已同意申请' : '已拒绝申请' });
+ })
+ .catch((error) => {
+ wx.showToast({
+ title: error.message || '处理失败',
+ icon: 'none',
+ });
+ });
+ },
+ });
+ },
+
+ },
+
+
+});
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessageElements/SystemMessage/index.json b/TUIService/TUIKit/components/TUIChat/components/MessageElements/SystemMessage/index.json
new file mode 100644
index 0000000..e8cfaaf
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessageElements/SystemMessage/index.json
@@ -0,0 +1,4 @@
+{
+ "component": true,
+ "usingComponents": {}
+}
\ No newline at end of file
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessageElements/SystemMessage/index.wxml b/TUIService/TUIKit/components/TUIChat/components/MessageElements/SystemMessage/index.wxml
new file mode 100644
index 0000000..70d5ca3
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessageElements/SystemMessage/index.wxml
@@ -0,0 +1,15 @@
+
+
+
+ {{messageTime}}
+ {{renderDom}}
+
+
+ {{options}}
+
+
+
+ {{messageTime}}
+ {{renderDom}}
+
+
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessageElements/SystemMessage/index.wxss b/TUIService/TUIKit/components/TUIChat/components/MessageElements/SystemMessage/index.wxss
new file mode 100644
index 0000000..5678623
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessageElements/SystemMessage/index.wxss
@@ -0,0 +1,24 @@
+.handle {
+ display: flex;
+ justify-content: space-between;
+}
+
+.card{
+ font-size: 14px;
+ margin: 20px;
+ padding: 20px;
+ box-sizing: border-box;
+ border: 1px solid #abdcff;
+ background-color: #f0faff;
+ border-radius: 12px;
+}
+.time {
+
+}
+.button{
+ color: blue;
+ border-radius: 8px;
+ line-height: 30px;
+ font-size: 16px;
+ width: 70px;
+}
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessageElements/TextMessage/index.js b/TUIService/TUIKit/components/TUIChat/components/MessageElements/TextMessage/index.js
new file mode 100644
index 0000000..ca60a0e
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessageElements/TextMessage/index.js
@@ -0,0 +1,44 @@
+import { parseText } from '../../../../../utils/message-parse';
+// eslint-disable-next-line no-undef
+Component({
+ /**
+ * 组件的属性列表
+ */
+ properties: {
+ message: {
+ type: Object,
+ value: {},
+ observer(newVal) {
+ // console.log(parseText(newVal));
+ this.setData({
+ renderDom: parseText(newVal),
+ });
+ },
+ },
+ isMine: {
+ type: Boolean,
+ value: true,
+ },
+ },
+
+ /**
+ * 组件的初始数据
+ */
+ data: {
+ renderDom:[]
+ },
+ lifetimes: {
+ attached() {
+ // 在组件实例进入页面节点树时执行
+ },
+ detached() {
+ // 在组件实例被从页面节点树移除时执行
+ },
+ },
+ /**
+ * 组件的方法列表
+ */
+ methods: {
+
+ },
+});
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessageElements/TextMessage/index.json b/TUIService/TUIKit/components/TUIChat/components/MessageElements/TextMessage/index.json
new file mode 100644
index 0000000..e8cfaaf
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessageElements/TextMessage/index.json
@@ -0,0 +1,4 @@
+{
+ "component": true,
+ "usingComponents": {}
+}
\ No newline at end of file
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessageElements/TextMessage/index.wxml b/TUIService/TUIKit/components/TUIChat/components/MessageElements/TextMessage/index.wxml
new file mode 100644
index 0000000..fdbbaf5
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessageElements/TextMessage/index.wxml
@@ -0,0 +1,9 @@
+
+
+
+
+
+ {{item.text}}
+
+
+
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessageElements/TextMessage/index.wxss b/TUIService/TUIKit/components/TUIChat/components/MessageElements/TextMessage/index.wxss
new file mode 100644
index 0000000..3f2a4e0
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessageElements/TextMessage/index.wxss
@@ -0,0 +1,80 @@
+.text-message {
+ max-width: 60vw;
+ min-height: 50rpx;
+ line-height: 50rpx;
+ padding: 10rpx 24rpx;
+ background: #F8F8F8;
+ border: 1rpx solid #D9D9D9;
+ border-radius: 2px 10px 10px 10px;
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+ white-space: pre-wrap;
+}
+.my-text {
+ position: relative;
+ border-radius: 10px 10px 10px 10px;
+ background: rgb(212, 239, 241);
+ border: 1rpx solid #1ACAD3;
+}
+.my-text::after{
+ content:'';
+ position: absolute;
+ top: 35rpx;
+ right: -19rpx;
+ transform: translate(-50%,-50%) rotate(-135deg);
+ width: 16rpx;
+ height: 16rpx;
+ background: rgb(212, 239, 241);
+ border: 1rpx solid #1ACAD3;
+ border-style: none none solid solid
+}
+.your-text {
+ position: relative;
+ border-radius: 10px 10px 10px 10px;
+ background: rgb(255, 255, 255);
+ border: 1rpx solid #D8D8D8;
+}
+.your-text::after{
+ content:'';
+ position: absolute;
+ top: 35rpx;
+ left: 0;
+ transform: translate(-50%,-50%) rotate(45deg);
+ width: 16rpx;
+ height: 16rpx;
+ background: rgb(255, 255, 255);
+ border: 1rpx solid #D8D8D8;
+ border-style: none none solid solid
+}
+.message-body-span {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ /*justify-content: flex-start;*/
+ flex-wrap: wrap;
+ word-break: break-word;
+ outline: none;
+ font-size: 28rpx;
+ color: #333333;
+ position: relative;
+ max-width: 60vw;
+}
+.message-body-span-text {
+ font-family: PingFangSC-Regular;
+ font-weight: 400;
+ color: #000000;
+ letter-spacing: 0;
+ line-height: 40rpx;
+ font-size: 30rpx;
+}
+.message-body-span-image {
+ display: inline-block;
+ width: 32rpx;
+ height: 32rpx;
+ margin: 0 4rpx;
+}
+.emoji-icon {
+ width: 20px;
+ height: 20px;
+}
\ No newline at end of file
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessageElements/TipMessage/index.js b/TUIService/TUIKit/components/TUIChat/components/MessageElements/TipMessage/index.js
new file mode 100644
index 0000000..d7d9d02
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessageElements/TipMessage/index.js
@@ -0,0 +1,39 @@
+import { parseGroupTip } from '../../../../../utils/message-parse';
+// eslint-disable-next-line no-undef
+Component({
+ /**
+ * 组件的属性列表
+ */
+ properties: {
+ message: {
+ type: Object,
+ value: {},
+ observer(newVal) {
+ this.setData({
+ renderDom: parseGroupTip(newVal),
+ });
+ },
+ },
+ },
+
+ /**
+ * 组件的初始数据
+ */
+ data: {
+
+ },
+ lifetimes: {
+ attached() {
+ // 在组件实例进入页面节点树时执行
+ },
+ detached() {
+ // 在组件实例被从页面节点树移除时执行
+ },
+ },
+ /**
+ * 组件的方法列表
+ */
+ methods: {
+
+ },
+});
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessageElements/TipMessage/index.json b/TUIService/TUIKit/components/TUIChat/components/MessageElements/TipMessage/index.json
new file mode 100644
index 0000000..e8cfaaf
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessageElements/TipMessage/index.json
@@ -0,0 +1,4 @@
+{
+ "component": true,
+ "usingComponents": {}
+}
\ No newline at end of file
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessageElements/TipMessage/index.wxml b/TUIService/TUIKit/components/TUIChat/components/MessageElements/TipMessage/index.wxml
new file mode 100644
index 0000000..2f01fb1
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessageElements/TipMessage/index.wxml
@@ -0,0 +1,3 @@
+
+ {{renderDom[0].text}}
+
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessageElements/TipMessage/index.wxss b/TUIService/TUIKit/components/TUIChat/components/MessageElements/TipMessage/index.wxss
new file mode 100644
index 0000000..d041479
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessageElements/TipMessage/index.wxss
@@ -0,0 +1,9 @@
+.tip-message {
+ width: 100%;
+}
+.text-message {
+ text-align: center;
+ font-size: 12px;
+ color: #999999;
+}
+
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessageElements/VideoMessage/index.js b/TUIService/TUIKit/components/TUIChat/components/MessageElements/VideoMessage/index.js
new file mode 100644
index 0000000..9b4b606
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessageElements/VideoMessage/index.js
@@ -0,0 +1,85 @@
+import { parseVideo } from '../../../../../utils/message-parse';
+// eslint-disable-next-line no-undef
+Component({
+ /**
+ * 组件的属性列表
+ */
+ properties: {
+ message: {
+ type: Object,
+ value: {},
+ observer(newVal) {
+ this.setData({
+ message: newVal,
+ renderDom: parseVideo(newVal),
+ });
+ },
+ },
+ isMine: {
+ type: Boolean,
+ value: true,
+ },
+ },
+
+ /**
+ * 组件的初始数据
+ */
+ data: {
+ message: {},
+ showSaveFlag: Number,
+ },
+
+ /**
+ * 组件的方法列表
+ */
+ methods: {
+ showVideoFullScreenChange(event) {
+ if (event.detail.fullScreen) {
+ this.setData({
+ showSaveFlag: 1,
+ });
+ } else {
+ this.setData({
+ showSaveFlag: 2,
+ });
+ }
+ },
+ // 1代表当前状态处于全屏,2代表当前状态不处于全屏。
+ handleLongPress(e) {
+ if (this.data.showSaveFlag === 1) {
+ wx.showModal({
+ content: '确认保存该视频?',
+ success: (res) => {
+ if (res.confirm) {
+ wx.downloadFile({
+ url: this.data.message.payload.videoUrl,
+ success(res) {
+ // 只要服务器有响应数据,就会把响应内容写入文件并进入 success 回调,业务需要自行判断是否下载到了想要的内容
+ if (res.statusCode === 200) {
+ wx.saveVideoToPhotosAlbum({
+ filePath: res.tempFilePath,
+ success() {
+ wx.showToast({
+ title: '保存成功!',
+ duration: 800,
+ icon: 'none',
+ });
+ },
+ });
+ }
+ },
+ fail(error) {
+ wx.showToast({
+ title: '保存失败!',
+ duration: 800,
+ icon: 'none',
+ });
+ },
+ });
+ }
+ },
+ });
+ }
+ },
+ },
+});
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessageElements/VideoMessage/index.json b/TUIService/TUIKit/components/TUIChat/components/MessageElements/VideoMessage/index.json
new file mode 100644
index 0000000..e8cfaaf
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessageElements/VideoMessage/index.json
@@ -0,0 +1,4 @@
+{
+ "component": true,
+ "usingComponents": {}
+}
\ No newline at end of file
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessageElements/VideoMessage/index.wxml b/TUIService/TUIKit/components/TUIChat/components/MessageElements/VideoMessage/index.wxml
new file mode 100644
index 0000000..b473652
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessageElements/VideoMessage/index.wxml
@@ -0,0 +1,5 @@
+
+
+
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessageElements/VideoMessage/index.wxss b/TUIService/TUIKit/components/TUIChat/components/MessageElements/VideoMessage/index.wxss
new file mode 100644
index 0000000..f254dda
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessageElements/VideoMessage/index.wxss
@@ -0,0 +1,12 @@
+.video-message {
+ width: 150px;
+ height: 110px;
+ max-width: 60vw;
+}
+.video-box {
+ width: 100%;
+ height: 100%;
+}
+.my-video {
+ border-radius: 10px 2px 10px 10px;
+}
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessageInput/index.js b/TUIService/TUIKit/components/TUIChat/components/MessageInput/index.js
new file mode 100644
index 0000000..d591cbf
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessageInput/index.js
@@ -0,0 +1,987 @@
+import logger from '../../../../utils/logger';
+import constant from '../../../../utils/constant';
+import {
+ finishConsult
+} from "../../../../../../api/consultOrder"
+// eslint-disable-next-line no-undef
+Component({
+ /**
+ * 组件的属性列表
+ */
+ properties: {
+ conversation: {
+ type: Object,
+ value: {},
+ observer(newVal) {
+ this.setData({
+ conversation: newVal,
+ },()=>{
+ //this.getMessageone(this.data.conversation)
+ });
+ },
+ },
+ order_inquiry_id: {
+ type: String,
+ value: '',
+ observer(newVal) {
+ this.setData({
+ order_inquiry_id:newVal,
+ });
+ },
+ },
+ inquiry_type: {
+ type: String,
+ value: '',
+ observer(newVal) {
+ this.setData({
+ inquiry_type:newVal
+ });
+ },
+ },
+ patient_family_data:{
+ type: Object,
+ value:{},
+ observer(newVal) {
+ this.setData({
+ patient_family_data:newVal
+ });
+ },
+ },
+ msgData:{
+ type: Object,
+ value:{},
+ observer(newVal) {
+
+ this.setData({
+ msgData:newVal
+ },()=>{
+
+ //console.log(newVal);
+ // this.setMsgRound();
+ });
+ },
+ },
+ message_rounds:{
+ type: Number,
+ value: 0,
+ observer(newVal) {
+ this.setData({
+ message_rounds:newVal
+ });
+ },
+ },
+ times_number:{
+ type: Number,
+ value: 0,
+ observer(newVal) {
+ this.setData({
+ times_number:newVal
+ },()=>{
+
+ });
+ },
+ },
+ duration:{
+ type: Number,
+ value: 0,
+ observer(newVal) {
+ this.setData({
+ duration:newVal
+ });
+ },
+ },
+ rest_time:{
+ type: Number,
+ value: 0,
+ rest_time(newVal) {
+ this.setData({
+ rest_time:newVal
+ },()=>{
+ //console.log('剩余时间:'+newVal)
+ });
+ },
+ },
+ hasCallKit: {
+ type: Boolean,
+ value: false,
+ observer(hasCallKit) {
+ this.setData({
+ hasCallKit,
+ });
+ },
+ },
+ },
+
+ /**
+ * 组件的初始数据
+ */
+ data: {
+ conversation: {},
+ showCustomer:false,
+ order_inquiry_id:'',
+ inquiry_type:'',
+ patient_family_data:{},
+ message: '',
+ message_rounds:0,
+ times_number:0,//总共回合数
+ msgData:{},
+ rest_time:0,
+ duration:0,
+ hideText:false,
+ showTip:true,
+
+ extensionArea: false,
+ sendMessageBtn: false,
+ displayFlag: '',
+ isAudio: false,
+ bottomVal: 0,
+ startPoint: 0,
+ popupToggle: false,
+ isRecording: false,
+ canSend: true,
+ text: '按住说话',
+ title: ' ',
+ notShow: false,
+ isShow: true,
+ commonFunction: [
+ { name: '常用语', key: '0' },
+ { name: '发送订单', key: '1' },
+ { name: '服务评价', key: '2' },
+ ],
+ displayServiceEvaluation: false,
+ showErrorImageFlag: 0,
+ messageList: [],
+ isFirstSendTyping: true,
+ time: 0,
+ focus: false,
+ isEmoji: false,
+ fileList: [],
+ hasCallKit: false,
+ },
+
+ lifetimes: {
+ attached() {
+
+
+ // 加载声音录制管理器
+ this.recorderManager = wx.getRecorderManager();
+ this.recorderManager.onStop((res) => {
+ wx.hideLoading();
+ if (this.data.canSend) {
+ if (res.duration < 1000) {
+ wx.showToast({
+ title: '录音时间太短',
+ icon: 'none',
+ });
+ } else {
+ // res.tempFilePath 存储录音文件的临时路径
+ const message = wx.$TUIKit.createAudioMessage({
+ to: this.getToAccount(),
+ conversationType: this.data.conversation.type,
+ payload: {
+ file: res,
+ },
+ });
+ this.$sendTIMMessage(message);
+ }
+ }
+ this.setData({
+ startPoint: 0,
+ popupToggle: false,
+ isRecording: false,
+ canSend: true,
+ title: ' ',
+ text: '按住说话',
+ });
+ });
+
+ },
+ ready(){
+ // wx.$TUIKit.on(wx.$TUIKitTIM.EVENT.SDK_READY,this.$onMessageReady,this);
+ },
+ detached() {
+ // 一定要解除相关的事件绑定
+ //wx.$TUIKit.off(wx.$TUIKitTIM.EVENT.SDK_READY, this.$onMessageReady,this);
+ }
+ },
+
+
+ /**
+ * 组件的方法列表
+ */
+ methods: {
+ showTooltip(){
+ this.setData({
+ showTip:!this.data.showTip,
+ });
+ },
+ handlefinishConsult(){
+ let {order_inquiry_id}=this.data;
+ finishConsult(order_inquiry_id).then(data=>{
+ this.triggerEvent("freshChatStatus",order_inquiry_id)
+ })
+ },
+ getMessageone(conversation){
+ wx.$TUIKit.getMessageListHopping({
+ conversationID: conversation.conversationID,
+ direction: 0,
+ count: 1,
+ }).then((res) => {
+ console.log("one");
+ console.log(res);
+ const { messageList } = res.data;
+ this.getLatestMessageList(messageList);
+ });
+ },
+ // 获取消息列表来判断是否发送正在输入状态
+ getMessageList(conversation) {
+ wx.$TUIKit.getMessageList({
+ conversationID: conversation.conversationID,
+ nextReqMessageID: this.data.nextReqMessageID,
+ count: 15,
+ }).then((res) => {
+ const { messageList } = res.data;
+ this.setData({
+ messageList,
+ });
+
+ });
+ },
+
+ // 打开录音开关
+ switchAudio() {
+ this.setData({
+ isAudio: !this.data.isAudio,
+ isEmoji: false,
+ text: '按住说话',
+ focus: false,
+ });
+ },
+
+ // 长按录音
+ handleLongPress(e) {
+ wx.aegis.reportEvent({
+ name: 'messageType',
+ ext1: 'messageType-audio',
+ ext2: wx.$chat_reportType,
+ ext3: wx.$chat_SDKAppID,
+ });
+ this.recorderManager.start({
+ duration: 60000, // 录音的时长,单位 ms,最大值 600000(10 分钟)
+ sampleRate: 44100, // 采样率
+ numberOfChannels: 1, // 录音通道数
+ encodeBitRate: 192000, // 编码码率
+ format: 'aac', // 音频格式,选择此格式创建的音频消息,可以在即时通信 IM 全平台(Android、iOS、微信小程序和Web)互通
+ });
+ this.setData({
+ startPoint: e.touches[0],
+ title: '正在录音',
+ // isRecording : true,
+ // canSend: true,
+ notShow: true,
+ isShow: false,
+ isRecording: true,
+ popupToggle: true,
+ });
+ },
+
+ // 录音时的手势上划移动距离对应文案变化
+ handleTouchMove(e) {
+ if (this.data.isRecording) {
+ if (this.data.startPoint.clientY - e.touches[e.touches.length - 1].clientY > 100) {
+ this.setData({
+ text: '抬起停止',
+ title: '松开手指,取消发送',
+ canSend: false,
+ });
+ } else if (this.data.startPoint.clientY - e.touches[e.touches.length - 1].clientY > 20) {
+ this.setData({
+ text: '抬起停止',
+ title: '上划可取消',
+ canSend: true,
+ });
+ } else {
+ this.setData({
+ text: '抬起停止',
+ title: '正在录音',
+ canSend: true,
+ });
+ }
+ }
+ },
+
+ // 手指离开页面滑动
+ handleTouchEnd() {
+ this.setData({
+ isRecording: false,
+ popupToggle: false,
+
+ });
+ wx.hideLoading();
+ this.recorderManager.stop();
+ },
+ // 选中表情消息
+ handleEmoji() {
+ let targetFlag = 'emoji';
+ if (this.data.displayFlag === 'emoji') {
+ targetFlag = '';
+ }
+ this.setData({
+ isAudio: false,
+ isEmoji: true,
+ displayFlag: targetFlag,
+ focus: false,
+ });
+ },
+
+ // 选自定义消息
+ handleExtensions() {
+ wx.aegis.reportEvent({
+ name: 'chooseExtensions',
+ ext1: 'chooseExtensions',
+ ext2: wx.$chat_reportType,
+ ext3: wx.$chat_SDKAppID,
+ });
+ let targetFlag = 'extension';
+ if (this.data.displayFlag === 'extension') {
+ targetFlag = '';
+ }
+ this.setData({
+ displayFlag: targetFlag,
+ });
+ },
+
+ error(e) {
+ console.log(e.detail);
+ },
+
+ handleSendPicture() {
+ this.sendMediaMessage('camera', 'image');
+ },
+
+ handleSendImage() {
+ wx.aegis.reportEvent({
+ name: 'messageType',
+ ext1: 'messageType-image',
+ ext2: wx.$chat_reportType,
+ ext3: wx.$chat_SDKAppID,
+ });
+ this.sendMediaMessage('album', 'image');
+ },
+
+ sendMediaMessage(type, mediaType) {
+ if(this.setMsgRound()){
+ const { fileList } = this.data;
+ wx.chooseMedia({
+ count: 9,
+ sourceType: [type],
+ mediaType: [mediaType],
+ success: (res) => {
+ this.sendCallback();
+ const mediaInfoList = res.tempFiles;
+ mediaInfoList.forEach((mediaInfo) => {
+ fileList.push({ type: res.type, tempFiles: [{ tempFilePath: mediaInfo.tempFilePath }] });
+ });
+ fileList.forEach((file) => {
+ if (file.type === 'image') {
+ this.handleSendImageMessage(file);
+ }
+ if (file.type === 'video') {
+ this.handleSendVideoMessage(file);
+ }
+ });
+ this.data.fileList = [];
+
+ },
+ });
+ }
+
+ },
+
+ // 发送图片消息
+ handleSendImageMessage(file) {
+ const message = wx.$TUIKit.createImageMessage({
+ to: this.getToAccount(),
+ conversationType: this.data.conversation.type,
+ payload: {
+ file,
+ },
+ cloudCustomData: JSON.stringify({
+ order_inquiry_id:this.data.order_inquiry_id,
+ inquiry_type:this.data.inquiry_type,
+ message_rounds:this.data.msgData.msg_round,
+ patient_family_data:this.data.patient_family_data,
+ is_system:0
+ }),
+ onProgress: (percent) => {
+ message.percent = percent;
+ },
+ });
+ this.$sendTIMMessage(message);
+ },
+
+ // 发送视频消息
+ handleSendVideoMessage(file) {
+ const message = wx.$TUIKit.createVideoMessage({
+ to: this.getToAccount(),
+ conversationType: this.data.conversation.type,
+ payload: {
+ file,
+ },
+ onProgress: (percent) => {
+ message.percent = percent;
+ },
+ });
+ this.$sendTIMMessage(message);
+ },
+
+ handleShootVideo() {
+ this.sendMediaMessage('camera', 'video');
+ },
+
+ handleSendVideo() {
+ wx.aegis.reportEvent({
+ name: 'messageType',
+ ext1: 'messageType-video',
+ ext2: wx.$chat_reportType,
+ ext3: wx.$chat_SDKAppID,
+ });
+ this.sendMediaMessage('album', 'video');
+ },
+
+ handleCommonFunctions(e) {
+ switch (e.target.dataset.function.key) {
+ case '0':
+ this.setData({
+ displayCommonWords: true,
+ });
+ break;
+ case '1':
+ this.setData({
+ displayOrderList: true,
+ });
+ break;
+ case '2':
+ this.setData({
+ displayServiceEvaluation: true,
+ });
+ break;
+ default:
+ break;
+ }
+ },
+
+ handleSendOrder() {
+ this.setData({
+ displayOrderList: true,
+ });
+ },
+
+ appendMessage(e) {
+ this.setData({
+ message: this.data.message + e.detail.message,
+ sendMessageBtn: true,
+ hideText:true
+ });
+ },
+
+ getToAccount() {
+ if (!this.data.conversation || !this.data.conversation.conversationID) {
+ return '';
+ }
+ switch (this.data.conversation.type) {
+ case wx.$TUIKitTIM.TYPES.CONV_C2C:
+ return this.data.conversation.conversationID.replace(wx.$TUIKitTIM.TYPES.CONV_C2C, '');
+ case wx.$TUIKitTIM.TYPES.CONV_GROUP:
+ return this.data.conversation.conversationID.replace(wx.$TUIKitTIM.TYPES.CONV_GROUP, '');
+ default:
+ return this.data.conversation.conversationID;
+ }
+ },
+ async handleCheckAuthorize(e) {
+ const type = e.currentTarget.dataset.value;
+ wx.getSetting({
+ success: async (res) => {
+ const isRecord = res.authSetting['scope.record'];
+ const isCamera = res.authSetting['scope.camera'];
+ if (!isRecord && type === 1) {
+ const title = '麦克风权限授权';
+ const content = '使用语音通话,需要在设置中对麦克风进行授权允许';
+ try {
+ await wx.authorize({ scope: 'scope.record' });
+ this.handleCalling(e);
+ } catch (e) {
+ this.handleShowModal(title, content);
+ }
+ return;
+ }
+ if ((!isRecord || !isCamera) && type === 2) {
+ const title = '麦克风、摄像头权限授权';
+ const content = '使用视频通话,需要在设置中对麦克风、摄像头进行授权允许';
+ try {
+ await wx.authorize({ scope: 'scope.record' });
+ await wx.authorize({ scope: 'scope.camera' });
+ this.handleCalling(e);
+ } catch (e) {
+ this.handleShowModal(title, content);
+ }
+ return;
+ }
+ this.handleCalling(e);
+ },
+ });
+ },
+ handleShowModal(title, content) {
+ wx.showModal({
+ title,
+ content,
+ confirmText: '去设置',
+ success: (res) => {
+ if (res.confirm) {
+ wx.openSetting();
+ }
+ },
+ });
+ },
+
+ handleCalling(e) {
+ if (!this.data.hasCallKit) {
+ wx.showToast({
+ title: '请先集成 TUICallKit 组件',
+ icon: 'none',
+ });
+ return;
+ }
+ const type = e.currentTarget.dataset.value;
+ const conversationType = this.data.conversation.type;
+ if (conversationType === wx.$TUIKitTIM.TYPES.CONV_GROUP) {
+ if (type === 1) {
+ wx.aegis.reportEvent({
+ name: 'audioCall',
+ ext1: 'audioCall-group',
+ ext2: wx.$chat_reportType,
+ ext3: wx.$chat_SDKAppID,
+ });
+ } else if (type === 2) {
+ wx.aegis.reportEvent({
+ name: 'videoCall',
+ ext1: 'videoCall-group',
+ ext2: wx.$chat_reportType,
+ ext3: wx.$chat_SDKAppID,
+ });
+ }
+ this.triggerEvent('handleCall', {
+ type,
+ conversationType,
+ });
+ }
+ if (conversationType === wx.$TUIKitTIM.TYPES.CONV_C2C) {
+ const { userID } = this.data.conversation.userProfile;
+ if (type === 1) {
+ wx.aegis.reportEvent({
+ name: 'audioCall',
+ ext1: 'audioCall-1v1',
+ ext2: wx.$chat_reportType,
+ ext3: wx.$chat_SDKAppID,
+ });
+ } else if (type === 2) {
+ wx.aegis.reportEvent({
+ name: 'videoCall',
+ ext1: 'videoCall-1v1',
+ ext2: wx.$chat_reportType,
+ ext3: wx.$chat_SDKAppID,
+ });
+ }
+ this.triggerEvent('handleCall', {
+ conversationType,
+ type,
+ userID,
+ });
+ }
+ this.setData({
+ displayFlag: '',
+ });
+ },
+ orderMsg(){
+ let that=this;
+ wx.requestSubscribeMessage({
+ tmplIds: ['82rKSdbKkbFK_tHmIMnHyfyRJq9ujvmAsTjRHdxmCdE'],
+ success (res) {
+ that.setData({
+ showCustomer:true
+ })
+ }
+ })
+ },
+ //发送成功之后回合数+1;
+ sendCallback(){
+ let {times_number,msgData}=this.data;
+ let rounds=msgData.msg_round;
+ if(msgData.msg_type==1){
+ rounds=rounds+1;
+ this.setData({
+ 'msgData.msg_round':rounds
+ })
+ };
+ this.triggerEvent("getMessageRounds",{
+ msg_round:rounds,
+ msg_type:2
+ });
+ setTimeout(() => {
+ if(times_number>=0){
+ if(rounds==times_number){
+ wx.showToast({
+ title: '沟通已达到限制的'+times_number+'个回合',
+ icon:"none"
+ })
+ this.triggerEvent("changeTimeStatus",true);
+ this.handlefinishConsult();
+ }
+ };
+ }, 300);
+
+ },
+ setMsgRound(){
+ let {duration,rest_time}=this.data;
+ if(duration!=0 && rest_time==0){
+ wx.showToast({
+ title: '沟通时长已超过限制时间',
+ icon:"none"
+ })
+ this.triggerEvent("changeTimeStatus",true);
+ this.handlefinishConsult();
+ return false;
+ };
+ return true
+
+ },
+ //发送前获取最新的一条消息
+ getLatestMessageList(messageList) {
+ let list=messageList;
+ if(list.length>0){
+ const messageList =list[list.length-1];
+ console.log(messageList);
+ let customdata=JSON.parse(messageList.cloudCustomData);
+ let msg_rounds=customdata.message_rounds;
+ let from=messageList.flow;
+ let type=messageList.type;
+ this.setData({
+ message_rounds:msg_rounds || 0
+ });
+ if(this.data.times_number>=0){
+ let rest_rounds=this.data.times_number-this.data.message_rounds;
+ this.triggerEvent("getMessageRounds",rest_rounds);
+ }
+
+
+ if(this.data.duration!=0 && this.data.rest_time==0){
+ wx.showToast({
+ title: '沟通时长已超过限制时间',
+ icon:"none"
+ })
+ this.handlefinishConsult();
+ return false;
+ }
+ if(this.data.times_number>=0){
+ if(msg_rounds==this.data.times_number){
+ wx.showToast({
+ title: '沟通已达到限制的'+this.data.times_number+'个回合',
+ icon:"none"
+ })
+
+ this.handlefinishConsult();
+ return false;
+ }
+ }
+
+
+ if(this.data.times_number>=0){
+ if(from=="in" && type!="TIMCustomElem"){
+ msg_rounds=msg_rounds+1;
+ this.setData({
+ message_rounds:msg_rounds
+ })
+
+ }
+ console.log("total:"+this.data.times_number,"message_rounds:"+this.data.message_rounds)
+ let rest_rounds=this.data.times_number-this.data.message_rounds;
+ this.triggerEvent("getMessageRounds",rest_rounds);
+ }
+
+
+ }
+ return true
+
+ },
+ sendTextMessage(msg, flag) {
+ if(!this.data.message){
+ wx.showToast({
+ title: '输入内容不能为空',
+ icon:'none'
+ })
+ return false
+ };
+ if(this.setMsgRound()){
+ wx.aegis.reportEvent({
+ name: 'messageType',
+ ext1: 'messageType-text',
+ ext2: wx.$chat_reportType,
+ ext3: wx.$chat_SDKAppID,
+ });
+ const to =this.getToAccount();
+ const text = flag ? msg : this.data.message;
+ const { FEAT_NATIVE_CODE } = constant;
+ this.sendCallback();
+ const message = wx.$TUIKit.createTextMessage({
+ to,
+ conversationType: this.data.conversation.type,
+ payload: {
+ text,
+ },
+ cloudCustomData: JSON.stringify({
+ order_inquiry_id:this.data.order_inquiry_id,
+ inquiry_type:this.data.inquiry_type,
+ message_rounds:this.data.msgData.msg_round,
+ patient_family_data:this.data.patient_family_data,
+ is_system:0
+ }),
+ });
+ this.setData({
+ message: '',
+ sendMessageBtn: false,
+ hideText:false
+ });
+
+ this.$sendTIMMessage(message);
+
+
+ }
+
+
+ },
+
+ // 监听输入框value值变化
+ onInputValueChange(event) {
+ if (event.detail.message || event.detail.value) {
+ this.setData({
+ message: event.detail.message || event.detail.value,
+ sendMessageBtn: true,
+ hideText:true
+ });
+ } else {
+ this.setData({
+ sendMessageBtn: false,
+ hideText:false
+ });
+ }
+ //event.detail.value && this.sendTypingStatusMessage();
+ },
+
+ // 发送正在输入状态消息
+ sendTypingStatusMessage() {
+ const { BUSINESS_ID_TEXT, FEAT_NATIVE_CODE } = constant;
+ // 创建正在输入状态消息, "typingStatus":1,正在输入中1, 输入结束0, "version": 1 兼容老版本,userAction:0, // 14表示正在输入,actionParam:"EIMAMSG_InputStatus_Ing" //"EIMAMSG_InputStatus_Ing" 表示正在输入, "EIMAMSG_InputStatus_End" 表示输入结束
+ const typingMessage = wx.$TUIKit.createCustomMessage({
+ to: this.getToAccount(),
+ conversationType: this.data.conversation.type,
+ payload: {
+ data: JSON.stringify({
+ businessID: BUSINESS_ID_TEXT.USER_TYPING,
+ typingStatus: FEAT_NATIVE_CODE.ISTYPING_STATUS,
+ version: FEAT_NATIVE_CODE.NATIVE_VERSION,
+ userAction: FEAT_NATIVE_CODE.ISTYPING_ACTION,
+ actionParam: constant.TYPE_INPUT_STATUS_ING,
+ }),
+ description: '',
+ extension: '',
+ },
+ cloudCustomData: JSON.stringify({
+ order_inquiry_id:this.data.order_inquiry_id,
+ inquiry_type:this.data.inquiry_type,
+ message_rounds:this.data.msgData.msg_round,
+ patient_family_data:this.data.patient_family_data,
+ is_system:0
+ }),
+ });
+ // 在消息列表中过滤出对方的消息,并且获取最新消息的时间。
+ const inList = this.data.messageList.filter(item => item.flow === 'in');
+ if (inList.length === 0) return;
+ const sortList = inList.sort((firstItem, secondItem) => secondItem.time - firstItem.time);
+ const newMessageTime = sortList[0].time * 1000;
+ // 发送正在输入状态消息的触发条件。
+ const isSendTypingMessage = this.data.messageList.every((item) => {
+ try {
+ const sendTypingMessage = JSON.parse(item.cloudCustomData);
+ return sendTypingMessage.messageFeature.needTyping;
+ } catch (error) {
+ return false;
+ }
+ });
+ // 获取当前编辑时间,与收到对方最新的一条消息时间相比,时间小于30s则发送正在输入状态消息/
+ const now = new Date().getTime();
+ const timeDifference = (now - newMessageTime);
+
+ if (isSendTypingMessage && timeDifference > (1000 * 30)) return;
+ if (this.data.isFirstSendTyping) {
+ this.$sendTypingMessage(typingMessage);
+ this.setData({
+ isFirstSendTyping: false,
+ });
+ } else {
+ this.data.time = setTimeout(() => {
+ this.$sendTypingMessage(typingMessage);
+ }, (1000 * 4));
+ }
+ },
+ // 监听是否获取焦点,有焦点则向父级传值,动态改变input组件的高度。
+ inputBindFocus(event) {
+ this.setData({
+ focus: true,
+ });
+ this.getMessageList(this.data.conversation);
+ this.triggerEvent('pullKeysBoards', {
+ event,
+ });
+ // 有焦点则关闭除键盘之外的操作界面,例如表情组件。
+ this.handleClose();
+ },
+
+ // 监听是否失去焦点
+ inputBindBlur(event) {
+ const { BUSINESS_ID_TEXT, FEAT_NATIVE_CODE } = constant;
+ const typingMessage = wx.$TUIKit.createCustomMessage({
+ to: this.getToAccount(),
+ conversationType: this.data.conversation.type,
+ payload: {
+ data: JSON.stringify({
+ businessID: BUSINESS_ID_TEXT.USER_TYPING,
+ typingStatus: FEAT_NATIVE_CODE.NOTTYPING_STATUS,
+ version: FEAT_NATIVE_CODE.NATIVE_VERSION,
+ userAction: FEAT_NATIVE_CODE.NOTTYPING_ACTION,
+ actionParam: constant.TYPE_INPUT_STATUS_END,
+ }),
+ cloudCustomData: JSON.stringify({ messageFeature:
+ {
+ needTyping: FEAT_NATIVE_CODE.FEAT_TYPING,
+ version: FEAT_NATIVE_CODE.NATIVE_VERSION,
+ },
+ }),
+ description: '',
+ extension: '',
+ },
+ });
+ //this.$sendTypingMessage(typingMessage);
+ this.setData({
+ isFirstSendTyping: true,
+ });
+ clearTimeout(this.data.time);
+ this.triggerEvent('downKeysBoards', {
+ event,
+ });
+ },
+
+ $handleSendTextMessage(event) {
+
+ this.sendTextMessage(event.detail.message, true);
+ this.setData({
+ displayCommonWords: false,
+ });
+ },
+
+ $handleSendCustomMessage(e) {
+ wx.aegis.reportEvent({
+ name: 'messageType',
+ ext1: 'messageType-custom',
+ ext2: wx.$chat_reportType,
+ ext3: wx.$chat_SDKAppID,
+ });
+ const message = wx.$TUIKit.createCustomMessage({
+ to: this.getToAccount(),
+ conversationType: this.data.conversation.type,
+ payload: e.detail.payload,
+ });
+ this.$sendTIMMessage(message);
+ this.setData({
+ displayOrderList: false,
+ displayCommonWords: false,
+ });
+ },
+
+ $handleCloseCards(e) {
+ switch (e.detail.key) {
+ case '0':
+ this.setData({
+ displayCommonWords: false,
+ });
+ break;
+ case '1':
+ this.setData({
+ displayOrderList: false,
+ });
+ break;
+ case '2':
+ this.setData({
+ displayServiceEvaluation: false,
+ });
+ break;
+ default:
+ break;
+ }
+ },
+ // 发送正在输入消息
+ $sendTypingMessage(message) {
+ wx.$TUIKit.sendMessage(message, {
+ onlineUserOnly: true,
+ });
+ },
+
+ $sendTIMMessage(message) {
+ this.triggerEvent('sendMessage', {
+ message,
+ });
+ wx.$TUIKit.sendMessage(message, {
+ offlinePushInfo: {
+ disablePush: true,
+ },
+ }).then(() => {
+ const firstSendMessage = wx.getStorageSync('isFirstSendMessage');
+ if (firstSendMessage) {
+ wx.aegis.reportEvent({
+ name: 'sendMessage',
+ ext1: 'sendMessage-success',
+ ext2: 'imTuikitExternal',
+ ext3: wx.$chat_SDKAppID,
+ });
+ }
+ })
+ .catch((error) => {
+ logger.log(`| TUI-chat | message-input | sendMessageError: ${error.code} `);
+ wx.aegis.reportEvent({
+ name: 'sendMessage',
+ ext1: `sendMessage-failed#error: ${error}`,
+ ext2: 'imTuikitExternal',
+ ext3: wx.$chat_SDKAppID,
+ });
+ this.triggerEvent('showMessageErrorImage', {
+ showErrorImageFlag: error.code,
+ message,
+ });
+ });
+ this.setData({
+ displayFlag: '',
+ });
+ },
+
+ handleClose() {
+ this.setData({
+ displayFlag: '',
+ });
+ },
+
+ handleServiceEvaluation() {
+ this.setData({
+ displayServiceEvaluation: true,
+ });
+ },
+ },
+});
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessageInput/index.json b/TUIService/TUIKit/components/TUIChat/components/MessageInput/index.json
new file mode 100644
index 0000000..47de2e5
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessageInput/index.json
@@ -0,0 +1,12 @@
+{
+ "component": true,
+ "usingComponents": {
+ "Emoji": "../MessageElements/Emoji/index",
+ "CommonWords": "../MessagePrivate/CommonWords/index",
+ "OrderList": "../MessagePrivate/OrderList/index",
+ "ServiceEvaluation": "../MessagePrivate/ServiceEvaluation/index",
+ "van-dialog": "@vant/weapp/dialog/index",
+ "van-popup": "@vant/weapp/popup/index"
+
+ }
+}
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessageInput/index.wxml b/TUIService/TUIKit/components/TUIChat/components/MessageInput/index.wxml
new file mode 100644
index 0000000..4ba2d83
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessageInput/index.wxml
@@ -0,0 +1,111 @@
+
+
+
+
+
+ 更多
+
+
+
+ 联系客服
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{text}}
+
+
+
+
+
+
+
+ 发送
+
+
+
+
+
+
+ 相机
+
+
+
+ 相册
+
+
+
+
+
+
+
+
+ 拍摄照片
+
+
+
+ 发送图片
+
+
+
+ 拍摄视频
+
+
+
+ 发送视频
+
+
+
+ 语音通话
+
+
+
+ 视频通话
+
+
+
+ 服务评价
+
+
+
+ 发送订单
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{title}}
+
+
+
+
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessageInput/index.wxss b/TUIService/TUIKit/components/TUIChat/components/MessageInput/index.wxss
new file mode 100644
index 0000000..eedfa80
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessageInput/index.wxss
@@ -0,0 +1,271 @@
+.TUI-message-input-container {
+ /* background-color: #F1F1F1; */
+ background-color: #fff;
+}
+
+.TUI-message-input {
+ display: flex;
+ position: relative;
+ padding-bottom: 16rpx;
+ margin: 30rpx 32rpx 0;
+ /* background-color: #F1F1F1; */
+ /* width: 100vw; */
+ overflow: scroll;
+}
+
+.TUI-commom-function {
+ background-color: #fff;
+ display: flex;
+ flex-wrap: nowrap;
+ width: 750rpx;
+ padding:8rpx 0 ;
+ /* background-color: #F1F1F1; */
+ align-items: center;
+}
+
+.TUI-commom-function-item {
+ display: flex;
+ width: 136rpx;
+ justify-content: center;
+ align-items: center;
+ font-size: 24rpx;
+ color: #FFFFFF;
+ height: 48rpx;
+ margin-left: 16rpx;
+ border-radius: 24rpx;
+ background-color: #00C8DC;
+}
+
+.TUI-commom-function-item:first-child {
+ margin-left: 48rpx;
+}
+
+.TUI-message-input-functions {
+ display: flex;
+ align-items: center;
+}
+
+.TUI-message-input-main {
+ position: relative;
+
+ max-height: 300rpx;
+ background: #F2F2F2;
+ flex: 1;
+ padding: 22rpx 10rpx;
+ margin: 0 10rpx;
+ border-radius: 44rpx;
+ display: flex;
+ align-items: center;
+}
+
+.TUI-message-input-main-focus {
+
+ max-height: 300rpx;
+ flex: 1;
+ background: #F2F2F2;
+ border-radius: 44rpx;
+ margin: 0 10rpx;
+ display: flex;
+ align-items: center;
+}
+
+.textbox {
+ position: absolute;
+ z-index: 1;
+ top: 15rpx;
+ left: 35rpx;
+ color: #999999;
+}
+
+.TUI-message-input-area {
+ width: 100%;
+ position: relative;
+ background-color: transparent;
+ max-height: 300rpx;
+ /* 最多显示10行 */
+ z-index: 2;
+
+ overflow: scroll;
+}
+
+.TUI-icon {
+ width: 56rpx;
+ height: 56rpx;
+ margin: 0 16rpx;
+}
+
+.TUI-Extensions {
+ display: flex;
+ flex-wrap: wrap;
+ width: 100vw;
+ height: 450rpx;
+ margin-left: 14rpx;
+ margin-right: 14rpx;
+}
+
+.TUI-Extension-slot {
+ width: 128rpx;
+ height: 170rpx;
+ margin-left: 26rpx;
+ margin-right: 26rpx;
+ margin-top: 24rpx;
+}
+
+.TUI-Extension-icon {
+ width: 128rpx;
+ height: 128rpx;
+ border-radius: 25%;
+}
+
+.TUI-sendMessage-btn {
+ display: flex;
+ align-items: center;
+ margin: 0 8rpx;
+
+}
+.sendBtn {
+ margin: 0;
+ width: 120rpx;
+ height: 70rpx;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ font-size: 28rpx;
+ color: #fff;
+ background: #3CC7C0;
+ border-radius: 6rpx
+}
+
+.TUI-Emoji-area {
+ width: 100vw;
+ height: 450rpx;
+}
+
+.TUI-Extension-slot-name {
+ line-height: 34rpx;
+ font-size: 24rpx;
+ color: #333333;
+ letter-spacing: 0;
+ text-align: center;
+}
+
+.record-modal {
+ height: 300rpx;
+ width: 60vw;
+ background-color: #000;
+ opacity: 0.8;
+ position: fixed;
+ top: 670rpx;
+ z-index: 9999;
+ left: 20vw;
+ border-radius: 24rpx;
+ display: flex;
+ flex-direction: column;
+}
+
+.record-modal .wrapper {
+ display: flex;
+ height: 200rpx;
+ box-sizing: border-box;
+ padding: 10vw;
+}
+
+.record-modal .wrapper .modal-loading {
+ opacity: 1;
+ width: 40rpx;
+ height: 16rpx;
+ border-radius: 4rpx;
+ background-color: #006fff;
+ animation: loading 2s cubic-bezier(0.17, 0.37, 0.43, 0.67) infinite;
+}
+
+.modal-title {
+ text-align: center;
+ color: #fff;
+}
+
+@keyframes loading {
+ 0% {
+ transform: translate(0, 0)
+ }
+
+ 50% {
+ transform: translate(30vw, 0);
+ background-color: #f5634a;
+ width: 40px;
+ }
+
+ 100% {
+ transform: translate(0, 0);
+ }
+}
+
+.tool {
+ display: flex;
+ margin: 10rpx 32rpx 0rpx;
+ padding-bottom: 20rpx;
+}
+
+.toolcell {
+ display: flex;
+
+ align-items: center;
+}
+
+.toolcell .toolicon {
+ width: 40rpx;
+ height: 35rpx;
+}
+
+.toolcell .name {
+ color: #999999;
+ font-size: 28rpx;
+ margin-left: 20rpx;
+}
+
+.toolcell:last-child {
+ margin-left: 90rpx;
+}
+.more {
+ width: 120rpx;
+ height: 60rpx;
+ display: flex;
+ margin-right: 32rpx;
+ align-items: center;
+ justify-content: center;
+ background: #F8F8F8;
+ color: #353535;
+ font-size: 26rpx;
+ border-radius: 6rpx;
+ border: 1px solid rgba(5, 5, 5, 0.1)
+}
+
+.functionbox {
+ position: relative;
+ display: flex;
+ justify-content: flex-end;
+ border: 1rpx solid #E7E7E7;
+}
+.contact {
+ position: absolute;
+ right: 30rpx;
+ font-size: 28rpx;
+ display: flex;
+ line-height: 60rpx;
+ justify-content: center;
+ top: -62rpx;
+ width: 128rpx;
+ height: 66rpx;
+ color: #333333;
+
+ background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAABCCAYAAACfHt50AAACV0lEQVR4Xu3XvaoaQRjG8Vl3AxERBYOICAYRUmgK2cUy/Umq3EFuI5eQG8gNpEiRKkXgdKZfvwpTBWGJeECbTSFRIjuGTXGaQHDTTZ7/qU4xg7Pz/Hjfeb3pdHox/MnegJcDCMNQ9gKUP3w2mxkACAsAgHD4+acDAAC0AGUDVADl9GkB4ukDAAC0AHEDAAAAU4CyASqAcvo8AsXTBwAAaAHiBgAAAKYAZQNUAOX0eQSKpw8AANACxA0AAABMAcoGqADK6fMIFE8fAACgBYgbAAAAmAKUDVABlNPnESiePgAAQAsQNwAAADAFKBugAiinzyNQPH0AAIAWIG4AAABgClA2QAVQTp9HoHj6AAAALUDcAAAAwBSgbIAKoJw+j0Dx9AEAAFqAuAEAAIApQNkAFUA5fR6B4ukDAAC0AHED9wCGw+F/fRW+75sgCAp94/l8NtbaQntcW7xarX5PAV9dO3jR8wZB0O33+w8qlcpVW9M0NUmS/LDW3l21weFFnsNnv/rocRzf+L7/odfrVWq12l/37fd7s9ls7qy1L8bj8fLqH3F0oQSAPJvlcjnOsuxTt9t91Gg0/ojrcrmY7XZrdrvdF2PM8yiKvjmaaaFjywDIbyWO4yelUum23W4/brVa9xeV9/okSUyapp993385Go2+F7pFhxdLAchzms/nbWvtbbPZfNrpdEyWZWa9XpvD4fC+XC6/GgwGPx3Os/DR5QDkN7RYLOrW2o/1ev3Z8Xg0p9PpTRiGrz3PuxS+Qcc3SALIM5tMJg+r1eq7/N8oit46nuM/H/8XJ/zgYgJgSv4AAAAASUVORK5CYII=) no-repeat center center;
+ background-size: cover;
+}
+.contactCustom{
+ display: flex;
+ line-height: 60rpx;
+ padding: 0;
+ justify-content: center;
+ width:100%;
+ font-size: 28rpx;
+}
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessageList/concat.wxs b/TUIService/TUIKit/components/TUIChat/components/MessageList/concat.wxs
new file mode 100644
index 0000000..107669b
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessageList/concat.wxs
@@ -0,0 +1,13 @@
+var concat = function() {
+ if (arguments[0] === 'GROUP' && arguments[2].indexOf('@TGS#') !== -1) {
+ arguments[2] = arguments[2].replace('@TGS#', '')
+ }
+ return arguments[1] + arguments[2]
+}
+var connect = function() {
+ return arguments[0] + arguments[1]
+}
+module.exports = {
+ concat: concat,
+ connect: connect
+};
\ No newline at end of file
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessageList/index.js b/TUIService/TUIKit/components/TUIChat/components/MessageList/index.js
new file mode 100644
index 0000000..9a0858a
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessageList/index.js
@@ -0,0 +1,757 @@
+import dayjs from '../../../../utils/dayjs';
+import logger from '../../../../utils/logger';
+import constant from '../../../../utils/constant';
+// eslint-disable-next-line no-undef
+const app = getApp();
+Component({
+ /**
+ * 组件的属性列表
+ */
+ properties: {
+ conversation: {
+ type: Object,
+ value: {},
+ observer(newVal) {
+ if (!newVal.conversationID) return;
+ this.setData({
+ conversation: newVal,
+ }, () => {
+ this.getMessageList(this.data.conversation);
+ });
+ },
+ },
+ order_inquiry_id: {
+ type: String,
+ value: '',
+ observer(order_inquiry_id) {
+ this.setData({
+ order_inquiry_id,
+ });
+ },
+ },
+ unreadCount: {
+ type: Number,
+ value: 0,
+ observer(newVal) {
+ this.setData({
+ unreadCount: newVal,
+ });
+ },
+ },
+
+ comment_id:{
+ type: String,
+ value:'',
+ observer(newVal) {
+ this.setData({
+ comment_id: newVal,
+ },()=>{
+ if(newVal){
+ this.changeCommnentStatus(newVal)
+ }
+ });
+ },
+ }
+ },
+
+ /**
+ * 组件的初始数据
+ */
+ data: {
+ avatar: '',
+ userID: '',
+ isLostsOfUnread: false,
+ unreadCount: '',
+ conversation: {}, // 当前会话
+ messageList: [],
+ comment_id:'',
+ order_inquiry_id:'',
+ // 自己的 ID 用于区分历史消息中,哪部分是自己发出的
+ scrollView: '',
+ triggered: true,
+ nextReqMessageID: '', // 下一条消息标志
+ isCompleted: false, // 当前会话消息是否已经请求完毕
+ messagepopToggle: false,
+ messageID: '',
+ checkID: '',
+ selectedMessage: {},
+ deleteMessage: '',
+ RevokeID: '', // 撤回消息的ID用于处理对方消息展示界面
+ showName: '',
+ showDownJump: false,
+ showUpJump: false,
+ jumpAim: '',
+ messageIndex: '',
+ isShow: false,
+ Show: false,
+ UseData: '',
+ chargeLastmessage: '',
+ groupOptionsNumber: '',
+ showNewMessageCount: [],
+ messageTime: '',
+ messageHistoryTime: '',
+ messageTimeID: {},
+ showMessageTime: false,
+ showMessageHistoryTime: false,
+ showMessageError: false,
+ personalProfile: {},
+ showPersonalProfile: false,
+ resendMessage: {},
+ msgData:{
+ msg_round:0,
+ msg_type:2 // 1 是医生 2是患者,
+ },//回合数
+ showOnlyOnce: false,
+ lastMessageSequence: '',
+ isRewrite: false,
+ isMessageTime: {},
+ firstTime: Number,
+ newArr: {},
+ errorMessage: {},
+ errorMessageID: '',
+ typingMessage: {},
+
+ },
+
+ lifetimes: {
+ attached() {
+ },
+ ready() {
+ if (this.data.unreadCount > 12) {
+ if (this.data.unreadCount > 99) {
+ this.setData({
+ isLostsOfUnread: true,
+ showUpJump: true,
+ });
+ } else {
+ this.setData({
+ showUpJump: true,
+ });
+ }
+ }
+ wx.$TUIKit.getMyProfile().then((res) => {
+
+ this.data.avatar = res.data.avatar;
+ this.data.userID = res.data.userID;
+ });
+ wx.$TUIKit.on(wx.$TUIKitTIM.EVENT.MESSAGE_RECEIVED, this.$onMessageReceived, this);
+ wx.$TUIKit.on(wx.$TUIKitTIM.EVENT.MESSAGE_READ_BY_PEER, this.$onMessageReadByPeer, this);
+ wx.$TUIKit.on(wx.$TUIKitTIM.EVENT.MESSAGE_REVOKED, this.$onMessageRevoked, this);
+ },
+
+ detached() {
+ // 一定要解除相关的事件绑定
+ wx.$TUIKit.off(wx.$TUIKitTIM.EVENT.MESSAGE_RECEIVED, this.$onMessageReceived);
+ wx.$TUIKit.off(wx.$TUIKitTIM.EVENT.MESSAGE_READ_BY_PEER, this.$onMessageReadByPeer);
+ wx.$TUIKit.off(wx.$TUIKitTIM.EVENT.MESSAGE_REVOKED, this.$onMessageRevoked);
+ },
+ },
+ pageLifetimes: {
+ // 组件所在页面的生命周期函数
+ show() {
+ this.setData({
+ img_host:app.hostConfig().imghost
+ });
+ }
+ },
+ methods: {
+ popComment(e){
+ this.triggerEvent("popComment",e.detail);
+
+ },
+ changeCommnentStatus(id){
+ let cpn = this.selectComponent(".custom"+id);
+ let renderDom=cpn.data.renderDom;
+ cpn.handleAllRate(id,renderDom);
+ },
+ // 刷新消息列表
+ refresh() {
+ if (this.data.isCompleted) {
+ this.setData({
+ isCompleted: true,
+ triggered: false,
+ });
+ return;
+ }
+ this.getMessageList(this.data.conversation);
+ setTimeout(() => {
+ this.setData({
+ triggered: false,
+ });
+ }, 2000);
+ },
+ // 获取消息列表
+ getMessageList(conversation) {
+ if (!this.data.isCompleted) {
+ wx.$TUIKit.getMessageList({
+ conversationID: conversation.conversationID,
+ nextReqMessageID: this.data.nextReqMessageID,
+ count: 15,
+ }).then((res) => {
+ this.showMoreHistoryMessageTime(res.data.messageList);
+ const { messageList } = res.data; // 消息列表。
+ this.data.nextReqMessageID = res.data.nextReqMessageID; // 用于续拉,分页续拉时需传入该字段。
+ this.data.isCompleted = res.data.isCompleted; // 表示是否已经拉完所有消息。
+ this.data.messageList = [...messageList, ...this.data.messageList];
+ if (messageList.length > 0 && this.data.messageList.length < this.data.unreadCount) {
+ this.getMessageList(conversation);
+ }
+ this.$handleMessageRender(this.data.messageList, messageList);
+
+ });
+ }
+ },
+ // 历史消息渲染
+ $handleMessageRender(messageList, currentMessageList) {
+ console.log(messageList)
+ this.showHistoryMessageTime(currentMessageList);
+ if (messageList.length > 0) {
+ if (this.data.conversation.type === '@TIM#SYSTEM') {
+ this.filterRepateSystemMessage(messageList);
+ } else {
+
+ // let tepmList=this.deepClone(currentMessageList).reverse();
+
+ let item=null;
+ //判断是否是撤回或者删除消息,跳到底部id
+ for (let i = currentMessageList.length-1;i>=0;i--){
+ if(!currentMessageList[i].isDeleted && !currentMessageList[i].isRevoked){
+ item=currentMessageList[i];
+ break;
+ }
+
+ };
+ //判断消息是否是处方消息; 这里需要messgaeList,要不然回合数会错误;
+ for (let i = messageList.length-1;i>=0;i--) {
+ if(!messageList[i].cloudCustomData){
+ continue;
+ }
+
+ let cloudCustomData=JSON.parse(messageList[i].cloudCustomData);
+ if(messageList[i].type!='TIMCustomElem'){
+ // let jsonData=JSON.parse(messageList[i].payload.data);
+ this.setData({
+ 'msgData.msg_round':cloudCustomData.message_rounds,
+ 'msgData.msg_type':messageList[i].flow=="in"?1:2
+ });
+
+ this.triggerEvent("getMessageRounds",this.data.msgData);
+ break;
+
+ }else{
+ let jsonData=JSON.parse(messageList[i].payload.data);
+ if(jsonData.message_type==1){
+ this.setData({
+ 'msgData.msg_round':0,
+ 'msgData.msg_type':2
+ });
+ // if(cloudCustomData.order_inquiry_id!=this.data.order_inquiry_id){
+ // return false;
+ // };
+ this.triggerEvent("getMessageRounds",this.data.msgData);
+ break;
+ };
+ }
+
+ }
+ this.setData({
+ messageList,
+ // 消息ID前拼接字符串为了解决scroll-into-view,无法跳转以数字开头的ID。
+ //jumpAim: `ID-${this.filterSystemMessageID(currentMessageList[currentMessageList.length - 1].ID)}`,
+ jumpAim: `ID-${this.filterSystemMessageID(item.ID)}`
+
+ }, () => {
+
+ });
+ }
+ };
+ },
+ // 系统消息去重
+ filterRepateSystemMessage(messageList) {
+ const noRepateMessage = [];
+ for (let index = 0; index < messageList.length; index++) {
+ if (!noRepateMessage.some(item => item && item.ID === messageList[index].ID)) {
+ noRepateMessage.push(messageList[index]);
+ }
+ }
+ this.setData({
+ messageList: noRepateMessage,
+ });
+ },
+ // 消息已读更新
+ $onMessageReadByPeer(event) {
+ this.updateReadByPeer(event);
+ },
+ // 更新已读更新
+ updateReadByPeer(event) {
+ event.data.forEach((item) => {
+ const index = this.data.messageList.findIndex(element => element.ID === item.ID);
+ this.data.messageList[index] = item;
+ this.setData({
+ messageList: this.data.messageList,
+ });
+ });
+ },
+
+ // 收到的消息
+ $onMessageReceived(value) {
+ const message = value.data[0];
+ let cloudCustomData=JSON.parse(message.cloudCustomData);
+ console.log("cloudCustom_id:"+cloudCustomData.order_inquiry_id,this.data.order_inquiry_id)
+ if(cloudCustomData.order_inquiry_id==this.data.order_inquiry_id){
+ if(message.type=="TIMCustomElem"){
+ let jsonData=JSON.parse(message.payload.data);
+
+ if(jsonData.message_type){
+ if(jsonData.message_type==1 || jsonData.message_type==2){
+ this.triggerEvent("freshChatStatus",cloudCustomData.order_inquiry_id)
+ };
+ if(jsonData.message_type==2){
+ this.triggerEvent("freshChatStatus",cloudCustomData.order_inquiry_id)
+ };
+ if(jsonData.message_type==1){
+ this.setData({
+ 'msgData.msg_round':0,
+ 'msgData.msg_type':2
+ });
+ this.triggerEvent("getMessageRounds",this.data.msgData);
+ }
+
+ }
+
+ }else{
+ console.log(this.data.msgData);
+ let chat_rounds=cloudCustomData.message_rounds || 0;
+ let rounds=this.data.msgData.msg_round>=chat_rounds?this.data.msgData.msg_round:chat_rounds;
+
+ this.setData({
+ 'msgData.msg_round':rounds,
+ 'msgData.msg_type':message.flow=="in"?1:2
+ });
+ this.triggerEvent("getMessageRounds",this.data.msgData);
+
+ }
+ }
+
+ wx.$TUIKit.setMessageRead({ conversationID: this.data.conversation.conversationID }).then(() => {
+ logger.log('| MessageList | setMessageRead | ok');
+ });
+ const { BUSINESS_ID_TEXT, MESSAGE_TYPE_TEXT } = constant;
+ this.messageTimeForShow(message);
+ this.setData({
+ UseData: value,
+ });
+ value.data.forEach((item) => {
+ if (item.conversationID !== this.data.conversation.conversationID) {
+ return;
+ }
+ // 判断收到的消息是否是正在输入状态消息。由于正在输入状态消息是自定义消息,需要对自定义消息进行一个过滤,是自定义消息但不是正在输入状态消息,则新消息未读数加1,不是自定义消息则新消息未读数直接加1
+ if (this.data.messageList.length > 12 && !message.isRead) {
+ try {
+ const typingMessage = JSON.parse(item.payload.data);
+ this.setData({
+ typingMessage,
+ });
+ } catch (error) {
+ }
+ if ((item.type === MESSAGE_TYPE_TEXT.TIM_CUSTOM_ELEM && this.data.typingMessage.businessID !== BUSINESS_ID_TEXT.USER_TYPING) || item.type !== MESSAGE_TYPE_TEXT.TIM_CUSTOM_ELEM) {
+ this.data.showNewMessageCount.push(message);
+ this.setData({
+ showNewMessageCount: this.data.showNewMessageCount,
+ showDownJump: true,
+ });
+ }
+ } else {
+ this.setData({
+ showDownJump: false,
+ });
+ }
+ });
+ // 若需修改消息,需将内存的消息复制一份,不能直接更改消息,防止修复内存消息,导致其他消息监听处发生消息错误
+ // 将收到的消息存入messageList之前需要进行过滤,正在输入状态消息不用存入messageList.
+ const list = [];
+ value.data.forEach((item) => {
+ if (item.conversationID === this.data.conversation.conversationID && item.type === MESSAGE_TYPE_TEXT.TIM_CUSTOM_ELEM) {
+ try {
+ const typingMessage = JSON.parse(item.payload.data);
+ if (typingMessage.businessID !== BUSINESS_ID_TEXT.USER_TYPING) {
+ list.push(item);
+ } else {
+ this.triggerEvent('typing', {
+ typingMessage,
+ });
+ }
+ } catch (error) {
+ }
+ } else if (item.conversationID === this.data.conversation.conversationID) {
+ list.push(item);
+ }
+ });
+ this.data.messageList = this.data.messageList.concat(list);
+ console.log("messageList------------------")
+ console.log(this.data.messageList);
+ this.setData({
+ messageList: this.data.messageList,
+ groupOptionsNumber: this.data.messageList.slice(-1)[0].payload.operationType,
+ });
+ if (this.data.conversation.type === 'GROUP') {
+ this.triggerEvent('changeMemberCount', {
+ groupOptionsNumber: this.data.messageList.slice(-1)[0].payload.operationType,
+ });
+ };
+ this.handleJumpNewMessage()
+ },
+ // 自己的消息上屏
+ updateMessageList(message) {
+ if (message.conversationID !== this.data.conversation.conversationID) return;
+ wx.$TUIKit.setMessageRead({ conversationID: this.data.conversation.conversationID }).then(() => {
+ logger.log('| MessageList | setMessageRead | ok');
+ });
+ const { BUSINESS_ID_TEXT, MESSAGE_TYPE_TEXT } = constant;
+ // this.$onMessageReadByPeer();
+ this.messageTimeForShow(message);
+ if (message.type === MESSAGE_TYPE_TEXT.TIM_CUSTOM_ELEM) {
+ const typingMessage = JSON.parse(message.payload.data);
+ if (typingMessage.businessID === BUSINESS_ID_TEXT.USER_TYPING) {
+ this.setData({
+ messageList: this.data.messageList,
+ });
+ } else {
+ this.data.messageList.push(message);
+ }
+ } else {
+ this.data.messageList.push(message);
+ }
+ if(this.data.messageList.length>0){
+ this.setData({
+ lastMessageSequence: this.data.messageList.slice(-1)[0].sequence,
+ messageList: this.data.messageList,
+ jumpAim: `ID-${this.filterSystemMessageID((this.data.messageList[this.data.messageList.length - 1]).ID)}`,
+ }, () => {
+ this.setData({
+ messageList: this.data.messageList,
+ });
+ });
+ }
+ },
+ // 兼容 scrollView
+ filterSystemMessageID(messageID) {
+ const index = messageID.indexOf('@TIM#');
+ const groupIndex = messageID.indexOf('@TGS#');
+ if (index === 0) {
+ messageID = messageID.replace('@TIM#', '');
+ }
+ if (groupIndex === 0) {
+ messageID = messageID.replace('@TGS#', '');
+ }
+ return messageID;
+ },
+ // 获取消息ID
+ handleLongPress(e) {
+ for (let index = 0; index < this.data.messageList.length; index++) {
+ if (this.data.messageList[index].status === 'success') {
+ const { index } = e.currentTarget.dataset;
+ this.setData({
+ messageID: e.currentTarget.id,
+ selectedMessage: this.data.messageList[index],
+ Show: true,
+ });
+ }
+ }
+ },
+ // 更新 messagelist
+ updateMessageByID(deleteMessageID) {
+ const { messageList } = this.data;
+ const deleteMessageArr = messageList.filter(item => item.ID === deleteMessageID);
+ this.setData({
+ messageList,
+ });
+ return deleteMessageArr;
+ },
+ // 删除消息
+ deleteMessage() {
+ wx.aegis.reportEvent({
+ name: 'messageOptions',
+ ext1: 'messageOptions-delete',
+ ext2: wx.$chat_reportType,
+ ext3: wx.$chat_SDKAppID,
+ });
+ wx.$TUIKit.deleteMessage([this.data.selectedMessage])
+ .then((imResponse) => {
+ this.updateMessageByID(imResponse.data.messageList[0].ID);
+ wx.showToast({
+ title: '删除成功!',
+ duration: 800,
+ icon: 'none',
+ });
+ })
+ .catch(() => {
+ wx.showToast({
+ title: '删除失败!',
+ duration: 800,
+ icon: 'error',
+ });
+ });
+ },
+ // 撤回消息
+ revokeMessage() {
+ wx.aegis.reportEvent({
+ name: 'messageOptions',
+ ext1: 'messageOptions-revoke',
+ ext2: wx.$chat_reportType,
+ ext3: wx.$chat_SDKAppID,
+ });
+ wx.$TUIKit.revokeMessage(this.data.selectedMessage)
+ .then((imResponse) => {
+ this.setData({
+ resendMessage: imResponse.data.message,
+ });
+ this.updateMessageByID(imResponse.data.message.ID);
+ // 消息撤回成功
+ })
+ .catch((imError) => {
+ wx.showToast({
+ title: '超过2分钟消息不支持撤回',
+ duration: 800,
+ icon: 'none',
+ }),
+ this.setData({
+ Show: false,
+ });
+ // 消息撤回失败
+ console.warn('revokeMessage error:', imError);
+ });
+ },
+ // 撤回消息重新发送
+ resendMessage(e) {
+ this.triggerEvent('resendMessage', {
+ message: e.detail.message,
+ });
+ },
+ // 关闭弹窗
+ handleEditToggleAvatar() {
+ this.setData({
+ Show: false,
+ });
+ },
+ // 向对方通知消息撤回事件
+ $onMessageRevoked(event) {
+ this.updateMessageByID(event.data[0].ID);
+ },
+ // 复制消息
+ copyMessage() {
+ wx.aegis.reportEvent({
+ name: 'messageOptions',
+ ext1: 'messageOptions-copy',
+ ext2: wx.$chat_reportType,
+ ext3: wx.$chat_SDKAppID,
+ });
+ wx.setClipboardData({
+ data: this.data.selectedMessage.payload.text,
+ success() {
+ wx.getClipboardData({
+ success(res) {
+ logger.log(`| TUI-chat | message-list | copyMessage: ${res.data} `);
+ },
+ });
+ },
+ });
+ this.setData({
+ Show: false,
+ });
+ },
+ // 消息跳转到最新
+ handleJumpNewMessage() {
+ if(this.data.messageList.length>0){
+ this.setData({
+ jumpAim: `ID-${this.filterSystemMessageID((this.data.messageList[this.data.messageList.length - 1]).ID)}`,
+ showDownJump: false,
+ showNewMessageCount: [],
+ });
+ }
+ },
+ // 消息跳转到最近未读
+ handleJumpUnreadMessage() {
+ if (this.data.unreadCount > 15) {
+ this.getMessageList(this.data.conversation);
+ this.setData({
+ jumpAim: `ID-${this.filterSystemMessageID(this.data.messageList[this.data.messageList.length - this.data.unreadCount].ID)}`,
+ showUpJump: false,
+ });
+ } else {
+ this.getMessageList(this.data.conversation);
+ this.setData({
+ jumpAim: `ID-${this.filterSystemMessageID(this.data.messageList[this.data.messageList.length - this.data.unreadCount].ID)}`,
+ showUpJump: false,
+ });
+ }
+ },
+ // 滑动到最底部置跳转事件为false
+ scrollHandler() {
+ this.setData({
+ jumpAim: `ID-${this.filterSystemMessageID(this.data.messageList[this.data.messageList.length - 1].ID)}`,
+ showDownJump: false,
+ });
+ },
+ // 删除处理掉的群通知消息
+ changeSystemMessageList(event) {
+ this.updateMessageByID(event.detail.message.ID);
+ },
+ // 展示消息时间
+ messageTimeForShow(messageTime) {
+ const interval = 5 * 60 * 1000;
+ const nowTime = Math.floor(messageTime.time / 10) * 10 * 1000;
+ if (this.data.messageList.length > 0) {
+ const lastTime = this.data.messageList.slice(-1)[0].time * 1000;
+ if (nowTime - lastTime > interval) {
+ Object.assign(messageTime, {
+ isShowTime: true,
+ }),
+ this.data.messageTime = dayjs(nowTime);
+ this.setData({
+ messageTime: dayjs(nowTime).format('YYYY-MM-DD HH:mm:ss'),
+ showMessageTime: true,
+ });
+ }
+ }
+ },
+ // 渲染历史消息时间
+ showHistoryMessageTime(messageList) {
+ const cut = 30 * 60 * 1000;
+ for (let index = 0; index < messageList.length; index++) {
+ const nowadayTime = Math.floor(messageList[index].time / 10) * 10 * 1000;
+ const firstTime = messageList[0].time * 1000;
+ if (nowadayTime - firstTime > cut) {
+ const indexbutton = messageList.map(item => item).indexOf(messageList[index]); // 获取第一个时间大于30分钟的消息所在位置的下标
+ const firstTime = nowadayTime; // 找到第一个数组时间戳大于30分钟的将其值设为初始值
+ const showHistoryTime = Math.floor(messageList[indexbutton].time / 10) * 10 * 1000;
+ Object.assign(messageList[indexbutton], {
+ isShowHistoryTime: true,
+ }),
+ this.setData({
+ firstTime: nowadayTime,
+ messageHistoryTime: dayjs(showHistoryTime).format('YYYY-MM-DD HH:mm:ss'),
+ showMessageHistoryTime: true,
+ });
+ return firstTime;
+ }
+ }
+ },
+ // 拉取更多历史消息渲染时间
+ showMoreHistoryMessageTime(messageList) {
+ if (messageList.length > 0) {
+ const showHistoryTime = messageList[0].time * 1000;
+ Object.assign(messageList[0], {
+ isShowMoreHistoryTime: true,
+ });
+ this.data.newArr[messageList[0].ID] = dayjs(showHistoryTime).format('YYYY-MM-DD HH:mm:ss');
+ this.setData({
+ newArr: this.data.newArr,
+ });
+ }
+ },
+ // 消息发送失败
+ sendMessageError(event) {
+ this.setData({
+ errorMessage: event.detail.message,
+ errorMessageID: event.detail.message.ID,
+ });
+ const errorCode = event.detail.showErrorImageFlag;
+ const { MESSAGE_ERROR_CODE, TOAST_TITLE_TEXT } = constant;
+ switch (errorCode) {
+ case MESSAGE_ERROR_CODE.DIRTY_WORDS:
+ this.showToast(TOAST_TITLE_TEXT.DIRTY_WORDS);
+ break;
+ case MESSAGE_ERROR_CODE.UPLOAD_FAIL:
+ this.showToast(TOAST_TITLE_TEXT.UPLOAD_FAIL);
+ break;
+ case MESSAGE_ERROR_CODE.REQUESTOR_TIME || MESSAGE_ERROR_CODE.DISCONNECT_NETWORK:
+ this.showToast(TOAST_TITLE_TEXT.CONNECT_ERROR);
+ break;
+ case MESSAGE_ERROR_CODE.DIRTY_MEDIA:
+ this.showToast(TOAST_TITLE_TEXT.DIRTY_MEDIA);
+ break;
+ default:
+ break;
+ }
+ },
+ // 消息发送失败后重新发送
+ ResendMessage() {
+ const { MESSAGE_ERROR_CODE, TOAST_TITLE_TEXT } = constant;
+ wx.showModal({
+ content: '确认重发该消息?',
+ success: (res) => {
+ if (!res.confirm) {
+ return;
+ }
+ wx.$TUIKit.resendMessage(this.data.errorMessage) // 传入需要重发的消息实例
+ .then(() => {
+ this.showToast(TOAST_TITLE_TEXT.RESEND_SUCCESS);
+ this.setData({
+ showMessageError: false,
+ });
+ })
+ .catch((imError) => {
+ switch (imError.code) {
+ case MESSAGE_ERROR_CODE.DIRTY_WORDS:
+ this.showToast(TOAST_TITLE_TEXT.DIRTY_WORDS);
+ break;
+ case MESSAGE_ERROR_CODE.UPLOAD_FAIL:
+ this.showToast(TOAST_TITLE_TEXT.UPLOAD_FAIL);
+ break;
+ case MESSAGE_ERROR_CODE.REQUESTOR_TIME || MESSAGE_ERROR_CODE.DISCONNECT_NETWORK:
+ this.showToast(TOAST_TITLE_TEXT.CONNECT_ERROR);
+ break;
+ case MESSAGE_ERROR_CODE.DIRTY_MEDIA:
+ this.showToast(TOAST_TITLE_TEXT.DIRTY_MEDIA);
+ break;
+ default:
+ break;
+ }
+ });
+ },
+ });
+ },
+
+ showToast(toastTitle) {
+ if (this.data.showMessageError) {
+ wx.showToast({
+ title: toastTitle,
+ duration: 800,
+ icon: 'none',
+ });
+ } else {
+ this.setData({
+ showMessageError: true,
+ });
+ wx.showToast({
+ title: toastTitle,
+ duration: 800,
+ icon: 'none',
+ });
+ }
+ },
+ deepClone(obj){
+ if(typeof obj!="object");return obj;
+ let result=obj instanceof Array?[]:{};
+ for(let key in obj){
+ result[key]=this.deepClone(obj[key]);
+ }
+
+ return result;
+ },
+ // 点击购买链接跳转
+ handleJumpLink(e) {
+ if (app?.globalData?.reportType !== constant.OPERATING_ENVIRONMENT) return;
+ const { BUSINESS_ID_TEXT } = constant;
+ const dataLink = JSON.parse(e.currentTarget.dataset.value.payload.data);
+ if (dataLink.businessID === BUSINESS_ID_TEXT.ORDER || dataLink.businessID === BUSINESS_ID_TEXT.LINK) {
+ const url = `/pages/TUI-User-Center/webview/webview?url=${dataLink.link}&wechatMobile`;
+ app.method.navigateTo({
+ url: encodeURI(url),
+ });
+ }
+ },
+ },
+
+});
\ No newline at end of file
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessageList/index.json b/TUIService/TUIKit/components/TUIChat/components/MessageList/index.json
new file mode 100644
index 0000000..2bd9367
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessageList/index.json
@@ -0,0 +1,17 @@
+{
+ "component": true,
+ "enablePullDownRefresh": true,
+ "usingComponents": {
+ "TextMessage": "../MessageElements/TextMessage/index",
+ "ImageMessage": "../MessageElements/ImageMessage/index",
+ "VideoMessage": "../MessageElements/VideoMessage/index",
+ "AudioMessage": "../MessageElements/AudioMessage/index",
+ "CustomMessage": "../MessageElements/CustomMessage/index",
+ "TipMessage": "../MessageElements/TipMessage/index",
+ "SystemMessage": "../MessageElements/SystemMessage/index",
+ "FaceMessage": "../MessageElements/FaceMessage/index",
+ "FileMessage": "../MessageElements/FileMessage/index",
+ "MergerMessage": "../MessageElements/MergerMessage/index",
+ "RevokeMessage": "../MessageElements/RevokeMessage/index"
+ }
+}
\ No newline at end of file
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessageList/index.wxml b/TUIService/TUIKit/components/TUIChat/components/MessageList/index.wxml
new file mode 100644
index 0000000..7053bb6
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessageList/index.wxml
@@ -0,0 +1,82 @@
+
+
+
+ 没有更多啦
+ {{filter.toS(messageList[messageList.length-1])}}
+
+
+
+ {{messageTime}}
+
+
+
+
+ {{messageHistoryTime}}
+
+
+
+
+ {{newArr[item.ID]}}
+
+
+
+
+
+
+
+ 复制
+
+
+
+
+
+
+
+
+
+
+ 已读
+ 未读
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{showNewMessageCount.length}}条新消息
+
+
+
+
+
+
+
+ 99+条未读
+ {{unreadCount}}条未读
+
+
+
+
\ No newline at end of file
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessageList/index.wxss b/TUIService/TUIKit/components/TUIChat/components/MessageList/index.wxss
new file mode 100644
index 0000000..4047b3b
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessageList/index.wxss
@@ -0,0 +1,269 @@
+.container{
+ width: 100%;
+ height: 100%;
+ background-color: #F4F4F4;
+}
+.message-list-container {
+ /* margin-top: 20rpx; */
+ width: 100%;
+ height: calc(100%);
+ background-color: #F4F4F4;
+}
+.t-message-item {
+ /*max-width: 60vw;*/
+ padding: 14rpx 0;
+}
+.t-message{
+ position: relative;
+ z-index: -9;
+ box-sizing: border-box;
+ /* width: calc(100vw - 40rpx);
+ margin:0 auto; */
+ padding: 10rpx 20rpx 20rpx 12rpx;
+}
+.t-recieve-message {
+ display: flex;
+ flex-direction: row;
+ justify-items: flex-start;
+ width: 100%;
+}
+.t-message-avatar {
+ margin-left: 20rpx;
+ margin-right: 12rpx;
+ border-radius: 10rpx;
+ width: 80rpx;
+ height: 80rpx;
+ border-radius: 50%;
+ flex-shrink: 0;
+}
+.t-self-message {
+ position: relative;
+ display: flex;
+ flex-direction: row;
+ justify-content: flex-end;
+ word-break: break-all;
+}
+.t-self-message-body {
+ display: flex;
+ justify-content: flex-start;
+ flex-wrap: wrap;
+ outline: none;
+}
+.t-recieve-message-body {
+ display: flex;
+ justify-content: flex-start;
+ flex-wrap: wrap;
+ outline: none;
+ /*background: #F8F8F8;*/
+ /* border-radius: 2px 10px 10px 10px; */
+ width:100%;
+ /* box-sizing: border-box;
+ margin-left: 8rpx;
+ margin-right: 8rpx; */
+}
+
+.read-receipts {
+ line-height: 42px;
+ height: 42px;
+ font-size: 12px;
+ color: #6e7981;
+ margin-right: 10px;
+ display: none;
+}
+.no-message {
+ text-align: center;
+ position: fixed;
+ width: 100%;
+ font-size: 12px;
+ color: #a5b5c1;
+ height: 40px;
+ top: -40px;
+ right: 0;
+}
+.label-pop{
+ position: absolute;
+ top: -15px;
+ left: 70px;
+ background: white;
+ width: 200rpx;
+}
+.label-pop-mask {
+ /* padding: 2px 4px; */
+
+ display: flex;
+ background-color: transparent;
+ align-items: center;
+ justify-content: center;
+}
+.label-recieve-body{
+ /* padding: 4px; */
+ position: absolute;
+ top: -25px;
+ /* left: 65px; */
+ left: 69px;
+ background: black;
+ /* padding-right: 3px;
+ padding-left: 3px; */
+ background-color: black;
+ z-index: 100;
+ box-shadow: 0 2px 16px 0 rgba(0,0,0,0.08);
+ border-radius: 8rpx;
+}
+/* .label-recieve-body:after{
+ content: "";
+ display: block;
+ border-width: 20px;
+ position: absolute;
+ bottom: -27px;
+ left: 8px;
+ border-style: solid dashed dashed;
+ border-color: black transparent transparent;
+ font-size: 0;
+ line-height: 0;
+ margin-left: 9px;
+ border-top-width: 8px;
+ border-right-width: 3px;
+ border-bottom-width: 20px;
+ border-left-width: 3px;
+ border-top-style: solid;
+ border-right-style: dashed;
+ border-bottom-style: dashed;
+ border-left-style: dashed;
+ border-top-color: black;
+ border-right-color: transparent;
+ border-bottom-color: transparent;
+ border-left-color: transparent;
+} */
+.label-self-body{
+ position: absolute;
+ padding: 4px;
+ top: -25px;
+ /* right: 50px; */
+ right: 66px;
+ background: black;
+ /* padding-right: 3px;
+ padding-left: 3px; */
+ background-color: black;
+ z-index: 100;
+ box-shadow: 0 2px 16px 0 rgba(0,0,0,0.08);
+ border-radius: 8rpx;
+}
+/* .label-self-body:after{
+ content: "";
+ display: block;
+ border-width: 20px;
+ position: absolute;
+ bottom: -27px;
+ left: 55px;
+ border-style: solid dashed dashed;
+ border-color: black transparent transparent;
+ font-size: 0;
+ line-height: 0;
+ margin-left: 9px;
+ border-top-width: 8px;
+ border-right-width: 3px;
+ border-bottom-width: 20px;
+ border-left-width: 3px;
+ border-top-style: solid;
+ border-right-style: dashed;
+ border-bottom-style: dashed;
+ border-left-style: dashed;
+ border-top-color: black;
+ border-right-color: transparent;
+ border-bottom-color: transparent;
+ border-left-color: transparent;
+} */
+.deletemessage{
+ font-size: 14px;
+ color: white;
+}
+.revokemessage{
+ font-size: 14px;
+ color: white;
+}
+.copymessage{
+ font-size: 14px;
+ color: white;
+}
+
+.new-message-item{
+ position: absolute;
+ right: 30px;
+ bottom: 180px;
+ background: black;
+ padding-right: 3px;
+ padding-left: 3px;
+ background-color: black;
+ z-index: 6;
+ box-shadow: 0 2px 16px 0 rgba(0,0,0,0.08);
+ border-radius: 8rpx;
+}
+.new-message-box{
+ display: flex;
+ font-size: 14px;
+ color: white;
+ padding: 2px;
+}
+.icon-left{
+ height: 28rpx;
+ width: 28rpx;
+ color: black;
+ background-color: black;
+ padding-top: 2px;
+}
+.videomessage-show{
+ background: black
+}
+.change-message{
+ width: 100%;
+ height: 200rpx
+}
+.unread-message-item{
+ position: absolute;
+ right: 30px;
+ top: 180px;
+ background: black;
+ padding-right: 3px;
+ padding-left: 3px;
+ background-color: black;
+ z-index: 9;
+ box-shadow: 0 2px 16px 0 rgba(0,0,0,0.08);
+ border-radius: 8rpx;
+}
+.unread-message-box{
+ display: flex;
+ font-size: 14px;
+ color: white;
+ padding: 2px;
+}
+.time-self-body{
+ position: absolute;
+ top: -14px;
+ right: 67px;
+}
+.time-recieve-body{
+ position: absolute;
+ top: -13px;
+ left: 65px;
+}
+.time{
+ font-size: 26rpx;
+ color: #333333;
+}
+.t-message-error-box{
+ display: flex;
+ align-items: center;
+ padding-right: 6px;
+}
+.t-message-error{
+ width: 16px;
+ height: 16px;
+}
+.showmessagetime{
+ display: flex;
+ justify-content: center;
+}
+.rewrite{
+ padding-left: 5px;
+ color: blue;
+}
\ No newline at end of file
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessagePrivate/CommonWords/index.js b/TUIService/TUIKit/components/TUIChat/components/MessagePrivate/CommonWords/index.js
new file mode 100644
index 0000000..21a0715
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessagePrivate/CommonWords/index.js
@@ -0,0 +1,67 @@
+const commonWordsList = [
+ '什么时候发货',
+ '发什么物流',
+ '为什么物流一直没更新',
+ '最新优惠',
+ '包邮吗',
+ '修改地址信息',
+ '修改收件人信息',
+ '物流一直显示正在揽收',
+ '问题A',
+ '问题B',
+];
+
+// eslint-disable-next-line no-undef
+Component({
+ /**
+ * 组件的属性列表
+ */
+ properties: {
+ display: {
+ type: Boolean,
+ value: '',
+ observer(newVal) {
+ this.setData({
+ displayTag: newVal,
+ });
+ },
+ },
+ },
+
+ /**
+ * 组件的初始数据
+ */
+ data: {
+ displayTag: true,
+ words: '',
+ commonWordsMatch: commonWordsList,
+ },
+
+ /**
+ * 组件的方法列表
+ */
+ methods: {
+ handleClose() {
+ this.triggerEvent('close', {
+ key: '0',
+ });
+ },
+ wordsInput(e) {
+ this.data.commonWordsMatch = [],
+ commonWordsList.forEach((item) => {
+ if (item.indexOf(e.detail.value) > -1) {
+ this.data.commonWordsMatch.push(item);
+ }
+ });
+ this.setData({
+ words: e.detail.value,
+ commonWordsMatch: this.data.commonWordsMatch,
+ });
+ },
+ sendMessage(e) {
+ this.triggerEvent('sendMessage', {
+ message: e.currentTarget.dataset.words,
+ });
+ },
+ },
+});
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessagePrivate/CommonWords/index.json b/TUIService/TUIKit/components/TUIChat/components/MessagePrivate/CommonWords/index.json
new file mode 100644
index 0000000..e8cfaaf
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessagePrivate/CommonWords/index.json
@@ -0,0 +1,4 @@
+{
+ "component": true,
+ "usingComponents": {}
+}
\ No newline at end of file
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessagePrivate/CommonWords/index.wxml b/TUIService/TUIKit/components/TUIChat/components/MessagePrivate/CommonWords/index.wxml
new file mode 100644
index 0000000..41d07b8
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessagePrivate/CommonWords/index.wxml
@@ -0,0 +1,15 @@
+
+
+
+ 请选择你要发送的常用语
+ 关闭
+
+
+
+
+
+
+ {{item}}
+
+
+
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessagePrivate/CommonWords/index.wxss b/TUIService/TUIKit/components/TUIChat/components/MessagePrivate/CommonWords/index.wxss
new file mode 100644
index 0000000..c988b4e
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessagePrivate/CommonWords/index.wxss
@@ -0,0 +1,82 @@
+.tui-common-words-container {
+ position: fixed;
+ width: 100vw;
+ height: 100vh;
+ z-index: 100;
+ top: 0;
+ background: rgba(0,0,0,0.5);
+}
+
+.tui-common-words-box {
+ position: absolute;
+ width: 100%;
+ height: 60%;
+ bottom: 0;
+ background: rgba(255,255,255,1);
+ padding-bottom: 68rpx;
+ z-index: 200;
+}
+
+.tui-common-words-title {
+ display: flex;
+ flex-wrap: nowrap;
+ justify-content: space-between;
+ padding-left: 40rpx;
+ padding-right: 40rpx;
+ padding-top: 48rpx;
+ font-family: PingFangSC-Medium;
+ font-size: 36rpx;
+ color: #000000;
+ letter-spacing: 0;
+ line-height: 50rpx;
+}
+
+.tui-search-bar {
+ display: flex;
+ flex-wrap: nowrap;
+ align-items: center;
+ margin: 32rpx 40rpx;
+ width: 670rpx;
+ height: 80rpx;
+ background: #FFFFFF;
+ border-radius: 40rpx;
+ border-radius: 40rpx;
+ background-color: #F8F8F8;
+}
+
+.tui-searchcion {
+ display: inline-block;
+ margin-left: 24rpx;
+ width: 48rpx;
+ height: 48rpx;
+}
+
+.tui-search-bar-input {
+ margin-left: 16rpx;
+ line-height: 40rpx;
+ font-size: 28rpx;
+ width: 100%;
+ display: inline-block;
+}
+
+.tui-common-words-list {
+ position: absolute;
+ top: 242rpx;
+ bottom: 68rpx;
+ width: 750rpx;
+}
+
+.tui-common-words-item {
+ width: 750rpx;
+ height: 112rpx;
+ border-bottom: 2rpx solid #EEF0F3;
+ background-color: #FFFFFF;
+ font-family: PingFangSC-Regular;
+ font-size: 32rpx;
+ color: #333333;
+ letter-spacing: 0;
+ line-height: 44rpx;
+ padding: 0 40rpx;
+ display: flex;
+ align-items: center;
+}
\ No newline at end of file
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessagePrivate/OrderList/index.js b/TUIService/TUIKit/components/TUIChat/components/MessagePrivate/OrderList/index.js
new file mode 100644
index 0000000..5d87a43
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessagePrivate/OrderList/index.js
@@ -0,0 +1,105 @@
+import constant from '../../../../../utils/constant';
+
+const orderList = [
+ {
+ orderNum: 1,
+ time: '2021-7-20 20:45',
+ title: '即时通信 IM 首购活动',
+ description: '单用户限购1件',
+ imageUrl: 'https://sdk-web-1252463788.cos.ap-hongkong.myqcloud.com/component/TUIKit/assets/im.jpg',
+ link: 'https://cloud.tencent.com/act/pro/imnew?from=16262',
+ imageWidth: 135,
+ imageHeight: 135,
+ price: '0.9折起',
+ },
+ {
+ orderNum: 2,
+ time: '2021-7-20 22:45',
+ title: '即时通信 IM 老客户热销专区',
+ description: '购买时长越长越优惠',
+ imageUrl: 'https://sdk-web-1252463788.cos.ap-hongkong.myqcloud.com/component/TUIKit/assets/im.jpg',
+ link: 'https://cloud.tencent.com/act/pro/imnew?from=16262',
+ imageWidth: 135,
+ imageHeight: 135,
+ price: '7.2折起',
+ },
+];
+// eslint-disable-next-line no-undef
+Component({
+ /**
+ * 组件的属性列表
+ */
+ properties: {
+ display: {
+ type: Boolean,
+ value: '',
+ observer(newVal) {
+ this.setData({
+ displayTag: newVal,
+ });
+ },
+ },
+ conversation: {
+ type: Object,
+ value: {},
+ observer(newVal) {
+ this.setData({
+ conversation: newVal,
+ });
+ },
+ },
+ },
+
+ /**
+ * 组件的初始数据
+ */
+ data: {
+ displayTag: true,
+ words: '',
+ orderMatch: orderList,
+ },
+
+ /**
+ * 组件的方法列表
+ */
+ methods: {
+ handleClose() {
+ this.triggerEvent('close', {
+ key: '1',
+ });
+ },
+ wordsInput(e) {
+ this.data.orderMatch = [],
+ orderList.forEach((item) => {
+ if (item.title.indexOf(e.detail.value) > -1 || item.orderNum === ~~e.detail.value) {
+ this.data.orderMatch.push(item);
+ }
+ });
+ this.setData({
+ words: e.detail.value,
+ orderMatch: this.data.orderMatch,
+ });
+ },
+ sendMessage(e) {
+ const { BUSINESS_ID_TEXT, FEAT_NATIVE_CODE } = constant;
+ const { order } = e.currentTarget.dataset;
+ this.triggerEvent('sendCustomMessage', { // 传递给父组件,在父组件处调用SDK的接口,来进行自定消息的发送
+ payload: {
+ data: JSON.stringify({
+ businessID: BUSINESS_ID_TEXT.ORDER,
+ version: FEAT_NATIVE_CODE.NATIVE_VERSION,
+ title: order.title,
+ imageUrl: order.imageUrl,
+ imageWidth: order.imageWidth,
+ imageHeight: order.imageHeight,
+ link: order.link,
+ price: order.price,
+ description: order.description,
+ }), // data字段用于标识该消息类型
+ description: order.title, // 获取自定义消息的具体描述
+ extension: order.title, // 自定义消息的具体内容
+ },
+ });
+ },
+ },
+});
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessagePrivate/OrderList/index.json b/TUIService/TUIKit/components/TUIChat/components/MessagePrivate/OrderList/index.json
new file mode 100644
index 0000000..e8cfaaf
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessagePrivate/OrderList/index.json
@@ -0,0 +1,4 @@
+{
+ "component": true,
+ "usingComponents": {}
+}
\ No newline at end of file
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessagePrivate/OrderList/index.wxml b/TUIService/TUIKit/components/TUIChat/components/MessagePrivate/OrderList/index.wxml
new file mode 100644
index 0000000..60a2865
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessagePrivate/OrderList/index.wxml
@@ -0,0 +1,32 @@
+
+
+
+ 请选择你要发送的订单
+ 关闭
+
+
+
+
+
+
+
+
+ 订单编号: {{item.orderNum}}
+ {{item.time}}
+
+
+
+
+ {{item.title}}
+ {{item.description}}
+
+ {{item.price}}
+
+ 发送此订单
+
+
+
+
+
+
+
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessagePrivate/OrderList/index.wxss b/TUIService/TUIKit/components/TUIChat/components/MessagePrivate/OrderList/index.wxss
new file mode 100644
index 0000000..7a5fe20
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessagePrivate/OrderList/index.wxss
@@ -0,0 +1,173 @@
+.tui-cards-container {
+ position: fixed;
+ width: 100vw;
+ height: 100vh;
+ z-index: 100;
+ top: 0;
+ background: rgba(0,0,0,0.5);
+}
+
+.tui-cards-box {
+ position: absolute;
+ width: 100%;
+ height: 60%;
+ bottom: 0;
+ background: #F4F5F9;
+ padding-bottom: 68rpx;
+ z-index: 200;
+}
+
+.tui-cards-title {
+ display: flex;
+ flex-wrap: nowrap;
+ justify-content: space-between;
+ padding-left: 40rpx;
+ padding-right: 40rpx;
+ padding-top: 48rpx;
+ font-family: PingFangSC-Medium;
+ font-size: 36rpx;
+ color: #000000;
+ letter-spacing: 0;
+ line-height: 50rpx;
+}
+
+.tui-search-bar {
+ display: flex;
+ flex-wrap: nowrap;
+ align-items: center;
+ margin: 32rpx 40rpx;
+ width: 670rpx;
+ height: 80rpx;
+ background: #FFFFFF;
+ border-radius: 40rpx;
+ border-radius: 40rpx;
+ background-color: #F8F8F8;
+}
+
+.tui-searchcion {
+ display: inline-block;
+ margin-left: 24rpx;
+ width: 48rpx;
+ height: 48rpx;
+}
+
+.tui-search-bar-input {
+ margin-left: 16rpx;
+ line-height: 40rpx;
+ font-size: 28rpx;
+ width: 100%;
+ display: inline-block;
+}
+
+.tui-order-list {
+ position: absolute;
+ top: 242rpx;
+ bottom: 68rpx;
+ width: 750rpx;
+}
+
+.tui-order-item {
+ width: 670rpx;
+ margin: 32rpx 40rpx;
+ height: 388rpx;
+ background-color: #FFFFFF;
+ border-radius: 4px;
+ display: flex;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.order-title {
+ width: 670rpx;
+ height: 102rpx;
+ padding: 32rpx 40rpx;
+ padding-bottom: 0;
+ border-bottom: 2rpx solid #EEF0F3;
+}
+
+.order-title > .order-number {
+ font-family: PingFangSC-Medium;
+ font-size: 32rpx;
+ line-height: 44rpx;
+ color: #000000;
+ letter-spacing: 0;
+ margin-bottom: 8rpx;
+}
+
+.order-title > .order-time {
+ font-family: PingFangSC-Regular;
+ font-size: 24rpx;
+ line-height: 34rpx;
+ color: #999999;
+ letter-spacing: 0;
+}
+
+.order-info {
+ display: flex;
+ flex-wrap: nowrap;
+ width: 670rpx;
+ height: 236rpx;
+ padding: 32rpx 40rpx;
+}
+
+.order-content {
+ width: 450rpx;
+ margin-left: 32rpx;
+}
+
+.order-content-title {
+ font-family: PingFangSC-Medium;
+ width: 378rpx;
+ line-height: 34rpx;
+ font-size: 24rpx;
+ color: #000000;
+ letter-spacing: 0;
+ margin-bottom: 12rpx;
+}
+
+.order-content-description {
+ display: flex;
+ flex-wrap: nowrap;
+ font-family: PingFangSC-Regular;
+ max-width: 410rpx;
+ line-height: 34rpx;
+ font-size: 24rpx;
+ color: #999999;
+ letter-spacing: 0;
+ margin-bottom: 12rpx;
+}
+
+.order-content-price {
+ font-family: PingFangSC-Medium;
+ font-size: 36rpx;
+ line-height: 50rpx;
+ color: #FF7201;
+ letter-spacing: 0;
+}
+
+.order-image {
+ width: 156rpx;
+ height: 156rpx;
+}
+
+.btn-send-order {
+ width: 176rpx;
+ height: 58rpx;
+ background-color: #006EFF;
+ border-radius: 14.5px;
+ font-family: PingFangSC-Regular;
+ font-size: 24rpx;
+ color: #FFFFFF;
+ line-height: 28px;
+ text-align: center;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ margin-right: 40rpx;
+}
+.btn-send-text{
+ font-family: PingFangSC-Regular;
+ font-size: 12px;
+ color: #FFFFFF;
+ line-height: 14px;
+}
\ No newline at end of file
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessagePrivate/ServiceEvaluation/index.js b/TUIService/TUIKit/components/TUIChat/components/MessagePrivate/ServiceEvaluation/index.js
new file mode 100644
index 0000000..4a56eb9
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessagePrivate/ServiceEvaluation/index.js
@@ -0,0 +1,246 @@
+import constant from '../../../../../utils/constant';
+import {
+ evaluation
+} from '../../../../../../../api/consult'
+import {
+ throttle
+} from "../../../../../../../utils/util"
+let app=getApp();
+// eslint-disable-next-line no-undef
+Component({
+ /**
+ * 组件的属性列表
+ */
+ properties: {
+ display: {
+ type: Boolean,
+ value: false,
+ observer(newVal) {
+ console.log(newVal);
+ this.setData({
+ displayTag: newVal,
+ });
+ },
+ },
+
+ doctor_id: {
+ type: String,
+ value: '',
+ observer(newVal) {
+ this.setData({
+ doctor_id: newVal,
+ });
+ },
+ },
+ commentDetail: {
+ type: Object,
+ value: null,
+ observer(newVal) {
+ if (newVal) {
+ this.setData({
+ commentDetail: newVal,
+ reply_quality: newVal.reply_quality,
+ service_attitude: newVal.service_attitude,
+ reply_progress: newVal.reply_progress,
+ content: newVal.content?newVal.content:'感谢您的服务',
+ score: newVal.avg_score,
+ is_evaluation: newVal.is_evaluation,
+ order_inquiry_id: newVal.order_inquiry_id
+ });
+ if(!newVal.is_evaluation){
+ this.setData({
+ reply_quality: 5,
+ service_attitude: 5,
+ reply_progress: 5,
+ score:5
+ })
+ }
+ }
+
+
+ },
+ },
+ doctor_info: {
+ type: Object,
+ value: {},
+ observer(newVal) {
+ this.setData({
+ doctor_info: newVal,
+ });
+ },
+ }
+ },
+ lifetimes: {
+ attached: function () {
+
+ // 在组件实例进入页面节点树时执行
+ },
+ },
+ pageLifetimes: {
+ show: function() {
+ this.setData({
+ img_host:app.hostConfig().imghost
+ });
+
+ },
+ hide: function() {
+
+ // 页面被隐藏
+ },
+ resize: function(size) {
+ // 页面尺寸变化
+ }
+ },
+ /**
+ * 组件的初始数据
+ */
+ data: {
+ img_host:'https://oss.prod.applets.igandanyiyuan.com/applet/patient/static',
+ displayTag: false,
+ doctor_info: null,
+ commentDetail: null,
+ doctor_id: '',
+ is_evaluation: false,
+ message: '',
+ scoreList: [1, 2, 3, 4, 5],
+ score: 0,
+ comment: '',
+ order_inquiry_id: '',
+ reply_quality: 0,
+ service_attitude: 0,
+ reply_progress: 0,
+ content: '感谢您的服务'
+ },
+ /**
+ * 组件的方法列表
+ */
+ methods: {
+ onChangeContent(event) {
+ this.setData({
+ content: event.detail
+ })
+ },
+ handleEvaluation: throttle(function () {
+ let {
+ order_inquiry_id,
+ doctor_info,
+ reply_quality,
+ service_attitude,
+ reply_progress,
+ content
+ } = this.data;
+ if (reply_quality == '') {
+ wx.showToast({
+ title: '请评论回复质量',
+ icon: "none"
+ });
+ return false;
+ };
+ if (service_attitude == '') {
+ wx.showToast({
+ title: '请评论服务态度',
+ icon: "none"
+ });
+ return false;
+ };
+ if (content == '') {
+ wx.showToast({
+ title: '请填写您对医生的印象',
+ icon: "none"
+ });
+ return false;
+ };
+ if (reply_progress == '') {
+ wx.showToast({
+ title: '请评论回复速度',
+ icon: "none"
+ });
+ return false;
+ };
+ evaluation({
+ order_inquiry_id,
+ doctor_id:doctor_info.doctor_id,
+ reply_quality,
+ service_attitude,
+ reply_progress,
+ content,
+ }).then(data => {
+ this.setData({
+ displayTag: false
+ });
+ this.triggerEvent("freshRate",order_inquiry_id);
+ this.triggerEvent('close', {
+ score: Number(this.data.score)
+ });
+ wx.showToast({
+ title: '评价成功',
+ icon: "none"
+ })
+ })
+ }),
+ handleClose() {
+ this.triggerEvent('close', {
+ score: this.data.is_evaluation ? this.data.score : 0
+ });
+ },
+ onChange(event) {
+ this.setData({
+ [event.target.dataset.id]: event.detail
+ });
+ let {
+ reply_quality,
+ service_attitude,
+ reply_progress
+ } = this.data;
+ if (reply_quality && service_attitude && reply_progress) {
+ let score = (reply_quality * 0.4) + (service_attitude * 0.3) + (reply_progress * 0.3);
+ this.setData({
+ score: Math.floor(score)
+ })
+ }
+ },
+ handleScore(e) {
+ let {
+ score
+ } = e.currentTarget.dataset;
+ if (score === this.data.score) {
+ score = 0;
+ }
+ this.setData({
+ score,
+ });
+ },
+ bindTextAreaInput(e) {
+ this.setData({
+ comment: e.detail.value,
+ });
+ },
+ sendMessage() {
+ const {
+ BUSINESS_ID_TEXT,
+ STRING_TEXT,
+ FEAT_NATIVE_CODE
+ } = constant;
+ this.triggerEvent('sendCustomMessage', {
+ payload: {
+ // data 字段作为表示,可以自定义
+ data: JSON.stringify({
+ businessID: BUSINESS_ID_TEXT.EVALUATION,
+ version: FEAT_NATIVE_CODE.NATIVE_VERSION,
+ score: this.data.score,
+ comment: this.data.comment,
+ }),
+ description: STRING_TEXT.TYPETEXT, // 获取骰子点数
+ extension: STRING_TEXT.TYPETEXT,
+ },
+ });
+
+ this.setData({
+ score: 0,
+ comment: '',
+ });
+ this.handleClose();
+ },
+ },
+
+});
\ No newline at end of file
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessagePrivate/ServiceEvaluation/index.json b/TUIService/TUIKit/components/TUIChat/components/MessagePrivate/ServiceEvaluation/index.json
new file mode 100644
index 0000000..946fdfb
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessagePrivate/ServiceEvaluation/index.json
@@ -0,0 +1,10 @@
+{
+ "component": true,
+ "usingComponents": {
+ "van-rate": "@vant/weapp/rate/index",
+ "van-field": "@vant/weapp/field/index"
+ },
+
+ "styleIsolation": "shared"
+
+}
\ No newline at end of file
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessagePrivate/ServiceEvaluation/index.wxml b/TUIService/TUIKit/components/TUIChat/components/MessagePrivate/ServiceEvaluation/index.wxml
new file mode 100644
index 0000000..633e7d7
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessagePrivate/ServiceEvaluation/index.wxml
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+
+
+ {{doctor_info.user_name}}
+ {{doctor_info.doctor_title_name}}
+
+
+
+
+
+
+
+
+ 非常满意
+
+
+
+
+ 回复质量
+
+ 好评
+ 中评
+ 差评
+
+
+ 服务态度
+
+ 好评
+ 中评
+ 差评
+
+
+ 回复速度
+
+
+ 好评
+ 中评
+ 差评
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/TUIService/TUIKit/components/TUIChat/components/MessagePrivate/ServiceEvaluation/index.wxss b/TUIService/TUIKit/components/TUIChat/components/MessagePrivate/ServiceEvaluation/index.wxss
new file mode 100644
index 0000000..80a78a9
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/components/MessagePrivate/ServiceEvaluation/index.wxss
@@ -0,0 +1,180 @@
+.tui-cards-container {
+ position: fixed;
+ width: 100vw;
+ height: 100vh;
+ z-index:9999999;
+ top: 0;
+ background: rgba(0, 0, 0, 0.5);
+ display: flex;
+ align-items: flex-end;
+}
+
+.service-evaluation {
+ flex: 1;
+ background: #FFFFFF;
+ padding: 38rpx 40rpx 38rpx;
+ border-radius: 40rpx 40rpx 0 0;
+}
+
+.header {
+ display: flex;
+ justify-content: space-between;
+ font-family: PingFangSC-Regular;
+}
+
+.btn {
+ width: auto !important;
+ padding: 0;
+ margin: 0 !important;
+ background: none;
+}
+
+.header label {
+ font-size: 18px;
+ color: #000000;
+ letter-spacing: 0;
+ line-height: 25px;
+}
+.van-field__body--textarea{
+ width:600rpx;
+}
+.header .btn {
+ font-size: 16px;
+ color: #006EFF;
+ letter-spacing: 0;
+ line-height: 24px;
+}
+
+.main {
+ display: flex;
+ flex-direction: column;
+ padding: 8rpx 0 38rpx;
+}
+
+.main-evaluation-score {
+ padding: 0 60rpx 48rpx;
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-end;
+}
+
+.main-evaluation-score .score-star {
+ width: 72rpx;
+ height: 72rpx;
+}
+
+.main textarea {
+ background: #F8F8F8;
+ border: 0 solid #D9D9D9;
+ border-radius: 4px;
+ font-size: 14px;
+ padding: 16rpx 32rpx;
+}
+
+.textarea-placeholder {
+ color: #B0B0B0;
+}
+.footer .btn{
+ height: 80rpx;
+ width:100%;
+ background: #3CC7C0;
+ color:#fff;
+ display: flex;
+ font-size: 30rpx;
+ align-items: center;
+ justify-content: center;
+ border-radius: 10rpx
+ }
+.chatclose {
+ width: 30rpx;
+ height: 30rpx;
+ position: absolute;
+ padding:10rpx 30rpx;
+
+ right: 10rpx;
+}
+
+.doctorInfo {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.doctorAvatar {
+ width: 120rpx;
+ height: 120rpx;
+ border-radius: 50%;
+}
+
+.namebox {
+ display: flex;
+ margin-top: 18rpx;
+ align-items: center;
+}
+
+.namebox .name {
+ color: #333333;
+ font-size: 32rpx;
+}
+
+.viewstar {
+ margin-top: 28rpx;
+}
+
+.namebox .position {
+ color: #333333;
+ font-size: 24rpx;
+ margin-left: 8rpx;
+}
+.linebox{
+ display: flex;
+ margin-top: 20rpx;
+ align-items: center;
+}
+.linebox .line {
+ flex: 1;
+ height:1rpx;
+ background: #CCCCCC;
+}
+
+.linebox .pingjia {
+ margin: 0 40rpx;
+ font-weight: 600;
+ color: #333333;
+}
+
+.starbox{
+ margin-bottom: 30rpx;
+ display: flex;
+ align-items: center;
+ color: #333333;
+ font-size: 28rpx;
+}
+.ratebox{
+ margin-top: 34rpx;
+}
+
+.starbox .name{
+ margin-right:22rpx;
+}
+.starbox .quality{
+ margin-left:22rpx;
+ }
+ .ipt{
+ height:165rpx;
+ background-color: transparent!important;
+ padding:8rpx!important;
+ }
+ .commentArea{
+ position: relative;
+ }
+
+ .commentArea .van-field__word-limit{
+ position: absolute!important;
+ left:10rpx;
+ right:10rpx;
+ text-align: right;
+ bottom:5rpx;
+ color: #ccc!important;
+ font-size: 24rpx;
+}
diff --git a/TUIService/TUIKit/components/TUIChat/index.js b/TUIService/TUIKit/components/TUIChat/index.js
new file mode 100644
index 0000000..fc1cc03
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/index.js
@@ -0,0 +1,792 @@
+// TUIKit-WChat/Chat/index.js
+import logger from '../../utils/logger';
+import constant from '../../utils/constant';
+const dayjs = require("../../utils/dayjs.js");
+import {
+ getRate
+} from "../../../../api/consultOrder"
+// eslint-disable-next-line no-undef
+import {
+ fllowDoctor,
+ notfllowDoctor,
+ doctorDetail,
+} from "../../../../api/consultExpert"
+
+
+import {
+ chatMsg
+} from "../../../../api/common"
+import {throttle} from "../../../../utils/util"
+
+const app = getApp();
+const inputStyle = `
+ --padding: 25px
+`;
+
+let newInputStyle = `
+--padding: 0px
+`;
+
+const setNewInputStyle = (number) => {
+ const height = number;
+ newInputStyle = `--padding: ${height}px`;
+};
+let pageY = 0;
+Component({
+ /**
+ * 组件的属性列表
+ */
+ properties: {
+ currentConversationID: {
+ type: String,
+ value: '',
+ observer(currentConversationID) {
+ this.setData({
+ conversationID: currentConversationID,
+ });
+ },
+ },
+ order_inquiry_id: {
+ type: String,
+ value: '',
+ observer(order_inquiry_id) {
+ this.setData({
+ order_inquiry_id,
+ });
+ },
+ },
+ fromType: {
+ type: String,
+ value: '',
+ observer(newval) {
+ this.setData({
+ fromType: newval
+ });
+ },
+ },
+ inquiry_type: {
+ type: String,
+ value: '',
+ observer(inquiry_type) {
+ this.setData({
+ inquiry_type
+ });
+ },
+ },
+ hasCallKit: {
+ type: Boolean,
+ value: false,
+ observer(hasCallKit) {
+ this.setData({
+ hasCallKit,
+ });
+ },
+ },
+ },
+
+ lifetimes: {
+ attached() {
+ if (app?.globalData?.reportType === constant.OPERATING_ENVIRONMENT) {
+ this.setData({
+ showTips: true,
+ });
+ }
+ },
+ ready() {
+
+ }
+ },
+ pageLifetimes: {
+ show: function() {
+ this.setData({
+ img_host:app.hostConfig().imghost
+ });
+ wx.onNetworkStatusChange((res) => {
+ let msg = ''
+ if (!res.isConnected) {
+ msg = '当前网络不可用,请检查你的网络设置'
+ } else if (res.networkType === 'none') {
+ msg = '网络开小差了,请在网络良好后重试'
+ }
+ if (msg) {
+ wx.showToast({
+ title: msg,
+ icon: 'none',
+ })
+ }
+ })
+ console.log(this.data.order_inquiry_id);
+ this.handleChatMsg(this.data.order_inquiry_id);
+
+ },
+ hide: function() {
+ this.setData({
+ showAgain:false
+ })
+ // 页面被隐藏
+ },
+ resize: function(size) {
+ // 页面尺寸变化
+ }
+ },
+ /**
+ * 组件的初始数据
+ */
+ data: {
+ img_host:'https://oss.prod.applets.igandanyiyuan.com/applet/patient/static',
+ conversationName: '',
+ isEvaluation:false,
+ conversation: {},
+ doctor_info: '',
+ messageList: [],
+ isShow: false,
+ showImage: false,
+ showChat: true,
+ commentDetail: null,
+ conversationID: '',
+ order_inquiry_id: '',
+ comment_id:'',//评论订单id
+ fromType: '',
+ inquiry_type: '',
+ patient_family_data: {},
+ rest_rounds: 0,//剩余回合数
+ msgData:{
+ msg_round:0,
+ msg_type:1
+ },
+ message: '',
+ doctorChatData: {
+ is_evaluation: false,
+ inquiry_status: '',
+ follow: false,
+ times_number: 0,
+ duration: 0,
+ reception_time: null,
+ rest_time: 0,
+ doctor_id: '',
+ timeData: {},
+ },
+ doctorDetail: {
+ avatar: '',
+ be_good_at: '',
+ user_name: '',
+ doctor_title_name: '',
+ department_custom_name: '',
+ doctor_inquiry_config: [],
+ hospital: {},
+ doctor_id:'',
+ multi_point_status: '',
+ multi_point_enable:0
+ },
+ current_inquiry_config: {},
+ config: {
+ sdkAppID: '',
+ userID: '',
+ userSig: '',
+ type: 1,
+ tim: null,
+ },
+ unreadCount: 0,
+ hasCallKit: false,
+ viewData: {
+ style: inputStyle,
+ },
+ showHead: false,
+ showDialog: false,
+ overlay: false,
+ blockHeight:"300rpx", //菜单卡片高度
+ KeyboardHeight: 0,
+ showPop: true,
+ showTips: false,
+ showGroupTips: false,
+ showAll: false,
+ displayServiceEvaluation: false,
+ score: 0,
+ startX: 0, //touchStart开始坐标
+ startY: 0,
+ isFlag:true,
+ isEnd:false
+ },
+
+ /**
+ * 组件的方法列表
+ */
+ methods: {
+ handleGetRate(id) {
+ getRate(id).then(data => {
+ if (data) {
+ this.setData({
+ isEvaluation:true,
+ commentDetail: data,
+ score: data.avg_score
+ })
+ }
+
+
+ })
+ },
+ openHelp() {
+ this.setData({
+ showDialog: true
+ })
+ },
+ closeHead() {
+ this.setData({
+ showHead: true
+ })
+ },
+ // 显示遮罩层
+ showModal() {
+ this.setData({
+ hideModal: true,
+ blockHeight:"1130rpx"
+ })
+ },
+ // 隐藏遮罩层
+ hideModal() {
+
+ this.setData({
+ hideModal: false,
+ blockHeight:"300rpx"
+ })
+ },
+ touchstart(e) {
+ this.setData({
+ startX: e.changedTouches[0].clientX,
+ startY: e.changedTouches[0].clientY
+ })
+ },
+ angle(start, end) {
+ var _X = end.X - start.X,
+ _Y = end.Y - start.Y;
+ //返回角度 Math.atan()返回数字的反正切值
+ return 360 * Math.atan(_Y / _X) / (2 * Math.PI);
+ },
+ touchend(e) {
+ let {startX,startY} = this.data;
+ let slidingRange = 45; //
+ let touchMoveX = e.changedTouches[0].clientX;
+ let touchMoveY = e.changedTouches[0].clientY;
+ let angle = this.angle({
+ X: startX,
+ Y: startY
+ }, {
+ X: touchMoveX,
+ Y: touchMoveY
+ });
+ //为了方便计算取绝对值判断
+ if (Math.abs(angle) > slidingRange && touchMoveY < startY) {
+
+ this.showModal()
+ // 向上滑动
+ };
+ if (Math.abs(angle) > slidingRange && touchMoveY > startY ) {
+ this.hideModal()
+ // 向下滑动
+ }
+ },
+ onClose() {
+ this.setData({
+ showPop: false,
+ });
+ },
+ changeTimeStatus(event){
+ if(event.detail){
+ this.setData({
+ isEnd:true
+ })
+ }
+ },
+ goExpertDetail:throttle(function(){
+ let id = this.data.doctorChatData.doctor_id;
+ // wx.redirectTo({
+ // url: "/pages/expertDetail/expertDetail?doctor_id=" + id
+ // })
+ app.method.navigateTo({
+ url: "/pages/expertDetail/expertDetail?doctor_id=" + id
+ })
+ }),
+ loopArr(arr,type){
+ let inquiry_mode='';
+ let inquiry_price='';
+ let recieveStatus='';
+ let order_type=type;
+ for (let i = 0; i < arr.length; i++) {
+ if(arr[i].inquiry_type==type){
+ recieveStatus=arr[i].work_num_day-arr[i].times_number;
+ inquiry_mode=arr[i].inquiry_mode;
+ inquiry_price=arr[i].inquiry_price;
+ }
+ };
+ //如果公益问诊 次数为0 则去看是否有专家问诊
+ if(type==3 && recieveStatus==0){
+ for (let i = 0; i < arr.length; i++) {
+ if(arr[i].inquiry_type==1){
+ order_type=1;
+ recieveStatus=arr[i].work_num_day-arr[i].order_inquiry_count;
+ inquiry_mode=arr[i].inquiry_mode;
+ inquiry_price=arr[i].inquiry_price;
+ duration=arr[i].duration;
+ work_num_day=arr[i].work_num_day;
+ times_number=arr[i].times_number;
+ order_inquiry_count=arr[i].order_inquiry_count;
+ }
+ }
+ }
+ this.setData({
+ current_inquiry_config: {
+ inquiry_type: order_type,
+ inquiry_mode:inquiry_mode,
+ inquiry_price:inquiry_price,
+ recieveStatus:recieveStatus
+ }
+ })
+ },
+ formatInquiryStatus(arr){
+ var a='3';
+ if(arr){
+ for (var i = 0; i < arr.length; ++i) {
+ if(arr[i].is_enable==1 && arr[i].inquiry_type==1){
+ a='2'
+ };
+ if(arr[i].is_enable==1 && arr[i].inquiry_type==3){
+ return '1'
+ };
+ }
+
+ }
+ return a
+ },
+ getDoctorDetail(id) {
+ doctorDetail(id).then(data => {
+ let obj = this.data.doctorDetail;
+ for (const key in obj) {
+ let item = `doctorDetail.${key}`
+ this.setData({
+ [item]: data[key]
+ })
+ };
+ let doctor_inquiry_config = data.doctor_inquiry_config;
+ let inquiryType=this.formatInquiryStatus(doctor_inquiry_config);
+ if(inquiryType==1){
+ this.loopArr(doctor_inquiry_config,3);
+ }else if(inquiryType==2){
+ this.loopArr(doctor_inquiry_config,1);
+ }else{
+ this.setData({
+ current_inquiry_config:null
+ })
+ }
+ // if(data.is_img_expert_reception==1 && data.is_img_welfare_reception==1){
+ // this.loopArr(doctor_inquiry_config,3);
+ // // 1:专家问诊 2:快速问诊 3:公益问诊 4:问诊购药
+ // this.setData({
+ // isHide:true
+ // })
+ // }else if(data.is_img_expert_reception==1 && data.is_img_welfare_reception==0){
+ // this.loopArr(doctor_inquiry_config,1);
+
+ // }else if(data.is_img_welfare_reception== 1 && data.is_img_expert_reception==0){
+ // this.loopArr(doctor_inquiry_config,3);
+ // }else{
+ // this.setData({
+ // current_inquiry_config:null
+ // })
+ // }
+ })
+ },
+ goOrderDetail:throttle(function(){
+ let {
+ order_inquiry_id
+ } = this.data;
+ // wx.redirectTo({
+ // url: '/pages/orderDetail/orderDetail?order_inquiry_id='+order_inquiry_id
+ // })
+ console.log("订单详情");
+ app.method.navigateTo({
+ url: '/pages/orderDetail/orderDetail?order_inquiry_id='+order_inquiry_id
+ })
+ }),
+ getMessageRounds(event) {
+ console.log('detail======')
+ console.log(event)
+ this.setData({
+ msgData: event.detail
+ })
+ console.log(this.data.doctorChatData.times_number)
+ if(this.data.doctorChatData.times_number>=0){
+ let rest_rounds=this.data.doctorChatData.times_number-event.detail.msg_round;
+ console.log("rest_rounds:"+rest_rounds)
+ this.setData({
+ rest_rounds:rest_rounds
+ })
+
+ }
+ },
+ onChangeTime(e) {
+ this.setData({
+ 'doctorChatData.timeData': e.detail,
+ });
+ },
+ toggleFllow() {
+ if (this.data.doctorChatData.follow) {
+ this.handenotfllowDoctor()
+ } else {
+ this.handelfllowDoctor()
+ }
+ },
+ handleChatMsg(id) {
+ chatMsg(id).then(data => {
+ // console.log("接口请求收到时间66666"+dayjs().format("YYYY-MM-DD HH:mm:ss:SSS"));
+ // console.log(data);
+ let obj = this.data.doctorChatData;
+ for (const key in obj) {
+ let item = `doctorChatData.${key}`
+ this.setData({
+ [item]: data[key]
+ })
+ };
+ this.getDoctorDetail(data.doctor_id);
+ let patient_family_data = {
+ patient_name: data.patient_family_name,
+ patient_sex: data.patient_family_sex,
+ patient_age: data.patient_family_age
+ };
+ this.setData({
+ patient_family_data: patient_family_data
+ })
+ let duration=''
+ if( data.duration == 0){
+ duration='不限时长';
+ }else if((data.duration / 60)>0 && (data.duration / 60)<=1){
+ duration=data.duration+"分钟内";
+ }else{
+ duration=(data.duration / 60) + "小时内";
+ };
+ console.log(duration);
+ let number = data.times_number == 0 ? '不限次' : data.times_number + "回合";
+ let message='';
+ if(data.inquiry_type==4 || data.inquiry_type==2){
+ message=`医生接诊后${duration}${number}沟通。超过5分钟未接诊,平台会在1个工作日内全额退还费用,如使用优惠劵,一并退回。`
+ }else if(data.inquiry_type==1 || data.inquiry_type==3){
+ message=`医生接诊后${duration}${number}沟通。医生超过24小时未接诊,平台会在1个工作日内全额退还费用,如使用优惠劵,一并退回`
+ }
+ this.setData({
+ message:message
+ })
+ if (data.inquiry_status == 3) {
+ this.setData({
+ "doctorChatData.rest_time": -1 //待接诊 可以沟通
+ });
+ if (data.times_number == 0) {
+ this.setData({
+ "doctorChatData.times_number": -1
+ })
+ } else {
+ this.setData({
+ message_rounds: data.times_number
+ })
+
+ }
+
+ } else if (data.inquiry_status == 4) {
+ if (data.times_number == 0) {
+ this.setData({
+ "doctorChatData.times_number": -1
+ })
+ } else {
+ this.setData({
+ message_rounds: data.times_number
+ })
+
+ }
+ if (data.duration != 0) {
+ if (data.reception_time) {
+ let endtime = dayjs(data.reception_time).add(data.duration, 'minute').format('YYYY-MM-DD HH:mm:ss');
+ let nowtime = dayjs().format('YYYY-MM-DD HH:mm:ss');
+ let countdown = dayjs(endtime).diff(nowtime, "millisecond");
+ let countdownTime = countdown > 0 ? countdown : 0;
+ console.log("countdownTime--------");
+ console.log(countdownTime);
+ this.setData({
+ "doctorChatData.rest_time": countdownTime
+ })
+ } else {
+ this.setData({
+ "doctorChatData.rest_time": 0
+ })
+ }
+ } else {
+ this.setData({
+ "doctorChatData.rest_time": -2 //接诊不限时间
+ })
+ }
+ }
+ // console.log("times_number:----"+data.times_number,this.data.msgData.msg_round)
+ if(data.times_number>=0){
+ let rest_rounds=data.times_number-this.data.msgData.msg_round;
+ console.log("rest_rounds:----"+rest_rounds)
+ this.setData({
+ rest_rounds:rest_rounds
+ })
+
+ }
+ if(this.data.isFlag){
+ this.scrollBottom();
+ this.setData({
+ isFlag:false
+ })
+ }
+ if(data.inquiry_status == 4 && data.duration!==0){
+ if(this.data.doctorChatData.rest_time==0){
+ //console.log("结束了");
+ this.selectComponent('#MessageInput').handlefinishConsult()
+ }
+
+ }
+ })
+ },
+ handelfllowDoctor() {
+ let id = this.data.doctorChatData.doctor_id;
+ fllowDoctor(id).then(data => {
+ this.setData({
+ "doctorChatData.follow": true
+ })
+ wx.showToast({
+ title: '关注成功',
+ icon: "none"
+ })
+ })
+ },
+ handenotfllowDoctor() {
+ let id = this.data.doctorChatData.doctor_id;
+ notfllowDoctor(id).then(data => {
+ this.setData({
+ "doctorChatData.follow": false
+ })
+ wx.showToast({
+ title: '已取消关注',
+ icon: "none"
+ })
+ })
+ },
+ $handleCloseCards(event) {
+ let commentDetail={
+ avg_score:event.detail.score,
+ is_evaluation:event.detail.score>0?true:false
+ };
+ this.setData({
+ displayServiceEvaluation: false,
+ commentDetail:commentDetail
+ });
+ },
+ handleServiceEvaluation(e) {
+ let commentDetail=e.detail;
+ if( commentDetail && commentDetail.avg_score){
+ commentDetail.is_evaluation=true
+ }else{
+ commentDetail.is_evaluation=false
+ }
+ this.setData({
+ displayServiceEvaluation:true,
+ commentDetail:commentDetail,
+ });
+ },
+ init() {
+ //this.handleGetRate(this.data.order_inquiry_id);
+ wx.$TUIKit.setMessageRead({
+ conversationID: this.data.conversationID
+ }).then((data) => {
+ logger.log('| TUI-chat | setMessageRead | ok');
+ });
+ wx.$TUIKit.getConversationProfile(this.data.conversationID).then((res) => {
+ const {
+ conversation
+ } = res.data;
+ app.globalData.chatNumber = app.globalData.chatNumber - conversation.unreadCount;
+ this.setData({
+ conversationName: this.getConversationName(conversation),
+ conversation,
+ isShow: conversation.type === wx.$TUIKitTIM.TYPES.CONV_GROUP,
+ });
+ if (conversation.type !== wx.$TUIKitTIM.TYPES.CONV_GROUP) return;
+ if (!this.data.showTips) {
+ this.setData({
+ showGroupTips: true,
+ });
+ } else {
+ this.setData({
+ showAll: true,
+ });
+ }
+ }).catch((err) => {
+ console.log(err)
+ });
+
+
+ },
+ getConversationName(conversation) {
+ if (conversation.type === '@TIM#SYSTEM') {
+ this.setData({
+ showChat: false,
+ });
+ return '系统通知';
+ }
+ if (conversation.type === wx.$TUIKitTIM.TYPES.CONV_C2C) {
+ return conversation.remark || conversation.userProfile.nick || conversation.userProfile.userID;
+ }
+ if (conversation.type === wx.$TUIKitTIM.TYPES.CONV_GROUP) {
+ return conversation.groupProfile.name || conversation.groupProfile.groupID;
+ }
+ },
+ sendMessage(event) {
+ // 将自己发送的消息写进消息列表里面
+ this.selectComponent('#MessageList').updateMessageList(event.detail.message);
+ },
+ showMessageErrorImage(event) {
+ this.selectComponent('#MessageList').sendMessageError(event);
+ },
+ triggerClose() {
+ try {
+ this.selectComponent('#MessageInput').handleClose();
+ } catch (error) {
+
+ }
+ },
+ handleCall(event) {
+ if (event.detail.conversationType === wx.$TUIKitTIM.TYPES.CONV_GROUP) {
+ this.selectComponent('#TUIGroup').callShowMoreMember(event);
+ } else {
+ this.triggerEvent('handleCall', event.detail);
+ }
+ },
+ groupCall(event) {
+ const {
+ selectedUserIDList,
+ type,
+ groupID
+ } = event.detail;
+ const userIDList = selectedUserIDList;
+ this.triggerEvent('handleCall', {
+ userIDList,
+ type,
+ groupID
+ });
+ },
+ goBack() {
+ //this.triggerEvent('showConversationList');
+ if (app.globalData.origion == 1) {
+ wx.reLaunch({
+ url: '/pages/index/index',
+ })
+ } else if (app.globalData.origion == 2) {
+ wx.reLaunch({
+ url: '/pages/index/index',
+ })
+ } else {
+ wx.$TUIKit.setMessageRead({
+ conversationID: this.data.conversationID,
+ }).then(() => {
+ if (this.data.fromType) {
+ wx.reLaunch({
+ url: "/pages/index/index"
+ })
+ } else {
+ wx.navigateBack({
+ delta: 1,
+ fail:function(){
+ wx.reLaunch({
+ url: '/pages/index/index',
+ })
+ }
+ })
+ }
+
+ });
+ }
+
+ },
+ showConversationList() {
+ this.triggerEvent('showConversationList');
+ },
+ freshChatStatus(event) {
+ console.log("freshChatStatus");
+ if (event.detail) {
+ this.setData({
+ order_inquiry_id:event.detail
+ })
+ this.handleChatMsg(event.detail);
+
+ }
+ },
+ freshRate(event){
+ console.log('comment_id:'+event.detail);
+ if (event.detail) {
+ this.setData({
+ comment_id:event.detail
+ });
+ //this.handleGetRate(event.detail);
+
+ }
+ },
+ changeMemberCount(event) {
+ this.selectComponent('#TUIGroup').updateMemberCount(event.detail.groupOptionsNumber);
+ },
+ resendMessage(event) {
+ this.selectComponent('#MessageInput').onInputValueChange(event);
+ },
+ //触发滚动到底部
+ scrollBottom(){
+ console.log("触发");
+ wx.nextTick(() => {
+ let compoment=this.selectComponent(".mylist");
+ compoment.handleJumpNewMessage();
+ });
+ },
+ // 监听键盘,获取焦点时将输入框推到键盘上方
+ pullKeysBoards(event) {
+ setNewInputStyle(event.detail.event.detail.height);
+ this.setData({
+ 'viewData.style': newInputStyle,
+ });
+ this.scrollBottom();
+ },
+
+ // 监听键盘,失去焦点时收起键盘
+ downKeysBoards(event) {
+ this.scrollBottom();
+ this.setData({
+ 'viewData.style': inputStyle,
+ });
+ },
+ typing(event) {
+ const {
+ STRING_TEXT,
+ FEAT_NATIVE_CODE
+ } = constant;
+ if (this.data.conversation.type === wx.$TUIKitTIM.TYPES.CONV_C2C) {
+ if (event.detail.typingMessage.typingStatus === FEAT_NATIVE_CODE.ISTYPING_STATUS && event.detail.typingMessage.actionParam === constant.TYPE_INPUT_STATUS_ING) {
+ this.setData({
+ conversationName: STRING_TEXT.TYPETYPING,
+ });
+ setTimeout(() => {
+ this.setData({
+ conversationName: this.getConversationName(this.data.conversation),
+ });
+ }, (1000 * 30));
+ } else if (event.detail.typingMessage.typingStatus === FEAT_NATIVE_CODE.NOTTYPING_STATUS && event.detail.typingMessage.actionParam === constant.TYPE_INPUT_STATUS_END) {
+ this.setData({
+ conversationName: this.getConversationName(this.data.conversation),
+ });
+ }
+ }
+ },
+ handleReport() {
+ const url = '/pages/TUI-User-Center/webview/webview?url=https://cloud.tencent.com/apply/p/xc3oaubi98g';
+ app.method.navigateTo({
+ url,
+ });
+ },
+ },
+
+});
\ No newline at end of file
diff --git a/TUIService/TUIKit/components/TUIChat/index.json b/TUIService/TUIKit/components/TUIChat/index.json
new file mode 100644
index 0000000..f00958b
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/index.json
@@ -0,0 +1,14 @@
+{
+ "component": true,
+ "usingComponents": {
+ "MessageList": "./components/MessageList/index",
+ "MessageInput": "./components/MessageInput/index",
+ "TUIGroup": "../TUIGroup/index",
+ "ServiceEvaluation":"./components/MessagePrivate/ServiceEvaluation/index",
+ "van-count-down": "@vant/weapp/count-down/index",
+ "van-popup": "@vant/weapp/popup/index",
+ "consult-list":"../../../../components/consultList/consultList",
+ "dialog":"../../../../components/dialog/dialog",
+ "nav":"../../../../components/nav/nav"
+ }
+}
\ No newline at end of file
diff --git a/TUIService/TUIKit/components/TUIChat/index.wxml b/TUIService/TUIKit/components/TUIChat/index.wxml
new file mode 100644
index 0000000..40aa121
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/index.wxml
@@ -0,0 +1,135 @@
+
+
+
+
+
+
+ {{doctorDetail.user_name}}医生
+
+
+
+
+
+
+
+ 已关注
+ 关注
+
+
+
+
+ 【安全提示】本 APP 仅用于体验腾讯云即时通信 IM 产品功能,不可用于业务洽谈与拓展。请勿轻信汇款、中奖等涉及钱款等信息,勿轻易拨打陌生电话,谨防上当受骗。
+ 点此投诉
+
+
+
+
+
+
+
+ 等待接诊中
+
+
+ 医生将在空闲时尽快接诊,请耐心等待
+
+
+
+
+ 问诊中
+ |
+
+ 不限时间
+
+ 剩余
+
+ {{(doctorChatData.timeData.days*24)+doctorChatData.timeData.hours }}小时
+ {{ doctorChatData.timeData.minutes }}分
+ {{ doctorChatData.timeData.seconds }}秒
+
+
+ 不限
+ {{rest_rounds>=0?rest_rounds:0}}
+ 个沟通回合
+
+
+
+
+
+
+ 问诊已取消
+
+ 订单详情
+
+
+
+
+ 问诊完成
+
+ 订单详情
+
+
+
+
+ 问诊结束
+
+ 订单详情
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 再次咨询
+
+
+
+
+
+
+
+ {{doctorDetail.user_name}}
+
+ {{doctorDetail.hospital.hospital_level_name}}
+ 可处方
+
+ {{doctorDetail.doctor_title_name}}{{doctorDetail.department_custom_name}}
+ {{doctorDetail.hospital.hospital_name}}
+
+
+
+
+ 擅长:{{doctorDetail.be_good_at}}
+
+
+ 图文问诊: ¥{{current_inquiry_config.inquiry_price}}
+ 再次咨询
+
+
+
+
+
+
+
+
+
+
+
diff --git a/TUIService/TUIKit/components/TUIChat/index.wxss b/TUIService/TUIKit/components/TUIChat/index.wxss
new file mode 100644
index 0000000..842296c
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIChat/index.wxss
@@ -0,0 +1,636 @@
+.container {
+ width: 100vw;
+ height: 100vh;
+ display: flex;
+ flex-direction: column;
+
+}
+
+.safetytips-box {
+ background: rgba(255, 149, 0, 0.1);
+ padding: 9px;
+}
+
+.safetytips {
+ font-family: 'PingFang SC';
+ font-style: normal;
+ font-weight: 400;
+ font-size: 24rpx;
+ line-height: 36rpx;
+ text-align: justify;
+ color: #FF8C39;
+}
+
+.report {
+ float: right;
+ color: #006EFF;
+}
+
+.tui-navigatorbar {
+ position: absolute;
+ top: 0;
+ width: 750rpx;
+ height: 172rpx;
+ background: rgba(237, 237, 237, 0.9);
+ backdrop-filter: blur(20px);
+}
+.tui-navigatorbar-back {
+ position: absolute;
+ width: 30rpx;
+ height: 60rpx;
+ left:0rpx;
+ padding-left:40rpx;
+ padding-right:40rpx;
+ bottom: 15rpx;
+}
+
+
+
+.tui-chatroom-navigatorbar {
+ position: relative;
+ /*top: 0;*/
+ flex-shrink: 0;
+ width: 750rpx;
+ height: 176rpx;
+
+}
+
+.tui-chatroom-navigatorbar-back {
+ position: absolute;
+ width: 60rpx;
+ height: 60rpx;
+ left: 24rpx;
+ bottom: 15rpx;
+}
+
+.conversation-title {
+ position: absolute;
+ width: 350rpx;
+ height: 88rpx;
+ line-height: 88rpx;
+ font-size: 36rpx;
+ color: #000;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow:ellipsis;
+ bottom: 0;
+ left:50%;
+ text-align: center;
+ transform: translateX(-50%);
+
+}
+.list-box{
+ width: 100vw;
+ flex:1;
+ margin-top: 172rpx;
+
+}
+.list-box.nobottom{
+ margin-bottom: 300rpx;
+}
+/* 旧样式 */
+/* .list-box {
+ position: absolute;
+ width: 100vw;
+ height: calc(100vh - 250px);
+ top: 172rpx;
+}
+.list-box.nobottom{
+ background-color: red;
+ height: calc(100vh - 172rpx);
+} */
+.list-box-notips {
+ height: calc(100vh - 284px);
+}
+
+.list-box-group {
+ background:blue;
+ height: calc(100vh - 248px);
+ top: 254rpx;
+}
+
+.list-box-group-notips {
+ background:red;
+ height: calc(100vh - 320px) !important;
+ top: 246rpx;
+}
+ .input-area{
+ height:auto;
+}
+/* 旧样式 */
+/* .input-area {
+ position: absolute;
+ bottom: 0;
+} */
+
+.message-list {
+ position: relative;
+ width: 100%;
+ height:100%;
+}
+.mylist{
+ position: absolute;
+ top:94rpx;
+ width:100%;
+ bottom: 0px;
+ flex:1;
+}
+.message-input {
+ flex-shrink: 0;
+ width: 100%;
+ padding-bottom: var(--padding);
+ /* background-color: #F1F1F1; */
+ background-color: #fff;
+}
+
+.calling {
+ position: fixed;
+ z-index: 199;
+ top: 0;
+ bottom: 0;
+ right: 0;
+}
+
+.group-profile {
+ top: 151rpx;
+ left: 0;
+ z-index: 8;
+ position: absolute;
+}
+
+.statusbox {
+ width: 100%;
+ display: flex;
+ /* position: absolute;
+ top: 172rpx; */
+ align-items: center;
+ z-index: 22;
+ height: 94rpx;
+ background: #FFFFFF;
+ box-shadow: 0px 4px 10px 0px rgba(204, 204, 204, 0.5);
+ justify-content: space-between;
+}
+
+.statusbox .status {
+ width: 100%;
+
+ display: flex;
+ align-items: center;
+
+ color: #333333;
+ font-size: 32rpx;
+}
+.statusbox .bar{
+ margin:0 20rpx;
+}
+
+.listwraper{
+ border-bottom:1rpx solid #E7E7E7;
+ display: flex;
+ justify-content: space-between;
+ padding:30rpx 0rpx 30rpx;
+ display: flex;
+ align-items: center;
+}
+.listwraper:last-child{
+ border-bottom:none;
+}
+.statusbox .orderDetail{
+padding:0 20rpx;
+height: 60rpx;
+white-space: nowrap;
+background: #F8F8F8;
+margin-right: 32rpx;
+border-radius: 6rpx;
+transform: rotateZ(360deg);
+border: 1rpx solid rgba(5,5,5,0.1);
+display: flex;
+justify-content: center;
+align-items: center;
+font-size: 26rpx;
+color: #353535;
+}
+.statusbox .red{
+ font-size: 32rpx;
+ font-weight: bold;
+ color:rgba(239, 79, 32, 1);
+}
+.circle {
+ margin-left: 32rpx;
+ margin-right: 16rpx;
+ width: 10rpx;
+ height: 10rpx;
+ background: #2FCED7;
+ border-radius: 50%;
+}
+.statusbox .desc{
+ display: flex;
+ align-items:baseline;
+}
+.statusbox .item{
+ font-size: 32rpx;
+}
+.statusdesc {
+ height: 94rpx;
+ line-height: 94rpx;
+ margin-right: 32rpx;
+ white-space: nowrap;
+ color: #999999;
+ font-size: 24rpx;
+}
+.headbox {
+ position: fixed;
+ right: 0;
+ z-index: 222;
+ bottom: 410rpx;
+ width: 140rpx;
+ display: flex;
+
+ align-items: center;
+ height: 160rpx;
+ background: #FFFFFF;
+ box-shadow: 0px 4rpx 10rpx 0rpx rgba(204, 204, 204, 0.5);
+ border-radius: 20rpx 0px 0px 20rpx;
+}
+
+.headbox .guanzhu {
+ width: 100rpx;
+ height: 40rpx;
+ position: absolute;
+ bottom: 15rpx;
+ left: 50%;
+ transform: translateX(-50%);
+ background: #3CC7C0;
+ border-radius: 20rpx;
+ color: #fff;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 28rpx;
+}
+
+.headicon {
+ width: 120rpx;
+ height: 120rpx;
+ border-radius: 50%;
+ margin: 0 auto;
+}
+
+.headbox .close {
+ top: -15rpx;
+ left: -15rpx;
+ position: absolute;
+ width: 30rpx;
+ height: 30rpx;
+ border-radius: 50%;
+}
+.help{
+ width: 30rpx;
+ height: 30rpx;
+ margin-left: 16rpx;
+}
+
+
+
+
+.functionbox {
+ position: relative;
+ display: flex;
+ justify-content: flex-end;
+ border: 1rpx solid #E7E7E7;
+}
+
+.contact {
+ position: absolute;
+ right: 30rpx;
+ font-size: 28rpx;
+ display: flex;
+ line-height: 60rpx;
+ justify-content: center;
+ top: -62rpx;
+ width: 128rpx;
+ height: 66rpx;
+ color: #333333;
+
+ background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAABCCAYAAACfHt50AAACV0lEQVR4Xu3XvaoaQRjG8Vl3AxERBYOICAYRUmgK2cUy/Umq3EFuI5eQG8gNpEiRKkXgdKZfvwpTBWGJeECbTSFRIjuGTXGaQHDTTZ7/qU4xg7Pz/Hjfeb3pdHox/MnegJcDCMNQ9gKUP3w2mxkACAsAgHD4+acDAAC0AGUDVADl9GkB4ukDAAC0AHEDAAAAU4CyASqAcvo8AsXTBwAAaAHiBgAAAKYAZQNUAOX0eQSKpw8AANACxA0AAABMAcoGqADK6fMIFE8fAACgBYgbAAAAmAKUDVABlNPnESiePgAAQAsQNwAAADAFKBugAiinzyNQPH0AAIAWIG4AAABgClA2QAVQTp9HoHj6AAAALUDcAAAAwBSgbIAKoJw+j0Dx9AEAAFqAuAEAAIApQNkAFUA5fR6B4ukDAAC0AHED9wCGw+F/fRW+75sgCAp94/l8NtbaQntcW7xarX5PAV9dO3jR8wZB0O33+w8qlcpVW9M0NUmS/LDW3l21weFFnsNnv/rocRzf+L7/odfrVWq12l/37fd7s9ls7qy1L8bj8fLqH3F0oQSAPJvlcjnOsuxTt9t91Gg0/ojrcrmY7XZrdrvdF2PM8yiKvjmaaaFjywDIbyWO4yelUum23W4/brVa9xeV9/okSUyapp993385Go2+F7pFhxdLAchzms/nbWvtbbPZfNrpdEyWZWa9XpvD4fC+XC6/GgwGPx3Os/DR5QDkN7RYLOrW2o/1ev3Z8Xg0p9PpTRiGrz3PuxS+Qcc3SALIM5tMJg+r1eq7/N8oit46nuM/H/8XJ/zgYgJgSv4AAAAASUVORK5CYII=) no-repeat center center;
+ background-size: cover;
+}
+.contactCustom{
+ display: flex;
+ line-height: 60rpx;
+ padding: 0;
+ justify-content: center;
+ width:100%;
+ font-size: 28rpx;
+}
+.infobox {
+ position: relative;
+
+ z-index: 1;
+ /* overflow-y: scroll;
+ -webkit-overflow-scrolling: touch; */
+ margin-top: 40rpx;
+ padding: 22rpx 20rpx 40rpx;
+ background: #FFFFFF;
+ border-radius: 10rpx;
+}
+
+.namebox .head {
+ width: 80rpx;
+ height:80rpx;
+ flex-shrink: 0;
+ border-radius: 50%;
+}
+
+.namebox .guanzhu image {
+ width: 28rpx;
+ height: 26rpx;
+}
+
+.namebox {
+ display: flex;
+
+}
+
+.namewraper {
+ max-width:530rpx;
+ display: flex;
+ justify-content: space-between;
+ flex-direction: column;
+ margin-left: 20rpx;
+}
+
+.namebox .row {
+ display: flex;
+ align-items: flex-end;
+
+}
+
+.namebox {
+ display: flex;
+ padding:0 52rpx;
+ align-items: flex-start;
+ justify-content: space-between;
+}
+
+.namebox .name {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ font-weight: 600;
+ color: #333333;
+ font-size: 34rpx;
+}
+
+.position {
+ font-size: 30rpx;
+ white-space: normal;
+ word-break: break-all;
+}
+.doctor_title{
+ margin-right: 10rpx;
+}
+.hospital {
+ color: #333333;
+ margin-top: 12rpx;
+ font-size: 28rpx;
+ white-space: normal;
+ word-break: break-all;
+}
+.type {
+ height: 32rpx;
+ display: flex;
+ margin-bottom: 6rpx;
+ line-height: 32rpx;
+ white-space: nowrap;
+ align-items: center;
+ margin-left: 18rpx;
+ padding: 0rpx 6rpx;
+ background: #ED9C00;
+ border-radius: 4rpx;
+ color: #FFFFFF;
+ font-size: 24rpx;
+}
+.namebox .position {
+ font-weight: normal;
+ white-space: nowrap;
+ margin-left: 15rpx;
+ font-size: 30rpx;
+}
+
+
+
+.descbox {
+ padding: 0 15rpx;
+ margin-top: 20rpx;
+ display: flex;
+ text-align: center;
+ justify-content: space-between;
+}
+
+.descbox .number {
+ color: #333333;
+ font-size: 40rpx;
+ font-weight: bold;
+}
+.descbox .name {
+ margin-top: 15rpx;
+ color: #999999;
+ font-size: 24rpx;
+}
+.goodjob {
+ color: #666666;
+ margin-top: 38rpx;
+ line-height: 42rpx;
+ margin-left: 100rpx;
+ font-size: 28rpx;
+ text-overflow: ellipsis;
+ display: -webkit-box;
+ -webkit-box-orient: vertical;
+ -webkit-line-clamp: 2;
+ overflow: hidden;
+ word-break: break-all;
+
+}
+.renzhenbox {
+ margin-top: 18rpx;
+ width: 100%;
+ display: flex;
+ justify-content: space-between;
+}
+
+.renzhenbox view {
+ display: flex;
+ align-items: center;
+}
+
+.renzhen image {
+ width: 20rpx;
+ height: 20rpx;
+}
+
+.renzhen text {
+ font-weight: 600;
+ color: #3CC7C0;
+ font-size: 24rpx;
+ margin-left: 10rpx;
+}
+
+.intro image {
+ width: 10rpx;
+ height: 18rpx;
+}
+
+.intro text {
+ color: #333333;
+ margin-right: 10rpx;
+ font-size: 24rpx;
+}
+
+.van-icon-cross{
+ color:#333;
+
+}
+.van-popup__close-icon{
+ position: absolute!important;
+
+}
+.van-popup--bottom
+.rowintro{
+ margin-top: 30rpx;
+ display: flex;
+ color: #333333;
+ font-size: 34rpx;
+ align-items: center;
+}
+.rowintro image{
+ width: 32rpx;
+ height:35rpx;
+}
+.rowintro text{
+ margin-left: 16rpx;
+}
+.borderbox{
+ position: relative;
+ padding-bottom: 30rpx;
+ margin:0 52rpx;
+ border-bottom:1rpx solid #E7E7E7;
+}
+
+.ellipsis{
+ text-overflow: ellipsis;
+ display: -webkit-box;
+ -webkit-box-orient: vertical;
+ -webkit-line-clamp: 2;
+ overflow: hidden
+}
+.goodat{
+ display: flex
+}
+.mypop{
+ box-shadow: 0 0 10px #ccc;
+}
+.consultwraper{
+ overflow-y:scroll ;
+ -webkit-overflow-scrolling: touch;
+}
+.popwrper{
+ top:0rpx;
+ background-color: #fff;
+ position: absolute;
+ transition: height 0.5s;
+ width:100%;
+ overflow: hidden;
+height:100%;
+ bottom:0px;
+}
+.close{
+ z-index:9;
+ width: 32rpx;
+ height:32rpx;
+ position: absolute;
+ right:30rpx;
+ top:30rpx;
+}
+.popname{
+ margin-top: 45rpx;
+ padding:20rpx 52rpx 0;
+ font-size: 34rpx;
+ color:#333;
+ font-weight: 600;
+}
+.consultbox{
+ margin-left: 100rpx;
+ display: flex;
+ margin-top: 20rpx;
+ align-items: center;
+ justify-content: space-between;
+}
+.consultbox{
+ color: #333333;
+ font-size: 28rpx;
+}
+.consultbox .btn{
+ width: 160rpx;
+height: 60rpx;
+background: #3CC7C0;
+color:#fff;
+display: flex;
+justify-content: center;
+align-items: center;
+font-size: 30rpx;
+border-radius: 30rpx;
+}
+.price{
+ color:#EF4F20;
+ font-size: 34rpx;
+ font-weight: bold;
+}
+.viewwrap{
+ border-bottom:1rpx solid #E7E7E7;
+ display: flex;
+ justify-content: space-between;
+ padding:30rpx 0rpx 30rpx;
+ margin:0 52rpx;
+ display: flex;
+}
+.viewwrap .right{
+ margin-left: 20rpx;
+}
+.viewwrap .price{
+ margin-top: 10rpx;
+}
+.viewwrap .name{
+ font-size: 28rpx;
+ font-weight: 600;
+ color: #333333
+}
+.top{
+ position: absolute;
+ top:20rpx;
+ width:100%;
+ display: flex;
+ justify-content: center;
+ padding:20rpx 0;
+}
+.top .up{
+ width:40rpx;
+ height:22rpx;
+ transition: all 0.5s;
+}
+.top .up.active{
+ transform: rotate(180deg);
+}
+.leftimg{
+ display: flex;
+ align-items: center;
+
+}
+ .price .unit{
+ color:#333;
+ font-size: 28rpx;
+ }
+.zxicon{
+ width:80rpx;
+ height:80rpx;
+}
\ No newline at end of file
diff --git a/TUIService/TUIKit/components/TUIConversation/components/ConversationItem/index.js b/TUIService/TUIKit/components/TUIConversation/components/ConversationItem/index.js
new file mode 100644
index 0000000..8bd1f63
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIConversation/components/ConversationItem/index.js
@@ -0,0 +1,338 @@
+import { caculateTimeago } from '../../../../utils/common';
+const app = getApp();
+// eslint-disable-next-line no-undef
+Component({
+ /**
+ * 组件的属性列表
+ */
+ properties: {
+ conversation: {
+ type: Object,
+ value: {},
+ observer(conversation) {
+ this.setData({
+ conversationName: this.getConversationName(conversation),
+ setConversationAvatar: this.setConversationAvatar(conversation),
+ });
+ this.setMuteIcon(conversation);
+ this.showMuteIconImg(conversation);
+ this.$updateTimeAgo(conversation);
+ this.setPinName(conversation.isPinned);
+ },
+ },
+ charge: {
+ type: Boolean,
+ value: {},
+ observer(charge) {
+ if (!charge) {
+ this.setData({
+ xScale: 0,
+ });
+ }
+ },
+ },
+ statusList: {
+ type: Array,
+ value: [],
+ observer(statusList) {
+ this.setUserStatus(this.data.conversation, statusList);
+ },
+ },
+ },
+ /**
+ * 组件的初始数据
+ */
+ data: {
+ xScale: 0,
+ conversationName: '',
+ conversationAvatar: '',
+ conversation: {},
+ showName: '',
+ showMessage: '',
+ showPin: '置顶聊天',
+ showMute: '消息免打扰',
+ popupToggle: false,
+ isTrigger: false,
+ num: 0,
+ setShowName: '',
+ showMuteIcon: false,
+ showStatus: false,
+ },
+ lifetimes: {
+ attached() {
+ },
+
+ },
+ pageLifetimes: {
+ // 展示已经置顶的消息和更新时间戳
+ show() {
+ this.showMuteIconImg(this.data.conversation);
+ this.setPinName(this.data.conversation.isPinned);
+ this.setMuteIcon(this.data.conversation);
+ this.$updateTimeAgo(this.data.conversation);
+ },
+ // 隐藏动画
+ hide() {
+ this.setData({
+ xScale: 0,
+ });
+ },
+ },
+ /**
+ * 组件的方法列表
+ */
+ methods: {
+ // 切换置顶聊天状态
+ setPinName(isPinned) {
+ this.setData({
+ showPin: isPinned ? '取消置顶' : '置顶聊天',
+ });
+ },
+ // 切换免打扰状态
+ setMuteIcon(conversation) {
+ this.setData({
+ showMute: (conversation.messageRemindType === 'AcceptNotNotify') ? '取消免打扰' : '消息免打扰',
+ });
+ },
+ // 先查 remark;无 remark 查 (c2c)nick/(group)name;最后查 (c2c)userID/(group)groupID
+ // 群会话,先展示namecard,无namecard展示nick,最展示UserID
+ getConversationName(conversation) {
+ if (conversation.type === '@TIM#SYSTEM') {
+ return '系统通知';
+ }
+ if (conversation.type === 'C2C') {
+ return conversation.remark || conversation.userProfile.nick || conversation.userProfile.userID;
+ }
+ if (conversation.type === 'GROUP') {
+ if (conversation.lastMessage.nameCard !== '') {
+ this.data.setShowName = conversation.lastMessage.nameCard;
+ } else if (conversation.lastMessage.nick !== '') {
+ this.data.setShowName = conversation.lastMessage.nick;
+ } else {
+ if (conversation.lastMessage.fromAccount === wx.$chat_userID) {
+ this.data.setShowName = '我';
+ } else {
+ this.data.setShowName = conversation.lastMessage.fromAccount;
+ }
+ }
+ this.setData({
+ showName: this.data.setShowName,
+ });
+ return conversation.groupProfile.name || conversation.groupProfile.groupID;
+ }
+ },
+ // 设置会话的头像
+ setConversationAvatar(conversation) {
+ if (conversation.type === '@TIM#SYSTEM') {
+ return 'https://web.sdk.qcloud.com/component/TUIKit/assets/system.png';
+ }
+ if (conversation.type === 'C2C') {
+ return conversation.userProfile.avatar || 'https://sdk-web-1252463788.cos.ap-hongkong.myqcloud.com/component/TUIKit/assets/avatar_21.png';
+ }
+ if (conversation.type === 'GROUP') {
+ return conversation.groupProfile.avatar || '../../../../static/assets/gruopavatar.svg';
+ }
+ },
+ // 删除会话
+ deleteConversation() {
+ wx.showModal({
+ content: '确认删除会话?',
+ success: (res) => {
+ if (res.confirm) {
+ wx.aegis.reportEvent({
+ name: 'conversationOptions',
+ ext1: 'conversation-delete',
+ ext2: wx.$chat_reportType,
+ ext3: wx.$chat_SDKAppID,
+ });
+ wx.$TUIKit.deleteConversation(this.data.conversation.conversationID);
+ this.setData({
+ conversation: {},
+ xScale: 0,
+ });
+ }
+ },
+ });
+ },
+ // 消息置顶
+ pinConversation() {
+ wx.aegis.reportEvent({
+ name: 'conversationOptions',
+ ext1: 'conversation-top',
+ ext2: wx.$chat_reportType,
+ ext3: wx.$chat_SDKAppID,
+ });
+ wx.$TUIKit.pinConversation({ conversationID: this.data.conversation.conversationID, isPinned: true })
+ .then(() => {
+ this.setData({
+ xScale: 0,
+ });
+ })
+ .catch((imError) => {
+ console.warn('pinConversation error:', imError); // 置顶会话失败的相关信息
+ });
+ if (this.data.showPin === '取消置顶') {
+ wx.$TUIKit.pinConversation({ conversationID: this.data.conversation.conversationID, isPinned: false })
+ .then(() => {
+ this.setData({
+ xScale: 0,
+ });
+ })
+ .catch((imError) => {
+ console.warn('pinConversation error:', imError); // 置顶会话失败的相关信息
+ });
+ }
+ },
+ // 是否显示免打扰图标
+ showMuteIconImg(conversation) {
+ if (conversation.messageRemindType === 'AcceptNotNotify') {
+ this.setData({
+ showMuteIcon: true,
+ });
+ } else {
+ this.setData({
+ showMuteIcon: false,
+ });
+ }
+ },
+ // 消息免打扰
+ muteNotifications() {
+ wx.aegis.reportEvent({
+ name: 'conversationOptions',
+ ext1: 'conversation-mutenotifications',
+ ext2: wx.$chat_reportType,
+ ext3: wx.$chat_SDKAppID,
+ });
+ let newShowMute = '';
+ let newShowMuteIcon = false;
+ let messageRemindType = wx.$TUIKitTIM.TYPES.MSG_REMIND_ACPT_NOT_NOTE;
+ if (this.data.showMute === '消息免打扰') {
+ newShowMute = '取消免打扰';
+ newShowMuteIcon = true;
+ messageRemindType = wx.$TUIKitTIM.TYPES.MSG_REMIND_ACPT_NOT_NOTE;
+ }
+ if (this.data.showMute === '取消免打扰') {
+ newShowMute = '消息免打扰';
+ newShowMuteIcon = false;
+ messageRemindType = wx.$TUIKitTIM.TYPES.MSG_REMIND_ACPT_AND_NOTE;
+ }
+
+ if (this.data.conversation.type === 'C2C') {
+ // C2C 消息免打扰,一般的实现是在线接收消息,离线不接收消息(在有离线推送的情况下),v2.16.0起支持
+ const { userID } = this.data.conversation.userProfile;
+ wx.$TUIKit.setMessageRemindType({
+ userIDList: [userID],
+ messageRemindType,
+ })
+ .then((imResponse) => {
+ this.setData({
+ xScale: 0,
+ showMuteIcon: newShowMuteIcon,
+ showMute: newShowMute,
+ });
+ })
+ .catch((imError) => {
+ console.warn('setMessageRemindType error:', imError);
+ });
+ }
+
+ if (this.data.conversation.type === 'GROUP') {
+ const { groupID } = this.data.conversation.groupProfile;
+ // 群消息免打扰,一般的实现是在线接收消息,离线不接收消息(在有离线推送的情况下)
+ wx.$TUIKit.setMessageRemindType({
+ groupID,
+ messageRemindType,
+ })
+ .then((imResponse) => {
+ this.setData({
+ xScale: 0,
+ showMuteIcon: newShowMuteIcon,
+ showMute: newShowMute,
+ });
+ // 设置消息免打扰成功
+ })
+ .catch((imError) => {
+ // 设置消息免打扰失败
+ console.warn('setMessageRemindType error:', imError);
+ });
+ }
+ },
+ // 控制左滑动画
+ handleTouchMove(e) {
+ this.setData({
+ num: e.detail.x,
+ });
+ if (e.detail.x < 0 && !this.data.isTrigger) {
+ this.setData({
+ isTrigger: true,
+ });
+ this.triggerEvent('transCheckID', {
+ checkID: this.data.conversation.conversationID,
+ });
+ }
+ if (e.detail.x === 0) {
+ this.setData({
+ isTrigger: false,
+ });
+ }
+ },
+ handleTouchEnd() {
+ if (this.data.num < -wx.getSystemInfoSync().windowWidth / 5) {
+ this.setData({
+ xScale: -wx.getSystemInfoSync().windowWidth,
+ });
+ }
+ if (this.data.num >= -wx.getSystemInfoSync().windowWidth / 5 && this.data.num < 0) {
+ this.setData({
+ xScale: 0,
+ });
+ }
+ },
+ // 更新会话的时间戳,显示会话里的最后一条消息
+ $updateTimeAgo(conversation) {
+ if (conversation.conversationID && conversation.lastMessage.lastTime) {
+ conversation.lastMessage.timeago = caculateTimeago(conversation.lastMessage.lastTime * 1000);
+ if (conversation.lastMessage.isRevoked) {
+ this.setData({
+ showMessage: '撤回了一条消息',
+ });
+ } else {
+ this.setData({
+ showMessage: conversation.lastMessage.messageForShow,
+ });
+ }
+ this.setData({
+ conversation,
+ });
+ }
+ },
+ // 会话头像显示失败显示的默认头像
+ handleimageerro() {
+ this.setData({
+ setConversationAvatar: '../../../../static/assets/gruopavatar.svg',
+ });
+ },
+ // 判断该用户的状态并展示出来
+ setUserStatus(conversation, statusList) {
+ // if (!wx.getStorageSync('showOnlineStatus')) return;
+ const currentUserID = wx.getStorageSync('currentUserID');
+ if (currentUserID.includes(wx.$chat_userID)) {
+ this.setData({
+ getStatus: wx.getStorageSync(wx.$chat_userID),
+ });
+ } else {
+ this.setData({
+ getStatus: true,
+ });
+ }
+ if (conversation.type !== wx.$TUIKitTIM.TYPES.CONV_C2C) return;
+ statusList.forEach((item) => {
+ if (item.userID !== conversation.userProfile.userID) return;
+ const showStatus = (item.statusType === 1);
+ this.setData({
+ showStatus,
+ });
+ });
+ },
+ },
+});
diff --git a/TUIService/TUIKit/components/TUIConversation/components/ConversationItem/index.json b/TUIService/TUIKit/components/TUIConversation/components/ConversationItem/index.json
new file mode 100644
index 0000000..e8cfaaf
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIConversation/components/ConversationItem/index.json
@@ -0,0 +1,4 @@
+{
+ "component": true,
+ "usingComponents": {}
+}
\ No newline at end of file
diff --git a/TUIService/TUIKit/components/TUIConversation/components/ConversationItem/index.wxml b/TUIService/TUIKit/components/TUIConversation/components/ConversationItem/index.wxml
new file mode 100644
index 0000000..bb293f8
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIConversation/components/ConversationItem/index.wxml
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+ 99+
+ {{conversation.unreadCount}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{showName}}:
+
+
+
+ [{{conversation.unreadCount}}条]
+ {{showMessage}}
+
+
+
+ {{showMessage}}
+
+
+
+
+
+ {{conversation.lastMessage.timeago}}
+
+
+
+
+
+
+ {{showMute}}
+ {{showPin}}
+ 删除
+
+
+
+
diff --git a/TUIService/TUIKit/components/TUIConversation/components/ConversationItem/index.wxss b/TUIService/TUIKit/components/TUIConversation/components/ConversationItem/index.wxss
new file mode 100644
index 0000000..e816713
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIConversation/components/ConversationItem/index.wxss
@@ -0,0 +1,188 @@
+.t-conversation-item-container {
+ width: 100vw;
+ height: 150rpx;
+ background-color: #FFFFFF;
+}
+.t-conversation-item {
+ width: 162vw;
+ height: 150rpx;
+ display: flex;
+ left: 0;
+ align-items: center;
+ justify-content: flex-start;
+ box-sizing: border-box;
+ border-bottom: 2rpx solid #EEF0F3;
+}
+.t-conversation-pinneditem{
+ width: 162vw;
+ height: 150rpx;
+ display: flex;
+ left: 0;
+ align-items: center;
+ justify-content: flex-start;
+ box-sizing: border-box;
+ border-bottom: 1rpx solid #999999;
+ background-color: #EEF0F3
+}
+.text-box{
+ display: flex;
+}
+.avatar-box{
+ position: relative;
+ display: inline-flex;
+}
+.t-conversation-item-avatar{
+ position: relative;
+ width: 96rpx;
+ height: 96rpx;
+ border-radius: 14rpx;
+ /*padding-left: 40rpx;*/
+ /*padding-right: 24rpx;*/
+ /*padding-bottom: 28rpx;*/
+ /*padding-top: 28rpx;*/
+ margin: 0 16rpx;
+ overflow: auto;
+}
+.t-conversation-item-content {
+ flex: 1;
+ padding-left: 20rpx;
+}
+.t-conversation-item-info {
+ line-height: 34rpx;
+ font-size: 24rpx;
+ color: #999999;
+ margin-right: 30rpx;
+}
+
+.t-error {
+ background-color: #fb5250;
+ color: #fff;
+}
+
+.t-conversation-delete {
+ width: 144rpx;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background-color: #E85454;
+ color: #FFFFFF;
+ line-height: 44rpx;
+ font-size: 32rpx;
+}
+.t-conversation-item-mutenotifications{
+ margin-right: 40rpx;
+}
+.t-conversation-mutenotifications-img{
+ height: 34rpx;
+ width: 28rpx;
+ float: right;
+}
+.t-conversation-pinconversation{
+ width: 144rpx;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background-color: #006EFF;
+ color: #FFFFFF;
+ line-height: 44rpx;
+ font-size: 32rpx;
+}
+.t-conversation-mutenotifications{
+ width: 180rpx;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background-color: orange;
+ color: #FFFFFF;
+ line-height: 44rpx;
+ font-size: 32rpx;
+}
+.tui-conversation-item-name {
+ line-height: 50rpx;
+ font-size: 36rpx;
+ font-family: 'PingFangSC-Regular';
+ color: #333333;
+}
+
+.tui-conversation-lastMessage {
+ line-height: 40rpx;
+ font-size: 28rpx;
+ font-family: 'PingFangSC-Regular';
+ color: #999999;
+ max-width: 64vw;
+ display: inline-block;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ overflow: hidden;
+}
+.right-box{
+ display:flex;
+ position: absolute;
+ top: -10rpx;
+ right: 31rpx;
+}
+.unread {
+ position: absolute;
+ top: -5rpx;
+ right: -25rpx;
+ width: 32rpx;
+ height: 32rpx;
+ border-radius: 50%;
+ display: flex;
+ align-items: center;
+ color: #ffffff;
+ background-color: red;
+ justify-content: center;
+}
+.unread-mute{
+ width: 20rpx;
+ height: 20rpx;
+ background: #FA5151;
+ border-radius: 50%;
+ position: absolute;
+ top: 0rpx;
+ right: -20rpx;
+}
+.read-text {
+ line-height: 15px;
+ font-size: 10px;
+}
+.tui-conversation-box{
+ display: flex;
+}
+.tui-conversation-lastName{
+ line-height: 40rpx;
+ font-size: 28rpx;
+ font-family: 'PingFangSC-Regular';
+ color: #999999;
+}
+.t-conversation-box{
+ height: 150rpx;
+ display: flex
+}
+.status {
+ position: relative;
+ top: 84rpx;
+ left: 23rpx;
+ width: 18rpx;
+ height: 18rpx;
+ opacity: 1;
+ border-radius: 8px;
+ background: #29CC85;
+}
+.statusType {
+ position: relative;
+ top: 84rpx;
+ left: 23rpx;
+ width: 18rpx;
+ height: 18rpx;
+ opacity: 1;
+ border-radius: 8px;
+ background: #A4A4A4;
+}
+.status-online {
+ border: 4rpx solid white;
+}
+.status-offline{
+ border: 4rpx solid white;
+}
\ No newline at end of file
diff --git a/TUIService/TUIKit/components/TUIConversation/components/CreateConversation/index.js b/TUIService/TUIKit/components/TUIConversation/components/CreateConversation/index.js
new file mode 100644
index 0000000..e6a61e8
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIConversation/components/CreateConversation/index.js
@@ -0,0 +1,89 @@
+// eslint-disable-next-line no-undef
+// Component Object
+Component({
+ properties: {
+ myProperty: {
+ type: String,
+ value: '',
+ observer() {},
+ },
+
+ },
+ data: {
+ userID: '',
+ searchUser: {},
+ myID: '',
+ },
+ methods: {
+ goBack() {
+ this.triggerEvent('showConversation');
+ },
+ // 获取输入的 UserID
+ userIDInput(e) {
+ this.setData({
+ userID: e.detail.value,
+ searchUser: {},
+ });
+ },
+ // 获取该 UserID 对应的个人资料
+ getuserProfile() {
+ wx.$TUIKit.getUserProfile({
+ userIDList: [this.data.userID],
+ }).then((imRes) => {
+ if (imRes.data.length > 0) {
+ this.setData({
+ searchUser: imRes.data[0],
+ });
+ } else {
+ wx.showToast({
+ title: '用户不存在',
+ icon: 'error',
+ });
+ this.setData({
+ userID: '',
+ });
+ }
+ });
+ },
+ // 选择发起会话
+ handleChoose() {
+ this.data.searchUser.isChoose = !this.data.searchUser.isChoose;
+ this.setData({
+ searchUser: this.data.searchUser,
+ });
+ },
+ // 确认邀请
+ bindConfirmInvite() {
+ if (this.data.searchUser.isChoose) {
+ wx.aegis.reportEvent({
+ name: 'conversationType',
+ ext1: 'conversationType-c2c',
+ ext2: wx.$chat_reportType,
+ ext3: wx.$chat_SDKAppID,
+ });
+ this.triggerEvent('searchUserID', { searchUserID: `C2C${this.data.searchUser.userID}` });
+ } else {
+ wx.showToast({
+ title: '请选择相关用户',
+ icon: 'none',
+ });
+ }
+ },
+ },
+ created() {
+ },
+ attached() {
+ this.setData({
+ myID: wx.$chat_userID,
+ });
+ },
+ ready() {
+
+ },
+ moved() {
+
+ },
+ detached() {
+
+ },
+});
diff --git a/TUIService/TUIKit/components/TUIConversation/components/CreateConversation/index.json b/TUIService/TUIKit/components/TUIConversation/components/CreateConversation/index.json
new file mode 100644
index 0000000..965b8e8
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIConversation/components/CreateConversation/index.json
@@ -0,0 +1,4 @@
+{
+ "usingComponents": {},
+ "navigationStyle": "custom"
+}
\ No newline at end of file
diff --git a/TUIService/TUIKit/components/TUIConversation/components/CreateConversation/index.wxml b/TUIService/TUIKit/components/TUIConversation/components/CreateConversation/index.wxml
new file mode 100644
index 0000000..3808ee7
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIConversation/components/CreateConversation/index.wxml
@@ -0,0 +1,25 @@
+
+
+
+ 发起会话
+
+
+
+
+
+
+
+ 您的用户ID {{myID}}
+
+
+
+
+
+
+ {{searchUser.nick}}
+ 用户ID:{{searchUser.userID}}
+
+
+
+ 确认邀请
+
diff --git a/TUIService/TUIKit/components/TUIConversation/components/CreateConversation/index.wxss b/TUIService/TUIKit/components/TUIConversation/components/CreateConversation/index.wxss
new file mode 100644
index 0000000..1ba12d5
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIConversation/components/CreateConversation/index.wxss
@@ -0,0 +1,138 @@
+.TUI-Create-conversation-container {
+ width: 100vw;
+ height: 100vh;
+ background-color: #F4F5F9;
+}
+
+.tui-navigatorbar{
+ position: absolute;
+ top: 0;
+ width: 750rpx;
+ height: 170rpx;
+ background-color: #006EFF;
+}
+
+.tui-navigatorbar-back{
+ position: absolute;
+ width: 60rpx;
+ height: 60rpx;
+ left: 24rpx;
+ bottom: 15rpx;
+}
+
+.conversation-title {
+ position:absolute;
+ width: 350rpx;
+ height: 88rpx;
+ line-height: 56rpx;
+ font-size: 36rpx;
+ color: #FFFFFF;
+ bottom: 0;
+ left: 200rpx;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.tui-search-area {
+ position: absolute;
+ top: 170rpx;
+ width: 750rpx;
+ background-color: #006EFF;
+}
+.tui-showID {
+ padding-left: 80rpx;
+ line-height: 40rpx;
+ font-size: 28rpx;
+ color: white;
+ height: 50rpx;
+ padding-top: 18rpx;
+}
+.tui-search-bar {
+ display: flex;
+ flex-wrap: nowrap;
+ align-items: center;
+ margin-left: 40rpx;
+ margin-top: 32rpx;
+ width: 670rpx;
+ height: 80rpx;
+ background: #FFFFFF;
+ border-radius: 40rpx;
+ border-radius: 40rpx;
+}
+
+.tui-searchcion {
+ display: inline-block;
+ margin-left: 24rpx;
+ width: 48rpx;
+ height: 48rpx;
+}
+
+.tui-search-bar-input {
+ margin-left: 16rpx;
+ line-height: 40rpx;
+ font-size: 28rpx;
+ width: 100%;
+ display: inline-block;
+}
+
+.tui-person-to-invite {
+ position: absolute;
+ top: 352rpx;
+ display: flex;
+ flex-wrap: nowrap;
+ width: 750rpx;
+ height: 150rpx;
+ background-color: #FFFFFF;
+}
+
+.tui-normal-choose {
+ margin-left: 40rpx;
+ margin-right: 40rpx;
+ margin-top: 52rpx;
+ margin-bottom: 50rpx;
+ width: 48rpx;
+ height: 48rpx;
+}
+
+.tui-person-profile {
+ width: 622rpx;
+ display: flex;
+ align-items: center;
+}
+
+.tui-person-profile-avatar {
+ width: 96rpx;
+ height: 96rpx;
+ margin-right: 24rpx;
+}
+
+.tui-person-profile-nick {
+ color: #333333;
+ line-height: 50rpx;
+ font-size: 36rpx;
+ margin-bottom: 4rpx;
+}
+
+.tui-person-profile-userID {
+ color: #999999;
+ line-height: 40rpx;
+ font-size: 28rpx;
+}
+
+.tui-confirm-btn {
+ position: absolute;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ bottom: 100rpx;
+ width: 670rpx;
+ height: 96rpx;
+ background: #006EFF;
+ color: #FFFFFF;
+ border-radius: 48rpx;
+ border-radius: 48rpx;
+ margin-left: 40rpx;
+ line-height: 44rpx;
+ font-size: 32rpx;
+}
\ No newline at end of file
diff --git a/TUIService/TUIKit/components/TUIConversation/components/CreateGroup/index.js b/TUIService/TUIKit/components/TUIConversation/components/CreateGroup/index.js
new file mode 100644
index 0000000..e39c935
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIConversation/components/CreateGroup/index.js
@@ -0,0 +1,105 @@
+// miniprogram/pages/TUI-Group/create-group/create.js
+import logger from '../../../../utils/logger';
+
+Component({
+ properties: {
+
+ },
+ data: {
+ groupTypeList: [
+ ],
+ groupType: '',
+ Type: '',
+ name: '',
+ groupID: '',
+ },
+ methods: {
+ goBack() {
+ this.triggerEvent('showConversation');
+ },
+ // 展示群列表
+ showGroupTypeList() {
+ this.setData({
+ popupToggle: true,
+ });
+ },
+ // 获取输入的群ID
+ bindGroupIDInput(e) {
+ const id = e.detail.value;
+ this.setData({
+ groupID: id,
+ });
+ },
+ // 获取输入的群名称
+ bindGroupNameInput(e) {
+ const groupname = e.detail.value;
+ this.setData({
+ name: groupname,
+ });
+ },
+ // 创建群聊时,传点击事件对应的值
+ click(e) {
+ this.setData({
+ groupType: e.currentTarget.dataset.value.groupType,
+ Type: e.currentTarget.dataset.value.Type,
+ name: e.currentTarget.dataset.value.name,
+ popupToggle: false,
+ });
+ },
+ // 确认创建群聊
+ bindConfirmCreate() {
+ logger.log(`| TUI-Group | create-group | bindConfirmCreate | groupID: ${this.data.groupID}`);
+ wx.$TUIKit.createGroup({
+ type: this.data.Type,
+ name: this.data.name,
+ groupID: this.data.groupID,
+ }).then((imResponse) => { // 创建成功
+ this.triggerEvent('createGroupID', { createGroupID: `GROUP${imResponse.data.group.groupID}` });
+ // 创建的群的资料
+ wx.aegis.reportEvent({
+ name: 'conversationType',
+ ext1: 'conversationType-group',
+ ext2: wx.$chat_reportType,
+ ext3: wx.$chat_SDKAppID,
+ });
+ })
+ .catch((imError) => {
+ if (imError.code === 10021) {
+ wx.showToast({
+ title: '该群组ID被使用,请更换群ID',
+ icon: 'none',
+ });
+ }
+ });
+ },
+ // 点击空白区域关闭弹窗
+ handleChooseToggle() {
+ this.setData({
+ popupToggle: false,
+ });
+ },
+ },
+ created() {
+
+ },
+ attached() {
+
+ },
+ ready() {
+ const groupTypeList = [
+ { groupType: '品牌客户群(Work)', Type: wx.$TUIKitTIM.TYPES.GRP_WORK },
+ { groupType: 'VIP专属群(Public)', Type: wx.$TUIKitTIM.TYPES.GRP_PUBLIC },
+ { groupType: '临时会议群 (Meeting)', Type: wx.$TUIKitTIM.TYPES.GRP_MEETING },
+ { groupType: '直播群(AVChatRoom)', Type: wx.$TUIKitTIM.TYPES.GRP_CHATROOM },
+ ];
+ this.setData({
+ groupTypeList,
+ });
+ },
+ moved() {
+
+ },
+ detached() {
+
+ },
+});
diff --git a/TUIService/TUIKit/components/TUIConversation/components/CreateGroup/index.json b/TUIService/TUIKit/components/TUIConversation/components/CreateGroup/index.json
new file mode 100644
index 0000000..8835af0
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIConversation/components/CreateGroup/index.json
@@ -0,0 +1,3 @@
+{
+ "usingComponents": {}
+}
\ No newline at end of file
diff --git a/TUIService/TUIKit/components/TUIConversation/components/CreateGroup/index.wxml b/TUIService/TUIKit/components/TUIConversation/components/CreateGroup/index.wxml
new file mode 100644
index 0000000..da7b8bb
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIConversation/components/CreateGroup/index.wxml
@@ -0,0 +1,52 @@
+
+
+
+
+ 发起群聊
+
+
+
+
+
+ *
+ 群类型
+ {{groupType}}
+
+
+
+
+
+
+
+ 群ID
+
+
+
+
+
+
+
+ *
+ 群名称
+
+
+
+
+
+
+
+ 发起群聊
+
+
+
+
+
+
+
+
+ {{item.groupType}}
+
+
+
+
+
diff --git a/TUIService/TUIKit/components/TUIConversation/components/CreateGroup/index.wxss b/TUIService/TUIKit/components/TUIConversation/components/CreateGroup/index.wxss
new file mode 100644
index 0000000..8d6bcb9
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIConversation/components/CreateGroup/index.wxss
@@ -0,0 +1,182 @@
+/* miniprogram/pages/TUI-Group/create-group/create.wxss */
+.container{
+ background: #EEF0F3;
+ width: 100vw;
+ height: 100vh;
+}
+.tui-navigatorbar{
+ position: absolute;
+ top: 0;
+ width: 750rpx;
+ height: 170rpx;
+ background-color: #006EFF;
+}
+
+.tui-navigatorbar-back{
+ position: absolute;
+ width: 60rpx;
+ height: 60rpx;
+ left: 24rpx;
+ bottom: 15rpx;
+}
+
+.conversation-title {
+ position:absolute;
+ width: 350rpx;
+ height: 88rpx;
+ line-height: 56rpx;
+ font-size: 36rpx;
+ color: #FFFFFF;
+ bottom: 0;
+ left: 200rpx;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+.group-area{
+ position: absolute;
+ top: 170rpx;
+ width: 750rpx;
+ background-color: #006EFF;
+}
+.item{
+ display: flex;
+ width: 100%;
+ justify-content: left;
+ align-items: center;
+}
+.icon-box{
+ display: flex;
+}
+.icon{
+ color:red;
+ padding-top: 34rpx;
+}
+.group-type{
+ background: #FFFFFF;
+ position: relative;
+ width: 100%;
+ height: 56px;
+ padding-left: 20px;
+ border-bottom: 1px solid #EEF0F3;
+ border-top: 8px solid #FFFFFF;
+}
+.group-ID{
+ background: #FFFFFF;
+ position: relative;
+ width: 100%;
+ height: 56px;
+ padding-left: 20px;
+ border-bottom: 1px solid #EEF0F3;
+ border-top: 8px solid #FFFFFF;
+}
+.listimage{
+ width: 16px;
+ height: 16px;
+ position: absolute;
+ top: 20px;
+ right: 10px;
+}
+.group-name{
+ background: #FFFFFF;
+ display: flex;
+ width: 100%;
+ height: 56px;
+ padding-left: 20px;
+ border-bottom: 1px solid #EEF0F3;
+ border-top: 8px solid #FFFFFF;
+}
+.aside-left {
+ display: flex;
+ align-items: center;
+ float: left;
+ font-family: PingFangSC-Regular;
+ font-size: 16px;
+ color: #333333;
+ letter-spacing: 0;
+ line-height: 56px;
+}
+.aside-right{
+ font-family: PingFangSC-Regular;
+ font-size: 16px;
+ color: black;
+ letter-spacing: 0;
+ padding-left: 104px;
+ line-height: 56px;
+ z-index: 999;
+}
+.input{
+ float: right;
+ font-family: PingFangSC-Regular;
+ font-size: 16px;
+ color: #999999;
+ letter-spacing: 0;
+ text-align: right;
+ line-height: 56px;
+ padding-top: 19px;
+ padding-right: 48px;
+ width: 70%;
+ /* z-index: 999; */
+}
+.inputname{
+ font-family: PingFangSC-Regular;
+ font-size: 16px;
+ color: #999999;
+ letter-spacing: 0;
+ text-align: right;
+ line-height: 56px;
+ padding-left: 180rpx;
+ padding-top: 19px;
+ width: 50%;
+}
+.group-create{
+ position: absolute;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ bottom: 100rpx;
+ width: 670rpx;
+ height: 96rpx;
+ background: #006EFF;
+ color: #FFFFFF;
+ border-radius: 48rpx;
+ border-radius: 48rpx;
+ line-height: 44rpx;
+ font-size: 32rpx;
+}
+.pop-mask{
+ width: 100vw;
+ height: 100vh;
+ position: fixed;
+ z-index: 10;
+ top: 0;
+ right: 0;
+ background: rgba(0,0,0,0.60);
+ display: flex;
+ align-items: flex-end;
+}
+.create-area{
+ display: flex;
+ align-items: center;
+ justify-content: center
+}
+.popup-main{
+ width: 100vw;
+ height: 30%;
+ background: #FFFFFF;
+ padding: 32px 20px;
+}
+.group-type-list{
+ width: 100vw;
+ height: 112rpx
+}
+.list-type{
+ font-family: PingFangSC-Regular;
+ font-size: 16px;
+ color: #333333;
+ letter-spacing: 0;
+ line-height: 22px;
+}
+.type-active{
+ color: #006EFF;
+}
diff --git a/TUIService/TUIKit/components/TUIConversation/components/JoinGroup/index.js b/TUIService/TUIKit/components/TUIConversation/components/JoinGroup/index.js
new file mode 100644
index 0000000..13d1e33
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIConversation/components/JoinGroup/index.js
@@ -0,0 +1,117 @@
+import logger from '../../../../utils/logger';
+// Component Object
+Component({
+ properties: {
+ myProperty: {
+ type: String,
+ value: '',
+ observer() {},
+ },
+
+ },
+ data: {
+ groupID: '',
+ searchGroup: {},
+ },
+ methods: {
+ // 回退
+ goBack() {
+ this.triggerEvent('showConversation');
+ },
+ // 获取输入的群ID
+ getGroupIDInput(e) {
+ this.setData({
+ groupID: e.detail.value,
+ });
+ },
+ // 通过输入的群ID来查找群
+ searchGroupByID() {
+ wx.$TUIKit.searchGroupByID(this.data.groupID)
+ .then((imResponse) => {
+ if (imResponse.data.group.groupID !== '') {
+ this.setData({
+ searchGroup: imResponse.data.group,
+ });
+ }
+ })
+ .catch((imError) => {
+ wx.hideLoading();
+ if (imError.code === 10007) {
+ wx.showToast({
+ title: '讨论组类型群不允许申请加群',
+ icon: 'none',
+ });
+ } else {
+ wx.showToast({
+ title: '未找到该群组',
+ icon: 'none',
+ });
+ }
+ });
+ },
+ // 选择查找到的群
+ handleChoose() {
+ this.data.searchGroup.isChoose = !this.data.searchGroup.isChoose;
+ this.setData({
+ searchGroup: this.data.searchGroup,
+ });
+ },
+ // 确认加入
+ bindConfirmJoin() {
+ wx.aegis.reportEvent({
+ name: 'conversationType',
+ ext1: 'conversationType-join',
+ ext2: wx.$chat_reportType,
+ ext3: wx.$chat_SDKAppID,
+ });
+ logger.log(`| TUI-Group | join-group | bindConfirmJoin | groupID: ${this.data.groupID}`);
+ wx.$TUIKit.joinGroup({ groupID: this.data.groupID, type: this.data.searchGroup.type })
+ .then((imResponse) => {
+ if (this.data.searchGroup.isChoose) {
+ if (imResponse.data.status === 'WaitAdminApproval') {
+ wx.showToast({
+ title: '等待管理员同意',
+ icon: 'none',
+ });
+ } else {
+ this.triggerEvent('searchGroupID', { searchGroupID: `GROUP${this.data.searchGroup.groupID}` });
+ }
+ } else {
+ wx.showToast({
+ title: '请选择相关群聊',
+ icon: 'error',
+ });
+ }
+ switch (imResponse.data.status) {
+ case wx.$TUIKitTIM.TYPES.JOIN_STATUS_WAIT_APPROVAL:
+ // 等待管理员同意
+ break;
+ case wx.$TUIKitTIM.TYPES.JOIN_STATUS_SUCCESS: // 加群成功
+ break;
+ case wx.$TUIKitTIM.TYPES.JOIN_STATUS_ALREADY_IN_GROUP: // 已经在群中
+ break;
+ default:
+ break;
+ }
+ })
+ .catch((imError) => {
+ console.warn('joinGroup error:', imError); // 申请加群失败的相关信息
+ });
+ },
+ },
+ created() {
+
+ },
+ attached() {
+
+ },
+ ready() {
+
+ },
+ moved() {
+
+ },
+ detached() {
+
+ },
+});
diff --git a/TUIService/TUIKit/components/TUIConversation/components/JoinGroup/index.json b/TUIService/TUIKit/components/TUIConversation/components/JoinGroup/index.json
new file mode 100644
index 0000000..965b8e8
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIConversation/components/JoinGroup/index.json
@@ -0,0 +1,4 @@
+{
+ "usingComponents": {},
+ "navigationStyle": "custom"
+}
\ No newline at end of file
diff --git a/TUIService/TUIKit/components/TUIConversation/components/JoinGroup/index.wxml b/TUIService/TUIKit/components/TUIConversation/components/JoinGroup/index.wxml
new file mode 100644
index 0000000..c893b59
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIConversation/components/JoinGroup/index.wxml
@@ -0,0 +1,25 @@
+
+
+
+
+ 加入群聊
+
+
+
+
+
+
+
+
+
+
+
+
+ {{searchGroup.name}}
+ 群ID:{{searchGroup.groupID}}
+
+
+
+ 确认加入
+
+
diff --git a/TUIService/TUIKit/components/TUIConversation/components/JoinGroup/index.wxss b/TUIService/TUIKit/components/TUIConversation/components/JoinGroup/index.wxss
new file mode 100644
index 0000000..698c60d
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIConversation/components/JoinGroup/index.wxss
@@ -0,0 +1,132 @@
+.TUI-Create-conversation-container {
+ width: 100vw;
+ height: 100vh;
+ background-color: #F4F5F9;
+}
+
+.tui-navigatorbar{
+ position: absolute;
+ top: 0;
+ width: 750rpx;
+ height: 176rpx;
+ background-color: #006EFF;
+}
+
+.tui-navigatorbar-back{
+ position: absolute;
+ width: 60rpx;
+ height: 60rpx;
+ left: 24rpx;
+ bottom: 15rpx;
+}
+
+.conversation-title {
+ position:absolute;
+ width: 350rpx;
+ height: 88rpx;
+ line-height: 56rpx;
+ font-size: 36rpx;
+ color: #FFFFFF;
+ bottom: 0;
+ left: 200rpx;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.tui-search-area {
+ position: absolute;
+ top: 176rpx;
+ width: 750rpx;
+ height: 144rpx;
+ background-color: #006EFF;
+}
+
+.tui-search-bar {
+ display: flex;
+ flex-wrap: nowrap;
+ align-items: center;
+ margin-left: 40rpx;
+ margin-top: 32rpx;
+ width: 670rpx;
+ height: 80rpx;
+ background: #FFFFFF;
+ border-radius: 40rpx;
+ border-radius: 40rpx;
+}
+
+.tui-searchcion {
+ display: inline-block;
+ margin-left: 24rpx;
+ width: 48rpx;
+ height: 48rpx;
+}
+
+.tui-search-bar-input {
+ margin-left: 16rpx;
+ line-height: 40rpx;
+ font-size: 28rpx;
+ width: 100%;
+ display: inline-block;
+}
+
+.tui-person-to-invite {
+ position: absolute;
+ top: 320rpx;
+ display: flex;
+ flex-wrap: nowrap;
+ width: 750rpx;
+ height: 150rpx;
+ background-color: #FFFFFF;
+}
+
+.tui-normal-choose {
+ margin-left: 40rpx;
+ margin-right: 40rpx;
+ margin-top: 52rpx;
+ margin-bottom: 50rpx;
+ width: 48rpx;
+ height: 48rpx;
+}
+
+.tui-person-profile {
+ width: 622rpx;
+ display: flex;
+ align-items: center;
+}
+
+.tui-person-profile-avatar {
+ width: 96rpx;
+ height: 96rpx;
+ margin-right: 24rpx;
+}
+
+.tui-person-profile-nick {
+ color: #333333;
+ line-height: 50rpx;
+ font-size: 36rpx;
+ margin-bottom: 4rpx;
+}
+
+.tui-person-profile-userID {
+ color: #999999;
+ line-height: 40rpx;
+ font-size: 28rpx;
+}
+
+.tui-confirm-btn {
+ position: absolute;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ bottom: 100rpx;
+ width: 670rpx;
+ height: 96rpx;
+ background: #006EFF;
+ color: #FFFFFF;
+ border-radius: 48rpx;
+ border-radius: 48rpx;
+ margin-left: 40rpx;
+ line-height: 44rpx;
+ font-size: 32rpx;
+}
\ No newline at end of file
diff --git a/TUIService/TUIKit/components/TUIConversation/index.js b/TUIService/TUIKit/components/TUIConversation/index.js
new file mode 100644
index 0000000..0f96d84
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIConversation/index.js
@@ -0,0 +1,255 @@
+import constant from "../../utils/constant";
+
+// TUIKitWChat/Conversation/index.js
+const app = getApp();
+
+Component({
+ /**
+ * 组件的属性列表
+ */
+ properties: {
+ config: {
+ type: Object,
+ value: {},
+ observer(config) {
+ },
+ },
+ },
+
+ /**
+ * 组件的初始数据
+ */
+ data: {
+ conversationList: [],
+ currentConversationID: '',
+ showSelectTag: false,
+ array: [
+ { id: 1, name: '发起会话' },
+ { id: 2, name: '发起群聊' },
+ { id: 3, name: '加入群聊' },
+ ],
+ index: Number,
+ unreadCount: 0,
+ conversationInfomation: {},
+ transChenckID: '',
+ userIDList: [],
+ statusList: [],
+ currentUserIDList: [],
+ showConversationList: true,
+ showCreateConversation: false,
+ showCreateGroup: false,
+ showJoinGroup: false,
+ handleChangeStatus: false,
+ storageList: [],
+ },
+ lifetimes: {
+ attached() {
+ },
+ detached() {
+ wx.$TUIKit.off(wx.$TUIKitTIM.EVENT.CONVERSATION_LIST_UPDATED, this.onConversationListUpdated, this);
+ wx.$TUIKit.off(wx.$TUIKitTIM.EVENT.USER_STATUS_UPDATED, this.onUserStatusUpdate, this);
+ },
+ },
+
+ /**
+ * 组件的方法列表
+ */
+ methods: {
+ init() {
+ wx.$TUIKit.on(wx.$TUIKitTIM.EVENT.CONVERSATION_LIST_UPDATED, this.onConversationListUpdated, this);
+ wx.$TUIKit.on(wx.$TUIKitTIM.EVENT.USER_STATUS_UPDATED, this.onUserStatusUpdate, this);
+ this.getConversationList();
+ wx.getStorageInfo({
+ success(res) {
+ wx.setStorage({
+ key: 'storageList',
+ data: res.keys,
+ });
+ },
+ });
+ this.setData({
+ handleChangeStatus: wx.getStorageSync(app?.globalData?.userInfo?.userID) ? wx.getStorageSync(app?.globalData?.userInfo?.userID) : true,
+ }, () => {
+ if (!wx.getStorageSync('storageList').includes('showOnlineStatus')) {
+ this.handleChangeStatus();
+ }
+ });
+ },
+ goBack() {
+ if (app?.globalData?.reportType !== constant.OPERATING_ENVIRONMENT) {
+ wx.navigateBack({
+ delta: 1,
+ });
+ } else {
+ wx.switchTab({
+ url: '/pages/TUI-Index/index',
+ });
+ }
+ },
+ // 更新会话列表
+ onConversationListUpdated(event) {
+ this.setData({
+ conversationList: event.data,
+ });
+ this.filterUserIDList(event.data);
+ },
+ transCheckID(event) {
+ this.setData({
+ transChenckID: event.detail.checkID,
+ });
+ },
+ // 更新状态
+ onUserStatusUpdate(event) {
+ event.data.forEach((element) => {
+ const index = this.data.statusList.findIndex(item => item.userID === element.userID);
+ if (index === -1) {
+ return;
+ }
+ this.data.statusList[index] = element;
+ this.setData({
+ statusList: this.data.statusList,
+ });
+ });
+ },
+ getConversationList() {
+ wx.$TUIKit.getConversationList().then((imResponse) => {
+ this.setData({
+ conversationList: imResponse.data.conversationList,
+ });
+ this.filterUserIDList(imResponse.data.conversationList);
+ });
+ },
+ // 跳转到子组件需要的参数
+ handleRoute(event) {
+ const flagIndex = this.data.conversationList.findIndex(item => item.conversationID === event.currentTarget.id);
+ this.setData({
+ index: flagIndex,
+ });
+ this.getConversationList();
+ this.setData({
+ currentConversationID: event.currentTarget.id,
+ unreadCount: this.data.conversationList[this.data.index].unreadCount,
+ });
+ this.triggerEvent('currentConversationID', { currentConversationID: event.currentTarget.id,
+ unreadCount: this.data.conversationList[this.data.index].unreadCount });
+ },
+ // 展示发起会话/发起群聊/加入群聊
+ showSelectedTag() {
+ wx.aegis.reportEvent({
+ name: 'conversationType',
+ ext1: 'conversationType-all',
+ });
+ this.setData({
+ showSelectTag: !this.data.showSelectTag,
+ });
+ },
+ handleOnTap(event) {
+ this.setData({
+ showSelectTag: false,
+ }, () => {
+ switch (event.currentTarget.dataset.id) {
+ case 1:
+ this.setData({
+ showCreateConversation: true,
+ showConversationList: false,
+ });
+ break;
+ case 2:
+ this.setData({
+ showCreateGroup: true,
+ showConversationList: false,
+ });
+ break;
+ case 3:
+ this.setData({
+ showJoinGroup: true,
+ showConversationList: false,
+ });
+ break;
+ default:
+ break;
+ }
+ });
+ },
+ // 点击空白区域关闭showMore弹窗
+ handleEditToggle() {
+ this.setData({
+ showSelectTag: false,
+ });
+ },
+ showConversation(event) {
+ this.setData({
+ showConversationList: true,
+ showCreateConversation: false,
+ showCreateGroup: false,
+ showJoinGroup: false,
+ });
+ },
+ searchUserID(event) {
+ this.triggerEvent('currentConversationID', { currentConversationID: event.detail.searchUserID });
+ },
+ searchGroupID(event) {
+ this.triggerEvent('currentConversationID', { currentConversationID: event.detail.searchGroupID });
+ },
+ createGroupID(event) {
+ this.triggerEvent('currentConversationID', { currentConversationID: event.detail.createGroupID });
+ },
+ // 处理当前登录账号是否开启在线状态
+ handleChangeStatus() {
+ const currentID = wx.$chat_userID;
+ const cacheList = wx.getStorageSync('currentUserID');
+ const nowList = [];
+ nowList.push(wx.$chat_userID);
+ if (cacheList.length === 0 || !cacheList.includes(wx.$chat_userID)) {
+ wx.setStorage({
+ key: 'currentUserID',
+ data: wx.getStorageSync('currentUserID').concat(nowList),
+ });
+ }
+ wx.setStorage({
+ key: currentID,
+ data: this.data.handleChangeStatus,
+ });
+ },
+ // 订阅在线状态
+ subscribeOnlineStatus(userIDList) {
+ wx.$TUIKit.getUserStatus({ userIDList }).then((imResponse) => {
+ const { successUserList } = imResponse.data;
+ this.setData({
+ statusList: successUserList,
+ });
+ })
+ .catch((imError) => {
+ console.warn('getUserStatus error:', imError); // 获取用户状态失败的相关信息
+ });
+ wx.$TUIKit.subscribeUserStatus({ userIDList });
+ },
+
+ // 过滤会话列表,找出C2C会话,以及需要订阅状态的userIDList
+ filterUserIDList(conversationList) {
+ if (conversationList.length === 0) return;
+ const userIDList = [];
+ conversationList.forEach((element) => {
+ if (element.type === wx.$TUIKitTIM.TYPES.CONV_C2C) {
+ userIDList.push(element.userProfile.userID);
+ }
+ });
+ const currentUserID = wx.getStorageSync('currentUserID');
+ if (currentUserID.includes(wx.$chat_userID)) {
+ const currentStatus = wx.getStorageSync(wx.$chat_userID);
+ if (currentStatus) {
+ this.subscribeOnlineStatus(userIDList);
+ }
+ } else {
+ this.subscribeOnlineStatus(userIDList);
+ }
+ },
+
+ learnMore() {
+ if (app?.globalData?.reportType !== constant.OPERATING_ENVIRONMENT) return;
+ app.method.navigateTo({
+ url: '/pages/TUI-User-Center/webview/webview?url=https://cloud.tencent.com/product/im',
+ });
+ },
+ },
+});
diff --git a/TUIService/TUIKit/components/TUIConversation/index.json b/TUIService/TUIKit/components/TUIConversation/index.json
new file mode 100644
index 0000000..9c1eed3
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIConversation/index.json
@@ -0,0 +1,10 @@
+{
+ "component": true,
+ "usingComponents": {
+ "ConversationItem": "./components/ConversationItem/index",
+ "CreateConversation": "./components/CreateConversation/index",
+ "CreateGroup": "./components/CreateGroup/index",
+ "JoinGroup": "./components/JoinGroup/index"
+ },
+ "navigationStyle": "custom"
+}
\ No newline at end of file
diff --git a/TUIService/TUIKit/components/TUIConversation/index.wxml b/TUIService/TUIKit/components/TUIConversation/index.wxml
new file mode 100644
index 0000000..652c6ea
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIConversation/index.wxml
@@ -0,0 +1,28 @@
+
+
+
+
+
+ 最近联系人
+
+
+
+
+
+
+
+
+
+
+
+ {{item.name}}
+
+
+
+
+ 了解更多IM功能
+
+
+
+
+
\ No newline at end of file
diff --git a/TUIService/TUIKit/components/TUIConversation/index.wxss b/TUIService/TUIKit/components/TUIConversation/index.wxss
new file mode 100644
index 0000000..0d5a2a6
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIConversation/index.wxss
@@ -0,0 +1,124 @@
+.container{
+ width: 100vw;
+ height: 100vh;
+ background-color: #F4F5F9;
+}
+
+.tui-navigatorbar{
+ position: absolute;
+ top: 0;
+ width: 750rpx;
+ height: 176rpx;
+ background: rgba(237,237,237,0.9);
+ backdrop-filter: blur(20px);
+}
+
+.tui-navigatorbar-back{
+ position: absolute;
+ width: 30rpx;
+ height: 60rpx;
+ left: 24rpx;
+
+ bottom: 20rpx;
+}
+
+.conversation-title {
+ position:absolute;
+ width: 350rpx;
+ height: 88rpx;
+ line-height: 56rpx;
+ font-size: 36rpx;
+ color: #000;
+ bottom: 0;
+ left: 200rpx;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.conversation-list-area {
+ position: absolute;
+ width: 100vw;
+ height: calc(100vh - 190px);
+ top: 172rpx;
+}
+
+.scoll-view {
+ width: 100%;
+ height: 100%;
+}
+
+.btn-show-more {
+ display: flex;
+ width: 160rpx;
+ height: 160rpx;
+ padding-left: 3rpx;
+
+}
+
+.picker {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ width: 100%;
+ height: 96rpx;
+}
+.bottom-back{
+ height: 120px;
+ width: 100%;
+ background-color: #F4F5F9;
+ z-index: 3;
+}
+.bottom-area {
+ flex-direction: column;
+ position: absolute;
+ bottom: 80rpx;
+ right: 0;
+ left: 0;
+ margin: auto;
+ width: 100px;
+ display: flex;
+ justify-content: center;
+ align-items: center
+}
+
+.im-link {
+ width: 218rpx;
+ height: 36rpx;
+ font-size: 28rpx;
+ line-height: 36rpx;
+ margin: 0 auto;
+ color: #006EFF;
+}
+.conversation-bubble {
+ padding-top: 40rpx;
+ position: absolute;
+ width: 300rpx;
+ padding-right: 3px;
+ background-color: #FFFFFF;
+ height: 320rpx;
+ bottom: 300rpx;
+ left: 220rpx;
+ z-index: 100;
+ box-shadow: 0 2px 16px 0 rgba(0,0,0,0.08);
+ border-radius: 14rpx;
+}
+.conversation-bubble:before,.conversation-bubble:after{
+ content: "";
+ display: block;
+ border-width: 20px;
+ position: absolute;
+ bottom: -40px;
+ left: 54px;
+ border-style: solid dashed dashed;
+ border-color: #fff transparent transparent;
+ font-size: 0;
+ line-height: 0;
+ margin-left:4px
+}
+
+.conversation-bubble:after{
+ bottom: -33px;
+ border-color: #fff transparent transparent;
+
+}
diff --git a/TUIService/TUIKit/components/TUIGroup/checked.wxs b/TUIService/TUIKit/components/TUIGroup/checked.wxs
new file mode 100644
index 0000000..84cbdcf
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIGroup/checked.wxs
@@ -0,0 +1,9 @@
+var includes = function() {
+ var show = false;
+ if(arguments[0].indexOf(arguments[1]) !== -1) {
+ return show = true;
+ }
+}
+module.exports = {
+ includes: includes
+};
\ No newline at end of file
diff --git a/TUIService/TUIKit/components/TUIGroup/index.js b/TUIService/TUIKit/components/TUIGroup/index.js
new file mode 100644
index 0000000..2b80151
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIGroup/index.js
@@ -0,0 +1,363 @@
+import logger from '../../utils/logger';
+// eslint-disable-next-line no-undef
+Component({
+ /**
+ * 组件的属性列表
+ */
+ properties: {
+ conversation: {
+ type: Object,
+ value: '',
+ observer(newVal) {
+ if (newVal.type === 'GROUP');
+ this.setData({
+ conversation: newVal,
+ });
+ },
+ },
+ count: {
+ type: Number,
+ value: '',
+ observer(newVal) {
+ this.setData({
+ memberCount: newVal,
+ });
+ },
+ },
+ },
+ /**
+ * 组件的初始数据
+ */
+ data: {
+ personalProfile: {
+ },
+ getMemberCount: 30,
+ count: '',
+ userID: '',
+ conversation: {},
+ memberCount: '',
+ groupMemberProfile: [],
+ groupMemberAvatar: [],
+ groupMemberNick: [],
+ hidden: true,
+ notShow: true,
+ isShow: false,
+ showMore: false,
+ addShow: false,
+ popupToggle: false,
+ quitPopupToggle: false,
+ addPopupToggle: false,
+ showText: '退出群聊',
+ showOwner: false,
+ noRepateOwner: [],
+ showOwnerName: {},
+ showGetMore: false,
+ offsetNumber: 0,
+ selectedUserIDList: [],
+ showGroupCall: false,
+ type: 0,
+ Profile: {},
+ callStatus: false,
+ list: [],
+ currentUserID: '',
+ callGroupMemberProfile: [],
+ },
+ lifetimes: {
+ attached() {
+ wx.$TUIKit.getGroupProfile({
+ groupID: this.data.conversation.groupProfile.groupID,
+ }).then((imResponse) => {
+ this.setData({
+ Profile: imResponse,
+ });
+ });
+ this.setData({
+ currentUserID: wx.$chat_userID,
+ memberCount: this.data.conversation.groupProfile.memberCount,
+ });
+ },
+ },
+
+ /**
+ * 组件的方法列表
+ */
+ methods: {
+ // 展示更多群成员
+ showMore() {
+ const { group } = this.data.Profile.data;
+ const currentMemberCount = group.memberCount;
+ this.setData({
+ showGetMore: currentMemberCount > this.data.getMemberCount,
+ showText: group.selfInfo.role === 'Owner' ? '解散群聊' : '',
+ });
+ wx.$TUIKit.getGroupMemberList({
+ groupID: this.data.conversation.groupProfile.groupID,
+ count: this.data.getMemberCount, offset: 0,
+ })
+ .then((imResponse) => {
+ logger.log(`| TUI-group-profile | getGroupMemberList | getGroupMemberList-length: ${imResponse.data.memberList.length}`);
+ if (this.data.conversation.groupProfile.type === 'Private') {
+ this.setData({
+ addShow: true,
+ });
+ }
+ if (imResponse.data.memberList.length > 3) {
+ this.setData({
+ showMore: true,
+ });
+ }
+ this.setData({
+ groupMemberProfile: imResponse.data.memberList,
+ hidden: !this.data.hidden,
+ notShow: !this.data.notShow,
+ isShow: !this.data.isShow,
+ });
+ });
+ },
+ // 拉取更多成员进行展示
+ getMoreMember() {
+ const offset = this.data.offsetNumber + this.data.getMemberCount;
+ this.setData({
+ offsetNumber: offset,
+ });
+ wx.$TUIKit.getGroupMemberList({
+ groupID: this.data.conversation.groupProfile.groupID,
+ count: this.data.getMemberCount, offset,
+ }).then((imResponse) => {
+ this.setData({
+ groupMemberProfile: this.data.groupMemberProfile.concat(imResponse.data.memberList),
+ });
+ if (this.data.groupMemberProfile.length === this.data.memberCount) {
+ this.setData({
+ showGetMore: false,
+ });
+ }
+ });
+ },
+ // 关闭显示showmore
+ showLess() {
+ this.setData({
+ isShow: false,
+ notShow: true,
+ hidden: true,
+ });
+ },
+ // 展示更多群成员弹窗
+ showMoreMember() {
+ this.setData({
+ popupToggle: true,
+ callStatus: false,
+ });
+ },
+ // 通话展示更多群成员
+ callShowMoreMember(event) {
+ if (this.data.groupMemberProfile.length === 0) {
+ wx.$TUIKit.getGroupMemberList({
+ groupID: this.data.conversation.groupProfile.groupID,
+ count: this.data.getMemberCount,
+ offset: 0,
+ })
+ .then((imResponse) => {
+ const index = imResponse.data.memberList.findIndex((member) => member.userID === this.data.currentUserID);
+ imResponse.data.memberList.splice(index, 1);
+ this.setData({
+ callGroupMemberProfile: imResponse.data.memberList,
+ showGetMore: this.data.Profile.data.group.memberCount > this.data.getMemberCount,
+ });
+ });
+ } else {
+ const currentGroupMemberProfile = this.data.groupMemberProfile;
+ const index = currentGroupMemberProfile.findIndex((member)=> member.userID === this.data.currentUserID);
+ currentGroupMemberProfile.splice(index, 1);
+ this.setData({
+ callGroupMemberProfile: currentGroupMemberProfile,
+ });
+ }
+ this.setData({
+ type: event.detail.type,
+ popupToggle: true,
+ callStatus: true,
+ });
+ },
+ // 关闭显示弹窗
+ close() {
+ this.setData({
+ selectedUserIDList: [],
+ showGroupCall: false,
+ popupToggle: false,
+ addPopupToggle: false,
+ quitPopupToggle: false,
+ });
+ },
+ quitGroup() {
+ if (this.data.showText === '退出群聊') {
+ this.setData({
+ quitPopupToggle: true,
+ popupToggle: false,
+ });
+ } else if (this.data.showText === '解散群聊') {
+ this.setData({
+ dismissPopupToggle: true,
+ popupToggle: false,
+ });
+ }
+ },
+ // 解散群聊
+ dismissGroupConfirm() {
+ wx.$TUIKit.dismissGroup(this.data.conversation.groupProfile.groupID)
+ .then(() => {
+ this.triggerEvent('showConversationList');
+ })
+ .catch((imError) => {
+ wx.showToast({
+ title: '群主不能解散好友工作群',
+ icon: 'none',
+ });
+ this.setData({
+ dismissPopupToggle: false,
+ });
+ logger.warn('dismissGroup error:', imError);
+ });
+ },
+ // 解散群聊的按钮提示
+ dismissGroupAbandon() {
+ this.setData({
+ dismissPopupToggle: false,
+ });
+ },
+ // 主动退群
+ quitGroupConfirm() {
+ wx.$TUIKit.quitGroup(this.data.conversation.groupProfile.groupID)
+ .then(() => {
+ this.triggerEvent('showConversationList');
+ })
+ .catch((imError) => {
+ wx.showToast({
+ title: '该群不允许群主主动退出',
+ icon: 'none',
+ });
+ this.setData({
+ quitPopupToggle: false,
+ });
+ logger.warn('quitGroup error:', imError); // 退出群组失败的相关信息
+ });
+ },
+ // 退出群聊的按钮显示
+ quitGroupAbandon() {
+ this.setData({
+ quitPopupToggle: false,
+ });
+ },
+ // 添加群成员按钮显示
+ addMember() {
+ this.setData({
+ addPopupToggle: true,
+ });
+ },
+ // 获取输入的用户ID
+ binduserIDInput(e) {
+ const id = e.detail.value;
+ this.setData({
+ userID: id,
+ });
+ },
+ // work群主动添加群成员
+ submit() {
+ wx.$TUIKit.addGroupMember({
+ groupID: this.data.conversation.groupProfile.groupID,
+ userIDList: [this.data.userID],
+ }).then((imResponse) => {
+ if (imResponse.data.successUserIDList.length > 0) {
+ wx.showToast({ title: '添加成功', duration: 800 });
+ this.userID = '';
+ this.addMemberModalVisible = false;
+ this.setData({
+ addPopupToggle: false,
+ });
+ }
+ if (imResponse.data.existedUserIDList.length > 0) {
+ wx.showToast({ title: '该用户已在群中', duration: 800, icon: 'none' });
+ }
+ })
+ .catch((imError) => {
+ console.warn('addGroupMember error:', imError); // 错误信息
+ wx.showToast({ title: '添加失败,请确保该用户存在', duration: 800, icon: 'none' });
+ });
+ },
+ // 实时更新群成员个数
+ updateMemberCount(event) {
+ if (event === 1) { // 1是有成员加群
+ wx.$TUIKit.getGroupMemberList({
+ groupID: this.data.conversation.groupProfile.groupID,
+ count: this.data.getMemberCount, offset: 0,
+ }).then((imResponse) => {
+ this.setData({
+ groupMemberProfile: imResponse.data.memberList,
+ memberCount: this.data.memberCount + 1,
+ });
+ if (this.data.memberCount > 3) {
+ this.setData({
+ showMore: true,
+ });
+ }
+ });
+ }
+ if (event === 2) { // 2是有成员退群
+ wx.$TUIKit.getGroupMemberList({
+ groupID: this.data.conversation.groupProfile.groupID,
+ count: this.data.getMemberCount, offset: 0,
+ }).then((imResponse) => {
+ this.setData({
+ groupMemberProfile: imResponse.data.memberList,
+ memberCount: this.data.memberCount - 1,
+ });
+ if (this.data.memberCount <= 3) {
+ this.setData({
+ showMore: false,
+ });
+ }
+ });
+ }
+ },
+ // 复制群ID
+ copyGroupID() {
+ wx.setClipboardData({
+ data: this.data.conversation.groupProfile.groupID,
+ success() {
+ wx.getClipboardData({
+ success(res) {
+ logger.log(`| TUI-chat | tui-group | copyGroupID: ${res.data} `);
+ },
+ });
+ },
+ });
+ },
+ // 获取群通话ID
+ handleGroupCallUserIDList(e) {
+ if (!this.data.callStatus) return;
+ const { selectedUserIDList } = this.data ;
+ const { userID } = e.currentTarget.dataset.value;
+ const index = selectedUserIDList.indexOf(userID);
+ if (index > -1) {
+ selectedUserIDList.splice(index, 1);
+ } else {
+ selectedUserIDList.push(userID);
+ }
+ this.setData({
+ selectedUserIDList,
+ showGroupCall: selectedUserIDList.length > 0,
+ });
+ },
+ // 父组件传值
+ handleGroupCall() {
+ const { selectedUserIDList, type } = this.data;
+ const { groupID } = this.data.conversation.groupProfile;
+ this.triggerEvent('groupCall', { selectedUserIDList, type, groupID });
+ this.setData({
+ popupToggle: false,
+ showGroupCall: false,
+ selectedUserIDList: []
+ });
+ },
+ },
+});
diff --git a/TUIService/TUIKit/components/TUIGroup/index.json b/TUIService/TUIKit/components/TUIGroup/index.json
new file mode 100644
index 0000000..e2d4484
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIGroup/index.json
@@ -0,0 +1,4 @@
+{
+ "component":true,
+ "usingComponents": {}
+}
\ No newline at end of file
diff --git a/TUIService/TUIKit/components/TUIGroup/index.wxml b/TUIService/TUIKit/components/TUIGroup/index.wxml
new file mode 100644
index 0000000..11e5e9a
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIGroup/index.wxml
@@ -0,0 +1,115 @@
+
+
+
+ 群ID:{{conversation.groupProfile.groupID}}
+
+ 聊天成员:{{memberCount}}人
+
+
+
+
+
+
+
+
+ (群主)
+ {{item.nick||item.userID}}
+
+
+
+
+ 更多
+
+
+
+
+ 添加成员
+
+
+
+ {{showText}}
+
+
+
+
+
+
+
+
+
+
+
+
+ 退出群聊后会同步删除历史聊天记录,是否要退出群聊?
+
+
+ 退出
+
+
+ 取消
+
+
+
+
+
+
+
+
+
+ 是否解散群聊?
+
+
+ 确认
+
+
+ 取消
+
+
+
+
+
+
+
+
+
+
+
diff --git a/TUIService/TUIKit/components/TUIGroup/index.wxss b/TUIService/TUIKit/components/TUIGroup/index.wxss
new file mode 100644
index 0000000..7c9641b
--- /dev/null
+++ b/TUIService/TUIKit/components/TUIGroup/index.wxss
@@ -0,0 +1,373 @@
+.group-information-box{
+ width: 100vw ;
+ background: #006EFF;
+}
+.group-box{
+ display: inline-flex;
+ width: 100%;
+ box-sizing: border-box;
+ padding: 34rpx 40rpx;
+}
+
+.group-ID{
+ flex: 1;
+ max-width:50% ;
+ color: white;
+ display: inline-block;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ overflow: hidden;
+}
+.group-member{
+ padding-left: 110rpx;
+ color: white;
+}
+.icon-right{
+ float: right;
+ width: 32rpx;
+ height: 32rpx;
+ padding-top: 10rpx;
+ padding-left: 4rpx;
+}
+.showdetail{
+ display:flex;
+ width: 100vw;
+ height: 200rpx;
+ background: #006EFF;
+}
+.box{
+ width: 100rpx;
+ height: 130rpx;
+ padding-left: 35rpx;
+ padding-top: 10rpx;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+}
+.left-box{
+ display: flex;
+ padding-left: 200rpx;
+ padding-top: 10rpx;
+ width: 250rpx;
+}
+.box-group{
+ position: absolute;
+ width: 80rpx;
+ height: 80rpx;
+ right: 160rpx;
+}
+.box-group-quit{
+ position:absolute;
+ right: 80rpx;
+ width: 80rpx;
+ height: 80rpx;
+}
+.addmember{
+ width: 80rpx;
+ height: 80rpx;
+}
+.quitgroup{
+ padding-left: 28rpx;
+ width: 80rpx;
+ height: 80rpx;
+}
+.profile-box{
+ width: 80rpx;
+ height: 80rpx;
+ flex-shrink: 0;
+ z-index: 8;
+}
+.addmember-text{
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ font-family: PingFangSC-Regular;
+ font-size: 10px;
+ color: #FFFFFF;
+ letter-spacing: 0;
+}
+.quitgroup-text{
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ font-family: PingFangSC-Regular;
+ font-size: 10px;
+ color: #FFFFFF;
+ letter-spacing: 0;
+ padding-left: 20rpx;
+ width: 100rpx;
+}
+.nick-box{
+ margin-top: 10px;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ font-family: PingFangSC-Regular;
+ font-size: 10px;
+ color: #FFFFFF;
+ letter-spacing: 0;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ width: 100%;
+}
+
+.popup-mask{
+ width: 100vw;
+ height: 100vh;
+ position: fixed;
+ z-index: 10;
+ top: 0;
+ right: 0;
+ display: flex;
+ align-items: flex-end;
+}
+.pop-main{
+ max-height: 35%;
+ width: 100%;
+ padding-bottom: 120rpx;
+ background: #FFFFFF;
+ overflow: auto
+}
+.group-member-text{
+ display: inline-block;
+ padding-left: 40rpx;
+ opacity: 0.8;
+ font-family: PingFangSC-Medium;
+ font-size: 18px;
+ letter-spacing: 0;
+ line-height: 25px;
+}
+.close{
+ font-family: PingFangSC-Regular;
+ font-size: 18px;
+ color: #2B8BD5;
+ letter-spacing: 0;
+ line-height: 24px;
+}
+.quitpop-mask{
+ width: 100vw;
+ height: 100vh;
+ position: fixed;
+ z-index: 10;
+ top: 0;
+ right: 0;
+ background: rgba(0,0,0,0.60);
+ display: flex;
+ align-items: flex-end;
+}
+.quitpop{
+ position: fixed;
+ bottom: 0;
+ width: 100%;
+ height: 25%;
+ background: #FFFFFF;
+ z-index: 99999;
+}
+.text-box{
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ height: 112rpx;
+}
+.confirmQuitgroup-text{
+ display: inline-block;
+ opacity: 0.4;
+ font-family: PingFangSC-Regular;
+ font-size: 14px;
+ letter-spacing: 0;
+ text-align: center;
+ line-height: 18px;
+}
+.quitgroup-confirm{
+ font-family: PingFangSC-Regular;
+ font-size: 16px;
+ color: #E85454;
+ letter-spacing: 0;
+ text-align: center;
+ line-height: 22px;
+}
+.quitgroup-abandon{
+ opacity: 0.8;
+ font-family: PingFangSC-Regular;
+ font-size: 16px;
+ letter-spacing: 0;
+ text-align: center;
+ line-height: 22px;
+}
+.mask{
+ position: absolute;
+ top: 450rpx;
+ left: 100rpx;
+ width: 70%;
+ height: 20%;
+ background:#999999;
+ z-index: 999;
+}
+.popup {
+background: #ffffff;
+border: 1px solid #eeeeee;
+}
+.popup-main {
+height: 56px;
+padding: 60rpx 0;
+text-align: center;
+font-family: PingFangSC-Regular;
+font-size: 14px;
+color: #999999;
+letter-spacing: 0;
+text-align: center;
+line-height: 18px;
+}
+.input{
+ padding-top: 30rpx;
+}
+.popup-footer {
+display: flex;
+
+}
+.popup-footer button {
+flex: 1;
+}
+.popup-footer .cancel {
+ font-family: PingFangSC-Regular;
+ font-size: 14px;
+ color: #000000;
+ letter-spacing: 0;
+ text-align: center;
+ line-height: 22px;
+ height: 44px;
+ border-radius: 10px ;
+}
+.popup-footer .submit {
+ font-family: PingFangSC-Regular;
+ font-size: 14px;
+ color: #E85454;
+ letter-spacing: 0;
+ text-align: center;
+ line-height: 22px;
+ height: 44px;
+ border-radius: 10px ;
+
+}
+.cancellation{
+ margin-top: 68px;
+ margin-left: 20px;
+ margin-right: 20px;
+ background-color:white;
+ width: 280px;
+ height: 46px;
+ border: 1px solid #E85454 ;
+ border-radius: 24px;
+ border-radius: 24px;
+}
+.confirm-cancellation{
+ margin-left: 110px;
+ margin-top: 13px;
+ font-family: PingFangSC-Regular;
+ font-size: 16px;
+ color: #E85454;
+ letter-spacing: 0;
+}
+.image-list{
+ padding-top: 40rpx;
+ display: flex;
+ flex-wrap: wrap;
+}
+ .image-nick-box{
+ width: 141rpx;
+ height: 140rpx;
+ padding-left: 45rpx;
+ padding-top: 32rpx;
+}
+.image{
+ width: 108rpx;
+ height: 108rpx;
+ border-radius: 4px;
+ border-radius: 4px;
+}
+.groupownername-box {
+ display: flex
+}
+.groupownername {
+ margin-top: 10px;
+ display: inline-block;
+ font-family: PingFangSC-Regular;
+ font-size: 10px;
+ color: white;
+ letter-spacing: 0;
+ white-space: nowrap;
+ width: 80rpx;
+}
+.groupmembername{
+ display: inline-block;
+ font-family: PingFangSC-Regular;
+ font-size: 12px;
+ color: #999999;
+ letter-spacing: 0;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ width: 80rpx;
+}
+.groupowner-box {
+ display: flex;
+}
+.groupownername-bootom {
+ display: inline-block;
+ font-family: PingFangSC-Regular;
+ font-size: 12px;
+ color: #999999;
+ letter-spacing: 0;
+ white-space: nowrap;
+ width: 80rpx;
+}
+.text-box-qiut{
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ height: 112rpx;
+}
+.text-box-cancle{
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ height: 112rpx;
+ border-top: 16rpx solid #eeeeee ;
+}
+.moremember{
+ width: 108rpx;
+ height: 140rpx;
+ padding-left: 32rpx;
+ padding-top: 32rpx;
+}
+.call-box {
+ display: flex;
+ flex-direction: column;
+}
+.call-image {
+ width: 48px;
+ height: 48px;
+}
+
+.image-nick-box-active {
+ box-sizing: border-box;
+ border: 3px solid #24a528;
+ border-radius: 4px;
+}
+.pop-main-header {
+ display: flex;
+ align-items: center;
+ justify-items: center;
+ padding-top: 40rpx;
+ justify-content: space-between;
+
+}
+.show-group-call{
+ display: flex;
+ padding-right: 40rpx;
+}
+.handlecall{
+ padding-right: 40rpx;
+}
\ No newline at end of file
diff --git a/TUIService/TUIKit/debug/GenerateTestUserSig.js b/TUIService/TUIKit/debug/GenerateTestUserSig.js
new file mode 100644
index 0000000..352024a
--- /dev/null
+++ b/TUIService/TUIKit/debug/GenerateTestUserSig.js
@@ -0,0 +1,63 @@
+import LibGenerateTestUserSig from './lib-generate-test-usersig-es.min.js';
+
+/**
+ * 腾讯云 SDKAppId,需要替换为您自己账号下的 SDKAppId。
+ *
+ * 进入腾讯云实时音视频[控制台](https://console.cloud.tencent.com/rav ) 创建应用,即可看到 SDKAppId,
+ * 它是腾讯云用于区分客户的唯一标识。
+ */
+// const SDKAPPID = 0;
+
+
+/**
+ * 签名过期时间,建议不要设置的过短
+ *
+ * 时间单位:秒
+ * 默认时间:7 x 24 x 60 x 60 = 604800 = 7 天
+ */
+// const EXPIRETIME = 604800;
+
+
+/**
+ * 计算签名用的加密密钥,获取步骤如下:
+ *
+ * step1. 进入腾讯云实时音视频[控制台](https://console.cloud.tencent.com/rav ),如果还没有应用就创建一个,
+ * step2. 单击“应用配置”进入基础配置页面,并进一步找到“帐号体系集成”部分。
+ * step3. 点击“查看密钥”按钮,就可以看到计算 UserSig 使用的加密的密钥了,请将其拷贝并复制到如下的变量中
+ *
+ * 注意:该方案仅适用于调试Demo,正式上线前请将 UserSig 计算代码和密钥迁移到您的后台服务器上,以避免加密密钥泄露导致的流量盗用。
+ * 文档:https://cloud.tencent.com/document/product/647/17275#Server
+ */
+// const SECRETKEY = '';
+
+/*
+ * Module: GenerateTestUserSig
+ *
+ * Function: 用于生成测试用的 UserSig,UserSig 是腾讯云为其云服务设计的一种安全保护签名。
+ * 其计算方法是对 SDKAppID、UserID 和 EXPIRETIME 进行加密,加密算法为 HMAC-SHA256。
+ *
+ * Attention: 请不要将如下代码发布到您的线上正式版本的 App 中,原因如下:
+ *
+ * 本文件中的代码虽然能够正确计算出 UserSig,但仅适合快速调通 SDK 的基本功能,不适合线上产品,
+ * 这是因为客户端代码中的 SECRETKEY 很容易被反编译逆向破解,尤其是 Web 端的代码被破解的难度几乎为零。
+ * 一旦您的密钥泄露,攻击者就可以计算出正确的 UserSig 来盗用您的腾讯云流量。
+ *
+ * 正确的做法是将 UserSig 的计算代码和加密密钥放在您的业务服务器上,然后由 App 按需向您的服务器获取实时算出的 UserSig。
+ * 由于破解服务器的成本要高于破解客户端 App,所以服务器计算的方案能够更好地保护您的加密密钥。
+ *
+ * Reference:https://cloud.tencent.com/document/product/647/17275#Server
+ */
+function genTestUserSig(config) {
+ const { SDKAPPID, SECRETKEY, EXPIRETIME,userID } = config;
+ const generator = new LibGenerateTestUserSig(SDKAPPID, SECRETKEY, EXPIRETIME);
+ const userSig = generator.genTestUserSig(userID);
+
+ return {
+ sdkAppID: SDKAPPID,
+ userSig,
+ };
+}
+
+module.exports = {
+ genTestUserSig,
+};
diff --git a/TUIService/TUIKit/debug/lib-generate-test-usersig-es.min.js b/TUIService/TUIKit/debug/lib-generate-test-usersig-es.min.js
new file mode 100644
index 0000000..b01b70b
--- /dev/null
+++ b/TUIService/TUIKit/debug/lib-generate-test-usersig-es.min.js
@@ -0,0 +1,2 @@
+/*eslint-disable*/
+var e="undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{},t=[],r=[],n="undefined"!=typeof Uint8Array?Uint8Array:Array,i=!1;function o(){i=!0;for(var e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",n=0,o=e.length;n>18&63]+t[o>>12&63]+t[o>>6&63]+t[63&o]);return a.join("")}function s(e){var r;i||o();for(var n=e.length,s=n%3,h="",l=[],f=0,c=n-s;fc?c:f+16383));return 1===s?(r=e[n-1],h+=t[r>>2],h+=t[r<<4&63],h+="=="):2===s&&(r=(e[n-2]<<8)+e[n-1],h+=t[r>>10],h+=t[r>>4&63],h+=t[r<<2&63],h+="="),l.push(h),l.join("")}function h(e,t,r,n,i){var o,a,s=8*i-n-1,h=(1<>1,f=-7,c=r?i-1:0,u=r?-1:1,d=e[t+c];for(c+=u,o=d&(1<<-f)-1,d>>=-f,f+=s;f>0;o=256*o+e[t+c],c+=u,f-=8);for(a=o&(1<<-f)-1,o>>=-f,f+=n;f>0;a=256*a+e[t+c],c+=u,f-=8);if(0===o)o=1-l;else{if(o===h)return a?NaN:1/0*(d?-1:1);a+=Math.pow(2,n),o-=l}return(d?-1:1)*a*Math.pow(2,o-n)}function l(e,t,r,n,i,o){var a,s,h,l=8*o-i-1,f=(1<>1,u=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,d=n?0:o-1,p=n?1:-1,_=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(s=isNaN(t)?1:0,a=f):(a=Math.floor(Math.log(t)/Math.LN2),t*(h=Math.pow(2,-a))<1&&(a--,h*=2),(t+=a+c>=1?u/h:u*Math.pow(2,1-c))*h>=2&&(a++,h/=2),a+c>=f?(s=0,a=f):a+c>=1?(s=(t*h-1)*Math.pow(2,i),a+=c):(s=t*Math.pow(2,c-1)*Math.pow(2,i),a=0));i>=8;e[r+d]=255&s,d+=p,s/=256,i-=8);for(a=a<0;e[r+d]=255&a,d+=p,a/=256,l-=8);e[r+d-p]|=128*_}var f={}.toString,c=Array.isArray||function(e){return"[object Array]"==f.call(e)};function u(){return p.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function d(e,t){if(u()=u())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+u().toString(16)+" bytes");return 0|e}function y(e){return!(null==e||!e._isBuffer)}function m(e,t){if(y(e))return e.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;"string"!=typeof e&&(e=""+e);var r=e.length;if(0===r)return 0;for(var n=!1;;)switch(t){case"ascii":case"latin1":case"binary":return r;case"utf8":case"utf-8":case void 0:return q(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*r;case"hex":return r>>>1;case"base64":return V(e).length;default:if(n)return q(e).length;t=(""+t).toLowerCase(),n=!0}}function k(e,t,r){var n=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return"";if((void 0===r||r>this.length)&&(r=this.length),r<=0)return"";if((r>>>=0)<=(t>>>=0))return"";for(e||(e="utf8");;)switch(e){case"hex":return O(this,t,r);case"utf8":case"utf-8":return C(this,t,r);case"ascii":return I(this,t,r);case"latin1":case"binary":return P(this,t,r);case"base64":return M(this,t,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return U(this,t,r);default:if(n)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),n=!0}}function E(e,t,r){var n=e[t];e[t]=e[r],e[r]=n}function S(e,t,r,n,i){if(0===e.length)return-1;if("string"==typeof r?(n=r,r=0):r>2147483647?r=2147483647:r<-2147483648&&(r=-2147483648),r=+r,isNaN(r)&&(r=i?0:e.length-1),r<0&&(r=e.length+r),r>=e.length){if(i)return-1;r=e.length-1}else if(r<0){if(!i)return-1;r=0}if("string"==typeof t&&(t=p.from(t,n)),y(t))return 0===t.length?-1:x(e,t,r,n,i);if("number"==typeof t)return t&=255,p.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?i?Uint8Array.prototype.indexOf.call(e,t,r):Uint8Array.prototype.lastIndexOf.call(e,t,r):x(e,[t],r,n,i);throw new TypeError("val must be string, number or Buffer")}function x(e,t,r,n,i){var o,a=1,s=e.length,h=t.length;if(void 0!==n&&("ucs2"===(n=String(n).toLowerCase())||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(e.length<2||t.length<2)return-1;a=2,s/=2,h/=2,r/=2}function l(e,t){return 1===a?e[t]:e.readUInt16BE(t*a)}if(i){var f=-1;for(o=r;os&&(r=s-h),o=r;o>=0;o--){for(var c=!0,u=0;ui&&(n=i):n=i;var o=t.length;if(o%2!=0)throw new TypeError("Invalid hex string");n>o/2&&(n=o/2);for(var a=0;a>8,i=r%256,o.push(i),o.push(n);return o}(t,e.length-r),e,r,n)}function M(e,t,r){return 0===t&&r===e.length?s(e):s(e.slice(t,r))}function C(e,t,r){r=Math.min(e.length,r);for(var n=[],i=t;i239?4:l>223?3:l>191?2:1;if(i+c<=r)switch(c){case 1:l<128&&(f=l);break;case 2:128==(192&(o=e[i+1]))&&(h=(31&l)<<6|63&o)>127&&(f=h);break;case 3:o=e[i+1],a=e[i+2],128==(192&o)&&128==(192&a)&&(h=(15&l)<<12|(63&o)<<6|63&a)>2047&&(h<55296||h>57343)&&(f=h);break;case 4:o=e[i+1],a=e[i+2],s=e[i+3],128==(192&o)&&128==(192&a)&&128==(192&s)&&(h=(15&l)<<18|(63&o)<<12|(63&a)<<6|63&s)>65535&&h<1114112&&(f=h)}null===f?(f=65533,c=1):f>65535&&(f-=65536,n.push(f>>>10&1023|55296),f=56320|1023&f),n.push(f),i+=c}return function(e){var t=e.length;if(t<=D)return String.fromCharCode.apply(String,e);var r="",n=0;for(;n0&&(e=this.toString("hex",0,50).match(/.{2}/g).join(" "),this.length>50&&(e+=" ... ")),""},p.prototype.compare=function(e,t,r,n,i){if(!y(e))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===r&&(r=e?e.length:0),void 0===n&&(n=0),void 0===i&&(i=this.length),t<0||r>e.length||n<0||i>this.length)throw new RangeError("out of range index");if(n>=i&&t>=r)return 0;if(n>=i)return-1;if(t>=r)return 1;if(this===e)return 0;for(var o=(i>>>=0)-(n>>>=0),a=(r>>>=0)-(t>>>=0),s=Math.min(o,a),h=this.slice(n,i),l=e.slice(t,r),f=0;fi)&&(r=i),e.length>0&&(r<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");for(var o=!1;;)switch(n){case"hex":return R(this,e,t,r);case"utf8":case"utf-8":return A(this,e,t,r);case"ascii":return B(this,e,t,r);case"latin1":case"binary":return z(this,e,t,r);case"base64":return L(this,e,t,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return T(this,e,t,r);default:if(o)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),o=!0}},p.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var D=4096;function I(e,t,r){var n="";r=Math.min(e.length,r);for(var i=t;in)&&(r=n);for(var i="",o=t;or)throw new RangeError("Trying to access beyond buffer length")}function F(e,t,r,n,i,o){if(!y(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>i||te.length)throw new RangeError("Index out of range")}function N(e,t,r,n){t<0&&(t=65535+t+1);for(var i=0,o=Math.min(e.length-r,2);i>>8*(n?i:1-i)}function Z(e,t,r,n){t<0&&(t=4294967295+t+1);for(var i=0,o=Math.min(e.length-r,4);i>>8*(n?i:3-i)&255}function j(e,t,r,n,i,o){if(r+n>e.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("Index out of range")}function W(e,t,r,n,i){return i||j(e,0,r,4),l(e,t,r,n,23,4),r+4}function Y(e,t,r,n,i){return i||j(e,0,r,8),l(e,t,r,n,52,8),r+8}p.prototype.slice=function(e,t){var r,n=this.length;if((e=~~e)<0?(e+=n)<0&&(e=0):e>n&&(e=n),(t=void 0===t?n:~~t)<0?(t+=n)<0&&(t=0):t>n&&(t=n),t0&&(i*=256);)n+=this[e+--t]*i;return n},p.prototype.readUInt8=function(e,t){return t||H(e,1,this.length),this[e]},p.prototype.readUInt16LE=function(e,t){return t||H(e,2,this.length),this[e]|this[e+1]<<8},p.prototype.readUInt16BE=function(e,t){return t||H(e,2,this.length),this[e]<<8|this[e+1]},p.prototype.readUInt32LE=function(e,t){return t||H(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},p.prototype.readUInt32BE=function(e,t){return t||H(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},p.prototype.readIntLE=function(e,t,r){e|=0,t|=0,r||H(e,t,this.length);for(var n=this[e],i=1,o=0;++o=(i*=128)&&(n-=Math.pow(2,8*t)),n},p.prototype.readIntBE=function(e,t,r){e|=0,t|=0,r||H(e,t,this.length);for(var n=t,i=1,o=this[e+--n];n>0&&(i*=256);)o+=this[e+--n]*i;return o>=(i*=128)&&(o-=Math.pow(2,8*t)),o},p.prototype.readInt8=function(e,t){return t||H(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},p.prototype.readInt16LE=function(e,t){t||H(e,2,this.length);var r=this[e]|this[e+1]<<8;return 32768&r?4294901760|r:r},p.prototype.readInt16BE=function(e,t){t||H(e,2,this.length);var r=this[e+1]|this[e]<<8;return 32768&r?4294901760|r:r},p.prototype.readInt32LE=function(e,t){return t||H(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},p.prototype.readInt32BE=function(e,t){return t||H(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},p.prototype.readFloatLE=function(e,t){return t||H(e,4,this.length),h(this,e,!0,23,4)},p.prototype.readFloatBE=function(e,t){return t||H(e,4,this.length),h(this,e,!1,23,4)},p.prototype.readDoubleLE=function(e,t){return t||H(e,8,this.length),h(this,e,!0,52,8)},p.prototype.readDoubleBE=function(e,t){return t||H(e,8,this.length),h(this,e,!1,52,8)},p.prototype.writeUIntLE=function(e,t,r,n){(e=+e,t|=0,r|=0,n)||F(this,e,t,r,Math.pow(2,8*r)-1,0);var i=1,o=0;for(this[t]=255&e;++o=0&&(o*=256);)this[t+i]=e/o&255;return t+r},p.prototype.writeUInt8=function(e,t,r){return e=+e,t|=0,r||F(this,e,t,1,255,0),p.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),this[t]=255&e,t+1},p.prototype.writeUInt16LE=function(e,t,r){return e=+e,t|=0,r||F(this,e,t,2,65535,0),p.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):N(this,e,t,!0),t+2},p.prototype.writeUInt16BE=function(e,t,r){return e=+e,t|=0,r||F(this,e,t,2,65535,0),p.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):N(this,e,t,!1),t+2},p.prototype.writeUInt32LE=function(e,t,r){return e=+e,t|=0,r||F(this,e,t,4,4294967295,0),p.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):Z(this,e,t,!0),t+4},p.prototype.writeUInt32BE=function(e,t,r){return e=+e,t|=0,r||F(this,e,t,4,4294967295,0),p.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):Z(this,e,t,!1),t+4},p.prototype.writeIntLE=function(e,t,r,n){if(e=+e,t|=0,!n){var i=Math.pow(2,8*r-1);F(this,e,t,r,i-1,-i)}var o=0,a=1,s=0;for(this[t]=255&e;++o>0)-s&255;return t+r},p.prototype.writeIntBE=function(e,t,r,n){if(e=+e,t|=0,!n){var i=Math.pow(2,8*r-1);F(this,e,t,r,i-1,-i)}var o=r-1,a=1,s=0;for(this[t+o]=255&e;--o>=0&&(a*=256);)e<0&&0===s&&0!==this[t+o+1]&&(s=1),this[t+o]=(e/a>>0)-s&255;return t+r},p.prototype.writeInt8=function(e,t,r){return e=+e,t|=0,r||F(this,e,t,1,127,-128),p.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),e<0&&(e=255+e+1),this[t]=255&e,t+1},p.prototype.writeInt16LE=function(e,t,r){return e=+e,t|=0,r||F(this,e,t,2,32767,-32768),p.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):N(this,e,t,!0),t+2},p.prototype.writeInt16BE=function(e,t,r){return e=+e,t|=0,r||F(this,e,t,2,32767,-32768),p.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):N(this,e,t,!1),t+2},p.prototype.writeInt32LE=function(e,t,r){return e=+e,t|=0,r||F(this,e,t,4,2147483647,-2147483648),p.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):Z(this,e,t,!0),t+4},p.prototype.writeInt32BE=function(e,t,r){return e=+e,t|=0,r||F(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),p.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):Z(this,e,t,!1),t+4},p.prototype.writeFloatLE=function(e,t,r){return W(this,e,t,!0,r)},p.prototype.writeFloatBE=function(e,t,r){return W(this,e,t,!1,r)},p.prototype.writeDoubleLE=function(e,t,r){return Y(this,e,t,!0,r)},p.prototype.writeDoubleBE=function(e,t,r){return Y(this,e,t,!1,r)},p.prototype.copy=function(e,t,r,n){if(r||(r=0),n||0===n||(n=this.length),t>=e.length&&(t=e.length),t||(t=0),n>0&&n=this.length)throw new RangeError("sourceStart out of bounds");if(n<0)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),e.length-t=0;--i)e[i+t]=this[i+r];else if(o<1e3||!p.TYPED_ARRAY_SUPPORT)for(i=0;i>>=0,r=void 0===r?this.length:r>>>0,e||(e=0),"number"==typeof e)for(o=t;o55295&&r<57344){if(!i){if(r>56319){(t-=3)>-1&&o.push(239,191,189);continue}if(a+1===n){(t-=3)>-1&&o.push(239,191,189);continue}i=r;continue}if(r<56320){(t-=3)>-1&&o.push(239,191,189),i=r;continue}r=65536+(i-55296<<10|r-56320)}else i&&(t-=3)>-1&&o.push(239,191,189);if(i=null,r<128){if((t-=1)<0)break;o.push(r)}else if(r<2048){if((t-=2)<0)break;o.push(r>>6|192,63&r|128)}else if(r<65536){if((t-=3)<0)break;o.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(r<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;o.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return o}function V(e){return function(e){var t,a,s,h,l,f;i||o();var c=e.length;if(c%4>0)throw new Error("Invalid string. Length must be a multiple of 4");l="="===e[c-2]?2:"="===e[c-1]?1:0,f=new n(3*c/4-l),s=l>0?c-4:c;var u=0;for(t=0,a=0;t>16&255,f[u++]=h>>8&255,f[u++]=255&h;return 2===l?(h=r[e.charCodeAt(t)]<<2|r[e.charCodeAt(t+1)]>>4,f[u++]=255&h):1===l&&(h=r[e.charCodeAt(t)]<<10|r[e.charCodeAt(t+1)]<<4|r[e.charCodeAt(t+2)]>>2,f[u++]=h>>8&255,f[u++]=255&h),f}(function(e){if((e=function(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")}(e).replace(K,"")).length<2)return"";for(;e.length%4!=0;)e+="=";return e}(e))}function G(e,t,r,n){for(var i=0;i=t.length||i>=e.length);++i)t[i+r]=e[i];return i}function $(e){return null!=e&&(!!e._isBuffer||J(e)||function(e){return"function"==typeof e.readFloatLE&&"function"==typeof e.slice&&J(e.slice(0,0))}(e))}function J(e){return!!e.constructor&&"function"==typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)}"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;function Q(e,t){return e(t={exports:{}},t.exports),t.exports}var ee=Q(function(e,t){var r;e.exports=(r=r||function(e,t){var r=Object.create||function(){function e(){}return function(t){var r;return e.prototype=t,r=new e,e.prototype=null,r}}(),n={},i=n.lib={},o=i.Base={extend:function(e){var t=r(this);return e&&t.mixIn(e),t.hasOwnProperty("init")&&this.init!==t.init||(t.init=function(){t.$super.init.apply(this,arguments)}),t.init.prototype=t,t.$super=this,t},create:function(){var e=this.extend();return e.init.apply(e,arguments),e},init:function(){},mixIn:function(e){for(var t in e)e.hasOwnProperty(t)&&(this[t]=e[t]);e.hasOwnProperty("toString")&&(this.toString=e.toString)},clone:function(){return this.init.prototype.extend(this)}},a=i.WordArray=o.extend({init:function(e,t){e=this.words=e||[],this.sigBytes=null!=t?t:4*e.length},toString:function(e){return(e||h).stringify(this)},concat:function(e){var t=this.words,r=e.words,n=this.sigBytes,i=e.sigBytes;if(this.clamp(),n%4)for(var o=0;o>>2]>>>24-o%4*8&255;t[n+o>>>2]|=a<<24-(n+o)%4*8}else for(var o=0;o>>2]=r[o>>>2];return this.sigBytes+=i,this},clamp:function(){var t=this.words,r=this.sigBytes;t[r>>>2]&=4294967295<<32-r%4*8,t.length=e.ceil(r/4)},clone:function(){var e=o.clone.call(this);return e.words=this.words.slice(0),e},random:function(t){for(var r,n=[],i=function(t){var t=t,r=987654321,n=4294967295;return function(){var i=((r=36969*(65535&r)+(r>>16)&n)<<16)+(t=18e3*(65535&t)+(t>>16)&n)&n;return i/=4294967296,(i+=.5)*(e.random()>.5?1:-1)}},o=0;o>>2]>>>24-i%4*8&255;n.push((o>>>4).toString(16)),n.push((15&o).toString(16))}return n.join("")},parse:function(e){for(var t=e.length,r=[],n=0;n>>3]|=parseInt(e.substr(n,2),16)<<24-n%8*4;return new a.init(r,t/2)}},l=s.Latin1={stringify:function(e){for(var t=e.words,r=e.sigBytes,n=[],i=0;i>>2]>>>24-i%4*8&255;n.push(String.fromCharCode(o))}return n.join("")},parse:function(e){for(var t=e.length,r=[],n=0;n>>2]|=(255&e.charCodeAt(n))<<24-n%4*8;return new a.init(r,t)}},f=s.Utf8={stringify:function(e){try{return decodeURIComponent(escape(l.stringify(e)))}catch(e){throw new Error("Malformed UTF-8 data")}},parse:function(e){return l.parse(unescape(encodeURIComponent(e)))}},c=i.BufferedBlockAlgorithm=o.extend({reset:function(){this._data=new a.init,this._nDataBytes=0},_append:function(e){"string"==typeof e&&(e=f.parse(e)),this._data.concat(e),this._nDataBytes+=e.sigBytes},_process:function(t){var r=this._data,n=r.words,i=r.sigBytes,o=this.blockSize,s=4*o,h=i/s,l=(h=t?e.ceil(h):e.max((0|h)-this._minBufferSize,0))*o,f=e.min(4*l,i);if(l){for(var c=0;c>>2]|=e[i]<<24-i%4*8;t.call(this,n,r)}else t.apply(this,arguments)}).prototype=e}}(),r.lib.WordArray)}),Q(function(e,t){var r;e.exports=(r=ee,function(){var e=r,t=e.lib.WordArray,n=e.enc;function i(e){return e<<8&4278255360|e>>>8&16711935}n.Utf16=n.Utf16BE={stringify:function(e){for(var t=e.words,r=e.sigBytes,n=[],i=0;i>>2]>>>16-i%4*8&65535;n.push(String.fromCharCode(o))}return n.join("")},parse:function(e){for(var r=e.length,n=[],i=0;i>>1]|=e.charCodeAt(i)<<16-i%2*16;return t.create(n,2*r)}},n.Utf16LE={stringify:function(e){for(var t=e.words,r=e.sigBytes,n=[],o=0;o>>2]>>>16-o%4*8&65535);n.push(String.fromCharCode(a))}return n.join("")},parse:function(e){for(var r=e.length,n=[],o=0;o>>1]|=i(e.charCodeAt(o)<<16-o%2*16);return t.create(n,2*r)}}}(),r.enc.Utf16)}),Q(function(e,t){var r,n,i;e.exports=(i=(n=r=ee).lib.WordArray,n.enc.Base64={stringify:function(e){var t=e.words,r=e.sigBytes,n=this._map;e.clamp();for(var i=[],o=0;o>>2]>>>24-o%4*8&255)<<16|(t[o+1>>>2]>>>24-(o+1)%4*8&255)<<8|t[o+2>>>2]>>>24-(o+2)%4*8&255,s=0;s<4&&o+.75*s>>6*(3-s)&63));var h=n.charAt(64);if(h)for(;i.length%4;)i.push(h);return i.join("")},parse:function(e){var t=e.length,r=this._map,n=this._reverseMap;if(!n){n=this._reverseMap=[];for(var o=0;o>>6-a%4*2;n[o>>>2]|=(s|h)<<24-o%4*8,o++}return i.create(n,o)}(e,t,n)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="},r.enc.Base64)}),Q(function(e,t){var r;e.exports=(r=ee,function(e){var t=r,n=t.lib,i=n.WordArray,o=n.Hasher,a=t.algo,s=[];!function(){for(var t=0;t<64;t++)s[t]=4294967296*e.abs(e.sin(t+1))|0}();var h=a.MD5=o.extend({_doReset:function(){this._hash=new i.init([1732584193,4023233417,2562383102,271733878])},_doProcessBlock:function(e,t){for(var r=0;r<16;r++){var n=t+r,i=e[n];e[n]=16711935&(i<<8|i>>>24)|4278255360&(i<<24|i>>>8)}var o=this._hash.words,a=e[t+0],h=e[t+1],d=e[t+2],p=e[t+3],_=e[t+4],g=e[t+5],v=e[t+6],w=e[t+7],b=e[t+8],y=e[t+9],m=e[t+10],k=e[t+11],E=e[t+12],S=e[t+13],x=e[t+14],R=e[t+15],A=o[0],B=o[1],z=o[2],L=o[3];A=l(A,B,z,L,a,7,s[0]),L=l(L,A,B,z,h,12,s[1]),z=l(z,L,A,B,d,17,s[2]),B=l(B,z,L,A,p,22,s[3]),A=l(A,B,z,L,_,7,s[4]),L=l(L,A,B,z,g,12,s[5]),z=l(z,L,A,B,v,17,s[6]),B=l(B,z,L,A,w,22,s[7]),A=l(A,B,z,L,b,7,s[8]),L=l(L,A,B,z,y,12,s[9]),z=l(z,L,A,B,m,17,s[10]),B=l(B,z,L,A,k,22,s[11]),A=l(A,B,z,L,E,7,s[12]),L=l(L,A,B,z,S,12,s[13]),z=l(z,L,A,B,x,17,s[14]),A=f(A,B=l(B,z,L,A,R,22,s[15]),z,L,h,5,s[16]),L=f(L,A,B,z,v,9,s[17]),z=f(z,L,A,B,k,14,s[18]),B=f(B,z,L,A,a,20,s[19]),A=f(A,B,z,L,g,5,s[20]),L=f(L,A,B,z,m,9,s[21]),z=f(z,L,A,B,R,14,s[22]),B=f(B,z,L,A,_,20,s[23]),A=f(A,B,z,L,y,5,s[24]),L=f(L,A,B,z,x,9,s[25]),z=f(z,L,A,B,p,14,s[26]),B=f(B,z,L,A,b,20,s[27]),A=f(A,B,z,L,S,5,s[28]),L=f(L,A,B,z,d,9,s[29]),z=f(z,L,A,B,w,14,s[30]),A=c(A,B=f(B,z,L,A,E,20,s[31]),z,L,g,4,s[32]),L=c(L,A,B,z,b,11,s[33]),z=c(z,L,A,B,k,16,s[34]),B=c(B,z,L,A,x,23,s[35]),A=c(A,B,z,L,h,4,s[36]),L=c(L,A,B,z,_,11,s[37]),z=c(z,L,A,B,w,16,s[38]),B=c(B,z,L,A,m,23,s[39]),A=c(A,B,z,L,S,4,s[40]),L=c(L,A,B,z,a,11,s[41]),z=c(z,L,A,B,p,16,s[42]),B=c(B,z,L,A,v,23,s[43]),A=c(A,B,z,L,y,4,s[44]),L=c(L,A,B,z,E,11,s[45]),z=c(z,L,A,B,R,16,s[46]),A=u(A,B=c(B,z,L,A,d,23,s[47]),z,L,a,6,s[48]),L=u(L,A,B,z,w,10,s[49]),z=u(z,L,A,B,x,15,s[50]),B=u(B,z,L,A,g,21,s[51]),A=u(A,B,z,L,E,6,s[52]),L=u(L,A,B,z,p,10,s[53]),z=u(z,L,A,B,m,15,s[54]),B=u(B,z,L,A,h,21,s[55]),A=u(A,B,z,L,b,6,s[56]),L=u(L,A,B,z,R,10,s[57]),z=u(z,L,A,B,v,15,s[58]),B=u(B,z,L,A,S,21,s[59]),A=u(A,B,z,L,_,6,s[60]),L=u(L,A,B,z,k,10,s[61]),z=u(z,L,A,B,d,15,s[62]),B=u(B,z,L,A,y,21,s[63]),o[0]=o[0]+A|0,o[1]=o[1]+B|0,o[2]=o[2]+z|0,o[3]=o[3]+L|0},_doFinalize:function(){var t=this._data,r=t.words,n=8*this._nDataBytes,i=8*t.sigBytes;r[i>>>5]|=128<<24-i%32;var o=e.floor(n/4294967296),a=n;r[15+(i+64>>>9<<4)]=16711935&(o<<8|o>>>24)|4278255360&(o<<24|o>>>8),r[14+(i+64>>>9<<4)]=16711935&(a<<8|a>>>24)|4278255360&(a<<24|a>>>8),t.sigBytes=4*(r.length+1),this._process();for(var s=this._hash,h=s.words,l=0;l<4;l++){var f=h[l];h[l]=16711935&(f<<8|f>>>24)|4278255360&(f<<24|f>>>8)}return s},clone:function(){var e=o.clone.call(this);return e._hash=this._hash.clone(),e}});function l(e,t,r,n,i,o,a){var s=e+(t&r|~t&n)+i+a;return(s<>>32-o)+t}function f(e,t,r,n,i,o,a){var s=e+(t&n|r&~n)+i+a;return(s<>>32-o)+t}function c(e,t,r,n,i,o,a){var s=e+(t^r^n)+i+a;return(s<>>32-o)+t}function u(e,t,r,n,i,o,a){var s=e+(r^(t|~n))+i+a;return(s<>>32-o)+t}t.MD5=o._createHelper(h),t.HmacMD5=o._createHmacHelper(h)}(Math),r.MD5)}),Q(function(e,t){var r,n,i,o,a,s,h,l;e.exports=(i=(n=r=ee).lib,o=i.WordArray,a=i.Hasher,s=n.algo,h=[],l=s.SHA1=a.extend({_doReset:function(){this._hash=new o.init([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(e,t){for(var r=this._hash.words,n=r[0],i=r[1],o=r[2],a=r[3],s=r[4],l=0;l<80;l++){if(l<16)h[l]=0|e[t+l];else{var f=h[l-3]^h[l-8]^h[l-14]^h[l-16];h[l]=f<<1|f>>>31}var c=(n<<5|n>>>27)+s+h[l];c+=l<20?1518500249+(i&o|~i&a):l<40?1859775393+(i^o^a):l<60?(i&o|i&a|o&a)-1894007588:(i^o^a)-899497514,s=a,a=o,o=i<<30|i>>>2,i=n,n=c}r[0]=r[0]+n|0,r[1]=r[1]+i|0,r[2]=r[2]+o|0,r[3]=r[3]+a|0,r[4]=r[4]+s|0},_doFinalize:function(){var e=this._data,t=e.words,r=8*this._nDataBytes,n=8*e.sigBytes;return t[n>>>5]|=128<<24-n%32,t[14+(n+64>>>9<<4)]=Math.floor(r/4294967296),t[15+(n+64>>>9<<4)]=r,e.sigBytes=4*t.length,this._process(),this._hash},clone:function(){var e=a.clone.call(this);return e._hash=this._hash.clone(),e}}),n.SHA1=a._createHelper(l),n.HmacSHA1=a._createHmacHelper(l),r.SHA1)}),Q(function(e,t){var r;e.exports=(r=ee,function(e){var t=r,n=t.lib,i=n.WordArray,o=n.Hasher,a=t.algo,s=[],h=[];!function(){function t(t){for(var r=e.sqrt(t),n=2;n<=r;n++)if(!(t%n))return!1;return!0}function r(e){return 4294967296*(e-(0|e))|0}for(var n=2,i=0;i<64;)t(n)&&(i<8&&(s[i]=r(e.pow(n,.5))),h[i]=r(e.pow(n,1/3)),i++),n++}();var l=[],f=a.SHA256=o.extend({_doReset:function(){this._hash=new i.init(s.slice(0))},_doProcessBlock:function(e,t){for(var r=this._hash.words,n=r[0],i=r[1],o=r[2],a=r[3],s=r[4],f=r[5],c=r[6],u=r[7],d=0;d<64;d++){if(d<16)l[d]=0|e[t+d];else{var p=l[d-15],_=(p<<25|p>>>7)^(p<<14|p>>>18)^p>>>3,g=l[d-2],v=(g<<15|g>>>17)^(g<<13|g>>>19)^g>>>10;l[d]=_+l[d-7]+v+l[d-16]}var w=n&i^n&o^i&o,b=(n<<30|n>>>2)^(n<<19|n>>>13)^(n<<10|n>>>22),y=u+((s<<26|s>>>6)^(s<<21|s>>>11)^(s<<7|s>>>25))+(s&f^~s&c)+h[d]+l[d];u=c,c=f,f=s,s=a+y|0,a=o,o=i,i=n,n=y+(b+w)|0}r[0]=r[0]+n|0,r[1]=r[1]+i|0,r[2]=r[2]+o|0,r[3]=r[3]+a|0,r[4]=r[4]+s|0,r[5]=r[5]+f|0,r[6]=r[6]+c|0,r[7]=r[7]+u|0},_doFinalize:function(){var t=this._data,r=t.words,n=8*this._nDataBytes,i=8*t.sigBytes;return r[i>>>5]|=128<<24-i%32,r[14+(i+64>>>9<<4)]=e.floor(n/4294967296),r[15+(i+64>>>9<<4)]=n,t.sigBytes=4*r.length,this._process(),this._hash},clone:function(){var e=o.clone.call(this);return e._hash=this._hash.clone(),e}});t.SHA256=o._createHelper(f),t.HmacSHA256=o._createHmacHelper(f)}(Math),r.SHA256)}),Q(function(e,t){var r,n,i,o,a,s;e.exports=(i=(n=r=ee).lib.WordArray,o=n.algo,a=o.SHA256,s=o.SHA224=a.extend({_doReset:function(){this._hash=new i.init([3238371032,914150663,812702999,4144912697,4290775857,1750603025,1694076839,3204075428])},_doFinalize:function(){var e=a._doFinalize.call(this);return e.sigBytes-=4,e}}),n.SHA224=a._createHelper(s),n.HmacSHA224=a._createHmacHelper(s),r.SHA224)}),Q(function(e,t){var r;e.exports=(r=ee,function(){var e=r,t=e.lib.Hasher,n=e.x64,i=n.Word,o=n.WordArray,a=e.algo;function s(){return i.create.apply(i,arguments)}var h=[s(1116352408,3609767458),s(1899447441,602891725),s(3049323471,3964484399),s(3921009573,2173295548),s(961987163,4081628472),s(1508970993,3053834265),s(2453635748,2937671579),s(2870763221,3664609560),s(3624381080,2734883394),s(310598401,1164996542),s(607225278,1323610764),s(1426881987,3590304994),s(1925078388,4068182383),s(2162078206,991336113),s(2614888103,633803317),s(3248222580,3479774868),s(3835390401,2666613458),s(4022224774,944711139),s(264347078,2341262773),s(604807628,2007800933),s(770255983,1495990901),s(1249150122,1856431235),s(1555081692,3175218132),s(1996064986,2198950837),s(2554220882,3999719339),s(2821834349,766784016),s(2952996808,2566594879),s(3210313671,3203337956),s(3336571891,1034457026),s(3584528711,2466948901),s(113926993,3758326383),s(338241895,168717936),s(666307205,1188179964),s(773529912,1546045734),s(1294757372,1522805485),s(1396182291,2643833823),s(1695183700,2343527390),s(1986661051,1014477480),s(2177026350,1206759142),s(2456956037,344077627),s(2730485921,1290863460),s(2820302411,3158454273),s(3259730800,3505952657),s(3345764771,106217008),s(3516065817,3606008344),s(3600352804,1432725776),s(4094571909,1467031594),s(275423344,851169720),s(430227734,3100823752),s(506948616,1363258195),s(659060556,3750685593),s(883997877,3785050280),s(958139571,3318307427),s(1322822218,3812723403),s(1537002063,2003034995),s(1747873779,3602036899),s(1955562222,1575990012),s(2024104815,1125592928),s(2227730452,2716904306),s(2361852424,442776044),s(2428436474,593698344),s(2756734187,3733110249),s(3204031479,2999351573),s(3329325298,3815920427),s(3391569614,3928383900),s(3515267271,566280711),s(3940187606,3454069534),s(4118630271,4000239992),s(116418474,1914138554),s(174292421,2731055270),s(289380356,3203993006),s(460393269,320620315),s(685471733,587496836),s(852142971,1086792851),s(1017036298,365543100),s(1126000580,2618297676),s(1288033470,3409855158),s(1501505948,4234509866),s(1607167915,987167468),s(1816402316,1246189591)],l=[];!function(){for(var e=0;e<80;e++)l[e]=s()}();var f=a.SHA512=t.extend({_doReset:function(){this._hash=new o.init([new i.init(1779033703,4089235720),new i.init(3144134277,2227873595),new i.init(1013904242,4271175723),new i.init(2773480762,1595750129),new i.init(1359893119,2917565137),new i.init(2600822924,725511199),new i.init(528734635,4215389547),new i.init(1541459225,327033209)])},_doProcessBlock:function(e,t){for(var r=this._hash.words,n=r[0],i=r[1],o=r[2],a=r[3],s=r[4],f=r[5],c=r[6],u=r[7],d=n.high,p=n.low,_=i.high,g=i.low,v=o.high,w=o.low,b=a.high,y=a.low,m=s.high,k=s.low,E=f.high,S=f.low,x=c.high,R=c.low,A=u.high,B=u.low,z=d,L=p,T=_,M=g,C=v,D=w,I=b,P=y,O=m,U=k,H=E,F=S,N=x,Z=R,j=A,W=B,Y=0;Y<80;Y++){var K=l[Y];if(Y<16)var X=K.high=0|e[t+2*Y],q=K.low=0|e[t+2*Y+1];else{var V=l[Y-15],G=V.high,$=V.low,J=(G>>>1|$<<31)^(G>>>8|$<<24)^G>>>7,Q=($>>>1|G<<31)^($>>>8|G<<24)^($>>>7|G<<25),ee=l[Y-2],te=ee.high,re=ee.low,ne=(te>>>19|re<<13)^(te<<3|re>>>29)^te>>>6,ie=(re>>>19|te<<13)^(re<<3|te>>>29)^(re>>>6|te<<26),oe=l[Y-7],ae=oe.high,se=oe.low,he=l[Y-16],le=he.high,fe=he.low;X=(X=(X=J+ae+((q=Q+se)>>>0>>0?1:0))+ne+((q+=ie)>>>0>>0?1:0))+le+((q+=fe)>>>0>>0?1:0),K.high=X,K.low=q}var ce,ue=O&H^~O&N,de=U&F^~U&Z,pe=z&T^z&C^T&C,_e=L&M^L&D^M&D,ge=(z>>>28|L<<4)^(z<<30|L>>>2)^(z<<25|L>>>7),ve=(L>>>28|z<<4)^(L<<30|z>>>2)^(L<<25|z>>>7),we=(O>>>14|U<<18)^(O>>>18|U<<14)^(O<<23|U>>>9),be=(U>>>14|O<<18)^(U>>>18|O<<14)^(U<<23|O>>>9),ye=h[Y],me=ye.high,ke=ye.low,Ee=j+we+((ce=W+be)>>>0>>0?1:0),Se=ve+_e;j=N,W=Z,N=H,Z=F,H=O,F=U,O=I+(Ee=(Ee=(Ee=Ee+ue+((ce+=de)>>>0>>0?1:0))+me+((ce+=ke)>>>0>>0?1:0))+X+((ce+=q)>>>0>>0?1:0))+((U=P+ce|0)>>>0>>0?1:0)|0,I=C,P=D,C=T,D=M,T=z,M=L,z=Ee+(ge+pe+(Se>>>0>>0?1:0))+((L=ce+Se|0)>>>0>>0?1:0)|0}p=n.low=p+L,n.high=d+z+(p>>>0>>0?1:0),g=i.low=g+M,i.high=_+T+(g>>>0>>0?1:0),w=o.low=w+D,o.high=v+C+(w>>>0>>0?1:0),y=a.low=y+P,a.high=b+I+(y>>>0>>0?1:0),k=s.low=k+U,s.high=m+O+(k>>>0>>0?1:0),S=f.low=S+F,f.high=E+H+(S>>>0>>0?1:0),R=c.low=R+Z,c.high=x+N+(R>>>0>>0?1:0),B=u.low=B+W,u.high=A+j+(B>>>0>>0?1:0)},_doFinalize:function(){var e=this._data,t=e.words,r=8*this._nDataBytes,n=8*e.sigBytes;return t[n>>>5]|=128<<24-n%32,t[30+(n+128>>>10<<5)]=Math.floor(r/4294967296),t[31+(n+128>>>10<<5)]=r,e.sigBytes=4*t.length,this._process(),this._hash.toX32()},clone:function(){var e=t.clone.call(this);return e._hash=this._hash.clone(),e},blockSize:32});e.SHA512=t._createHelper(f),e.HmacSHA512=t._createHmacHelper(f)}(),r.SHA512)}),Q(function(e,t){var r,n,i,o,a,s,h,l;e.exports=(i=(n=r=ee).x64,o=i.Word,a=i.WordArray,s=n.algo,h=s.SHA512,l=s.SHA384=h.extend({_doReset:function(){this._hash=new a.init([new o.init(3418070365,3238371032),new o.init(1654270250,914150663),new o.init(2438529370,812702999),new o.init(355462360,4144912697),new o.init(1731405415,4290775857),new o.init(2394180231,1750603025),new o.init(3675008525,1694076839),new o.init(1203062813,3204075428)])},_doFinalize:function(){var e=h._doFinalize.call(this);return e.sigBytes-=16,e}}),n.SHA384=h._createHelper(l),n.HmacSHA384=h._createHmacHelper(l),r.SHA384)}),Q(function(e,t){var r;e.exports=(r=ee,function(e){var t=r,n=t.lib,i=n.WordArray,o=n.Hasher,a=t.x64.Word,s=t.algo,h=[],l=[],f=[];!function(){for(var e=1,t=0,r=0;r<24;r++){h[e+5*t]=(r+1)*(r+2)/2%64;var n=(2*e+3*t)%5;e=t%5,t=n}for(e=0;e<5;e++)for(t=0;t<5;t++)l[e+5*t]=t+(2*e+3*t)%5*5;for(var i=1,o=0;o<24;o++){for(var s=0,c=0,u=0;u<7;u++){if(1&i){var d=(1<>>24)|4278255360&(o<<24|o>>>8),a=16711935&(a<<8|a>>>24)|4278255360&(a<<24|a>>>8),(B=r[i]).high^=a,B.low^=o}for(var s=0;s<24;s++){for(var u=0;u<5;u++){for(var d=0,p=0,_=0;_<5;_++)d^=(B=r[u+5*_]).high,p^=B.low;var g=c[u];g.high=d,g.low=p}for(u=0;u<5;u++){var v=c[(u+4)%5],w=c[(u+1)%5],b=w.high,y=w.low;for(d=v.high^(b<<1|y>>>31),p=v.low^(y<<1|b>>>31),_=0;_<5;_++)(B=r[u+5*_]).high^=d,B.low^=p}for(var m=1;m<25;m++){var k=(B=r[m]).high,E=B.low,S=h[m];S<32?(d=k<>>32-S,p=E<>>32-S):(d=E<>>64-S,p=k<>>64-S);var x=c[l[m]];x.high=d,x.low=p}var R=c[0],A=r[0];for(R.high=A.high,R.low=A.low,u=0;u<5;u++)for(_=0;_<5;_++){var B=r[m=u+5*_],z=c[m],L=c[(u+1)%5+5*_],T=c[(u+2)%5+5*_];B.high=z.high^~L.high&T.high,B.low=z.low^~L.low&T.low}B=r[0];var M=f[s];B.high^=M.high,B.low^=M.low}},_doFinalize:function(){var t=this._data,r=t.words,n=(this._nDataBytes,8*t.sigBytes),o=32*this.blockSize;r[n>>>5]|=1<<24-n%32,r[(e.ceil((n+1)/o)*o>>>5)-1]|=128,t.sigBytes=4*r.length,this._process();for(var a=this._state,s=this.cfg.outputLength/8,h=s/8,l=[],f=0;f>>24)|4278255360&(u<<24|u>>>8),d=16711935&(d<<8|d>>>24)|4278255360&(d<<24|d>>>8),l.push(d),l.push(u)}return new i.init(l,s)},clone:function(){for(var e=o.clone.call(this),t=e._state=this._state.slice(0),r=0;r<25;r++)t[r]=t[r].clone();return e}});t.SHA3=o._createHelper(u),t.HmacSHA3=o._createHmacHelper(u)}(Math),r.SHA3)}),Q(function(e,t){var r;e.exports=(r=ee,function(e){var t=r,n=t.lib,i=n.WordArray,o=n.Hasher,a=t.algo,s=i.create([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,7,4,13,1,10,6,15,3,12,0,9,5,2,14,11,8,3,10,14,4,9,15,8,1,2,7,0,6,13,11,5,12,1,9,11,10,0,8,12,4,13,3,7,15,14,5,6,2,4,0,5,9,7,12,2,10,14,1,3,8,11,6,15,13]),h=i.create([5,14,7,0,9,2,11,4,13,6,15,8,1,10,3,12,6,11,3,7,0,13,5,10,14,15,8,12,4,9,1,2,15,5,1,3,7,14,6,9,11,8,12,2,10,0,4,13,8,6,4,1,3,11,15,0,5,12,2,13,9,7,10,14,12,15,10,4,1,5,8,7,6,2,13,14,0,3,9,11]),l=i.create([11,14,15,12,5,8,7,9,11,13,14,15,6,7,9,8,7,6,8,13,11,9,7,15,7,12,15,9,11,7,13,12,11,13,6,7,14,9,13,15,14,8,13,6,5,12,7,5,11,12,14,15,14,15,9,8,9,14,5,6,8,6,5,12,9,15,5,11,6,8,13,12,5,12,13,14,11,8,5,6]),f=i.create([8,9,9,11,13,15,15,5,7,7,8,11,14,14,12,6,9,13,15,7,12,8,9,11,7,7,12,7,6,15,13,11,9,7,15,11,8,6,6,14,12,13,5,14,13,13,7,5,15,5,8,11,14,14,6,14,6,9,12,9,12,5,15,8,8,5,12,9,12,5,14,6,8,13,6,5,15,13,11,11]),c=i.create([0,1518500249,1859775393,2400959708,2840853838]),u=i.create([1352829926,1548603684,1836072691,2053994217,0]),d=a.RIPEMD160=o.extend({_doReset:function(){this._hash=i.create([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(e,t){for(var r=0;r<16;r++){var n=t+r,i=e[n];e[n]=16711935&(i<<8|i>>>24)|4278255360&(i<<24|i>>>8)}var o,a,d,y,m,k,E,S,x,R,A,B=this._hash.words,z=c.words,L=u.words,T=s.words,M=h.words,C=l.words,D=f.words;for(k=o=B[0],E=a=B[1],S=d=B[2],x=y=B[3],R=m=B[4],r=0;r<80;r+=1)A=o+e[t+T[r]]|0,A+=r<16?p(a,d,y)+z[0]:r<32?_(a,d,y)+z[1]:r<48?g(a,d,y)+z[2]:r<64?v(a,d,y)+z[3]:w(a,d,y)+z[4],A=(A=b(A|=0,C[r]))+m|0,o=m,m=y,y=b(d,10),d=a,a=A,A=k+e[t+M[r]]|0,A+=r<16?w(E,S,x)+L[0]:r<32?v(E,S,x)+L[1]:r<48?g(E,S,x)+L[2]:r<64?_(E,S,x)+L[3]:p(E,S,x)+L[4],A=(A=b(A|=0,D[r]))+R|0,k=R,R=x,x=b(S,10),S=E,E=A;A=B[1]+d+x|0,B[1]=B[2]+y+R|0,B[2]=B[3]+m+k|0,B[3]=B[4]+o+E|0,B[4]=B[0]+a+S|0,B[0]=A},_doFinalize:function(){var e=this._data,t=e.words,r=8*this._nDataBytes,n=8*e.sigBytes;t[n>>>5]|=128<<24-n%32,t[14+(n+64>>>9<<4)]=16711935&(r<<8|r>>>24)|4278255360&(r<<24|r>>>8),e.sigBytes=4*(t.length+1),this._process();for(var i=this._hash,o=i.words,a=0;a<5;a++){var s=o[a];o[a]=16711935&(s<<8|s>>>24)|4278255360&(s<<24|s>>>8)}return i},clone:function(){var e=o.clone.call(this);return e._hash=this._hash.clone(),e}});function p(e,t,r){return e^t^r}function _(e,t,r){return e&t|~e&r}function g(e,t,r){return(e|~t)^r}function v(e,t,r){return e&r|t&~r}function w(e,t,r){return e^(t|~r)}function b(e,t){return e<>>32-t}t.RIPEMD160=o._createHelper(d),t.HmacRIPEMD160=o._createHmacHelper(d)}(),r.RIPEMD160)}),Q(function(e,t){var r,n,i,o,a,s;e.exports=(n=(r=ee).lib,i=n.Base,o=r.enc,a=o.Utf8,s=r.algo,void(s.HMAC=i.extend({init:function(e,t){e=this._hasher=new e.init,"string"==typeof t&&(t=a.parse(t));var r=e.blockSize,n=4*r;t.sigBytes>n&&(t=e.finalize(t)),t.clamp();for(var i=this._oKey=t.clone(),o=this._iKey=t.clone(),s=i.words,h=o.words,l=0;l>>2];e.sigBytes-=t}},o.BlockCipher=d.extend({cfg:d.cfg.extend({mode:g,padding:w}),reset:function(){d.reset.call(this);var e=this.cfg,t=e.iv,r=e.mode;if(this._xformMode==this._ENC_XFORM_MODE)var n=r.createEncryptor;else{var n=r.createDecryptor;this._minBufferSize=1}this._mode&&this._mode.__creator==n?this._mode.init(this,t&&t.words):(this._mode=n.call(r,this,t&&t.words),this._mode.__creator=n)},_doProcessBlock:function(e,t){this._mode.processBlock(e,t)},_doFinalize:function(){var e=this.cfg.padding;if(this._xformMode==this._ENC_XFORM_MODE){e.pad(this._data,this.blockSize);var t=this._process(!0)}else{var t=this._process(!0);e.unpad(t)}return t},blockSize:4}),b=o.CipherParams=a.extend({init:function(e){this.mixIn(e)},toString:function(e){return(e||this.formatter).stringify(this)}}),y=i.format={},m=y.OpenSSL={stringify:function(e){var t=e.ciphertext,r=e.salt;if(r)var n=s.create([1398893684,1701076831]).concat(r).concat(t);else var n=t;return n.toString(f)},parse:function(e){var t=f.parse(e),r=t.words;if(1398893684==r[0]&&1701076831==r[1]){var n=s.create(r.slice(2,4));r.splice(0,4),t.sigBytes-=16}return b.create({ciphertext:t,salt:n})}},k=o.SerializableCipher=a.extend({cfg:a.extend({format:m}),encrypt:function(e,t,r,n){n=this.cfg.extend(n);var i=e.createEncryptor(r,n),o=i.finalize(t),a=i.cfg;return b.create({ciphertext:o,key:r,iv:a.iv,algorithm:e,mode:a.mode,padding:a.padding,blockSize:e.blockSize,formatter:n.format})},decrypt:function(e,t,r,n){n=this.cfg.extend(n),t=this._parse(t,n.format);var i=e.createDecryptor(r,n).finalize(t.ciphertext);return i},_parse:function(e,t){return"string"==typeof e?t.parse(e,this):e}}),E=i.kdf={},S=E.OpenSSL={execute:function(e,t,r,n){n||(n=s.random(8));var i=u.create({keySize:t+r}).compute(e,n),o=s.create(i.words.slice(t),4*r);return i.sigBytes=4*t,b.create({key:i,iv:o,salt:n})}},x=o.PasswordBasedCipher=k.extend({cfg:k.cfg.extend({kdf:S}),encrypt:function(e,t,r,n){var i=(n=this.cfg.extend(n)).kdf.execute(r,e.keySize,e.ivSize);n.iv=i.iv;var o=k.encrypt.call(this,e,t,i.key,n);return o.mixIn(i),o},decrypt:function(e,t,r,n){n=this.cfg.extend(n),t=this._parse(t,n.format);var i=n.kdf.execute(r,e.keySize,e.ivSize,t.salt);n.iv=i.iv;var o=k.decrypt.call(this,e,t,i.key,n);return o}})))}),Q(function(e,t){var r;e.exports=((r=ee).mode.CFB=function(){var e=r.lib.BlockCipherMode.extend();function t(e,t,r,n){var i=this._iv;if(i){var o=i.slice(0);this._iv=void 0}else o=this._prevBlock;n.encryptBlock(o,0);for(var a=0;a>24&255)){var t=e>>16&255,r=e>>8&255,n=255&e;255===t?(t=0,255===r?(r=0,255===n?n=0:++n):++r):++t,e=0,e+=t<<16,e+=r<<8,e+=n}else e+=1<<24;return e}var n=e.Encryptor=e.extend({processBlock:function(e,r){var n=this._cipher,i=n.blockSize,o=this._iv,a=this._counter;o&&(a=this._counter=o.slice(0),this._iv=void 0),function(e){0===(e[0]=t(e[0]))&&(e[1]=t(e[1]))}(a);var s=a.slice(0);n.encryptBlock(s,0);for(var h=0;h>>2]|=i<<24-o%4*8,e.sigBytes+=i},unpad:function(e){var t=255&e.words[e.sigBytes-1>>>2];e.sigBytes-=t}},r.pad.Ansix923)}),Q(function(e,t){var r;e.exports=((r=ee).pad.Iso10126={pad:function(e,t){var n=4*t,i=n-e.sigBytes%n;e.concat(r.lib.WordArray.random(i-1)).concat(r.lib.WordArray.create([i<<24],1))},unpad:function(e){var t=255&e.words[e.sigBytes-1>>>2];e.sigBytes-=t}},r.pad.Iso10126)}),Q(function(e,t){var r;e.exports=((r=ee).pad.Iso97971={pad:function(e,t){e.concat(r.lib.WordArray.create([2147483648],1)),r.pad.ZeroPadding.pad(e,t)},unpad:function(e){r.pad.ZeroPadding.unpad(e),e.sigBytes--}},r.pad.Iso97971)}),Q(function(e,t){var r;e.exports=((r=ee).pad.ZeroPadding={pad:function(e,t){var r=4*t;e.clamp(),e.sigBytes+=r-(e.sigBytes%r||r)},unpad:function(e){for(var t=e.words,r=e.sigBytes-1;!(t[r>>>2]>>>24-r%4*8&255);)r--;e.sigBytes=r+1}},r.pad.ZeroPadding)}),Q(function(e,t){var r;e.exports=((r=ee).pad.NoPadding={pad:function(){},unpad:function(){}},r.pad.NoPadding)}),Q(function(e,t){var r,n,i,o;e.exports=(i=(n=r=ee).lib.CipherParams,o=n.enc.Hex,n.format.Hex={stringify:function(e){return e.ciphertext.toString(o)},parse:function(e){var t=o.parse(e);return i.create({ciphertext:t})}},r.format.Hex)}),Q(function(e,t){var r;e.exports=(r=ee,function(){var e=r,t=e.lib.BlockCipher,n=e.algo,i=[],o=[],a=[],s=[],h=[],l=[],f=[],c=[],u=[],d=[];!function(){for(var e=[],t=0;t<256;t++)e[t]=t<128?t<<1:t<<1^283;var r=0,n=0;for(t=0;t<256;t++){var p=n^n<<1^n<<2^n<<3^n<<4;p=p>>>8^255&p^99,i[r]=p,o[p]=r;var _=e[r],g=e[_],v=e[g],w=257*e[p]^16843008*p;a[r]=w<<24|w>>>8,s[r]=w<<16|w>>>16,h[r]=w<<8|w>>>24,l[r]=w,w=16843009*v^65537*g^257*_^16843008*r,f[p]=w<<24|w>>>8,c[p]=w<<16|w>>>16,u[p]=w<<8|w>>>24,d[p]=w,r?(r=_^e[e[e[v^_]]],n^=e[e[n]]):r=n=1}}();var p=[0,1,2,4,8,16,32,64,128,27,54],_=n.AES=t.extend({_doReset:function(){if(!this._nRounds||this._keyPriorReset!==this._key){for(var e=this._keyPriorReset=this._key,t=e.words,r=e.sigBytes/4,n=4*((this._nRounds=r+6)+1),o=this._keySchedule=[],a=0;a6&&a%r==4&&(s=i[s>>>24]<<24|i[s>>>16&255]<<16|i[s>>>8&255]<<8|i[255&s]):(s=i[(s=s<<8|s>>>24)>>>24]<<24|i[s>>>16&255]<<16|i[s>>>8&255]<<8|i[255&s],s^=p[a/r|0]<<24),o[a]=o[a-r]^s}for(var h=this._invKeySchedule=[],l=0;l>>24]]^c[i[s>>>16&255]]^u[i[s>>>8&255]]^d[i[255&s]]}},encryptBlock:function(e,t){this._doCryptBlock(e,t,this._keySchedule,a,s,h,l,i)},decryptBlock:function(e,t){var r=e[t+1];e[t+1]=e[t+3],e[t+3]=r,this._doCryptBlock(e,t,this._invKeySchedule,f,c,u,d,o),r=e[t+1],e[t+1]=e[t+3],e[t+3]=r},_doCryptBlock:function(e,t,r,n,i,o,a,s){for(var h=this._nRounds,l=e[t]^r[0],f=e[t+1]^r[1],c=e[t+2]^r[2],u=e[t+3]^r[3],d=4,p=1;p>>24]^i[f>>>16&255]^o[c>>>8&255]^a[255&u]^r[d++],g=n[f>>>24]^i[c>>>16&255]^o[u>>>8&255]^a[255&l]^r[d++],v=n[c>>>24]^i[u>>>16&255]^o[l>>>8&255]^a[255&f]^r[d++],w=n[u>>>24]^i[l>>>16&255]^o[f>>>8&255]^a[255&c]^r[d++];l=_,f=g,c=v,u=w}_=(s[l>>>24]<<24|s[f>>>16&255]<<16|s[c>>>8&255]<<8|s[255&u])^r[d++],g=(s[f>>>24]<<24|s[c>>>16&255]<<16|s[u>>>8&255]<<8|s[255&l])^r[d++],v=(s[c>>>24]<<24|s[u>>>16&255]<<16|s[l>>>8&255]<<8|s[255&f])^r[d++],w=(s[u>>>24]<<24|s[l>>>16&255]<<16|s[f>>>8&255]<<8|s[255&c])^r[d++],e[t]=_,e[t+1]=g,e[t+2]=v,e[t+3]=w},keySize:8});e.AES=t._createHelper(_)}(),r.AES)}),Q(function(e,t){var r;e.exports=(r=ee,function(){var e=r,t=e.lib,n=t.WordArray,i=t.BlockCipher,o=e.algo,a=[57,49,41,33,25,17,9,1,58,50,42,34,26,18,10,2,59,51,43,35,27,19,11,3,60,52,44,36,63,55,47,39,31,23,15,7,62,54,46,38,30,22,14,6,61,53,45,37,29,21,13,5,28,20,12,4],s=[14,17,11,24,1,5,3,28,15,6,21,10,23,19,12,4,26,8,16,7,27,20,13,2,41,52,31,37,47,55,30,40,51,45,33,48,44,49,39,56,34,53,46,42,50,36,29,32],h=[1,2,4,6,8,10,12,14,15,17,19,21,23,25,27,28],l=[{0:8421888,268435456:32768,536870912:8421378,805306368:2,1073741824:512,1342177280:8421890,1610612736:8389122,1879048192:8388608,2147483648:514,2415919104:8389120,2684354560:33280,2952790016:8421376,3221225472:32770,3489660928:8388610,3758096384:0,4026531840:33282,134217728:0,402653184:8421890,671088640:33282,939524096:32768,1207959552:8421888,1476395008:512,1744830464:8421378,2013265920:2,2281701376:8389120,2550136832:33280,2818572288:8421376,3087007744:8389122,3355443200:8388610,3623878656:32770,3892314112:514,4160749568:8388608,1:32768,268435457:2,536870913:8421888,805306369:8388608,1073741825:8421378,1342177281:33280,1610612737:512,1879048193:8389122,2147483649:8421890,2415919105:8421376,2684354561:8388610,2952790017:33282,3221225473:514,3489660929:8389120,3758096385:32770,4026531841:0,134217729:8421890,402653185:8421376,671088641:8388608,939524097:512,1207959553:32768,1476395009:8388610,1744830465:2,2013265921:33282,2281701377:32770,2550136833:8389122,2818572289:514,3087007745:8421888,3355443201:8389120,3623878657:0,3892314113:33280,4160749569:8421378},{0:1074282512,16777216:16384,33554432:524288,50331648:1074266128,67108864:1073741840,83886080:1074282496,100663296:1073758208,117440512:16,134217728:540672,150994944:1073758224,167772160:1073741824,184549376:540688,201326592:524304,218103808:0,234881024:16400,251658240:1074266112,8388608:1073758208,25165824:540688,41943040:16,58720256:1073758224,75497472:1074282512,92274688:1073741824,109051904:524288,125829120:1074266128,142606336:524304,159383552:0,176160768:16384,192937984:1074266112,209715200:1073741840,226492416:540672,243269632:1074282496,260046848:16400,268435456:0,285212672:1074266128,301989888:1073758224,318767104:1074282496,335544320:1074266112,352321536:16,369098752:540688,385875968:16384,402653184:16400,419430400:524288,436207616:524304,452984832:1073741840,469762048:540672,486539264:1073758208,503316480:1073741824,520093696:1074282512,276824064:540688,293601280:524288,310378496:1074266112,327155712:16384,343932928:1073758208,360710144:1074282512,377487360:16,394264576:1073741824,411041792:1074282496,427819008:1073741840,444596224:1073758224,461373440:524304,478150656:0,494927872:16400,511705088:1074266128,528482304:540672},{0:260,1048576:0,2097152:67109120,3145728:65796,4194304:65540,5242880:67108868,6291456:67174660,7340032:67174400,8388608:67108864,9437184:67174656,10485760:65792,11534336:67174404,12582912:67109124,13631488:65536,14680064:4,15728640:256,524288:67174656,1572864:67174404,2621440:0,3670016:67109120,4718592:67108868,5767168:65536,6815744:65540,7864320:260,8912896:4,9961472:256,11010048:67174400,12058624:65796,13107200:65792,14155776:67109124,15204352:67174660,16252928:67108864,16777216:67174656,17825792:65540,18874368:65536,19922944:67109120,20971520:256,22020096:67174660,23068672:67108868,24117248:0,25165824:67109124,26214400:67108864,27262976:4,28311552:65792,29360128:67174400,30408704:260,31457280:65796,32505856:67174404,17301504:67108864,18350080:260,19398656:67174656,20447232:0,21495808:65540,22544384:67109120,23592960:256,24641536:67174404,25690112:65536,26738688:67174660,27787264:65796,28835840:67108868,29884416:67109124,30932992:67174400,31981568:4,33030144:65792},{0:2151682048,65536:2147487808,131072:4198464,196608:2151677952,262144:0,327680:4198400,393216:2147483712,458752:4194368,524288:2147483648,589824:4194304,655360:64,720896:2147487744,786432:2151678016,851968:4160,917504:4096,983040:2151682112,32768:2147487808,98304:64,163840:2151678016,229376:2147487744,294912:4198400,360448:2151682112,425984:0,491520:2151677952,557056:4096,622592:2151682048,688128:4194304,753664:4160,819200:2147483648,884736:4194368,950272:4198464,1015808:2147483712,1048576:4194368,1114112:4198400,1179648:2147483712,1245184:0,1310720:4160,1376256:2151678016,1441792:2151682048,1507328:2147487808,1572864:2151682112,1638400:2147483648,1703936:2151677952,1769472:4198464,1835008:2147487744,1900544:4194304,1966080:64,2031616:4096,1081344:2151677952,1146880:2151682112,1212416:0,1277952:4198400,1343488:4194368,1409024:2147483648,1474560:2147487808,1540096:64,1605632:2147483712,1671168:4096,1736704:2147487744,1802240:2151678016,1867776:4160,1933312:2151682048,1998848:4194304,2064384:4198464},{0:128,4096:17039360,8192:262144,12288:536870912,16384:537133184,20480:16777344,24576:553648256,28672:262272,32768:16777216,36864:537133056,40960:536871040,45056:553910400,49152:553910272,53248:0,57344:17039488,61440:553648128,2048:17039488,6144:553648256,10240:128,14336:17039360,18432:262144,22528:537133184,26624:553910272,30720:536870912,34816:537133056,38912:0,43008:553910400,47104:16777344,51200:536871040,55296:553648128,59392:16777216,63488:262272,65536:262144,69632:128,73728:536870912,77824:553648256,81920:16777344,86016:553910272,90112:537133184,94208:16777216,98304:553910400,102400:553648128,106496:17039360,110592:537133056,114688:262272,118784:536871040,122880:0,126976:17039488,67584:553648256,71680:16777216,75776:17039360,79872:537133184,83968:536870912,88064:17039488,92160:128,96256:553910272,100352:262272,104448:553910400,108544:0,112640:553648128,116736:16777344,120832:262144,124928:537133056,129024:536871040},{0:268435464,256:8192,512:270532608,768:270540808,1024:268443648,1280:2097152,1536:2097160,1792:268435456,2048:0,2304:268443656,2560:2105344,2816:8,3072:270532616,3328:2105352,3584:8200,3840:270540800,128:270532608,384:270540808,640:8,896:2097152,1152:2105352,1408:268435464,1664:268443648,1920:8200,2176:2097160,2432:8192,2688:268443656,2944:270532616,3200:0,3456:270540800,3712:2105344,3968:268435456,4096:268443648,4352:270532616,4608:270540808,4864:8200,5120:2097152,5376:268435456,5632:268435464,5888:2105344,6144:2105352,6400:0,6656:8,6912:270532608,7168:8192,7424:268443656,7680:270540800,7936:2097160,4224:8,4480:2105344,4736:2097152,4992:268435464,5248:268443648,5504:8200,5760:270540808,6016:270532608,6272:270540800,6528:270532616,6784:8192,7040:2105352,7296:2097160,7552:0,7808:268435456,8064:268443656},{0:1048576,16:33555457,32:1024,48:1049601,64:34604033,80:0,96:1,112:34603009,128:33555456,144:1048577,160:33554433,176:34604032,192:34603008,208:1025,224:1049600,240:33554432,8:34603009,24:0,40:33555457,56:34604032,72:1048576,88:33554433,104:33554432,120:1025,136:1049601,152:33555456,168:34603008,184:1048577,200:1024,216:34604033,232:1,248:1049600,256:33554432,272:1048576,288:33555457,304:34603009,320:1048577,336:33555456,352:34604032,368:1049601,384:1025,400:34604033,416:1049600,432:1,448:0,464:34603008,480:33554433,496:1024,264:1049600,280:33555457,296:34603009,312:1,328:33554432,344:1048576,360:1025,376:34604032,392:33554433,408:34603008,424:0,440:34604033,456:1049601,472:1024,488:33555456,504:1048577},{0:134219808,1:131072,2:134217728,3:32,4:131104,5:134350880,6:134350848,7:2048,8:134348800,9:134219776,10:133120,11:134348832,12:2080,13:0,14:134217760,15:133152,2147483648:2048,2147483649:134350880,2147483650:134219808,2147483651:134217728,2147483652:134348800,2147483653:133120,2147483654:133152,2147483655:32,2147483656:134217760,2147483657:2080,2147483658:131104,2147483659:134350848,2147483660:0,2147483661:134348832,2147483662:134219776,2147483663:131072,16:133152,17:134350848,18:32,19:2048,20:134219776,21:134217760,22:134348832,23:131072,24:0,25:131104,26:134348800,27:134219808,28:134350880,29:133120,30:2080,31:134217728,2147483664:131072,2147483665:2048,2147483666:134348832,2147483667:133152,2147483668:32,2147483669:134348800,2147483670:134217728,2147483671:134219808,2147483672:134350880,2147483673:134217760,2147483674:134219776,2147483675:0,2147483676:133120,2147483677:2080,2147483678:131104,2147483679:134350848}],f=[4160749569,528482304,33030144,2064384,129024,8064,504,2147483679],c=o.DES=i.extend({_doReset:function(){for(var e=this._key.words,t=[],r=0;r<56;r++){var n=a[r]-1;t[r]=e[n>>>5]>>>31-n%32&1}for(var i=this._subKeys=[],o=0;o<16;o++){var l=i[o]=[],f=h[o];for(r=0;r<24;r++)l[r/6|0]|=t[(s[r]-1+f)%28]<<31-r%6,l[4+(r/6|0)]|=t[28+(s[r+24]-1+f)%28]<<31-r%6;for(l[0]=l[0]<<1|l[0]>>>31,r=1;r<7;r++)l[r]=l[r]>>>4*(r-1)+3;l[7]=l[7]<<5|l[7]>>>27}var c=this._invSubKeys=[];for(r=0;r<16;r++)c[r]=i[15-r]},encryptBlock:function(e,t){this._doCryptBlock(e,t,this._subKeys)},decryptBlock:function(e,t){this._doCryptBlock(e,t,this._invSubKeys)},_doCryptBlock:function(e,t,r){this._lBlock=e[t],this._rBlock=e[t+1],u.call(this,4,252645135),u.call(this,16,65535),d.call(this,2,858993459),d.call(this,8,16711935),u.call(this,1,1431655765);for(var n=0;n<16;n++){for(var i=r[n],o=this._lBlock,a=this._rBlock,s=0,h=0;h<8;h++)s|=l[h][((a^i[h])&f[h])>>>0];this._lBlock=a,this._rBlock=o^s}var c=this._lBlock;this._lBlock=this._rBlock,this._rBlock=c,u.call(this,1,1431655765),d.call(this,8,16711935),d.call(this,2,858993459),u.call(this,16,65535),u.call(this,4,252645135),e[t]=this._lBlock,e[t+1]=this._rBlock},keySize:2,ivSize:2,blockSize:2});function u(e,t){var r=(this._lBlock>>>e^this._rBlock)&t;this._rBlock^=r,this._lBlock^=r<>>e^this._lBlock)&t;this._lBlock^=r,this._rBlock^=r<>>2]>>>24-a%4*8&255;o=(o+n[i]+s)%256;var h=n[i];n[i]=n[o],n[o]=h}this._i=this._j=0},_doProcessBlock:function(e,t){e[t]^=o.call(this)},keySize:8,ivSize:0});function o(){for(var e=this._S,t=this._i,r=this._j,n=0,i=0;i<4;i++){r=(r+e[t=(t+1)%256])%256;var o=e[t];e[t]=e[r],e[r]=o,n|=e[(e[t]+e[r])%256]<<24-8*i}return this._i=t,this._j=r,n}e.RC4=t._createHelper(i);var a=n.RC4Drop=i.extend({cfg:i.cfg.extend({drop:192}),_doReset:function(){i._doReset.call(this);for(var e=this.cfg.drop;e>0;e--)o.call(this)}});e.RC4Drop=t._createHelper(a)}(),r.RC4)}),Q(function(e,t){var r;e.exports=(r=ee,function(){var e=r,t=e.lib.StreamCipher,n=e.algo,i=[],o=[],a=[],s=n.Rabbit=t.extend({_doReset:function(){for(var e=this._key.words,t=this.cfg.iv,r=0;r<4;r++)e[r]=16711935&(e[r]<<8|e[r]>>>24)|4278255360&(e[r]<<24|e[r]>>>8);var n=this._X=[e[0],e[3]<<16|e[2]>>>16,e[1],e[0]<<16|e[3]>>>16,e[2],e[1]<<16|e[0]>>>16,e[3],e[2]<<16|e[1]>>>16],i=this._C=[e[2]<<16|e[2]>>>16,4294901760&e[0]|65535&e[1],e[3]<<16|e[3]>>>16,4294901760&e[1]|65535&e[2],e[0]<<16|e[0]>>>16,4294901760&e[2]|65535&e[3],e[1]<<16|e[1]>>>16,4294901760&e[3]|65535&e[0]];for(this._b=0,r=0;r<4;r++)h.call(this);for(r=0;r<8;r++)i[r]^=n[r+4&7];if(t){var o=t.words,a=o[0],s=o[1],l=16711935&(a<<8|a>>>24)|4278255360&(a<<24|a>>>8),f=16711935&(s<<8|s>>>24)|4278255360&(s<<24|s>>>8),c=l>>>16|4294901760&f,u=f<<16|65535&l;for(i[0]^=l,i[1]^=c,i[2]^=f,i[3]^=u,i[4]^=l,i[5]^=c,i[6]^=f,i[7]^=u,r=0;r<4;r++)h.call(this)}},_doProcessBlock:function(e,t){var r=this._X;h.call(this),i[0]=r[0]^r[5]>>>16^r[3]<<16,i[1]=r[2]^r[7]>>>16^r[5]<<16,i[2]=r[4]^r[1]>>>16^r[7]<<16,i[3]=r[6]^r[3]>>>16^r[1]<<16;for(var n=0;n<4;n++)i[n]=16711935&(i[n]<<8|i[n]>>>24)|4278255360&(i[n]<<24|i[n]>>>8),e[t+n]^=i[n]},blockSize:4,ivSize:2});function h(){for(var e=this._X,t=this._C,r=0;r<8;r++)o[r]=t[r];for(t[0]=t[0]+1295307597+this._b|0,t[1]=t[1]+3545052371+(t[0]>>>0>>0?1:0)|0,t[2]=t[2]+886263092+(t[1]>>>0>>0?1:0)|0,t[3]=t[3]+1295307597+(t[2]>>>0>>0?1:0)|0,t[4]=t[4]+3545052371+(t[3]>>>0>>0?1:0)|0,t[5]=t[5]+886263092+(t[4]>>>0>>0?1:0)|0,t[6]=t[6]+1295307597+(t[5]>>>0>>0?1:0)|0,t[7]=t[7]+3545052371+(t[6]>>>0>>0?1:0)|0,this._b=t[7]>>>0>>0?1:0,r=0;r<8;r++){var n=e[r]+t[r],i=65535&n,s=n>>>16,h=((i*i>>>17)+i*s>>>15)+s*s,l=((4294901760&n)*n|0)+((65535&n)*n|0);a[r]=h^l}e[0]=a[0]+(a[7]<<16|a[7]>>>16)+(a[6]<<16|a[6]>>>16)|0,e[1]=a[1]+(a[0]<<8|a[0]>>>24)+a[7]|0,e[2]=a[2]+(a[1]<<16|a[1]>>>16)+(a[0]<<16|a[0]>>>16)|0,e[3]=a[3]+(a[2]<<8|a[2]>>>24)+a[1]|0,e[4]=a[4]+(a[3]<<16|a[3]>>>16)+(a[2]<<16|a[2]>>>16)|0,e[5]=a[5]+(a[4]<<8|a[4]>>>24)+a[3]|0,e[6]=a[6]+(a[5]<<16|a[5]>>>16)+(a[4]<<16|a[4]>>>16)|0,e[7]=a[7]+(a[6]<<8|a[6]>>>24)+a[5]|0}e.Rabbit=t._createHelper(s)}(),r.Rabbit)}),Q(function(e,t){var r;e.exports=(r=ee,function(){var e=r,t=e.lib.StreamCipher,n=e.algo,i=[],o=[],a=[],s=n.RabbitLegacy=t.extend({_doReset:function(){var e=this._key.words,t=this.cfg.iv,r=this._X=[e[0],e[3]<<16|e[2]>>>16,e[1],e[0]<<16|e[3]>>>16,e[2],e[1]<<16|e[0]>>>16,e[3],e[2]<<16|e[1]>>>16],n=this._C=[e[2]<<16|e[2]>>>16,4294901760&e[0]|65535&e[1],e[3]<<16|e[3]>>>16,4294901760&e[1]|65535&e[2],e[0]<<16|e[0]>>>16,4294901760&e[2]|65535&e[3],e[1]<<16|e[1]>>>16,4294901760&e[3]|65535&e[0]];this._b=0;for(var i=0;i<4;i++)h.call(this);for(i=0;i<8;i++)n[i]^=r[i+4&7];if(t){var o=t.words,a=o[0],s=o[1],l=16711935&(a<<8|a>>>24)|4278255360&(a<<24|a>>>8),f=16711935&(s<<8|s>>>24)|4278255360&(s<<24|s>>>8),c=l>>>16|4294901760&f,u=f<<16|65535&l;for(n[0]^=l,n[1]^=c,n[2]^=f,n[3]^=u,n[4]^=l,n[5]^=c,n[6]^=f,n[7]^=u,i=0;i<4;i++)h.call(this)}},_doProcessBlock:function(e,t){var r=this._X;h.call(this),i[0]=r[0]^r[5]>>>16^r[3]<<16,i[1]=r[2]^r[7]>>>16^r[5]<<16,i[2]=r[4]^r[1]>>>16^r[7]<<16,i[3]=r[6]^r[3]>>>16^r[1]<<16;for(var n=0;n<4;n++)i[n]=16711935&(i[n]<<8|i[n]>>>24)|4278255360&(i[n]<<24|i[n]>>>8),e[t+n]^=i[n]},blockSize:4,ivSize:2});function h(){for(var e=this._X,t=this._C,r=0;r<8;r++)o[r]=t[r];for(t[0]=t[0]+1295307597+this._b|0,t[1]=t[1]+3545052371+(t[0]>>>0>>0?1:0)|0,t[2]=t[2]+886263092+(t[1]>>>0>>0?1:0)|0,t[3]=t[3]+1295307597+(t[2]>>>0>>0?1:0)|0,t[4]=t[4]+3545052371+(t[3]>>>0>>0?1:0)|0,t[5]=t[5]+886263092+(t[4]>>>0>>0?1:0)|0,t[6]=t[6]+1295307597+(t[5]>>>0>>0?1:0)|0,t[7]=t[7]+3545052371+(t[6]>>>0>>0?1:0)|0,this._b=t[7]>>>0>>0?1:0,r=0;r<8;r++){var n=e[r]+t[r],i=65535&n,s=n>>>16,h=((i*i>>>17)+i*s>>>15)+s*s,l=((4294901760&n)*n|0)+((65535&n)*n|0);a[r]=h^l}e[0]=a[0]+(a[7]<<16|a[7]>>>16)+(a[6]<<16|a[6]>>>16)|0,e[1]=a[1]+(a[0]<<8|a[0]>>>24)+a[7]|0,e[2]=a[2]+(a[1]<<16|a[1]>>>16)+(a[0]<<16|a[0]>>>16)|0,e[3]=a[3]+(a[2]<<8|a[2]>>>24)+a[1]|0,e[4]=a[4]+(a[3]<<16|a[3]>>>16)+(a[2]<<16|a[2]>>>16)|0,e[5]=a[5]+(a[4]<<8|a[4]>>>24)+a[3]|0,e[6]=a[6]+(a[5]<<16|a[5]>>>16)+(a[4]<<16|a[4]>>>16)|0,e[7]=a[7]+(a[6]<<8|a[6]>>>24)+a[5]|0}e.RabbitLegacy=t._createHelper(s)}(),r.RabbitLegacy)}),Q(function(e,t){e.exports=ee}));function re(){throw new Error("setTimeout has not been defined")}function ne(){throw new Error("clearTimeout has not been defined")}var ie=re,oe=ne;function ae(e){if(ie===setTimeout)return setTimeout(e,0);if((ie===re||!ie)&&setTimeout)return ie=setTimeout,setTimeout(e,0);try{return ie(e,0)}catch(t){try{return ie.call(null,e,0)}catch(t){return ie.call(this,e,0)}}}"function"==typeof e.setTimeout&&(ie=setTimeout),"function"==typeof e.clearTimeout&&(oe=clearTimeout);var se,he=[],le=!1,fe=-1;function ce(){le&&se&&(le=!1,se.length?he=se.concat(he):fe=-1,he.length&&ue())}function ue(){if(!le){var e=ae(ce);le=!0;for(var t=he.length;t;){for(se=he,he=[];++fe1)for(var r=1;r0&&a.length>i){a.warned=!0;var h=new Error("Possible EventEmitter memory leak detected. "+a.length+" "+t+" listeners added. Use emitter.setMaxListeners() to increase limit");h.name="MaxListenersExceededWarning",h.emitter=e,h.type=t,h.count=a.length,s=h,"function"==typeof console.warn?console.warn(s):console.log(s)}}else a=o[t]=r,++e._eventsCount;return e}function xe(e,t,r){var n=!1;function i(){e.removeListener(t,i),n||(n=!0,r.apply(e,arguments))}return i.listener=r,i}function Re(e){var t=this._events;if(t){var r=t[e];if("function"==typeof r)return 1;if(r)return r.length}return 0}function Ae(e,t){for(var r=new Array(t);t--;)r[t]=e[t];return r}ge.prototype=Object.create(null),ve.EventEmitter=ve,ve.usingDomains=!1,ve.prototype.domain=void 0,ve.prototype._events=void 0,ve.prototype._maxListeners=void 0,ve.defaultMaxListeners=10,ve.init=function(){this.domain=null,ve.usingDomains&&(void 0).active&&(void 0).Domain,this._events&&this._events!==Object.getPrototypeOf(this)._events||(this._events=new ge,this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},ve.prototype.setMaxListeners=function(e){if("number"!=typeof e||e<0||isNaN(e))throw new TypeError('"n" argument must be a positive number');return this._maxListeners=e,this},ve.prototype.getMaxListeners=function(){return we(this)},ve.prototype.emit=function(e){var t,r,n,i,o,a,s,h="error"===e;if(a=this._events)h=h&&null==a.error;else if(!h)return!1;if(s=this.domain,h){if(t=arguments[1],!s){if(t instanceof Error)throw t;var l=new Error('Uncaught, unspecified "error" event. ('+t+")");throw l.context=t,l}return t||(t=new Error('Uncaught, unspecified "error" event')),t.domainEmitter=this,t.domain=s,t.domainThrown=!1,s.emit("error",t),!1}if(!(r=a[e]))return!1;var f="function"==typeof r;switch(n=arguments.length){case 1:be(r,f,this);break;case 2:ye(r,f,this,arguments[1]);break;case 3:me(r,f,this,arguments[1],arguments[2]);break;case 4:ke(r,f,this,arguments[1],arguments[2],arguments[3]);break;default:for(i=new Array(n-1),o=1;o0;)if(r[o]===t||r[o].listener&&r[o].listener===t){a=r[o].listener,i=o;break}if(i<0)return this;if(1===r.length){if(r[0]=void 0,0==--this._eventsCount)return this._events=new ge,this;delete n[e]}else!function(e,t){for(var r=t,n=r+1,i=e.length;n0?Reflect.ownKeys(this._events):[]};var Be="function"==typeof Object.create?function(e,t){e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})}:function(e,t){e.super_=t;var r=function(){};r.prototype=t.prototype,e.prototype=new r,e.prototype.constructor=e},ze=/%[sdj%]/g;function Le(e){if(!Ze(e)){for(var t=[],r=0;r=i)return e;switch(e){case"%s":return String(n[r++]);case"%d":return Number(n[r++]);case"%j":try{return JSON.stringify(n[r++])}catch(e){return"[Circular]"}default:return e}}),a=n[r];r=3&&(r.depth=arguments[2]),arguments.length>=4&&(r.colors=arguments[3]),Fe(t)?r.showHidden=t:t&&function(e,t){if(!t||!Ye(t))return e;var r=Object.keys(t),n=r.length;for(;n--;)e[r[n]]=t[r[n]]}(r,t),je(r.showHidden)&&(r.showHidden=!1),je(r.depth)&&(r.depth=2),je(r.colors)&&(r.colors=!1),je(r.customInspect)&&(r.customInspect=!0),r.colors&&(r.stylize=Ie),Oe(r,e,r.depth)}function Ie(e,t){var r=De.styles[t];return r?"["+De.colors[r][0]+"m"+e+"["+De.colors[r][1]+"m":e}function Pe(e,t){return e}function Oe(e,t,r){if(e.customInspect&&t&&qe(t.inspect)&&t.inspect!==De&&(!t.constructor||t.constructor.prototype!==t)){var n=t.inspect(r,e);return Ze(n)||(n=Oe(e,n,r)),n}var i=function(e,t){if(je(t))return e.stylize("undefined","undefined");if(Ze(t)){var r="'"+JSON.stringify(t).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return e.stylize(r,"string")}if(n=t,"number"==typeof n)return e.stylize(""+t,"number");var n;if(Fe(t))return e.stylize(""+t,"boolean");if(Ne(t))return e.stylize("null","null")}(e,t);if(i)return i;var o=Object.keys(t),a=function(e){var t={};return e.forEach(function(e,r){t[e]=!0}),t}(o);if(e.showHidden&&(o=Object.getOwnPropertyNames(t)),Xe(t)&&(o.indexOf("message")>=0||o.indexOf("description")>=0))return Ue(t);if(0===o.length){if(qe(t)){var s=t.name?": "+t.name:"";return e.stylize("[Function"+s+"]","special")}if(We(t))return e.stylize(RegExp.prototype.toString.call(t),"regexp");if(Ke(t))return e.stylize(Date.prototype.toString.call(t),"date");if(Xe(t))return Ue(t)}var h,l,f="",c=!1,u=["{","}"];(h=t,Array.isArray(h)&&(c=!0,u=["[","]"]),qe(t))&&(f=" [Function"+(t.name?": "+t.name:"")+"]");return We(t)&&(f=" "+RegExp.prototype.toString.call(t)),Ke(t)&&(f=" "+Date.prototype.toUTCString.call(t)),Xe(t)&&(f=" "+Ue(t)),0!==o.length||c&&0!=t.length?r<0?We(t)?e.stylize(RegExp.prototype.toString.call(t),"regexp"):e.stylize("[Object]","special"):(e.seen.push(t),l=c?function(e,t,r,n,i){for(var o=[],a=0,s=t.length;a60)return r[0]+(""===t?"":t+"\n ")+" "+e.join(",\n ")+" "+r[1];return r[0]+t+" "+e.join(", ")+" "+r[1]}(l,f,u)):u[0]+f+u[1]}function Ue(e){return"["+Error.prototype.toString.call(e)+"]"}function He(e,t,r,n,i,o){var a,s,h;if((h=Object.getOwnPropertyDescriptor(t,i)||{value:t[i]}).get?s=h.set?e.stylize("[Getter/Setter]","special"):e.stylize("[Getter]","special"):h.set&&(s=e.stylize("[Setter]","special")),Ge(n,i)||(a="["+i+"]"),s||(e.seen.indexOf(h.value)<0?(s=Ne(r)?Oe(e,h.value,null):Oe(e,h.value,r-1)).indexOf("\n")>-1&&(s=o?s.split("\n").map(function(e){return" "+e}).join("\n").substr(2):"\n"+s.split("\n").map(function(e){return" "+e}).join("\n")):s=e.stylize("[Circular]","special")),je(a)){if(o&&i.match(/^\d+$/))return s;(a=JSON.stringify(""+i)).match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(a=a.substr(1,a.length-2),a=e.stylize(a,"name")):(a=a.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),a=e.stylize(a,"string"))}return a+": "+s}function Fe(e){return"boolean"==typeof e}function Ne(e){return null===e}function Ze(e){return"string"==typeof e}function je(e){return void 0===e}function We(e){return Ye(e)&&"[object RegExp]"===Ve(e)}function Ye(e){return"object"==typeof e&&null!==e}function Ke(e){return Ye(e)&&"[object Date]"===Ve(e)}function Xe(e){return Ye(e)&&("[object Error]"===Ve(e)||e instanceof Error)}function qe(e){return"function"==typeof e}function Ve(e){return Object.prototype.toString.call(e)}function Ge(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function $e(){this.head=null,this.tail=null,this.length=0}De.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},De.styles={special:"cyan",number:"yellow",boolean:"yellow",undefined:"grey",null:"bold",string:"green",date:"magenta",regexp:"red"},$e.prototype.push=function(e){var t={data:e,next:null};this.length>0?this.tail.next=t:this.head=t,this.tail=t,++this.length},$e.prototype.unshift=function(e){var t={data:e,next:this.head};0===this.length&&(this.tail=t),this.head=t,++this.length},$e.prototype.shift=function(){if(0!==this.length){var e=this.head.data;return 1===this.length?this.head=this.tail=null:this.head=this.head.next,--this.length,e}},$e.prototype.clear=function(){this.head=this.tail=null,this.length=0},$e.prototype.join=function(e){if(0===this.length)return"";for(var t=this.head,r=""+t.data;t=t.next;)r+=e+t.data;return r},$e.prototype.concat=function(e){if(0===this.length)return p.alloc(0);if(1===this.length)return this.head.data;for(var t=p.allocUnsafe(e>>>0),r=this.head,n=0;r;)r.data.copy(t,n),n+=r.data.length,r=r.next;return t};var Je=p.isEncoding||function(e){switch(e&&e.toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":case"raw":return!0;default:return!1}};function Qe(e){switch(this.encoding=(e||"utf8").toLowerCase().replace(/[-_]/,""),function(e){if(e&&!Je(e))throw new Error("Unknown encoding: "+e)}(e),this.encoding){case"utf8":this.surrogateSize=3;break;case"ucs2":case"utf16le":this.surrogateSize=2,this.detectIncompleteChar=tt;break;case"base64":this.surrogateSize=3,this.detectIncompleteChar=rt;break;default:return void(this.write=et)}this.charBuffer=new p(6),this.charReceived=0,this.charLength=0}function et(e){return e.toString(this.encoding)}function tt(e){this.charReceived=e.length%2,this.charLength=this.charReceived?2:0}function rt(e){this.charReceived=e.length%3,this.charLength=this.charReceived?3:0}Qe.prototype.write=function(e){for(var t="";this.charLength;){var r=e.length>=this.charLength-this.charReceived?this.charLength-this.charReceived:e.length;if(e.copy(this.charBuffer,this.charReceived,0,r),this.charReceived+=r,this.charReceived=55296&&i<=56319)){if(this.charReceived=this.charLength=0,0===e.length)return t;break}this.charLength+=this.surrogateSize,t=""}this.detectIncompleteChar(e);var n=e.length;this.charLength&&(e.copy(this.charBuffer,0,e.length-this.charReceived,n),n-=this.charReceived);var i;n=(t+=e.toString(this.encoding,0,n)).length-1;if((i=t.charCodeAt(n))>=55296&&i<=56319){var o=this.surrogateSize;return this.charLength+=o,this.charReceived+=o,this.charBuffer.copy(this.charBuffer,o,0,o),e.copy(this.charBuffer,0,0,o),t.substring(0,n)}return t},Qe.prototype.detectIncompleteChar=function(e){for(var t=e.length>=3?3:e.length;t>0;t--){var r=e[e.length-t];if(1==t&&r>>5==6){this.charLength=2;break}if(t<=2&&r>>4==14){this.charLength=3;break}if(t<=3&&r>>3==30){this.charLength=4;break}}this.charReceived=t},Qe.prototype.end=function(e){var t="";if(e&&e.length&&(t=this.write(e)),this.charReceived){var r=this.charReceived,n=this.charBuffer,i=this.encoding;t+=n.slice(0,r).toString(i)}return t},ot.ReadableState=it;var nt=function(e){je(Me)&&(Me=""),e=e.toUpperCase(),Ce[e]||(new RegExp("\\b"+e+"\\b","i").test(Me)?Ce[e]=function(){var t=Le.apply(null,arguments);console.error("%s %d: %s",e,0,t)}:Ce[e]=function(){});return Ce[e]}("stream");function it(e,t){e=e||{},this.objectMode=!!e.objectMode,t instanceof Ct&&(this.objectMode=this.objectMode||!!e.readableObjectMode);var r=e.highWaterMark,n=this.objectMode?16:16384;this.highWaterMark=r||0===r?r:n,this.highWaterMark=~~this.highWaterMark,this.buffer=new $e,this.length=0,this.pipes=null,this.pipesCount=0,this.flowing=null,this.ended=!1,this.endEmitted=!1,this.reading=!1,this.sync=!0,this.needReadable=!1,this.emittedReadable=!1,this.readableListening=!1,this.resumeScheduled=!1,this.defaultEncoding=e.defaultEncoding||"utf8",this.ranOut=!1,this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,e.encoding&&(this.decoder=new Qe(e.encoding),this.encoding=e.encoding)}function ot(e){if(!(this instanceof ot))return new ot(e);this._readableState=new it(e,this),this.readable=!0,e&&"function"==typeof e.read&&(this._read=e.read),ve.call(this)}function at(e,t,r,n,i){var o=function(e,t){var r=null;$(t)||"string"==typeof t||null==t||e.objectMode||(r=new TypeError("Invalid non-string/buffer chunk"));return r}(t,r);if(o)e.emit("error",o);else if(null===r)t.reading=!1,function(e,t){if(t.ended)return;if(t.decoder){var r=t.decoder.end();r&&r.length&&(t.buffer.push(r),t.length+=t.objectMode?1:r.length)}t.ended=!0,lt(e)}(e,t);else if(t.objectMode||r&&r.length>0)if(t.ended&&!i){var a=new Error("stream.push() after EOF");e.emit("error",a)}else if(t.endEmitted&&i){var s=new Error("stream.unshift() after end event");e.emit("error",s)}else{var h;!t.decoder||i||n||(r=t.decoder.write(r),h=!t.objectMode&&0===r.length),i||(t.reading=!1),h||(t.flowing&&0===t.length&&!t.sync?(e.emit("data",r),e.read(0)):(t.length+=t.objectMode?1:r.length,i?t.buffer.unshift(r):t.buffer.push(r),t.needReadable&<(e))),function(e,t){t.readingMore||(t.readingMore=!0,de(ct,e,t))}(e,t)}else i||(t.reading=!1);return function(e){return!e.ended&&(e.needReadable||e.lengtht.highWaterMark&&(t.highWaterMark=function(e){return e>=st?e=st:(e--,e|=e>>>1,e|=e>>>2,e|=e>>>4,e|=e>>>8,e|=e>>>16,e++),e}(e)),e<=t.length?e:t.ended?t.length:(t.needReadable=!0,0))}function lt(e){var t=e._readableState;t.needReadable=!1,t.emittedReadable||(nt("emitReadable",t.flowing),t.emittedReadable=!0,t.sync?de(ft,e):ft(e))}function ft(e){nt("emit readable"),e.emit("readable"),pt(e)}function ct(e,t){for(var r=t.length;!t.reading&&!t.flowing&&!t.ended&&t.length=t.length?(r=t.decoder?t.buffer.join(""):1===t.buffer.length?t.buffer.head.data:t.buffer.concat(t.length),t.buffer.clear()):r=function(e,t,r){var n;eo.length?o.length:e;if(a===o.length?i+=o:i+=o.slice(0,e),0===(e-=a)){a===o.length?(++n,r.next?t.head=r.next:t.head=t.tail=null):(t.head=r,r.data=o.slice(a));break}++n}return t.length-=n,i}(e,t):function(e,t){var r=p.allocUnsafe(e),n=t.head,i=1;n.data.copy(r),e-=n.data.length;for(;n=n.next;){var o=n.data,a=e>o.length?o.length:e;if(o.copy(r,r.length-e,0,a),0===(e-=a)){a===o.length?(++i,n.next?t.head=n.next:t.head=t.tail=null):(t.head=n,n.data=o.slice(a));break}++i}return t.length-=i,r}(e,t);return n}(e,t.buffer,t.decoder),r);var r}function gt(e){var t=e._readableState;if(t.length>0)throw new Error('"endReadable()" called on non-empty stream');t.endEmitted||(t.ended=!0,de(vt,t,e))}function vt(e,t){e.endEmitted||0!==e.length||(e.endEmitted=!0,t.readable=!1,t.emit("end"))}function wt(e,t){for(var r=0,n=e.length;r=t.highWaterMark||t.ended))return nt("read: emitReadable",t.length,t.ended),0===t.length&&t.ended?gt(this):lt(this),null;if(0===(e=ht(e,t))&&t.ended)return 0===t.length&>(this),null;var n,i=t.needReadable;return nt("need readable",i),(0===t.length||t.length-e0?_t(e,t):null)?(t.needReadable=!0,e=0):t.length-=e,0===t.length&&(t.ended||(t.needReadable=!0),r!==e&&t.ended&>(this)),null!==n&&this.emit("data",n),n},ot.prototype._read=function(e){this.emit("error",new Error("not implemented"))},ot.prototype.pipe=function(e,t){var r=this,n=this._readableState;switch(n.pipesCount){case 0:n.pipes=e;break;case 1:n.pipes=[n.pipes,e];break;default:n.pipes.push(e)}n.pipesCount+=1,nt("pipe count=%d opts=%j",n.pipesCount,t);var i=!t||!1!==t.end?a:l;function o(e){nt("onunpipe"),e===r&&l()}function a(){nt("onend"),e.end()}n.endEmitted?de(i):r.once("end",i),e.on("unpipe",o);var s=function(e){return function(){var t=e._readableState;nt("pipeOnDrain",t.awaitDrain),t.awaitDrain&&t.awaitDrain--,0===t.awaitDrain&&e.listeners("data").length&&(t.flowing=!0,pt(e))}}(r);e.on("drain",s);var h=!1;function l(){nt("cleanup"),e.removeListener("close",d),e.removeListener("finish",p),e.removeListener("drain",s),e.removeListener("error",u),e.removeListener("unpipe",o),r.removeListener("end",a),r.removeListener("end",l),r.removeListener("data",c),h=!0,!n.awaitDrain||e._writableState&&!e._writableState.needDrain||s()}var f=!1;function c(t){nt("ondata"),f=!1,!1!==e.write(t)||f||((1===n.pipesCount&&n.pipes===e||n.pipesCount>1&&-1!==wt(n.pipes,e))&&!h&&(nt("false write response, pause",r._readableState.awaitDrain),r._readableState.awaitDrain++,f=!0),r.pause())}function u(t){var r;nt("onerror",t),_(),e.removeListener("error",u),0===(r="error",e.listeners(r).length)&&e.emit("error",t)}function d(){e.removeListener("finish",p),_()}function p(){nt("onfinish"),e.removeListener("close",d),_()}function _(){nt("unpipe"),r.unpipe(e)}return r.on("data",c),function(e,t,r){if("function"==typeof e.prependListener)return e.prependListener(t,r);e._events&&e._events[t]?Array.isArray(e._events[t])?e._events[t].unshift(r):e._events[t]=[r,e._events[t]]:e.on(t,r)}(e,"error",u),e.once("close",d),e.once("finish",p),e.emit("pipe",r),n.flowing||(nt("pipe resume"),r.resume()),e},ot.prototype.unpipe=function(e){var t=this._readableState;if(0===t.pipesCount)return this;if(1===t.pipesCount)return e&&e!==t.pipes?this:(e||(e=t.pipes),t.pipes=null,t.pipesCount=0,t.flowing=!1,e&&e.emit("unpipe",this),this);if(!e){var r=t.pipes,n=t.pipesCount;t.pipes=null,t.pipesCount=0,t.flowing=!1;for(var i=0;i-1))throw new TypeError("Unknown encoding: "+e);return this._writableState.defaultEncoding=e,this},kt.prototype._write=function(e,t,r){r(new Error("not implemented"))},kt.prototype._writev=null,kt.prototype.end=function(e,t,r){var n=this._writableState;"function"==typeof e?(r=e,e=null,t=null):"function"==typeof t&&(r=t,t=null),null!=e&&this.write(e,t),n.corked&&(n.corked=1,this.uncork()),n.ending||n.finished||function(e,t,r){t.ending=!0,Bt(e,t),r&&(t.finished?de(r):e.once("finish",r));t.ended=!0,e.writable=!1}(this,n,r)},Be(Ct,ot);for(var Lt=Object.keys(kt.prototype),Tt=0;Tt=0;)e[t]=0}var Jt=0,Qt=1,er=2,tr=29,rr=256,nr=rr+1+tr,ir=30,or=19,ar=2*nr+1,sr=15,hr=16,lr=7,fr=256,cr=16,ur=17,dr=18,pr=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],_r=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],gr=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],vr=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],wr=new Array(2*(nr+2));$t(wr);var br=new Array(2*ir);$t(br);var yr=new Array(512);$t(yr);var mr=new Array(256);$t(mr);var kr=new Array(tr);$t(kr);var Er,Sr,xr,Rr=new Array(ir);function Ar(e,t,r,n,i){this.static_tree=e,this.extra_bits=t,this.extra_base=r,this.elems=n,this.max_length=i,this.has_stree=e&&e.length}function Br(e,t){this.dyn_tree=e,this.max_code=0,this.stat_desc=t}function zr(e){return e<256?yr[e]:yr[256+(e>>>7)]}function Lr(e,t){e.pending_buf[e.pending++]=255&t,e.pending_buf[e.pending++]=t>>>8&255}function Tr(e,t,r){e.bi_valid>hr-r?(e.bi_buf|=t<>hr-e.bi_valid,e.bi_valid+=r-hr):(e.bi_buf|=t<>>=1,r<<=1}while(--t>0);return r>>>1}function Dr(e,t,r){var n,i,o=new Array(sr+1),a=0;for(n=1;n<=sr;n++)o[n]=a=a+r[n-1]<<1;for(i=0;i<=t;i++){var s=e[2*i+1];0!==s&&(e[2*i]=Cr(o[s]++,s))}}function Ir(e){var t;for(t=0;t8?Lr(e,e.bi_buf):e.bi_valid>0&&(e.pending_buf[e.pending++]=e.bi_buf),e.bi_buf=0,e.bi_valid=0}function Or(e,t,r,n){var i=2*t,o=2*r;return e[i]>1;r>=1;r--)Ur(e,o,r);i=h;do{r=e.heap[1],e.heap[1]=e.heap[e.heap_len--],Ur(e,o,1),n=e.heap[1],e.heap[--e.heap_max]=r,e.heap[--e.heap_max]=n,o[2*i]=o[2*r]+o[2*n],e.depth[i]=(e.depth[r]>=e.depth[n]?e.depth[r]:e.depth[n])+1,o[2*r+1]=o[2*n+1]=i,e.heap[1]=i++,Ur(e,o,1)}while(e.heap_len>=2);e.heap[--e.heap_max]=e.heap[1],function(e,t){var r,n,i,o,a,s,h=t.dyn_tree,l=t.max_code,f=t.stat_desc.static_tree,c=t.stat_desc.has_stree,u=t.stat_desc.extra_bits,d=t.stat_desc.extra_base,p=t.stat_desc.max_length,_=0;for(o=0;o<=sr;o++)e.bl_count[o]=0;for(h[2*e.heap[e.heap_max]+1]=0,r=e.heap_max+1;rp&&(o=p,_++),h[2*n+1]=o,n>l||(e.bl_count[o]++,a=0,n>=d&&(a=u[n-d]),s=h[2*n],e.opt_len+=s*(o+a),c&&(e.static_len+=s*(f[2*n+1]+a)));if(0!==_){do{for(o=p-1;0===e.bl_count[o];)o--;e.bl_count[o]--,e.bl_count[o+1]+=2,e.bl_count[p]--,_-=2}while(_>0);for(o=p;0!==o;o--)for(n=e.bl_count[o];0!==n;)(i=e.heap[--r])>l||(h[2*i+1]!==o&&(e.opt_len+=(o-h[2*i+1])*h[2*i],h[2*i+1]=o),n--)}}(e,t),Dr(o,l,e.bl_count)}function Nr(e,t,r){var n,i,o=-1,a=t[1],s=0,h=7,l=4;for(0===a&&(h=138,l=3),t[2*(r+1)+1]=65535,n=0;n<=r;n++)i=a,a=t[2*(n+1)+1],++s>=7;n=8&&(e.pending_buf[e.pending++]=255&e.bi_buf,e.bi_buf>>=8,e.bi_valid-=8)}(e)}function Xr(e,t,r,n){var i,o,a=0;e.level>0?(e.strm.data_type===Gt&&(e.strm.data_type=function(e){var t,r=4093624447;for(t=0;t<=31;t++,r>>>=1)if(1&r&&0!==e.dyn_ltree[2*t])return qt;if(0!==e.dyn_ltree[18]||0!==e.dyn_ltree[20]||0!==e.dyn_ltree[26])return Vt;for(t=32;t=3&&0===e.bl_tree[2*vr[t]+1];t--);return e.opt_len+=3*(t+1)+5+5+4,t}(e),i=e.opt_len+3+7>>>3,(o=e.static_len+3+7>>>3)<=i&&(i=o)):i=o=r+5,r+4<=i&&-1!==t?Yr(e,t,r,n):e.strategy===Xt||o===i?(Tr(e,(Qt<<1)+(n?1:0),3),Hr(e,wr,br)):(Tr(e,(er<<1)+(n?1:0),3),function(e,t,r,n){var i;for(Tr(e,t-257,5),Tr(e,r-1,5),Tr(e,n-4,4),i=0;i>>8&255,e.pending_buf[e.d_buf+2*e.last_lit+1]=255&t,e.pending_buf[e.l_buf+e.last_lit]=255&r,e.last_lit++,0===t?e.dyn_ltree[2*r]++:(e.matches++,t--,e.dyn_ltree[2*(mr[r]+rr+1)]++,e.dyn_dtree[2*zr(t)]++),e.last_lit===e.lit_bufsize-1}function Vr(e,t,r,n){for(var i=65535&e|0,o=e>>>16&65535|0,a=0;0!==r;){r-=a=r>2e3?2e3:r;do{o=o+(i=i+t[n++]|0)|0}while(--a);i%=65521,o%=65521}return i|o<<16|0}var Gr=function(){for(var e,t=[],r=0;r<256;r++){e=r;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[r]=e}return t}();function $r(e,t,r,n){var i=Gr,o=n+r;e^=-1;for(var a=n;a>>8^i[255&(e^t[a])];return-1^e}var Jr,Qr=0,en=1,tn=3,rn=4,nn=5,on=0,an=1,sn=-2,hn=-3,ln=-5,fn=-1,cn=1,un=2,dn=3,pn=4,_n=2,gn=8,vn=9,wn=286,bn=30,yn=19,mn=2*wn+1,kn=15,En=3,Sn=258,xn=Sn+En+1,Rn=32,An=42,Bn=69,zn=73,Ln=91,Tn=103,Mn=113,Cn=666,Dn=1,In=2,Pn=3,On=4,Un=3;function Hn(e,t){return e.msg=Nt[t],t}function Fn(e){return(e<<1)-(e>4?9:0)}function Nn(e){for(var t=e.length;--t>=0;)e[t]=0}function Zn(e){var t=e.state,r=t.pending;r>e.avail_out&&(r=e.avail_out),0!==r&&(jt(e.output,t.pending_buf,t.pending_out,r,e.next_out),e.next_out+=r,t.pending_out+=r,e.total_out+=r,e.avail_out-=r,t.pending-=r,0===t.pending&&(t.pending_out=0))}function jn(e,t){Xr(e,e.block_start>=0?e.block_start:-1,e.strstart-e.block_start,t),e.block_start=e.strstart,Zn(e.strm)}function Wn(e,t){e.pending_buf[e.pending++]=t}function Yn(e,t){e.pending_buf[e.pending++]=t>>>8&255,e.pending_buf[e.pending++]=255&t}function Kn(e,t){var r,n,i=e.max_chain_length,o=e.strstart,a=e.prev_length,s=e.nice_match,h=e.strstart>e.w_size-xn?e.strstart-(e.w_size-xn):0,l=e.window,f=e.w_mask,c=e.prev,u=e.strstart+Sn,d=l[o+a-1],p=l[o+a];e.prev_length>=e.good_match&&(i>>=2),s>e.lookahead&&(s=e.lookahead);do{if(l[(r=t)+a]===p&&l[r+a-1]===d&&l[r]===l[o]&&l[++r]===l[o+1]){o+=2,r++;do{}while(l[++o]===l[++r]&&l[++o]===l[++r]&&l[++o]===l[++r]&&l[++o]===l[++r]&&l[++o]===l[++r]&&l[++o]===l[++r]&&l[++o]===l[++r]&&l[++o]===l[++r]&&oa){if(e.match_start=t,a=n,n>=s)break;d=l[o+a-1],p=l[o+a]}}}while((t=c[t&f])>h&&0!=--i);return a<=e.lookahead?a:e.lookahead}function Xn(e){var t,r,n,i,o,a,s,h,l,f,c=e.w_size;do{if(i=e.window_size-e.lookahead-e.strstart,e.strstart>=c+(c-xn)){jt(e.window,e.window,c,c,0),e.match_start-=c,e.strstart-=c,e.block_start-=c,t=r=e.hash_size;do{n=e.head[--t],e.head[t]=n>=c?n-c:0}while(--r);t=r=c;do{n=e.prev[--t],e.prev[t]=n>=c?n-c:0}while(--r);i+=c}if(0===e.strm.avail_in)break;if(a=e.strm,s=e.window,h=e.strstart+e.lookahead,l=i,f=void 0,(f=a.avail_in)>l&&(f=l),r=0===f?0:(a.avail_in-=f,jt(s,a.input,a.next_in,f,h),1===a.state.wrap?a.adler=Vr(a.adler,s,f,h):2===a.state.wrap&&(a.adler=$r(a.adler,s,f,h)),a.next_in+=f,a.total_in+=f,f),e.lookahead+=r,e.lookahead+e.insert>=En)for(o=e.strstart-e.insert,e.ins_h=e.window[o],e.ins_h=(e.ins_h<=En&&(e.ins_h=(e.ins_h<=En)if(n=qr(e,e.strstart-e.match_start,e.match_length-En),e.lookahead-=e.match_length,e.match_length<=e.max_lazy_match&&e.lookahead>=En){e.match_length--;do{e.strstart++,e.ins_h=(e.ins_h<=En&&(e.ins_h=(e.ins_h<4096)&&(e.match_length=En-1)),e.prev_length>=En&&e.match_length<=e.prev_length){i=e.strstart+e.lookahead-En,n=qr(e,e.strstart-1-e.prev_match,e.prev_length-En),e.lookahead-=e.prev_length-1,e.prev_length-=2;do{++e.strstart<=i&&(e.ins_h=(e.ins_h<nn||t<0)return e?Hn(e,sn):sn;if(n=e.state,!e.output||!e.input&&0!==e.avail_in||n.status===Cn&&t!==rn)return Hn(e,0===e.avail_out?ln:sn);if(n.strm=e,r=n.last_flush,n.last_flush=t,n.status===An)if(2===n.wrap)e.adler=0,Wn(n,31),Wn(n,139),Wn(n,8),n.gzhead?(Wn(n,(n.gzhead.text?1:0)+(n.gzhead.hcrc?2:0)+(n.gzhead.extra?4:0)+(n.gzhead.name?8:0)+(n.gzhead.comment?16:0)),Wn(n,255&n.gzhead.time),Wn(n,n.gzhead.time>>8&255),Wn(n,n.gzhead.time>>16&255),Wn(n,n.gzhead.time>>24&255),Wn(n,9===n.level?2:n.strategy>=un||n.level<2?4:0),Wn(n,255&n.gzhead.os),n.gzhead.extra&&n.gzhead.extra.length&&(Wn(n,255&n.gzhead.extra.length),Wn(n,n.gzhead.extra.length>>8&255)),n.gzhead.hcrc&&(e.adler=$r(e.adler,n.pending_buf,n.pending,0)),n.gzindex=0,n.status=Bn):(Wn(n,0),Wn(n,0),Wn(n,0),Wn(n,0),Wn(n,0),Wn(n,9===n.level?2:n.strategy>=un||n.level<2?4:0),Wn(n,Un),n.status=Mn);else{var a=gn+(n.w_bits-8<<4)<<8;a|=(n.strategy>=un||n.level<2?0:n.level<6?1:6===n.level?2:3)<<6,0!==n.strstart&&(a|=Rn),a+=31-a%31,n.status=Mn,Yn(n,a),0!==n.strstart&&(Yn(n,e.adler>>>16),Yn(n,65535&e.adler)),e.adler=1}if(n.status===Bn)if(n.gzhead.extra){for(i=n.pending;n.gzindex<(65535&n.gzhead.extra.length)&&(n.pending!==n.pending_buf_size||(n.gzhead.hcrc&&n.pending>i&&(e.adler=$r(e.adler,n.pending_buf,n.pending-i,i)),Zn(e),i=n.pending,n.pending!==n.pending_buf_size));)Wn(n,255&n.gzhead.extra[n.gzindex]),n.gzindex++;n.gzhead.hcrc&&n.pending>i&&(e.adler=$r(e.adler,n.pending_buf,n.pending-i,i)),n.gzindex===n.gzhead.extra.length&&(n.gzindex=0,n.status=zn)}else n.status=zn;if(n.status===zn)if(n.gzhead.name){i=n.pending;do{if(n.pending===n.pending_buf_size&&(n.gzhead.hcrc&&n.pending>i&&(e.adler=$r(e.adler,n.pending_buf,n.pending-i,i)),Zn(e),i=n.pending,n.pending===n.pending_buf_size)){o=1;break}o=n.gzindexi&&(e.adler=$r(e.adler,n.pending_buf,n.pending-i,i)),0===o&&(n.gzindex=0,n.status=Ln)}else n.status=Ln;if(n.status===Ln)if(n.gzhead.comment){i=n.pending;do{if(n.pending===n.pending_buf_size&&(n.gzhead.hcrc&&n.pending>i&&(e.adler=$r(e.adler,n.pending_buf,n.pending-i,i)),Zn(e),i=n.pending,n.pending===n.pending_buf_size)){o=1;break}o=n.gzindexi&&(e.adler=$r(e.adler,n.pending_buf,n.pending-i,i)),0===o&&(n.status=Tn)}else n.status=Tn;if(n.status===Tn&&(n.gzhead.hcrc?(n.pending+2>n.pending_buf_size&&Zn(e),n.pending+2<=n.pending_buf_size&&(Wn(n,255&e.adler),Wn(n,e.adler>>8&255),e.adler=0,n.status=Mn)):n.status=Mn),0!==n.pending){if(Zn(e),0===e.avail_out)return n.last_flush=-1,on}else if(0===e.avail_in&&Fn(t)<=Fn(r)&&t!==rn)return Hn(e,ln);if(n.status===Cn&&0!==e.avail_in)return Hn(e,ln);if(0!==e.avail_in||0!==n.lookahead||t!==Qr&&n.status!==Cn){var s=n.strategy===un?function(e,t){for(var r;;){if(0===e.lookahead&&(Xn(e),0===e.lookahead)){if(t===Qr)return Dn;break}if(e.match_length=0,r=qr(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++,r&&(jn(e,!1),0===e.strm.avail_out))return Dn}return e.insert=0,t===rn?(jn(e,!0),0===e.strm.avail_out?Pn:On):e.last_lit&&(jn(e,!1),0===e.strm.avail_out)?Dn:In}(n,t):n.strategy===dn?function(e,t){for(var r,n,i,o,a=e.window;;){if(e.lookahead<=Sn){if(Xn(e),e.lookahead<=Sn&&t===Qr)return Dn;if(0===e.lookahead)break}if(e.match_length=0,e.lookahead>=En&&e.strstart>0&&(n=a[i=e.strstart-1])===a[++i]&&n===a[++i]&&n===a[++i]){o=e.strstart+Sn;do{}while(n===a[++i]&&n===a[++i]&&n===a[++i]&&n===a[++i]&&n===a[++i]&&n===a[++i]&&n===a[++i]&&n===a[++i]&&ie.lookahead&&(e.match_length=e.lookahead)}if(e.match_length>=En?(r=qr(e,1,e.match_length-En),e.lookahead-=e.match_length,e.strstart+=e.match_length,e.match_length=0):(r=qr(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++),r&&(jn(e,!1),0===e.strm.avail_out))return Dn}return e.insert=0,t===rn?(jn(e,!0),0===e.strm.avail_out?Pn:On):e.last_lit&&(jn(e,!1),0===e.strm.avail_out)?Dn:In}(n,t):Jr[n.level].func(n,t);if(s!==Pn&&s!==On||(n.status=Cn),s===Dn||s===Pn)return 0===e.avail_out&&(n.last_flush=-1),on;if(s===In&&(t===en?Kr(n):t!==nn&&(Yr(n,0,0,!1),t===tn&&(Nn(n.head),0===n.lookahead&&(n.strstart=0,n.block_start=0,n.insert=0))),Zn(e),0===e.avail_out))return n.last_flush=-1,on}return t!==rn?on:n.wrap<=0?an:(2===n.wrap?(Wn(n,255&e.adler),Wn(n,e.adler>>8&255),Wn(n,e.adler>>16&255),Wn(n,e.adler>>24&255),Wn(n,255&e.total_in),Wn(n,e.total_in>>8&255),Wn(n,e.total_in>>16&255),Wn(n,e.total_in>>24&255)):(Yn(n,e.adler>>>16),Yn(n,65535&e.adler)),Zn(e),n.wrap>0&&(n.wrap=-n.wrap),0!==n.pending?on:an)}Jr=[new Gn(0,0,0,0,function(e,t){var r=65535;for(r>e.pending_buf_size-5&&(r=e.pending_buf_size-5);;){if(e.lookahead<=1){if(Xn(e),0===e.lookahead&&t===Qr)return Dn;if(0===e.lookahead)break}e.strstart+=e.lookahead,e.lookahead=0;var n=e.block_start+r;if((0===e.strstart||e.strstart>=n)&&(e.lookahead=e.strstart-n,e.strstart=n,jn(e,!1),0===e.strm.avail_out))return Dn;if(e.strstart-e.block_start>=e.w_size-xn&&(jn(e,!1),0===e.strm.avail_out))return Dn}return e.insert=0,t===rn?(jn(e,!0),0===e.strm.avail_out?Pn:On):(e.strstart>e.block_start&&(jn(e,!1),e.strm.avail_out),Dn)}),new Gn(4,4,8,4,qn),new Gn(4,5,16,8,qn),new Gn(4,6,32,32,qn),new Gn(4,4,16,16,Vn),new Gn(8,16,32,32,Vn),new Gn(8,16,128,128,Vn),new Gn(8,32,128,256,Vn),new Gn(32,128,258,1024,Vn),new Gn(32,258,258,4096,Vn)];var ei=30,ti=12;function ri(e,t){var r,n,i,o,a,s,h,l,f,c,u,d,p,_,g,v,w,b,y,m,k,E,S,x,R;r=e.state,n=e.next_in,x=e.input,i=n+(e.avail_in-5),o=e.next_out,R=e.output,a=o-(t-e.avail_out),s=o+(e.avail_out-257),h=r.dmax,l=r.wsize,f=r.whave,c=r.wnext,u=r.window,d=r.hold,p=r.bits,_=r.lencode,g=r.distcode,v=(1<>>=y=b>>>24,p-=y,0===(y=b>>>16&255))R[o++]=65535&b;else{if(!(16&y)){if(0==(64&y)){b=_[(65535&b)+(d&(1<>>=y,p-=y),p<15&&(d+=x[n++]<>>=y=b>>>24,p-=y,!(16&(y=b>>>16&255))){if(0==(64&y)){b=g[(65535&b)+(d&(1<h){e.msg="invalid distance too far back",r.mode=ei;break e}if(d>>>=y,p-=y,k>(y=o-a)){if((y=k-y)>f&&r.sane){e.msg="invalid distance too far back",r.mode=ei;break e}if(E=0,S=u,0===c){if(E+=l-y,y2;)R[o++]=S[E++],R[o++]=S[E++],R[o++]=S[E++],m-=3;m&&(R[o++]=S[E++],m>1&&(R[o++]=S[E++]))}else{E=o-k;do{R[o++]=R[E++],R[o++]=R[E++],R[o++]=R[E++],m-=3}while(m>2);m&&(R[o++]=R[E++],m>1&&(R[o++]=R[E++]))}break}}break}}while(n>3,d&=(1<<(p-=m<<3))-1,e.next_in=n,e.next_out=o,e.avail_in=n=1&&0===L[m];m--);if(k>m&&(k=m),0===m)return i[o++]=20971520,i[o++]=20971520,s.bits=1,0;for(y=1;y0&&(e===ai||1!==m))return-1;for(T[1]=0,w=1;wii||e===hi&&R>oi)return 1;for(;;){p=w-S,a[b]d?(_=M[C+a[b]],g=B[z+a[b]]):(_=96,g=0),h=1<>S)+(l-=h)]=p<<24|_<<16|g|0}while(0!==l);for(h=1<>=1;if(0!==h?(A&=h-1,A+=h):A=0,b++,0==--L[w]){if(w===m)break;w=t[r+a[b]]}if(w>k&&(A&c)!==f){for(0===S&&(S=k),u+=y,x=1<<(E=w-S);E+Sii||e===hi&&R>oi)return 1;i[f=A&c]=k<<24|E<<16|u-o|0}}return 0!==A&&(i[u+A]=w-S<<24|64<<16|0),s.bits=k,0}var pi=0,_i=1,gi=2,vi=4,wi=5,bi=6,yi=0,mi=1,ki=2,Ei=-2,Si=-3,xi=-4,Ri=-5,Ai=8,Bi=1,zi=2,Li=3,Ti=4,Mi=5,Ci=6,Di=7,Ii=8,Pi=9,Oi=10,Ui=11,Hi=12,Fi=13,Ni=14,Zi=15,ji=16,Wi=17,Yi=18,Ki=19,Xi=20,qi=21,Vi=22,Gi=23,$i=24,Ji=25,Qi=26,eo=27,to=28,ro=29,no=30,io=31,oo=32,ao=852,so=592;function ho(e){return(e>>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24)}function lo(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new Yt(320),this.work=new Yt(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function fo(e){var t;return e&&e.state?((t=e.state).wsize=0,t.whave=0,t.wnext=0,function(e){var t;return e&&e.state?(t=e.state,e.total_in=e.total_out=t.total=0,e.msg="",t.wrap&&(e.adler=1&t.wrap),t.mode=Bi,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new Kt(ao),t.distcode=t.distdyn=new Kt(so),t.sane=1,t.back=-1,yi):Ei}(e)):Ei}function co(e,t){var r,n;return e?(n=new lo,e.state=n,n.window=null,(r=function(e,t){var r,n;return e&&e.state?(n=e.state,t<0?(r=0,t=-t):(r=1+(t>>4),t<48&&(t&=15)),t&&(t<8||t>15)?Ei:(null!==n.window&&n.wbits!==t&&(n.window=null),n.wrap=r,n.wbits=t,fo(e))):Ei}(e,t))!==yi&&(e.state=null),r):Ei}var uo,po,_o=!0;function go(e){if(_o){var t;for(uo=new Kt(512),po=new Kt(32),t=0;t<144;)e.lens[t++]=8;for(;t<256;)e.lens[t++]=9;for(;t<280;)e.lens[t++]=7;for(;t<288;)e.lens[t++]=8;for(di(_i,e.lens,0,288,uo,0,e.work,{bits:9}),t=0;t<32;)e.lens[t++]=5;di(gi,e.lens,0,32,po,0,e.work,{bits:5}),_o=!1}e.lencode=uo,e.lenbits=9,e.distcode=po,e.distbits=5}function vo(e,t){var r,n,i,o,a,s,h,l,f,c,u,d,p,_,g,v,w,b,y,m,k,E,S,x,R=0,A=new Wt(4),B=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];if(!e||!e.state||!e.output||!e.input&&0!==e.avail_in)return Ei;(r=e.state).mode===Hi&&(r.mode=Fi),a=e.next_out,i=e.output,h=e.avail_out,o=e.next_in,n=e.input,s=e.avail_in,l=r.hold,f=r.bits,c=s,u=h,E=yi;e:for(;;)switch(r.mode){case Bi:if(0===r.wrap){r.mode=Fi;break}for(;f<16;){if(0===s)break e;s--,l+=n[o++]<>>8&255,r.check=$r(r.check,A,2,0),l=0,f=0,r.mode=zi;break}if(r.flags=0,r.head&&(r.head.done=!1),!(1&r.wrap)||(((255&l)<<8)+(l>>8))%31){e.msg="incorrect header check",r.mode=no;break}if((15&l)!==Ai){e.msg="unknown compression method",r.mode=no;break}if(f-=4,k=8+(15&(l>>>=4)),0===r.wbits)r.wbits=k;else if(k>r.wbits){e.msg="invalid window size",r.mode=no;break}r.dmax=1<>8&1),512&r.flags&&(A[0]=255&l,A[1]=l>>>8&255,r.check=$r(r.check,A,2,0)),l=0,f=0,r.mode=Li;case Li:for(;f<32;){if(0===s)break e;s--,l+=n[o++]<>>8&255,A[2]=l>>>16&255,A[3]=l>>>24&255,r.check=$r(r.check,A,4,0)),l=0,f=0,r.mode=Ti;case Ti:for(;f<16;){if(0===s)break e;s--,l+=n[o++]<>8),512&r.flags&&(A[0]=255&l,A[1]=l>>>8&255,r.check=$r(r.check,A,2,0)),l=0,f=0,r.mode=Mi;case Mi:if(1024&r.flags){for(;f<16;){if(0===s)break e;s--,l+=n[o++]<>>8&255,r.check=$r(r.check,A,2,0)),l=0,f=0}else r.head&&(r.head.extra=null);r.mode=Ci;case Ci:if(1024&r.flags&&((d=r.length)>s&&(d=s),d&&(r.head&&(k=r.head.extra_len-r.length,r.head.extra||(r.head.extra=new Array(r.head.extra_len)),jt(r.head.extra,n,o,d,k)),512&r.flags&&(r.check=$r(r.check,n,d,o)),s-=d,o+=d,r.length-=d),r.length))break e;r.length=0,r.mode=Di;case Di:if(2048&r.flags){if(0===s)break e;d=0;do{k=n[o+d++],r.head&&k&&r.length<65536&&(r.head.name+=String.fromCharCode(k))}while(k&&d>9&1,r.head.done=!0),e.adler=r.check=0,r.mode=Hi;break;case Oi:for(;f<32;){if(0===s)break e;s--,l+=n[o++]<>>=7&f,f-=7&f,r.mode=eo;break}for(;f<3;){if(0===s)break e;s--,l+=n[o++]<>>=1)){case 0:r.mode=Ni;break;case 1:if(go(r),r.mode=Xi,t===bi){l>>>=2,f-=2;break e}break;case 2:r.mode=Wi;break;case 3:e.msg="invalid block type",r.mode=no}l>>>=2,f-=2;break;case Ni:for(l>>>=7&f,f-=7&f;f<32;){if(0===s)break e;s--,l+=n[o++]<>>16^65535)){e.msg="invalid stored block lengths",r.mode=no;break}if(r.length=65535&l,l=0,f=0,r.mode=Zi,t===bi)break e;case Zi:r.mode=ji;case ji:if(d=r.length){if(d>s&&(d=s),d>h&&(d=h),0===d)break e;jt(i,n,o,d,a),s-=d,o+=d,h-=d,a+=d,r.length-=d;break}r.mode=Hi;break;case Wi:for(;f<14;){if(0===s)break e;s--,l+=n[o++]<>>=5,f-=5,r.ndist=1+(31&l),l>>>=5,f-=5,r.ncode=4+(15&l),l>>>=4,f-=4,r.nlen>286||r.ndist>30){e.msg="too many length or distance symbols",r.mode=no;break}r.have=0,r.mode=Yi;case Yi:for(;r.have>>=3,f-=3}for(;r.have<19;)r.lens[B[r.have++]]=0;if(r.lencode=r.lendyn,r.lenbits=7,S={bits:r.lenbits},E=di(pi,r.lens,0,19,r.lencode,0,r.work,S),r.lenbits=S.bits,E){e.msg="invalid code lengths set",r.mode=no;break}r.have=0,r.mode=Ki;case Ki:for(;r.have>>16&255,w=65535&R,!((g=R>>>24)<=f);){if(0===s)break e;s--,l+=n[o++]<>>=g,f-=g,r.lens[r.have++]=w;else{if(16===w){for(x=g+2;f>>=g,f-=g,0===r.have){e.msg="invalid bit length repeat",r.mode=no;break}k=r.lens[r.have-1],d=3+(3&l),l>>>=2,f-=2}else if(17===w){for(x=g+3;f>>=g)),l>>>=3,f-=3}else{for(x=g+7;f>>=g)),l>>>=7,f-=7}if(r.have+d>r.nlen+r.ndist){e.msg="invalid bit length repeat",r.mode=no;break}for(;d--;)r.lens[r.have++]=k}}if(r.mode===no)break;if(0===r.lens[256]){e.msg="invalid code -- missing end-of-block",r.mode=no;break}if(r.lenbits=9,S={bits:r.lenbits},E=di(_i,r.lens,0,r.nlen,r.lencode,0,r.work,S),r.lenbits=S.bits,E){e.msg="invalid literal/lengths set",r.mode=no;break}if(r.distbits=6,r.distcode=r.distdyn,S={bits:r.distbits},E=di(gi,r.lens,r.nlen,r.ndist,r.distcode,0,r.work,S),r.distbits=S.bits,E){e.msg="invalid distances set",r.mode=no;break}if(r.mode=Xi,t===bi)break e;case Xi:r.mode=qi;case qi:if(s>=6&&h>=258){e.next_out=a,e.avail_out=h,e.next_in=o,e.avail_in=s,r.hold=l,r.bits=f,ri(e,u),a=e.next_out,i=e.output,h=e.avail_out,o=e.next_in,n=e.input,s=e.avail_in,l=r.hold,f=r.bits,r.mode===Hi&&(r.back=-1);break}for(r.back=0;v=(R=r.lencode[l&(1<>>16&255,w=65535&R,!((g=R>>>24)<=f);){if(0===s)break e;s--,l+=n[o++]<>b)])>>>16&255,w=65535&R,!(b+(g=R>>>24)<=f);){if(0===s)break e;s--,l+=n[o++]<>>=b,f-=b,r.back+=b}if(l>>>=g,f-=g,r.back+=g,r.length=w,0===v){r.mode=Qi;break}if(32&v){r.back=-1,r.mode=Hi;break}if(64&v){e.msg="invalid literal/length code",r.mode=no;break}r.extra=15&v,r.mode=Vi;case Vi:if(r.extra){for(x=r.extra;f>>=r.extra,f-=r.extra,r.back+=r.extra}r.was=r.length,r.mode=Gi;case Gi:for(;v=(R=r.distcode[l&(1<>>16&255,w=65535&R,!((g=R>>>24)<=f);){if(0===s)break e;s--,l+=n[o++]<>b)])>>>16&255,w=65535&R,!(b+(g=R>>>24)<=f);){if(0===s)break e;s--,l+=n[o++]<>>=b,f-=b,r.back+=b}if(l>>>=g,f-=g,r.back+=g,64&v){e.msg="invalid distance code",r.mode=no;break}r.offset=w,r.extra=15&v,r.mode=$i;case $i:if(r.extra){for(x=r.extra;f>>=r.extra,f-=r.extra,r.back+=r.extra}if(r.offset>r.dmax){e.msg="invalid distance too far back",r.mode=no;break}r.mode=Ji;case Ji:if(0===h)break e;if(d=u-h,r.offset>d){if((d=r.offset-d)>r.whave&&r.sane){e.msg="invalid distance too far back",r.mode=no;break}d>r.wnext?(d-=r.wnext,p=r.wsize-d):p=r.wnext-d,d>r.length&&(d=r.length),_=r.window}else _=i,p=a-r.offset,d=r.length;d>h&&(d=h),h-=d,r.length-=d;do{i[a++]=_[p++]}while(--d);0===r.length&&(r.mode=qi);break;case Qi:if(0===h)break e;i[a++]=r.length,h--,r.mode=qi;break;case eo:if(r.wrap){for(;f<32;){if(0===s)break e;s--,l|=n[o++]<=o.wsize?(jt(o.window,t,r-o.wsize,o.wsize,0),o.wnext=0,o.whave=o.wsize):((i=o.wsize-o.wnext)>n&&(i=n),jt(o.window,t,r-n,i,o.wnext),(n-=i)?(jt(o.window,t,r-n,n,0),o.wnext=n,o.whave=o.wsize):(o.wnext+=i,o.wnext===o.wsize&&(o.wnext=0),o.whaveyo)throw new TypeError("Bad argument");this.mode=e,this.init_done=!1,this.write_in_progress=!1,this.pending_close=!1,this.windowBits=0,this.level=0,this.memLevel=0,this.strategy=0,this.dictionary=null}function ko(e,t){for(var r=0;r15&&(a=2,n-=16),i<1||i>vn||r!==gn||n<8||n>15||t<0||t>9||o<0||o>pn)return Hn(e,sn);8===n&&(n=9);var s=new $n;return e.state=s,s.strm=e,s.wrap=a,s.gzhead=null,s.w_bits=n,s.w_size=1<So.Z_MAX_CHUNK))throw new Error("Invalid chunk size: "+e.chunkSize);if(e.windowBits&&(e.windowBitsSo.Z_MAX_WINDOWBITS))throw new Error("Invalid windowBits: "+e.windowBits);if(e.level&&(e.levelSo.Z_MAX_LEVEL))throw new Error("Invalid compression level: "+e.level);if(e.memLevel&&(e.memLevelSo.Z_MAX_MEMLEVEL))throw new Error("Invalid memLevel: "+e.memLevel);if(e.strategy&&e.strategy!=So.Z_FILTERED&&e.strategy!=So.Z_HUFFMAN_ONLY&&e.strategy!=So.Z_RLE&&e.strategy!=So.Z_FIXED&&e.strategy!=So.Z_DEFAULT_STRATEGY)throw new Error("Invalid strategy: "+e.strategy);if(e.dictionary&&!$(e.dictionary))throw new Error("Invalid dictionary: it should be a Buffer instance");this._binding=new So.Zlib(t);var r=this;this._hadError=!1,this._binding.onerror=function(e,t){r._binding=null,r._hadError=!0;var n=new Error(e);n.errno=t,n.code=So.codes[t],r.emit("error",n)};var n=So.Z_DEFAULT_COMPRESSION;"number"==typeof e.level&&(n=e.level);var i=So.Z_DEFAULT_STRATEGY;"number"==typeof e.strategy&&(i=e.strategy),this._binding.init(e.windowBits||So.Z_DEFAULT_WINDOWBITS,n,e.memLevel||So.Z_DEFAULT_MEMLEVEL,i,e.dictionary),this._buffer=new p(this._chunkSize),this._offset=0,this._closed=!1,this._level=n,this._strategy=i,this.once("end",this.close)}Object.keys(xo).forEach(function(e){xo[xo[e]]=e}),Be(Io,Ot),Io.prototype.params=function(e,t,r){if(eSo.Z_MAX_LEVEL)throw new RangeError("Invalid compression level: "+e);if(t!=So.Z_FILTERED&&t!=So.Z_HUFFMAN_ONLY&&t!=So.Z_RLE&&t!=So.Z_FIXED&&t!=So.Z_DEFAULT_STRATEGY)throw new TypeError("Invalid strategy: "+t);if(this._level!==e||this._strategy!==t){var n=this;this.flush(So.Z_SYNC_FLUSH,function(){n._binding.params(e,t),n._hadError||(n._level=e,n._strategy=t,r&&r())})}else de(r)},Io.prototype.reset=function(){return this._binding.reset()},Io.prototype._flush=function(e){this._transform(new p(0),"",e)},Io.prototype.flush=function(e,t){var r=this._writableState;if(("function"==typeof e||void 0===e&&!t)&&(t=e,e=So.Z_FULL_FLUSH),r.ended)t&&de(t);else if(r.ending)t&&this.once("end",t);else if(r.needDrain){var n=this;this.once("drain",function(){n.flush(t)})}else this._flushFlag=e,this.write(new p(0),"",t)},Io.prototype.close=function(e){if(e&&de(e),!this._closed){this._closed=!0,this._binding.close();var t=this;de(function(){t.emit("close")})}},Io.prototype._transform=function(e,t,r){var n,i=this._writableState,o=(i.ending||i.ended)&&(!e||i.length===e.length);if(null===!e&&!$(e))return r(new Error("invalid input"));o?n=So.Z_FINISH:(n=this._flushFlag,e.length>=i.length&&(this._flushFlag=this._opts.flush||So.Z_NO_FLUSH)),this._processChunk(e,n,r)},Io.prototype._processChunk=function(e,t,r){var n=e&&e.length,i=this._chunkSize-this._offset,o=0,a=this,s="function"==typeof r;if(!s){var h,l=[],f=0;this.on("error",function(e){h=e});do{var c=this._binding.writeSync(t,e,o,n,this._buffer,this._offset,i)}while(!this._hadError&&_(c[0],c[1]));if(this._hadError)throw h;var u=p.concat(l,f);return this.close(),u}var d=this._binding.write(t,e,o,n,this._buffer,this._offset,i);function _(h,c){if(!a._hadError){var u=i-c;if(function(e,t){if(!e)throw new Error(t)}(u>=0,"have should not go down"),u>0){var d=a._buffer.slice(a._offset,a._offset+u);a._offset+=u,s?a.push(d):(l.push(d),f+=d.length)}if((0===c||a._offset>=a._chunkSize)&&(i=a._chunkSize,a._offset=0,a._buffer=new p(a._chunkSize)),0===c){if(o+=n-h,n=h,!s)return!0;var g=a._binding.write(t,e,o,n,a._buffer,a._offset,a._chunkSize);return g.callback=_,void(g.buffer=e)}if(!s)return!1;r()}}d.buffer=e,d.callback=_},Be(Bo,Io),Be(zo,Io),Be(Lo,Io),Be(To,Io),Be(Mo,Io),Be(Co,Io),Be(Do,Io);var Po={codes:xo,createDeflate:function(e){return new Bo(e)},createInflate:function(e){return new zo(e)},createDeflateRaw:function(e){return new Mo(e)},createInflateRaw:function(e){return new Co(e)},createGzip:function(e){return new Lo(e)},createGunzip:function(e){return new To(e)},createUnzip:function(e){return new Do(e)},deflate:function(e,t,r){return"function"==typeof t&&(r=t,t={}),Ro(new Bo(t),e,r)},deflateSync:function(e,t){return Ao(new Bo(t),e)},gzip:function(e,t,r){return"function"==typeof t&&(r=t,t={}),Ro(new Lo(t),e,r)},gzipSync:function(e,t){return Ao(new Lo(t),e)},deflateRaw:function(e,t,r){return"function"==typeof t&&(r=t,t={}),Ro(new Mo(t),e,r)},deflateRawSync:function(e,t){return Ao(new Mo(t),e)},unzip:function(e,t,r){return"function"==typeof t&&(r=t,t={}),Ro(new Do(t),e,r)},unzipSync:function(e,t){return Ao(new Do(t),e)},inflate:function(e,t,r){return"function"==typeof t&&(r=t,t={}),Ro(new zo(t),e,r)},inflateSync:function(e,t){return Ao(new zo(t),e)},gunzip:function(e,t,r){return"function"==typeof t&&(r=t,t={}),Ro(new To(t),e,r)},gunzipSync:function(e,t){return Ao(new To(t),e)},inflateRaw:function(e,t,r){return"function"==typeof t&&(r=t,t={}),Ro(new Co(t),e,r)},inflateRawSync:function(e,t){return Ao(new Co(t),e)},Deflate:Bo,Inflate:zo,Gzip:Lo,Gunzip:To,DeflateRaw:Mo,InflateRaw:Co,Unzip:Do,Zlib:Io};export default class{constructor(e,t,r){this.SDKAPPID=e,this.EXPIRETIME=r,this.PRIVATEKEY=t}genTestUserSig(e){return this._isNumber(this.SDKAPPID)?this._isString(this.PRIVATEKEY)?this._isString(e)?this._isNumber(this.EXPIRETIME)?(console.log("sdkAppID="+this.SDKAPPID+" key="+this.PRIVATEKEY+" userID="+e+" expire="+this.EXPIRETIME),this.genSigWithUserbuf(e,this.EXPIRETIME,null)):(console.error("expireTime must be a number"),""):(console.error("userID must be a string"),""):(console.error("privateKey must be a string"),""):(console.error("sdkAppID must be a number"),"")}newBuffer(e,t){return p.from?p.from(e,t):new p(e,t)}unescape(e){return e.replace(/_/g,"=").replace(/\-/g,"/").replace(/\*/g,"+")}escape(e){return e.replace(/\+/g,"*").replace(/\//g,"-").replace(/=/g,"_")}encode(e){return this.escape(this.newBuffer(e).toString("base64"))}decode(e){return this.newBuffer(this.unescape(e),"base64")}base64encode(e){return this.newBuffer(e).toString("base64")}base64decode(e){return this.newBuffer(e,"base64").toString()}_hmacsha256(e,t,r,n){let i="TLS.identifier:"+e+"\n";i+="TLS.sdkappid:"+this.SDKAPPID+"\n",i+="TLS.time:"+t+"\n",i+="TLS.expire:"+r+"\n",null!=n&&(i+="TLS.userbuf:"+n+"\n");let o=te.HmacSHA256(i,this.PRIVATEKEY);return te.enc.Base64.stringify(o)}_utc(){return Math.round(Date.now()/1e3)}_isNumber(e){return null!==e&&("number"==typeof e&&!isNaN(e-0)||"object"==typeof e&&e.constructor===Number)}_isString(e){return"string"==typeof e}genSigWithUserbuf(e,t,r){let n=this._utc(),i={"TLS.ver":"2.0","TLS.identifier":e,"TLS.sdkappid":this.SDKAPPID,"TLS.time":n,"TLS.expire":t},o="";if(null!=r){let a=this.base64encode(r);i["TLS.userbuf"]=a,o=this._hmacsha256(e,n,t,a)}else o=this._hmacsha256(e,n,t,null);i["TLS.sig"]=o;let a=JSON.stringify(i),s=Po.deflateSync(this.newBuffer(a)).toString("base64"),h=this.escape(s);return console.log("ret="+h),h}validate(e){let t=this.decode(e),r=Po.inflateSync(t);console.log("validate ret="+r)}}
diff --git a/TUIService/TUIKit/index.js b/TUIService/TUIKit/index.js
new file mode 100644
index 0000000..f65480a
--- /dev/null
+++ b/TUIService/TUIKit/index.js
@@ -0,0 +1,141 @@
+// TUIKitWChat/Chat/index.js
+import Aegis from './lib/aegis';
+import constant from './utils/constant';
+const app = getApp();
+Component({
+ /**
+ * 组件的属性列表
+ */
+ properties: {
+
+ },
+ // pageLifetimes: {
+ // // 组件所在页面的生命周期函数
+ // show: function () {
+ // this.setData({
+ // isShow:true,
+ // });
+ // const TUIChat = this.selectComponent('#TUIChat');
+ // TUIChat.init();
+ // },
+ // hide: function () {
+ // this.setData({
+ // isShow:false,
+ // })
+ // },
+ // resize: function () { },
+ // },
+ /**
+ * 组件的初始数据
+ */
+ data: {
+ isShowConversation: false,
+ isShowConversationList: true,
+ currentConversationID: '',
+ order_inquiry_id:'',
+ isShow:false,
+ inquiry_type:'',
+ fromType:'',
+ unreadCount: 0,
+ hasCallKit: false,
+ config: {
+ userID: '',
+ userSig: '',
+ type: 1,
+ tim: null,
+ SDKAppID: 0,
+ },
+ },
+
+ /**
+ * 组件的方法列表
+ */
+ methods: {
+ init(order_inquiry_id,inquiry_type,currentConversationID,fromType) {
+ const { config } = this.data;
+ config.userID = wx.$chat_userID;
+ config.userSig = wx.$chat_userSig;
+ config.tim = wx.$TUIKit;
+ config.SDKAppID = wx.$chat_SDKAppID;
+ this.setData({
+ config,
+ currentConversationID,
+ order_inquiry_id,
+ inquiry_type,
+ fromType
+ }, () => {
+ //this.TUICallKit = this.selectComponent('#TUICallKit');
+ // 这里的 isExitInit 用来判断 TUICallKit init 方法是否存在
+ // 当 isExitInit 为 true 时,进行 callkit 初始化和日志上报
+ // const isExitInit = (this.TUICallKit.init !== undefined);
+ // if (this.TUICallKit !== null && isExitInit) {
+ // wx.aegis.reportEvent({
+ // name: 'TUICallKit',
+ // ext1: 'TUICallKitInit',
+ // ext2: wx.$chat_reportType,
+ // ext3: wx.$chat_SDKAppID,
+ // });
+ // this.TUICallKit.init();
+ // wx.setStorageSync('_isTIMCallKit', true);
+ // wx.$_isTIMCallKit = '_isTIMCallKit';
+ // this.setData({
+ // hasCallKit: true,
+ // });
+ // }
+ });
+ const TUIChat = this.selectComponent('#TUIChat');
+ TUIChat.init();
+ //this.currentConversationID();
+ // const TUIConversation = this.selectComponent('#TUIConversation');
+ // TUIConversation.init();
+ if (app?.globalData?.reportType !== constant.OPERATING_ENVIRONMENT) {
+ this.aegisInit();
+ }
+ wx.$chat_reportType = 'chat-uikit-wechat';
+ wx.aegis.reportEvent({
+ name: 'time',
+ ext1: 'first-run-time',
+ ext2: wx.$chat_reportType,
+ ext3: wx.$chat_SDKAppID,
+ });
+ },
+ aegisInit() {
+ wx.aegis = new Aegis({
+ id: 'iHWefAYquFxvklBblC', // 项目key
+ reportApiSpeed: true, // 接口测速
+ reportAssetSpeed: true, // 静态资源测速
+ pagePerformance: true, // 开启页面测速
+ });
+ },
+ currentConversationID(event) {
+ this.setData({
+ isShowConversation: true,
+ isShowConversationList: false,
+ currentConversationID: event.detail.currentConversationID,
+ unreadCount: event.detail.unreadCount,
+ }, () => {
+ const TUIChat = this.selectComponent('#TUIChat');
+ TUIChat.init();
+ });
+ },
+ showConversationList() {
+ this.setData({
+ isShowConversation: false,
+ isShowConversationList: true,
+ }, () => {
+ const TUIConversation = this.selectComponent('#TUIConversation');
+ TUIConversation.init();
+ });
+ },
+ handleCall(event) {
+ if (event.detail.groupID) {
+ this.TUICallKit.groupCall(event.detail);
+ } else {
+ this.TUICallKit.call(event.detail);
+ }
+ },
+ sendMessage(event) {
+ this.selectComponent('#TUIChat').sendMessage(event);
+ },
+ },
+});
diff --git a/TUIService/TUIKit/index.json b/TUIService/TUIKit/index.json
new file mode 100644
index 0000000..8d29970
--- /dev/null
+++ b/TUIService/TUIKit/index.json
@@ -0,0 +1,8 @@
+{
+ "component": true,
+ "usingComponents": {
+ "TUIConversation": "./components/TUIConversation/index",
+ "TUIChat": "./components/TUIChat/index",
+ "TUICallKit": "./components/TUICallKit/TUICallKit/TUICallKit"
+ }
+}
\ No newline at end of file
diff --git a/TUIService/TUIKit/index.wxml b/TUIService/TUIKit/index.wxml
new file mode 100644
index 0000000..82c242d
--- /dev/null
+++ b/TUIService/TUIKit/index.wxml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/TUIService/TUIKit/index.wxss b/TUIService/TUIKit/index.wxss
new file mode 100644
index 0000000..e69de29
diff --git a/TUIService/TUIKit/lib/aegis.js b/TUIService/TUIKit/lib/aegis.js
new file mode 100644
index 0000000..996edcc
--- /dev/null
+++ b/TUIService/TUIKit/lib/aegis.js
@@ -0,0 +1,10 @@
+/**
+ * ====================================================================
+ * @tencent/aegis-mp-sdk@1.34.75 (c) 2021 Tencent Application Monitor.
+ * Author pumpkincai.
+ * Last Release Time Tue Dec 07 2021 14:47:12 GMT+0800 (GMT+08:00).
+ * Released under the MIT License.
+ * Thanks for supporting TAM & Aegis!
+ * ====================================================================
+ **/
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).Aegis=t()}(this,function(){"use strict";var i=function(e,t){return(i=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])})(e,t)};function e(e,t){function n(){this.constructor=e}i(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var a=function(){return(a=Object.assign||function(e){for(var t,n=1,i=arguments.length;n=n)return o=A(o),t(o.splice(0,o.length)),void(i&&clearTimeout(i));i&&clearTimeout(i),i=setTimeout(function(){i=null,0<(o=A(o)).length&&t(o.splice(0,o.length))},r.delay)}}function O(e,t){return Array.isArray(e)?t(e.map(function(e){return a(a({},e),{msg:"string"==typeof e.msg?e.msg:[].concat(e.msg).map(b).join(" ")})})):t(a(a({},e),{msg:"string"==typeof e.msg?e.msg:b(e.msg)}))}function R(r,s){return function(e,t){var n=Array.isArray(e),i=n?e:[e];r.lifeCycle.emit("beforeRequest",e);var o=r.config.beforeRequest;(i="function"==typeof o?i.map(function(t){try{var e=o({logs:t,logType:s});return(null==e?void 0:e.logType)===s&&null!=e&&e.logs?e.logs:!1!==e&&t}catch(e){return t}}).filter(function(e){return!1!==e}):i).length&&(i=function(e,t){if(!Array.isArray(e)||e.length<=1)return e;var n=[],i=[];return!(i="string"==typeof t?[t]:t)||i.length<=0||(i.forEach(function(t){e.forEach(function(e){null!=e&&e[t]&&n.push(t)})}),0l){for(var t=e.split("\n"),n="",i=t.length-1;0<=i&&!(t[i]&&(n=t[i]+"\n"+n).length>l);i--);s.writeFile({filePath:a,data:n,success:r})}else s.appendFile({data:o,filePath:a,encoding:"utf8",success:r,fail:function(e){console.error(e)}})}})},re),V=new D({name:"device",onNewAegis:function(l){return e=this,u=function(){return n=this,i=function(e){return this.setSystemInfo(l),this.refreshNetwork(l),this.setNetworkChange(l),[2]},a={label:0,sent:function(){if(1&s[0])throw s[1];return s[1]},trys:[],ops:[]},t={next:e(0),throw:e(1),return:e(2)},"function"==typeof Symbol&&(t[Symbol.iterator]=function(){return this}),t;function e(t){return function(e){return function(t){if(o)throw new TypeError("Generator is already executing.");for(;a;)try{if(o=1,r&&(s=2&t[0]?r.return:t[0]?r.throw||((s=r.return)&&s.call(r),0):r.next)&&!(s=s.call(r,t[1])).done)return s;switch(r=0,(t=s?[2&t[0],s.value]:t)[0]){case 0:case 1:s=t;break;case 4:return a.label++,{value:t[1],done:!1};case 5:a.label++,r=t[1],t=[0];continue;case 7:t=a.ops.pop(),a.trys.pop();continue;default:if(!((s=0<(s=a.trys).length&&s[s.length-1])||6!==t[0]&&2!==t[0])){a=0;continue}if(3===t[0]&&(!s||t[1]>s[0]&&t[1]n))}))}),(r=this.lifeCycle.emit,c=this.config,function(e,t){var n=c.logCreated;if("function"!=typeof n)return r("beforeWrite",e),t(e);e=e.filter(function(e){return!1!==n(e)});return r("beforeWrite",e),t(e)}),(i=this,setTimeout(function(){var e=i.config.pvUrl,n=void 0===e?"":e;n&&i.sendPipeline([function(e,t){t({url:n,type:m.PV,fail:function(e){"403 forbidden"===e&&i.destroy()}})}],m.PV)(null)},100),function(e,t){t(e)}),(o=l=a=!1,u=[],(s=this).lifeCycle.on("onConfigChange",function(){n&&clearTimeout(n),n=setTimeout(function(){var e,n;!o&&s.config&&(o=!0,e=s.config.whiteListUrl,(n=void 0===e?"":e)&&s.sendPipeline([function(e,t){t({url:n,type:m.WHITE_LIST,success:function(e){l=!0;try{var t=e.data||JSON.parse(e),n=t.retcode,i=t.result,o=void 0===i?{}:i;if(0===n){if(a=o.is_in_white_list,s.isWhiteList=a,o.shutdown)return void s.destroy();0<=o.rate&&o.rate<=1&&(s.config.random=o.rate,s.isGetSample=!1)}s.isWhiteList&&u.length?_(s)(u.splice(0),function(){}):!s.isWhiteList&&u.length&&(u.length=0);var r=s.config.onWhitelist;"function"==typeof r&&r(a)}catch(e){}},fail:function(e){"403 forbidden"===e&&s.destroy(),l=!0}})}],m.WHITE_LIST)(null),o=!1)},s.config.uin?50:500)}),s.lifeCycle.on("destroy",function(){u.length=0}),function(e,t){var n;a||null!==(n=null===(n=s.config)||void 0===n?void 0:n.api)&&void 0!==n&&n.reportRequst?t(e.concat(u.splice(0)).map(function(e){return I(e),e})):(e=e.filter(function(e){return e.level!==g.INFO&&e.level!==g.API_RESPONSE?(I(e),!0):(l||(u.push(e),200<=u.length&&(u.length=200)),!1)})).length&&t(e)}),function(e,t){var n=JSON.parse(JSON.stringify(e));d.lifeCycle.emit("beforeReport",n);var i=d.config.beforeReport;(e="function"==typeof i?e.filter(function(e){return!1!==i(e)}):e).length&&t(e)},_(this)]),this.eventPipeline=S([w(this,5),function(e){d.sendPipeline([function(e,t){var n=e.map(function(e){return{name:e.name,ext1:e.ext1||d.config.ext1||"",ext2:e.ext2||d.config.ext2||"",ext3:e.ext3||d.config.ext3||""}});t({url:d.config.eventUrl+"?payload="+encodeURIComponent(JSON.stringify(n)),type:m.EVENT,log:e,fail:function(e){"403 forbidden"===e&&d.destroy()}})}],m.EVENT)(e)}]),this.timeMap={},this.customTimePipeline=S([w(this,5),function(e){return d.sendPipeline([function(e,t){t({url:d.config.customTimeUrl+"?payload="+encodeURIComponent(JSON.stringify({custom:e})),type:m.CUSTOM,log:e,fail:function(e){"403 forbidden"===e&&d.destroy()}})}],m.CUSTOM)(e)}]),this.config=(t=this.config,void 0===(e=e.hostUrl)&&(e="https://aegis.qq.com"),t.url=t.url||e+"/collect",t.offlineUrl=t.offlineUrl||e+"/offline",t.whiteListUrl=t.whiteListUrl||e+"/collect/whitelist",t.pvUrl=t.pvUrl||e+"/collect/pv",t.eventUrl=t.eventUrl||e+"/collect/events",t.speedUrl=t.speedUrl||e+"/speed",t.customTimeUrl=t.customTimeUrl||e+"/speed/custom",t.performanceUrl=t.performanceUrl||e+"/speed/performance",t.webVitalsUrl=t.webVitalsUrl||e+"/speed/webvitals",t),ae.instances.push(this)}return W.use(ee),W.use(F),W.use(G),W.use($),W.use(D),W.use(V),W});
diff --git a/TUIService/TUIKit/lib/tim-profanity-filter-plugin.js b/TUIService/TUIKit/lib/tim-profanity-filter-plugin.js
new file mode 100644
index 0000000..1fdad73
--- /dev/null
+++ b/TUIService/TUIKit/lib/tim-profanity-filter-plugin.js
@@ -0,0 +1,15 @@
+!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t=t||self).TIMProfanityFilterPlugin=e()}(this,(function(){function t(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function e(t,e){for(var r=0;rt.length)&&(e=t.length);for(var r=0,i=new Array(e);r=t.length?{done:!0}:{done:!1,value:t[i++]}},e:function(t){throw t},f:n}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var s,a=!0,c=!1;return{s:function(){r=r.call(t)},n:function(){var t=r.next();return a=t.done,t},e:function(t){c=!0,s=t},f:function(){try{a||null==r.return||r.return()}finally{if(c)throw s}}}}var c=function(){for(var t=" \t\r\n~!@#$%^&*()_+-=【】、{}|;':\",。、《》?αβγδεζηθικλμνξοπρστυφχψωΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ。,、;:?!…—·ˉ¨‘’“”々~‖∶"'`|〃〔〕〈〉《》「」『』.〖〗【】()[]{}ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫ⒈⒉⒊⒋⒌⒍⒎⒏⒐⒑⒒⒓⒔⒕⒖⒗⒘⒙⒚⒛㈠㈡㈢㈣㈤㈥㈦㈧㈨㈩①②③④⑤⑥⑦⑧⑨⑩⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂⒃⒄⒅⒆⒇≈≡≠=≤≥<>≮≯∷±+-×÷/∫∮∝∞∧∨∑∏∪∩∈∵∴⊥∥∠⌒⊙≌∽√§№☆★○●◎◇◆□℃‰€■△▲※→←↑↓〓¤°#&@\︿_ ̄―♂♀┌┍┎┐┑┒┓─┄┈├┝┞┟┠┡┢┣│┆┊┬┭┮┯┰┱┲┳┼┽┾┿╀╁╂╃└┕┖┗┘┙┚┛━┅┉┤┥┦┧┨┩┪┫┃┇┋┴┵┶┷┸┹┺┻╋╊╉╈╇╆╅╄",e=new Map,r=0,i=t.length;r1&&(a+=h),f){if(o=!0,!r)break;var d=this._map.get(l)||"*";n=n.replace(new RegExp(l,"g"),d)}}return{isMatched:o,modifiedText:n}}},{key:"reset",value:function(){this._trieTree={},this._map=null}}]),e}(),l="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};var f={},u=function(t,e){return t(e={exports:{}},e.exports),e.exports}((function(t,e){var r,i,n,o,s,a;t.exports=(a=a||function(t,e){var r;if("undefined"!=typeof window&&window.crypto&&(r=window.crypto),!r&&"undefined"!=typeof window&&window.msCrypto&&(r=window.msCrypto),!r&&void 0!==l&&l.crypto&&(r=l.crypto),!r)try{r=f}catch(v){}var i=function(){if(r){if("function"==typeof r.getRandomValues)try{return r.getRandomValues(new Uint32Array(1))[0]}catch(v){}if("function"==typeof r.randomBytes)try{return r.randomBytes(4).readInt32LE()}catch(v){}}throw new Error("Native crypto module could not be used to get secure random number.")},n=Object.create||function(){function t(){}return function(e){var r;return t.prototype=e,r=new t,t.prototype=null,r}}(),o={},s=o.lib={},a=s.Base={extend:function(t){var e=n(this);return t&&e.mixIn(t),e.hasOwnProperty("init")&&this.init!==e.init||(e.init=function(){e.$super.init.apply(this,arguments)}),e.init.prototype=e,e.$super=this,e},create:function(){var t=this.extend();return t.init.apply(t,arguments),t},init:function(){},mixIn:function(t){for(var e in t)t.hasOwnProperty(e)&&(this[e]=t[e]);t.hasOwnProperty("toString")&&(this.toString=t.toString)},clone:function(){return this.init.prototype.extend(this)}},c=s.WordArray=a.extend({init:function(t,e){t=this.words=t||[],this.sigBytes=null!=e?e:4*t.length},toString:function(t){return(t||u).stringify(this)},concat:function(t){var e=this.words,r=t.words,i=this.sigBytes,n=t.sigBytes;if(this.clamp(),i%4)for(var o=0;o>>2]>>>24-o%4*8&255;e[i+o>>>2]|=s<<24-(i+o)%4*8}else for(o=0;o>>2]=r[o>>>2];return this.sigBytes+=n,this},clamp:function(){var e=this.words,r=this.sigBytes;e[r>>>2]&=4294967295<<32-r%4*8,e.length=t.ceil(r/4)},clone:function(){var t=a.clone.call(this);return t.words=this.words.slice(0),t},random:function(t){for(var e=[],r=0;r>>2]>>>24-n%4*8&255;i.push((o>>>4).toString(16)),i.push((15&o).toString(16))}return i.join("")},parse:function(t){for(var e=t.length,r=[],i=0;i>>3]|=parseInt(t.substr(i,2),16)<<24-i%8*4;return new c.init(r,e/2)}},d=h.Latin1={stringify:function(t){for(var e=t.words,r=t.sigBytes,i=[],n=0;n>>2]>>>24-n%4*8&255;i.push(String.fromCharCode(o))}return i.join("")},parse:function(t){for(var e=t.length,r=[],i=0;i>>2]|=(255&t.charCodeAt(i))<<24-i%4*8;return new c.init(r,e)}},p=h.Utf8={stringify:function(t){try{return decodeURIComponent(escape(d.stringify(t)))}catch(e){throw new Error("Malformed UTF-8 data")}},parse:function(t){return d.parse(unescape(encodeURIComponent(t)))}},_=s.BufferedBlockAlgorithm=a.extend({reset:function(){this._data=new c.init,this._nDataBytes=0},_append:function(t){"string"==typeof t&&(t=p.parse(t)),this._data.concat(t),this._nDataBytes+=t.sigBytes},_process:function(e){var r,i=this._data,n=i.words,o=i.sigBytes,s=this.blockSize,a=o/(4*s),h=(a=e?t.ceil(a):t.max((0|a)-this._minBufferSize,0))*s,l=t.min(4*h,o);if(h){for(var f=0;f>>2]>>>24-o%4*8&255)<<16|(e[o+1>>>2]>>>24-(o+1)%4*8&255)<<8|e[o+2>>>2]>>>24-(o+2)%4*8&255,a=0;a<4&&o+.75*a>>6*(3-a)&63));var c=i.charAt(64);if(c)for(;n.length%4;)n.push(c);return n.join("")},parse:function(t){var e=t.length,r=this._map,i=this._reverseMap;if(!i){i=this._reverseMap=[];for(var n=0;n>>6-o%4*2,h=a|c;i[n>>>2]|=h<<24-n%4*8,n++}return s.create(i,n)}(t,e,i)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="},function(t){var e=a,r=e.lib,i=r.WordArray,n=r.Hasher,o=e.algo,s=[];!function(){for(var e=0;e<64;e++)s[e]=4294967296*t.abs(t.sin(e+1))|0}();var c=o.MD5=n.extend({_doReset:function(){this._hash=new i.init([1732584193,4023233417,2562383102,271733878])},_doProcessBlock:function(t,e){for(var r=0;r<16;r++){var i=e+r,n=t[i];t[i]=16711935&(n<<8|n>>>24)|4278255360&(n<<24|n>>>8)}var o=this._hash.words,a=t[e+0],c=t[e+1],d=t[e+2],p=t[e+3],_=t[e+4],y=t[e+5],v=t[e+6],g=t[e+7],w=t[e+8],B=t[e+9],k=t[e+10],m=t[e+11],b=t[e+12],x=t[e+13],S=t[e+14],A=t[e+15],H=o[0],M=o[1],z=o[2],C=o[3];H=h(H,M,z,C,a,7,s[0]),C=h(C,H,M,z,c,12,s[1]),z=h(z,C,H,M,d,17,s[2]),M=h(M,z,C,H,p,22,s[3]),H=h(H,M,z,C,_,7,s[4]),C=h(C,H,M,z,y,12,s[5]),z=h(z,C,H,M,v,17,s[6]),M=h(M,z,C,H,g,22,s[7]),H=h(H,M,z,C,w,7,s[8]),C=h(C,H,M,z,B,12,s[9]),z=h(z,C,H,M,k,17,s[10]),M=h(M,z,C,H,m,22,s[11]),H=h(H,M,z,C,b,7,s[12]),C=h(C,H,M,z,x,12,s[13]),z=h(z,C,H,M,S,17,s[14]),H=l(H,M=h(M,z,C,H,A,22,s[15]),z,C,c,5,s[16]),C=l(C,H,M,z,v,9,s[17]),z=l(z,C,H,M,m,14,s[18]),M=l(M,z,C,H,a,20,s[19]),H=l(H,M,z,C,y,5,s[20]),C=l(C,H,M,z,k,9,s[21]),z=l(z,C,H,M,A,14,s[22]),M=l(M,z,C,H,_,20,s[23]),H=l(H,M,z,C,B,5,s[24]),C=l(C,H,M,z,S,9,s[25]),z=l(z,C,H,M,p,14,s[26]),M=l(M,z,C,H,w,20,s[27]),H=l(H,M,z,C,x,5,s[28]),C=l(C,H,M,z,d,9,s[29]),z=l(z,C,H,M,g,14,s[30]),H=f(H,M=l(M,z,C,H,b,20,s[31]),z,C,y,4,s[32]),C=f(C,H,M,z,w,11,s[33]),z=f(z,C,H,M,m,16,s[34]),M=f(M,z,C,H,S,23,s[35]),H=f(H,M,z,C,c,4,s[36]),C=f(C,H,M,z,_,11,s[37]),z=f(z,C,H,M,g,16,s[38]),M=f(M,z,C,H,k,23,s[39]),H=f(H,M,z,C,x,4,s[40]),C=f(C,H,M,z,a,11,s[41]),z=f(z,C,H,M,p,16,s[42]),M=f(M,z,C,H,v,23,s[43]),H=f(H,M,z,C,B,4,s[44]),C=f(C,H,M,z,b,11,s[45]),z=f(z,C,H,M,A,16,s[46]),H=u(H,M=f(M,z,C,H,d,23,s[47]),z,C,a,6,s[48]),C=u(C,H,M,z,g,10,s[49]),z=u(z,C,H,M,S,15,s[50]),M=u(M,z,C,H,y,21,s[51]),H=u(H,M,z,C,b,6,s[52]),C=u(C,H,M,z,p,10,s[53]),z=u(z,C,H,M,k,15,s[54]),M=u(M,z,C,H,c,21,s[55]),H=u(H,M,z,C,w,6,s[56]),C=u(C,H,M,z,A,10,s[57]),z=u(z,C,H,M,v,15,s[58]),M=u(M,z,C,H,x,21,s[59]),H=u(H,M,z,C,_,6,s[60]),C=u(C,H,M,z,m,10,s[61]),z=u(z,C,H,M,d,15,s[62]),M=u(M,z,C,H,B,21,s[63]),o[0]=o[0]+H|0,o[1]=o[1]+M|0,o[2]=o[2]+z|0,o[3]=o[3]+C|0},_doFinalize:function(){var e=this._data,r=e.words,i=8*this._nDataBytes,n=8*e.sigBytes;r[n>>>5]|=128<<24-n%32;var o=t.floor(i/4294967296),s=i;r[15+(n+64>>>9<<4)]=16711935&(o<<8|o>>>24)|4278255360&(o<<24|o>>>8),r[14+(n+64>>>9<<4)]=16711935&(s<<8|s>>>24)|4278255360&(s<<24|s>>>8),e.sigBytes=4*(r.length+1),this._process();for(var a=this._hash,c=a.words,h=0;h<4;h++){var l=c[h];c[h]=16711935&(l<<8|l>>>24)|4278255360&(l<<24|l>>>8)}return a},clone:function(){var t=n.clone.call(this);return t._hash=this._hash.clone(),t}});function h(t,e,r,i,n,o,s){var a=t+(e&r|~e&i)+n+s;return(a<>>32-o)+e}function l(t,e,r,i,n,o,s){var a=t+(e&i|r&~i)+n+s;return(a<>>32-o)+e}function f(t,e,r,i,n,o,s){var a=t+(e^r^i)+n+s;return(a<>>32-o)+e}function u(t,e,r,i,n,o,s){var a=t+(r^(e|~i))+n+s;return(a<>>32-o)+e}e.MD5=n._createHelper(c),e.HmacMD5=n._createHmacHelper(c)}(Math),function(){var t=a,e=t.lib,r=e.WordArray,i=e.Hasher,n=t.algo,o=[],s=n.SHA1=i.extend({_doReset:function(){this._hash=new r.init([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(t,e){for(var r=this._hash.words,i=r[0],n=r[1],s=r[2],a=r[3],c=r[4],h=0;h<80;h++){if(h<16)o[h]=0|t[e+h];else{var l=o[h-3]^o[h-8]^o[h-14]^o[h-16];o[h]=l<<1|l>>>31}var f=(i<<5|i>>>27)+c+o[h];f+=h<20?1518500249+(n&s|~n&a):h<40?1859775393+(n^s^a):h<60?(n&s|n&a|s&a)-1894007588:(n^s^a)-899497514,c=a,a=s,s=n<<30|n>>>2,n=i,i=f}r[0]=r[0]+i|0,r[1]=r[1]+n|0,r[2]=r[2]+s|0,r[3]=r[3]+a|0,r[4]=r[4]+c|0},_doFinalize:function(){var t=this._data,e=t.words,r=8*this._nDataBytes,i=8*t.sigBytes;return e[i>>>5]|=128<<24-i%32,e[14+(i+64>>>9<<4)]=Math.floor(r/4294967296),e[15+(i+64>>>9<<4)]=r,t.sigBytes=4*e.length,this._process(),this._hash},clone:function(){var t=i.clone.call(this);return t._hash=this._hash.clone(),t}});t.SHA1=i._createHelper(s),t.HmacSHA1=i._createHmacHelper(s)}(),function(t){var e=a,r=e.lib,i=r.WordArray,n=r.Hasher,o=e.algo,s=[],c=[];!function(){function e(e){for(var r=t.sqrt(e),i=2;i<=r;i++)if(!(e%i))return!1;return!0}function r(t){return 4294967296*(t-(0|t))|0}for(var i=2,n=0;n<64;)e(i)&&(n<8&&(s[n]=r(t.pow(i,.5))),c[n]=r(t.pow(i,1/3)),n++),i++}();var h=[],l=o.SHA256=n.extend({_doReset:function(){this._hash=new i.init(s.slice(0))},_doProcessBlock:function(t,e){for(var r=this._hash.words,i=r[0],n=r[1],o=r[2],s=r[3],a=r[4],l=r[5],f=r[6],u=r[7],d=0;d<64;d++){if(d<16)h[d]=0|t[e+d];else{var p=h[d-15],_=(p<<25|p>>>7)^(p<<14|p>>>18)^p>>>3,y=h[d-2],v=(y<<15|y>>>17)^(y<<13|y>>>19)^y>>>10;h[d]=_+h[d-7]+v+h[d-16]}var g=i&n^i&o^n&o,w=(i<<30|i>>>2)^(i<<19|i>>>13)^(i<<10|i>>>22),B=u+((a<<26|a>>>6)^(a<<21|a>>>11)^(a<<7|a>>>25))+(a&l^~a&f)+c[d]+h[d];u=f,f=l,l=a,a=s+B|0,s=o,o=n,n=i,i=B+(w+g)|0}r[0]=r[0]+i|0,r[1]=r[1]+n|0,r[2]=r[2]+o|0,r[3]=r[3]+s|0,r[4]=r[4]+a|0,r[5]=r[5]+l|0,r[6]=r[6]+f|0,r[7]=r[7]+u|0},_doFinalize:function(){var e=this._data,r=e.words,i=8*this._nDataBytes,n=8*e.sigBytes;return r[n>>>5]|=128<<24-n%32,r[14+(n+64>>>9<<4)]=t.floor(i/4294967296),r[15+(n+64>>>9<<4)]=i,e.sigBytes=4*r.length,this._process(),this._hash},clone:function(){var t=n.clone.call(this);return t._hash=this._hash.clone(),t}});e.SHA256=n._createHelper(l),e.HmacSHA256=n._createHmacHelper(l)}(Math),function(){var t=a,e=t.lib.WordArray,r=t.enc;function i(t){return t<<8&4278255360|t>>>8&16711935}r.Utf16=r.Utf16BE={stringify:function(t){for(var e=t.words,r=t.sigBytes,i=[],n=0;n>>2]>>>16-n%4*8&65535;i.push(String.fromCharCode(o))}return i.join("")},parse:function(t){for(var r=t.length,i=[],n=0;n>>1]|=t.charCodeAt(n)<<16-n%2*16;return e.create(i,2*r)}},r.Utf16LE={stringify:function(t){for(var e=t.words,r=t.sigBytes,n=[],o=0;o>>2]>>>16-o%4*8&65535);n.push(String.fromCharCode(s))}return n.join("")},parse:function(t){for(var r=t.length,n=[],o=0;o>>1]|=i(t.charCodeAt(o)<<16-o%2*16);return e.create(n,2*r)}}}(),function(){if("function"==typeof ArrayBuffer){var t=a.lib.WordArray,e=t.init;(t.init=function(t){if(t instanceof ArrayBuffer&&(t=new Uint8Array(t)),(t instanceof Int8Array||"undefined"!=typeof Uint8ClampedArray&&t instanceof Uint8ClampedArray||t instanceof Int16Array||t instanceof Uint16Array||t instanceof Int32Array||t instanceof Uint32Array||t instanceof Float32Array||t instanceof Float64Array)&&(t=new Uint8Array(t.buffer,t.byteOffset,t.byteLength)),t instanceof Uint8Array){for(var r=t.byteLength,i=[],n=0;n>>2]|=t[n]<<24-n%4*8;e.call(this,i,r)}else e.apply(this,arguments)}).prototype=t}}(),
+/** @preserve
+ (c) 2012 by C��dric Mesnil. All rights reserved.
+ Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+ - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+ - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+function(t){var e=a,r=e.lib,i=r.WordArray,n=r.Hasher,o=e.algo,s=i.create([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,7,4,13,1,10,6,15,3,12,0,9,5,2,14,11,8,3,10,14,4,9,15,8,1,2,7,0,6,13,11,5,12,1,9,11,10,0,8,12,4,13,3,7,15,14,5,6,2,4,0,5,9,7,12,2,10,14,1,3,8,11,6,15,13]),c=i.create([5,14,7,0,9,2,11,4,13,6,15,8,1,10,3,12,6,11,3,7,0,13,5,10,14,15,8,12,4,9,1,2,15,5,1,3,7,14,6,9,11,8,12,2,10,0,4,13,8,6,4,1,3,11,15,0,5,12,2,13,9,7,10,14,12,15,10,4,1,5,8,7,6,2,13,14,0,3,9,11]),h=i.create([11,14,15,12,5,8,7,9,11,13,14,15,6,7,9,8,7,6,8,13,11,9,7,15,7,12,15,9,11,7,13,12,11,13,6,7,14,9,13,15,14,8,13,6,5,12,7,5,11,12,14,15,14,15,9,8,9,14,5,6,8,6,5,12,9,15,5,11,6,8,13,12,5,12,13,14,11,8,5,6]),l=i.create([8,9,9,11,13,15,15,5,7,7,8,11,14,14,12,6,9,13,15,7,12,8,9,11,7,7,12,7,6,15,13,11,9,7,15,11,8,6,6,14,12,13,5,14,13,13,7,5,15,5,8,11,14,14,6,14,6,9,12,9,12,5,15,8,8,5,12,9,12,5,14,6,8,13,6,5,15,13,11,11]),f=i.create([0,1518500249,1859775393,2400959708,2840853838]),u=i.create([1352829926,1548603684,1836072691,2053994217,0]),d=o.RIPEMD160=n.extend({_doReset:function(){this._hash=i.create([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(t,e){for(var r=0;r<16;r++){var i=e+r,n=t[i];t[i]=16711935&(n<<8|n>>>24)|4278255360&(n<<24|n>>>8)}var o,a,d,B,k,m,b,x,S,A,H,M=this._hash.words,z=f.words,C=u.words,E=s.words,R=c.words,P=h.words,D=l.words;for(m=o=M[0],b=a=M[1],x=d=M[2],S=B=M[3],A=k=M[4],r=0;r<80;r+=1)H=o+t[e+E[r]]|0,H+=r<16?p(a,d,B)+z[0]:r<32?_(a,d,B)+z[1]:r<48?y(a,d,B)+z[2]:r<64?v(a,d,B)+z[3]:g(a,d,B)+z[4],H=(H=w(H|=0,P[r]))+k|0,o=k,k=B,B=w(d,10),d=a,a=H,H=m+t[e+R[r]]|0,H+=r<16?g(b,x,S)+C[0]:r<32?v(b,x,S)+C[1]:r<48?y(b,x,S)+C[2]:r<64?_(b,x,S)+C[3]:p(b,x,S)+C[4],H=(H=w(H|=0,D[r]))+A|0,m=A,A=S,S=w(x,10),x=b,b=H;H=M[1]+d+S|0,M[1]=M[2]+B+A|0,M[2]=M[3]+k+m|0,M[3]=M[4]+o+b|0,M[4]=M[0]+a+x|0,M[0]=H},_doFinalize:function(){var t=this._data,e=t.words,r=8*this._nDataBytes,i=8*t.sigBytes;e[i>>>5]|=128<<24-i%32,e[14+(i+64>>>9<<4)]=16711935&(r<<8|r>>>24)|4278255360&(r<<24|r>>>8),t.sigBytes=4*(e.length+1),this._process();for(var n=this._hash,o=n.words,s=0;s<5;s++){var a=o[s];o[s]=16711935&(a<<8|a>>>24)|4278255360&(a<<24|a>>>8)}return n},clone:function(){var t=n.clone.call(this);return t._hash=this._hash.clone(),t}});function p(t,e,r){return t^e^r}function _(t,e,r){return t&e|~t&r}function y(t,e,r){return(t|~e)^r}function v(t,e,r){return t&r|e&~r}function g(t,e,r){return t^(e|~r)}function w(t,e){return t<>>32-e}e.RIPEMD160=n._createHelper(d),e.HmacRIPEMD160=n._createHmacHelper(d)}(),function(){var t=a,e=t.lib.Base,r=t.enc.Utf8;t.algo.HMAC=e.extend({init:function(t,e){t=this._hasher=new t.init,"string"==typeof e&&(e=r.parse(e));var i=t.blockSize,n=4*i;e.sigBytes>n&&(e=t.finalize(e)),e.clamp();for(var o=this._oKey=e.clone(),s=this._iKey=e.clone(),a=o.words,c=s.words,h=0;h>>24)|4278255360&(o<<24|o>>>8),s=16711935&(s<<8|s>>>24)|4278255360&(s<<24|s>>>8),(M=r[n]).high^=s,M.low^=o}for(var a=0;a<24;a++){for(var u=0;u<5;u++){for(var d=0,p=0,_=0;_<5;_++)d^=(M=r[u+5*_]).high,p^=M.low;var y=f[u];y.high=d,y.low=p}for(u=0;u<5;u++){var v=f[(u+4)%5],g=f[(u+1)%5],w=g.high,B=g.low;for(d=v.high^(w<<1|B>>>31),p=v.low^(B<<1|w>>>31),_=0;_<5;_++)(M=r[u+5*_]).high^=d,M.low^=p}for(var k=1;k<25;k++){var m=(M=r[k]).high,b=M.low,x=c[k];x<32?(d=m<>>32-x,p=b<>>32-x):(d=b<>>64-x,p=m<>>64-x);var S=f[h[k]];S.high=d,S.low=p}var A=f[0],H=r[0];for(A.high=H.high,A.low=H.low,u=0;u<5;u++)for(_=0;_<5;_++){var M=r[k=u+5*_],z=f[k],C=f[(u+1)%5+5*_],E=f[(u+2)%5+5*_];M.high=z.high^~C.high&E.high,M.low=z.low^~C.low&E.low}M=r[0];var R=l[a];M.high^=R.high,M.low^=R.low}},_doFinalize:function(){var e=this._data,r=e.words,n=(this._nDataBytes,8*e.sigBytes),o=32*this.blockSize;r[n>>>5]|=1<<24-n%32,r[(t.ceil((n+1)/o)*o>>>5)-1]|=128,e.sigBytes=4*r.length,this._process();for(var s=this._state,a=this.cfg.outputLength/8,c=a/8,h=[],l=0;l>>24)|4278255360&(u<<24|u>>>8),d=16711935&(d<<8|d>>>24)|4278255360&(d<<24|d>>>8),h.push(d),h.push(u)}return new i.init(h,a)},clone:function(){for(var t=n.clone.call(this),e=t._state=this._state.slice(0),r=0;r<25;r++)e[r]=e[r].clone();return t}});e.SHA3=n._createHelper(u),e.HmacSHA3=n._createHmacHelper(u)}(Math),function(){var t=a,e=t.lib.Hasher,r=t.x64,i=r.Word,n=r.WordArray,o=t.algo;function s(){return i.create.apply(i,arguments)}var c=[s(1116352408,3609767458),s(1899447441,602891725),s(3049323471,3964484399),s(3921009573,2173295548),s(961987163,4081628472),s(1508970993,3053834265),s(2453635748,2937671579),s(2870763221,3664609560),s(3624381080,2734883394),s(310598401,1164996542),s(607225278,1323610764),s(1426881987,3590304994),s(1925078388,4068182383),s(2162078206,991336113),s(2614888103,633803317),s(3248222580,3479774868),s(3835390401,2666613458),s(4022224774,944711139),s(264347078,2341262773),s(604807628,2007800933),s(770255983,1495990901),s(1249150122,1856431235),s(1555081692,3175218132),s(1996064986,2198950837),s(2554220882,3999719339),s(2821834349,766784016),s(2952996808,2566594879),s(3210313671,3203337956),s(3336571891,1034457026),s(3584528711,2466948901),s(113926993,3758326383),s(338241895,168717936),s(666307205,1188179964),s(773529912,1546045734),s(1294757372,1522805485),s(1396182291,2643833823),s(1695183700,2343527390),s(1986661051,1014477480),s(2177026350,1206759142),s(2456956037,344077627),s(2730485921,1290863460),s(2820302411,3158454273),s(3259730800,3505952657),s(3345764771,106217008),s(3516065817,3606008344),s(3600352804,1432725776),s(4094571909,1467031594),s(275423344,851169720),s(430227734,3100823752),s(506948616,1363258195),s(659060556,3750685593),s(883997877,3785050280),s(958139571,3318307427),s(1322822218,3812723403),s(1537002063,2003034995),s(1747873779,3602036899),s(1955562222,1575990012),s(2024104815,1125592928),s(2227730452,2716904306),s(2361852424,442776044),s(2428436474,593698344),s(2756734187,3733110249),s(3204031479,2999351573),s(3329325298,3815920427),s(3391569614,3928383900),s(3515267271,566280711),s(3940187606,3454069534),s(4118630271,4000239992),s(116418474,1914138554),s(174292421,2731055270),s(289380356,3203993006),s(460393269,320620315),s(685471733,587496836),s(852142971,1086792851),s(1017036298,365543100),s(1126000580,2618297676),s(1288033470,3409855158),s(1501505948,4234509866),s(1607167915,987167468),s(1816402316,1246189591)],h=[];!function(){for(var t=0;t<80;t++)h[t]=s()}();var l=o.SHA512=e.extend({_doReset:function(){this._hash=new n.init([new i.init(1779033703,4089235720),new i.init(3144134277,2227873595),new i.init(1013904242,4271175723),new i.init(2773480762,1595750129),new i.init(1359893119,2917565137),new i.init(2600822924,725511199),new i.init(528734635,4215389547),new i.init(1541459225,327033209)])},_doProcessBlock:function(t,e){for(var r=this._hash.words,i=r[0],n=r[1],o=r[2],s=r[3],a=r[4],l=r[5],f=r[6],u=r[7],d=i.high,p=i.low,_=n.high,y=n.low,v=o.high,g=o.low,w=s.high,B=s.low,k=a.high,m=a.low,b=l.high,x=l.low,S=f.high,A=f.low,H=u.high,M=u.low,z=d,C=p,E=_,R=y,P=v,D=g,F=w,T=B,I=k,O=m,L=b,W=x,U=S,j=A,K=H,X=M,N=0;N<80;N++){var V,Z,$=h[N];if(N<16)Z=$.high=0|t[e+2*N],V=$.low=0|t[e+2*N+1];else{var q=h[N-15],G=q.high,J=q.low,Q=(G>>>1|J<<31)^(G>>>8|J<<24)^G>>>7,Y=(J>>>1|G<<31)^(J>>>8|G<<24)^(J>>>7|G<<25),tt=h[N-2],et=tt.high,rt=tt.low,it=(et>>>19|rt<<13)^(et<<3|rt>>>29)^et>>>6,nt=(rt>>>19|et<<13)^(rt<<3|et>>>29)^(rt>>>6|et<<26),ot=h[N-7],st=ot.high,at=ot.low,ct=h[N-16],ht=ct.high,lt=ct.low;Z=(Z=(Z=Q+st+((V=Y+at)>>>0>>0?1:0))+it+((V+=nt)>>>0>>0?1:0))+ht+((V+=lt)>>>0>>0?1:0),$.high=Z,$.low=V}var ft,ut=I&L^~I&U,dt=O&W^~O&j,pt=z&E^z&P^E&P,_t=C&R^C&D^R&D,yt=(z>>>28|C<<4)^(z<<30|C>>>2)^(z<<25|C>>>7),vt=(C>>>28|z<<4)^(C<<30|z>>>2)^(C<<25|z>>>7),gt=(I>>>14|O<<18)^(I>>>18|O<<14)^(I<<23|O>>>9),wt=(O>>>14|I<<18)^(O>>>18|I<<14)^(O<<23|I>>>9),Bt=c[N],kt=Bt.high,mt=Bt.low,bt=K+gt+((ft=X+wt)>>>0>>0?1:0),xt=vt+_t;K=U,X=j,U=L,j=W,L=I,W=O,I=F+(bt=(bt=(bt=bt+ut+((ft+=dt)>>>0>>0?1:0))+kt+((ft+=mt)>>>0>>0?1:0))+Z+((ft+=V)>>>0>>0?1:0))+((O=T+ft|0)>>>0>>0?1:0)|0,F=P,T=D,P=E,D=R,E=z,R=C,z=bt+(yt+pt+(xt>>>0>>0?1:0))+((C=ft+xt|0)>>>0>>0?1:0)|0}p=i.low=p+C,i.high=d+z+(p>>>0>>0?1:0),y=n.low=y+R,n.high=_+E+(y>>>0>>0?1:0),g=o.low=g+D,o.high=v+P+(g>>>0>>0?1:0),B=s.low=B+T,s.high=w+F+(B>>>0>>0?1:0),m=a.low=m+O,a.high=k+I+(m>>>0>>0?1:0),x=l.low=x+W,l.high=b+L+(x>>>0>>0?1:0),A=f.low=A+j,f.high=S+U+(A>>>0>>0?1:0),M=u.low=M+X,u.high=H+K+(M>>>0>>0?1:0)},_doFinalize:function(){var t=this._data,e=t.words,r=8*this._nDataBytes,i=8*t.sigBytes;return e[i>>>5]|=128<<24-i%32,e[30+(i+128>>>10<<5)]=Math.floor(r/4294967296),e[31+(i+128>>>10<<5)]=r,t.sigBytes=4*e.length,this._process(),this._hash.toX32()},clone:function(){var t=e.clone.call(this);return t._hash=this._hash.clone(),t},blockSize:32});t.SHA512=e._createHelper(l),t.HmacSHA512=e._createHmacHelper(l)}(),function(){var t=a,e=t.x64,r=e.Word,i=e.WordArray,n=t.algo,o=n.SHA512,s=n.SHA384=o.extend({_doReset:function(){this._hash=new i.init([new r.init(3418070365,3238371032),new r.init(1654270250,914150663),new r.init(2438529370,812702999),new r.init(355462360,4144912697),new r.init(1731405415,4290775857),new r.init(2394180231,1750603025),new r.init(3675008525,1694076839),new r.init(1203062813,3204075428)])},_doFinalize:function(){var t=o._doFinalize.call(this);return t.sigBytes-=16,t}});t.SHA384=o._createHelper(s),t.HmacSHA384=o._createHmacHelper(s)}(),a.lib.Cipher||function(t){var e=a,r=e.lib,i=r.Base,n=r.WordArray,o=r.BufferedBlockAlgorithm,s=e.enc,c=(s.Utf8,s.Base64),h=e.algo.EvpKDF,l=r.Cipher=o.extend({cfg:i.extend(),createEncryptor:function(t,e){return this.create(this._ENC_XFORM_MODE,t,e)},createDecryptor:function(t,e){return this.create(this._DEC_XFORM_MODE,t,e)},init:function(t,e,r){this.cfg=this.cfg.extend(r),this._xformMode=t,this._key=e,this.reset()},reset:function(){o.reset.call(this),this._doReset()},process:function(t){return this._append(t),this._process()},finalize:function(t){return t&&this._append(t),this._doFinalize()},keySize:4,ivSize:4,_ENC_XFORM_MODE:1,_DEC_XFORM_MODE:2,_createHelper:function(){function t(t){return"string"==typeof t?w:v}return function(e){return{encrypt:function(r,i,n){return t(i).encrypt(e,r,i,n)},decrypt:function(r,i,n){return t(i).decrypt(e,r,i,n)}}}}()}),f=(r.StreamCipher=l.extend({_doFinalize:function(){return this._process(!0)},blockSize:1}),e.mode={}),u=r.BlockCipherMode=i.extend({createEncryptor:function(t,e){return this.Encryptor.create(t,e)},createDecryptor:function(t,e){return this.Decryptor.create(t,e)},init:function(t,e){this._cipher=t,this._iv=e}}),d=f.CBC=function(){var t=u.extend();function e(t,e,r){var i,n=this._iv;n?(i=n,this._iv=void 0):i=this._prevBlock;for(var o=0;o>>2];t.sigBytes-=e}},_=(r.BlockCipher=l.extend({cfg:l.cfg.extend({mode:d,padding:p}),reset:function(){var t;l.reset.call(this);var e=this.cfg,r=e.iv,i=e.mode;this._xformMode==this._ENC_XFORM_MODE?t=i.createEncryptor:(t=i.createDecryptor,this._minBufferSize=1),this._mode&&this._mode.__creator==t?this._mode.init(this,r&&r.words):(this._mode=t.call(i,this,r&&r.words),this._mode.__creator=t)},_doProcessBlock:function(t,e){this._mode.processBlock(t,e)},_doFinalize:function(){var t,e=this.cfg.padding;return this._xformMode==this._ENC_XFORM_MODE?(e.pad(this._data,this.blockSize),t=this._process(!0)):(t=this._process(!0),e.unpad(t)),t},blockSize:4}),r.CipherParams=i.extend({init:function(t){this.mixIn(t)},toString:function(t){return(t||this.formatter).stringify(this)}})),y=(e.format={}).OpenSSL={stringify:function(t){var e=t.ciphertext,r=t.salt;return(r?n.create([1398893684,1701076831]).concat(r).concat(e):e).toString(c)},parse:function(t){var e,r=c.parse(t),i=r.words;return 1398893684==i[0]&&1701076831==i[1]&&(e=n.create(i.slice(2,4)),i.splice(0,4),r.sigBytes-=16),_.create({ciphertext:r,salt:e})}},v=r.SerializableCipher=i.extend({cfg:i.extend({format:y}),encrypt:function(t,e,r,i){i=this.cfg.extend(i);var n=t.createEncryptor(r,i),o=n.finalize(e),s=n.cfg;return _.create({ciphertext:o,key:r,iv:s.iv,algorithm:t,mode:s.mode,padding:s.padding,blockSize:t.blockSize,formatter:i.format})},decrypt:function(t,e,r,i){return i=this.cfg.extend(i),e=this._parse(e,i.format),t.createDecryptor(r,i).finalize(e.ciphertext)},_parse:function(t,e){return"string"==typeof t?e.parse(t,this):t}}),g=(e.kdf={}).OpenSSL={execute:function(t,e,r,i){i||(i=n.random(8));var o=h.create({keySize:e+r}).compute(t,i),s=n.create(o.words.slice(e),4*r);return o.sigBytes=4*e,_.create({key:o,iv:s,salt:i})}},w=r.PasswordBasedCipher=v.extend({cfg:v.cfg.extend({kdf:g}),encrypt:function(t,e,r,i){var n=(i=this.cfg.extend(i)).kdf.execute(r,t.keySize,t.ivSize);i.iv=n.iv;var o=v.encrypt.call(this,t,e,n.key,i);return o.mixIn(n),o},decrypt:function(t,e,r,i){i=this.cfg.extend(i),e=this._parse(e,i.format);var n=i.kdf.execute(r,t.keySize,t.ivSize,e.salt);return i.iv=n.iv,v.decrypt.call(this,t,e,n.key,i)}})}(),a.mode.CFB=function(){var t=a.lib.BlockCipherMode.extend();function e(t,e,r,i){var n,o=this._iv;o?(n=o.slice(0),this._iv=void 0):n=this._prevBlock,i.encryptBlock(n,0);for(var s=0;s>>2]|=n<<24-o%4*8,t.sigBytes+=n},unpad:function(t){var e=255&t.words[t.sigBytes-1>>>2];t.sigBytes-=e}},a.pad.Iso10126={pad:function(t,e){var r=4*e,i=r-t.sigBytes%r;t.concat(a.lib.WordArray.random(i-1)).concat(a.lib.WordArray.create([i<<24],1))},unpad:function(t){var e=255&t.words[t.sigBytes-1>>>2];t.sigBytes-=e}},a.pad.Iso97971={pad:function(t,e){t.concat(a.lib.WordArray.create([2147483648],1)),a.pad.ZeroPadding.pad(t,e)},unpad:function(t){a.pad.ZeroPadding.unpad(t),t.sigBytes--}},a.mode.OFB=(r=a.lib.BlockCipherMode.extend(),i=r.Encryptor=r.extend({processBlock:function(t,e){var r=this._cipher,i=r.blockSize,n=this._iv,o=this._keystream;n&&(o=this._keystream=n.slice(0),this._iv=void 0),r.encryptBlock(o,0);for(var s=0;s>>8^255&p^99,i[r]=p,n[p]=r;var _=t[r],y=t[_],v=t[y],g=257*t[p]^16843008*p;o[r]=g<<24|g>>>8,s[r]=g<<16|g>>>16,c[r]=g<<8|g>>>24,h[r]=g,g=16843009*v^65537*y^257*_^16843008*r,l[p]=g<<24|g>>>8,f[p]=g<<16|g>>>16,u[p]=g<<8|g>>>24,d[p]=g,r?(r=_^t[t[t[v^_]]],a^=t[t[a]]):r=a=1}}();var p=[0,1,2,4,8,16,32,64,128,27,54],_=r.AES=e.extend({_doReset:function(){if(!this._nRounds||this._keyPriorReset!==this._key){for(var t=this._keyPriorReset=this._key,e=t.words,r=t.sigBytes/4,n=4*((this._nRounds=r+6)+1),o=this._keySchedule=[],s=0;s6&&s%r==4&&(h=i[h>>>24]<<24|i[h>>>16&255]<<16|i[h>>>8&255]<<8|i[255&h]):(h=i[(h=h<<8|h>>>24)>>>24]<<24|i[h>>>16&255]<<16|i[h>>>8&255]<<8|i[255&h],h^=p[s/r|0]<<24),o[s]=o[s-r]^h);for(var a=this._invKeySchedule=[],c=0;c>>24]]^f[i[h>>>16&255]]^u[i[h>>>8&255]]^d[i[255&h]]}}},encryptBlock:function(t,e){this._doCryptBlock(t,e,this._keySchedule,o,s,c,h,i)},decryptBlock:function(t,e){var r=t[e+1];t[e+1]=t[e+3],t[e+3]=r,this._doCryptBlock(t,e,this._invKeySchedule,l,f,u,d,n),r=t[e+1],t[e+1]=t[e+3],t[e+3]=r},_doCryptBlock:function(t,e,r,i,n,o,s,a){for(var c=this._nRounds,h=t[e]^r[0],l=t[e+1]^r[1],f=t[e+2]^r[2],u=t[e+3]^r[3],d=4,p=1;p>>24]^n[l>>>16&255]^o[f>>>8&255]^s[255&u]^r[d++],y=i[l>>>24]^n[f>>>16&255]^o[u>>>8&255]^s[255&h]^r[d++],v=i[f>>>24]^n[u>>>16&255]^o[h>>>8&255]^s[255&l]^r[d++],g=i[u>>>24]^n[h>>>16&255]^o[l>>>8&255]^s[255&f]^r[d++];h=_,l=y,f=v,u=g}_=(a[h>>>24]<<24|a[l>>>16&255]<<16|a[f>>>8&255]<<8|a[255&u])^r[d++],y=(a[l>>>24]<<24|a[f>>>16&255]<<16|a[u>>>8&255]<<8|a[255&h])^r[d++],v=(a[f>>>24]<<24|a[u>>>16&255]<<16|a[h>>>8&255]<<8|a[255&l])^r[d++],g=(a[u>>>24]<<24|a[h>>>16&255]<<16|a[l>>>8&255]<<8|a[255&f])^r[d++],t[e]=_,t[e+1]=y,t[e+2]=v,t[e+3]=g},keySize:8});t.AES=e._createHelper(_)}(),function(){var t=a,e=t.lib,r=e.WordArray,i=e.BlockCipher,n=t.algo,o=[57,49,41,33,25,17,9,1,58,50,42,34,26,18,10,2,59,51,43,35,27,19,11,3,60,52,44,36,63,55,47,39,31,23,15,7,62,54,46,38,30,22,14,6,61,53,45,37,29,21,13,5,28,20,12,4],s=[14,17,11,24,1,5,3,28,15,6,21,10,23,19,12,4,26,8,16,7,27,20,13,2,41,52,31,37,47,55,30,40,51,45,33,48,44,49,39,56,34,53,46,42,50,36,29,32],c=[1,2,4,6,8,10,12,14,15,17,19,21,23,25,27,28],h=[{0:8421888,268435456:32768,536870912:8421378,805306368:2,1073741824:512,1342177280:8421890,1610612736:8389122,1879048192:8388608,2147483648:514,2415919104:8389120,2684354560:33280,2952790016:8421376,3221225472:32770,3489660928:8388610,3758096384:0,4026531840:33282,134217728:0,402653184:8421890,671088640:33282,939524096:32768,1207959552:8421888,1476395008:512,1744830464:8421378,2013265920:2,2281701376:8389120,2550136832:33280,2818572288:8421376,3087007744:8389122,3355443200:8388610,3623878656:32770,3892314112:514,4160749568:8388608,1:32768,268435457:2,536870913:8421888,805306369:8388608,1073741825:8421378,1342177281:33280,1610612737:512,1879048193:8389122,2147483649:8421890,2415919105:8421376,2684354561:8388610,2952790017:33282,3221225473:514,3489660929:8389120,3758096385:32770,4026531841:0,134217729:8421890,402653185:8421376,671088641:8388608,939524097:512,1207959553:32768,1476395009:8388610,1744830465:2,2013265921:33282,2281701377:32770,2550136833:8389122,2818572289:514,3087007745:8421888,3355443201:8389120,3623878657:0,3892314113:33280,4160749569:8421378},{0:1074282512,16777216:16384,33554432:524288,50331648:1074266128,67108864:1073741840,83886080:1074282496,100663296:1073758208,117440512:16,134217728:540672,150994944:1073758224,167772160:1073741824,184549376:540688,201326592:524304,218103808:0,234881024:16400,251658240:1074266112,8388608:1073758208,25165824:540688,41943040:16,58720256:1073758224,75497472:1074282512,92274688:1073741824,109051904:524288,125829120:1074266128,142606336:524304,159383552:0,176160768:16384,192937984:1074266112,209715200:1073741840,226492416:540672,243269632:1074282496,260046848:16400,268435456:0,285212672:1074266128,301989888:1073758224,318767104:1074282496,335544320:1074266112,352321536:16,369098752:540688,385875968:16384,402653184:16400,419430400:524288,436207616:524304,452984832:1073741840,469762048:540672,486539264:1073758208,503316480:1073741824,520093696:1074282512,276824064:540688,293601280:524288,310378496:1074266112,327155712:16384,343932928:1073758208,360710144:1074282512,377487360:16,394264576:1073741824,411041792:1074282496,427819008:1073741840,444596224:1073758224,461373440:524304,478150656:0,494927872:16400,511705088:1074266128,528482304:540672},{0:260,1048576:0,2097152:67109120,3145728:65796,4194304:65540,5242880:67108868,6291456:67174660,7340032:67174400,8388608:67108864,9437184:67174656,10485760:65792,11534336:67174404,12582912:67109124,13631488:65536,14680064:4,15728640:256,524288:67174656,1572864:67174404,2621440:0,3670016:67109120,4718592:67108868,5767168:65536,6815744:65540,7864320:260,8912896:4,9961472:256,11010048:67174400,12058624:65796,13107200:65792,14155776:67109124,15204352:67174660,16252928:67108864,16777216:67174656,17825792:65540,18874368:65536,19922944:67109120,20971520:256,22020096:67174660,23068672:67108868,24117248:0,25165824:67109124,26214400:67108864,27262976:4,28311552:65792,29360128:67174400,30408704:260,31457280:65796,32505856:67174404,17301504:67108864,18350080:260,19398656:67174656,20447232:0,21495808:65540,22544384:67109120,23592960:256,24641536:67174404,25690112:65536,26738688:67174660,27787264:65796,28835840:67108868,29884416:67109124,30932992:67174400,31981568:4,33030144:65792},{0:2151682048,65536:2147487808,131072:4198464,196608:2151677952,262144:0,327680:4198400,393216:2147483712,458752:4194368,524288:2147483648,589824:4194304,655360:64,720896:2147487744,786432:2151678016,851968:4160,917504:4096,983040:2151682112,32768:2147487808,98304:64,163840:2151678016,229376:2147487744,294912:4198400,360448:2151682112,425984:0,491520:2151677952,557056:4096,622592:2151682048,688128:4194304,753664:4160,819200:2147483648,884736:4194368,950272:4198464,1015808:2147483712,1048576:4194368,1114112:4198400,1179648:2147483712,1245184:0,1310720:4160,1376256:2151678016,1441792:2151682048,1507328:2147487808,1572864:2151682112,1638400:2147483648,1703936:2151677952,1769472:4198464,1835008:2147487744,1900544:4194304,1966080:64,2031616:4096,1081344:2151677952,1146880:2151682112,1212416:0,1277952:4198400,1343488:4194368,1409024:2147483648,1474560:2147487808,1540096:64,1605632:2147483712,1671168:4096,1736704:2147487744,1802240:2151678016,1867776:4160,1933312:2151682048,1998848:4194304,2064384:4198464},{0:128,4096:17039360,8192:262144,12288:536870912,16384:537133184,20480:16777344,24576:553648256,28672:262272,32768:16777216,36864:537133056,40960:536871040,45056:553910400,49152:553910272,53248:0,57344:17039488,61440:553648128,2048:17039488,6144:553648256,10240:128,14336:17039360,18432:262144,22528:537133184,26624:553910272,30720:536870912,34816:537133056,38912:0,43008:553910400,47104:16777344,51200:536871040,55296:553648128,59392:16777216,63488:262272,65536:262144,69632:128,73728:536870912,77824:553648256,81920:16777344,86016:553910272,90112:537133184,94208:16777216,98304:553910400,102400:553648128,106496:17039360,110592:537133056,114688:262272,118784:536871040,122880:0,126976:17039488,67584:553648256,71680:16777216,75776:17039360,79872:537133184,83968:536870912,88064:17039488,92160:128,96256:553910272,100352:262272,104448:553910400,108544:0,112640:553648128,116736:16777344,120832:262144,124928:537133056,129024:536871040},{0:268435464,256:8192,512:270532608,768:270540808,1024:268443648,1280:2097152,1536:2097160,1792:268435456,2048:0,2304:268443656,2560:2105344,2816:8,3072:270532616,3328:2105352,3584:8200,3840:270540800,128:270532608,384:270540808,640:8,896:2097152,1152:2105352,1408:268435464,1664:268443648,1920:8200,2176:2097160,2432:8192,2688:268443656,2944:270532616,3200:0,3456:270540800,3712:2105344,3968:268435456,4096:268443648,4352:270532616,4608:270540808,4864:8200,5120:2097152,5376:268435456,5632:268435464,5888:2105344,6144:2105352,6400:0,6656:8,6912:270532608,7168:8192,7424:268443656,7680:270540800,7936:2097160,4224:8,4480:2105344,4736:2097152,4992:268435464,5248:268443648,5504:8200,5760:270540808,6016:270532608,6272:270540800,6528:270532616,6784:8192,7040:2105352,7296:2097160,7552:0,7808:268435456,8064:268443656},{0:1048576,16:33555457,32:1024,48:1049601,64:34604033,80:0,96:1,112:34603009,128:33555456,144:1048577,160:33554433,176:34604032,192:34603008,208:1025,224:1049600,240:33554432,8:34603009,24:0,40:33555457,56:34604032,72:1048576,88:33554433,104:33554432,120:1025,136:1049601,152:33555456,168:34603008,184:1048577,200:1024,216:34604033,232:1,248:1049600,256:33554432,272:1048576,288:33555457,304:34603009,320:1048577,336:33555456,352:34604032,368:1049601,384:1025,400:34604033,416:1049600,432:1,448:0,464:34603008,480:33554433,496:1024,264:1049600,280:33555457,296:34603009,312:1,328:33554432,344:1048576,360:1025,376:34604032,392:33554433,408:34603008,424:0,440:34604033,456:1049601,472:1024,488:33555456,504:1048577},{0:134219808,1:131072,2:134217728,3:32,4:131104,5:134350880,6:134350848,7:2048,8:134348800,9:134219776,10:133120,11:134348832,12:2080,13:0,14:134217760,15:133152,2147483648:2048,2147483649:134350880,2147483650:134219808,2147483651:134217728,2147483652:134348800,2147483653:133120,2147483654:133152,2147483655:32,2147483656:134217760,2147483657:2080,2147483658:131104,2147483659:134350848,2147483660:0,2147483661:134348832,2147483662:134219776,2147483663:131072,16:133152,17:134350848,18:32,19:2048,20:134219776,21:134217760,22:134348832,23:131072,24:0,25:131104,26:134348800,27:134219808,28:134350880,29:133120,30:2080,31:134217728,2147483664:131072,2147483665:2048,2147483666:134348832,2147483667:133152,2147483668:32,2147483669:134348800,2147483670:134217728,2147483671:134219808,2147483672:134350880,2147483673:134217760,2147483674:134219776,2147483675:0,2147483676:133120,2147483677:2080,2147483678:131104,2147483679:134350848}],l=[4160749569,528482304,33030144,2064384,129024,8064,504,2147483679],f=n.DES=i.extend({_doReset:function(){for(var t=this._key.words,e=[],r=0;r<56;r++){var i=o[r]-1;e[r]=t[i>>>5]>>>31-i%32&1}for(var n=this._subKeys=[],a=0;a<16;a++){var h=n[a]=[],l=c[a];for(r=0;r<24;r++)h[r/6|0]|=e[(s[r]-1+l)%28]<<31-r%6,h[4+(r/6|0)]|=e[28+(s[r+24]-1+l)%28]<<31-r%6;for(h[0]=h[0]<<1|h[0]>>>31,r=1;r<7;r++)h[r]=h[r]>>>4*(r-1)+3;h[7]=h[7]<<5|h[7]>>>27}var f=this._invSubKeys=[];for(r=0;r<16;r++)f[r]=n[15-r]},encryptBlock:function(t,e){this._doCryptBlock(t,e,this._subKeys)},decryptBlock:function(t,e){this._doCryptBlock(t,e,this._invSubKeys)},_doCryptBlock:function(t,e,r){this._lBlock=t[e],this._rBlock=t[e+1],u.call(this,4,252645135),u.call(this,16,65535),d.call(this,2,858993459),d.call(this,8,16711935),u.call(this,1,1431655765);for(var i=0;i<16;i++){for(var n=r[i],o=this._lBlock,s=this._rBlock,a=0,c=0;c<8;c++)a|=h[c][((s^n[c])&l[c])>>>0];this._lBlock=s,this._rBlock=o^a}var f=this._lBlock;this._lBlock=this._rBlock,this._rBlock=f,u.call(this,1,1431655765),d.call(this,8,16711935),d.call(this,2,858993459),u.call(this,16,65535),u.call(this,4,252645135),t[e]=this._lBlock,t[e+1]=this._rBlock},keySize:2,ivSize:2,blockSize:2});function u(t,e){var r=(this._lBlock>>>t^this._rBlock)&e;this._rBlock^=r,this._lBlock^=r<>>t^this._lBlock)&e;this._lBlock^=r,this._rBlock^=r<192.");var e=t.slice(0,2),i=t.length<4?t.slice(0,2):t.slice(2,4),n=t.length<6?t.slice(0,2):t.slice(4,6);this._des1=f.createEncryptor(r.create(e)),this._des2=f.createEncryptor(r.create(i)),this._des3=f.createEncryptor(r.create(n))},encryptBlock:function(t,e){this._des1.encryptBlock(t,e),this._des2.decryptBlock(t,e),this._des3.encryptBlock(t,e)},decryptBlock:function(t,e){this._des3.decryptBlock(t,e),this._des2.encryptBlock(t,e),this._des1.decryptBlock(t,e)},keySize:6,ivSize:2,blockSize:2});t.TripleDES=i._createHelper(p)}(),function(){var t=a,e=t.lib.StreamCipher,r=t.algo,i=r.RC4=e.extend({_doReset:function(){for(var t=this._key,e=t.words,r=t.sigBytes,i=this._S=[],n=0;n<256;n++)i[n]=n;n=0;for(var o=0;n<256;n++){var s=n%r,a=e[s>>>2]>>>24-s%4*8&255;o=(o+i[n]+a)%256;var c=i[n];i[n]=i[o],i[o]=c}this._i=this._j=0},_doProcessBlock:function(t,e){t[e]^=n.call(this)},keySize:8,ivSize:0});function n(){for(var t=this._S,e=this._i,r=this._j,i=0,n=0;n<4;n++){r=(r+t[e=(e+1)%256])%256;var o=t[e];t[e]=t[r],t[r]=o,i|=t[(t[e]+t[r])%256]<<24-8*n}return this._i=e,this._j=r,i}t.RC4=e._createHelper(i);var o=r.RC4Drop=i.extend({cfg:i.cfg.extend({drop:192}),_doReset:function(){i._doReset.call(this);for(var t=this.cfg.drop;t>0;t--)n.call(this)}});t.RC4Drop=e._createHelper(o)}(),
+/** @preserve
+ * Counter block mode compatible with Dr Brian Gladman fileenc.c
+ * derived from CryptoJS.mode.CTR
+ * Jan Hruby jhruby.web@gmail.com
+ */
+a.mode.CTRGladman=function(){var t=a.lib.BlockCipherMode.extend();function e(t){if(255==(t>>24&255)){var e=t>>16&255,r=t>>8&255,i=255&t;255===e?(e=0,255===r?(r=0,255===i?i=0:++i):++r):++e,t=0,t+=e<<16,t+=r<<8,t+=i}else t+=1<<24;return t}var r=t.Encryptor=t.extend({processBlock:function(t,r){var i=this._cipher,n=i.blockSize,o=this._iv,s=this._counter;o&&(s=this._counter=o.slice(0),this._iv=void 0),function(t){0===(t[0]=e(t[0]))&&(t[1]=e(t[1]))}(s);var a=s.slice(0);i.encryptBlock(a,0);for(var c=0;c>>24)|4278255360&(t[r]<<24|t[r]>>>8);var i=this._X=[t[0],t[3]<<16|t[2]>>>16,t[1],t[0]<<16|t[3]>>>16,t[2],t[1]<<16|t[0]>>>16,t[3],t[2]<<16|t[1]>>>16],n=this._C=[t[2]<<16|t[2]>>>16,4294901760&t[0]|65535&t[1],t[3]<<16|t[3]>>>16,4294901760&t[1]|65535&t[2],t[0]<<16|t[0]>>>16,4294901760&t[2]|65535&t[3],t[1]<<16|t[1]>>>16,4294901760&t[3]|65535&t[0]];for(this._b=0,r=0;r<4;r++)c.call(this);for(r=0;r<8;r++)n[r]^=i[r+4&7];if(e){var o=e.words,s=o[0],a=o[1],h=16711935&(s<<8|s>>>24)|4278255360&(s<<24|s>>>8),l=16711935&(a<<8|a>>>24)|4278255360&(a<<24|a>>>8),f=h>>>16|4294901760&l,u=l<<16|65535&h;for(n[0]^=h,n[1]^=f,n[2]^=l,n[3]^=u,n[4]^=h,n[5]^=f,n[6]^=l,n[7]^=u,r=0;r<4;r++)c.call(this)}},_doProcessBlock:function(t,e){var r=this._X;c.call(this),i[0]=r[0]^r[5]>>>16^r[3]<<16,i[1]=r[2]^r[7]>>>16^r[5]<<16,i[2]=r[4]^r[1]>>>16^r[7]<<16,i[3]=r[6]^r[3]>>>16^r[1]<<16;for(var n=0;n<4;n++)i[n]=16711935&(i[n]<<8|i[n]>>>24)|4278255360&(i[n]<<24|i[n]>>>8),t[e+n]^=i[n]},blockSize:4,ivSize:2});function c(){for(var t=this._X,e=this._C,r=0;r<8;r++)n[r]=e[r];for(e[0]=e[0]+1295307597+this._b|0,e[1]=e[1]+3545052371+(e[0]>>>0>>0?1:0)|0,e[2]=e[2]+886263092+(e[1]>>>0>>0?1:0)|0,e[3]=e[3]+1295307597+(e[2]>>>0>>0?1:0)|0,e[4]=e[4]+3545052371+(e[3]>>>0>>0?1:0)|0,e[5]=e[5]+886263092+(e[4]>>>0>>0?1:0)|0,e[6]=e[6]+1295307597+(e[5]>>>0>>0?1:0)|0,e[7]=e[7]+3545052371+(e[6]>>>0>>0?1:0)|0,this._b=e[7]>>>0>>0?1:0,r=0;r<8;r++){var i=t[r]+e[r],s=65535&i,a=i>>>16,c=((s*s>>>17)+s*a>>>15)+a*a,h=((4294901760&i)*i|0)+((65535&i)*i|0);o[r]=c^h}t[0]=o[0]+(o[7]<<16|o[7]>>>16)+(o[6]<<16|o[6]>>>16)|0,t[1]=o[1]+(o[0]<<8|o[0]>>>24)+o[7]|0,t[2]=o[2]+(o[1]<<16|o[1]>>>16)+(o[0]<<16|o[0]>>>16)|0,t[3]=o[3]+(o[2]<<8|o[2]>>>24)+o[1]|0,t[4]=o[4]+(o[3]<<16|o[3]>>>16)+(o[2]<<16|o[2]>>>16)|0,t[5]=o[5]+(o[4]<<8|o[4]>>>24)+o[3]|0,t[6]=o[6]+(o[5]<<16|o[5]>>>16)+(o[4]<<16|o[4]>>>16)|0,t[7]=o[7]+(o[6]<<8|o[6]>>>24)+o[5]|0}t.Rabbit=e._createHelper(s)}(),a.mode.CTR=function(){var t=a.lib.BlockCipherMode.extend(),e=t.Encryptor=t.extend({processBlock:function(t,e){var r=this._cipher,i=r.blockSize,n=this._iv,o=this._counter;n&&(o=this._counter=n.slice(0),this._iv=void 0);var s=o.slice(0);r.encryptBlock(s,0),o[i-1]=o[i-1]+1|0;for(var a=0;a>>16,t[1],t[0]<<16|t[3]>>>16,t[2],t[1]<<16|t[0]>>>16,t[3],t[2]<<16|t[1]>>>16],i=this._C=[t[2]<<16|t[2]>>>16,4294901760&t[0]|65535&t[1],t[3]<<16|t[3]>>>16,4294901760&t[1]|65535&t[2],t[0]<<16|t[0]>>>16,4294901760&t[2]|65535&t[3],t[1]<<16|t[1]>>>16,4294901760&t[3]|65535&t[0]];this._b=0;for(var n=0;n<4;n++)c.call(this);for(n=0;n<8;n++)i[n]^=r[n+4&7];if(e){var o=e.words,s=o[0],a=o[1],h=16711935&(s<<8|s>>>24)|4278255360&(s<<24|s>>>8),l=16711935&(a<<8|a>>>24)|4278255360&(a<<24|a>>>8),f=h>>>16|4294901760&l,u=l<<16|65535&h;for(i[0]^=h,i[1]^=f,i[2]^=l,i[3]^=u,i[4]^=h,i[5]^=f,i[6]^=l,i[7]^=u,n=0;n<4;n++)c.call(this)}},_doProcessBlock:function(t,e){var r=this._X;c.call(this),i[0]=r[0]^r[5]>>>16^r[3]<<16,i[1]=r[2]^r[7]>>>16^r[5]<<16,i[2]=r[4]^r[1]>>>16^r[7]<<16,i[3]=r[6]^r[3]>>>16^r[1]<<16;for(var n=0;n<4;n++)i[n]=16711935&(i[n]<<8|i[n]>>>24)|4278255360&(i[n]<<24|i[n]>>>8),t[e+n]^=i[n]},blockSize:4,ivSize:2});function c(){for(var t=this._X,e=this._C,r=0;r<8;r++)n[r]=e[r];for(e[0]=e[0]+1295307597+this._b|0,e[1]=e[1]+3545052371+(e[0]>>>0>>0?1:0)|0,e[2]=e[2]+886263092+(e[1]>>>0>>0?1:0)|0,e[3]=e[3]+1295307597+(e[2]>>>0>>0?1:0)|0,e[4]=e[4]+3545052371+(e[3]>>>0>>0?1:0)|0,e[5]=e[5]+886263092+(e[4]>>>0>>0?1:0)|0,e[6]=e[6]+1295307597+(e[5]>>>0>>0?1:0)|0,e[7]=e[7]+3545052371+(e[6]>>>0>>0?1:0)|0,this._b=e[7]>>>0>>0?1:0,r=0;r<8;r++){var i=t[r]+e[r],s=65535&i,a=i>>>16,c=((s*s>>>17)+s*a>>>15)+a*a,h=((4294901760&i)*i|0)+((65535&i)*i|0);o[r]=c^h}t[0]=o[0]+(o[7]<<16|o[7]>>>16)+(o[6]<<16|o[6]>>>16)|0,t[1]=o[1]+(o[0]<<8|o[0]>>>24)+o[7]|0,t[2]=o[2]+(o[1]<<16|o[1]>>>16)+(o[0]<<16|o[0]>>>16)|0,t[3]=o[3]+(o[2]<<8|o[2]>>>24)+o[1]|0,t[4]=o[4]+(o[3]<<16|o[3]>>>16)+(o[2]<<16|o[2]>>>16)|0,t[5]=o[5]+(o[4]<<8|o[4]>>>24)+o[3]|0,t[6]=o[6]+(o[5]<<16|o[5]>>>16)+(o[4]<<16|o[4]>>>16)|0,t[7]=o[7]+(o[6]<<8|o[6]>>>24)+o[5]|0}t.RabbitLegacy=e._createHelper(s)}(),a.pad.ZeroPadding={pad:function(t,e){var r=4*e;t.clamp(),t.sigBytes+=r-(t.sigBytes%r||r)},unpad:function(t){var e=t.words,r=t.sigBytes-1;for(r=t.sigBytes-1;r>=0;r--)if(e[r>>>2]>>>24-r%4*8&255){t.sigBytes=r+1;break}}},a)}));return function(){function e(r){t(this,e);var i=r.logger,n=r.isArray,o=r.isMap,s=r.isDevMode;this._isArray=n,this._isMap=o,this._isDevMode=s,i.log("TIMProfanityFilterPlugin.VERSION:".concat("0.9.0")),this._interceptProfanityList=[],this._interceptFilter=null,this._interceptRegExpList=[],this._replacingProfanityMap=new Map,this._replacingFilter=null,this._replacingRegExpMap=new Map,this._key="",this._iv="",this._decryptOptions=void 0}return r(e,[{key:"onToken",value:function(t){this._key=u.enc.Utf8.parse(t.slice(0,32)),this._iv=this._key,this._decryptOptions={iv:this._iv,mode:u.mode.CBC,padding:u.pad.Pkcs7}}},{key:"onLexiconSliced",value:function(t){if(this._isArray(t)&&0!==t.length){var e,r,i,n=a(t);try{for(n.s();!(i=n.n()).done;){var o=i.value,s=o.filterType,c=o.profanityType,h=o.profanity,l=o.replacement;e=this._getDecryptedString(h),r=this._getDecryptedString(l),1===s?1===c?this._interceptProfanityList.push(e):2===c&&this._interceptRegExpList.push(e):2===s&&(1===c?this._replacingProfanityMap.set(e,r):2===c&&this._replacingRegExpMap.set(e,r))}}catch(f){n.e(f)}finally{n.f()}}}},{key:"_getDecryptedString",value:function(t){var e=u.AES.decrypt(t,this._key,this._decryptOptions);return u.enc.Utf8.stringify(e).toLowerCase()}},{key:"onLexiconCompleted",value:function(t){this.onLexiconSliced(t),this._interceptFilter=new h({input:this._interceptProfanityList,isArray:this._isArray,isMap:this._isMap}),this._replacingFilter=new h({input:this._replacingProfanityMap,isArray:this._isArray,isMap:this._isMap}),!0===this._isDevMode&&(console.log("TIMProfanityFilterPlugin _interceptProfanityList ->",this._interceptProfanityList),console.log("TIMProfanityFilterPlugin _interceptRegExpList ->",this._interceptRegExpList),console.log("TIMProfanityFilterPlugin _replacingProfanityMap ->",this._replacingProfanityMap),console.log("TIMProfanityFilterPlugin _replacingRegExpMap ->",this._replacingRegExpMap))}},{key:"filter",value:function(t){var e={type:0,modifiedText:t};if(!0===this._interceptFilter.filter({text:t,replacingEnabled:!1}).isMatched)return e.type=1,e;for(var r=!1,n=0,o=this._interceptRegExpList.length;n=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var f="undefined"!=typeof wx&&"function"==typeof wx.getSystemInfoSync&&Boolean(wx.getSystemInfoSync().fontSizeSetting),u="undefined"!=typeof qq&&"function"==typeof qq.getSystemInfoSync&&Boolean(qq.getSystemInfoSync().fontSizeSetting),l="undefined"!=typeof tt&&"function"==typeof tt.getSystemInfoSync&&Boolean(tt.getSystemInfoSync().fontSizeSetting),c="undefined"!=typeof swan&&"function"==typeof swan.getSystemInfoSync&&Boolean(swan.getSystemInfoSync().fontSizeSetting),y="undefined"!=typeof my&&"function"==typeof my.getSystemInfoSync&&Boolean(my.getSystemInfoSync().fontSizeSetting),d="undefined"!=typeof uni&&"undefined"==typeof window,p=f||u||l||c||y||d,g=u?qq:l?tt:c?swan:y?my:f?wx:d?uni:{},h=function(e){if("object"!==n(e)||null===e)return!1;var t=Object.getPrototypeOf(e);if(null===t)return!0;for(var o=t;null!==Object.getPrototypeOf(o);)o=Object.getPrototypeOf(o);return t===o};function m(e){if(null==e)return!0;if("boolean"==typeof e)return!1;if("number"==typeof e)return 0===e;if("string"==typeof e)return 0===e.length;if("function"==typeof e)return 0===e.length;if(Array.isArray(e))return 0===e.length;if(e instanceof Error)return""===e.message;if(h(e)){for(var t in e)if(Object.prototype.hasOwnProperty.call(e,t))return!1;return!0}return!1}var b=function(){function e(){o(this,e)}return a(e,[{key:"request",value:function(e,t){var n=this,o=e.downloadUrl||"",r=(e.method||"PUT").toUpperCase(),a=e.url;if(e.qs){var s=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"&",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"=";return m(e)?"":h(e)?Object.keys(e).map((function(o){var r=encodeURIComponent(o)+n;return Array.isArray(e[o])?e[o].map((function(e){return r+encodeURIComponent(e)})).join(t):r+encodeURIComponent(e[o])})).filter(Boolean).join(t):void 0}(e.qs);s&&(a+="".concat(-1===a.indexOf("?")?"?":"&").concat(s))}var i=new XMLHttpRequest;i.open(r,a,!0),i.responseType=e.dataType||"text";var f=e.headers||{};if(!m(f))for(var u in f)f.hasOwnProperty(u)&&"content-length"!==u.toLowerCase()&&"user-agent"!==u.toLowerCase()&&"origin"!==u.toLowerCase()&&"host"!==u.toLowerCase()&&i.setRequestHeader(u,f[u]);return i.onload=function(){if(200===i.status)t(null,n._xhrRes(i,n._xhrBody(i,o)));else{var e={code:i.status,message:JSON.stringify(i.responseText)};t(e,n._xhrRes(i,n._xhrBody(i)))}},i.onerror=function(e){var o=n._xhrBody(i),r={code:i.status,message:JSON.stringify(i.responseText)};o||i.statusText||0!==i.status||(e.message="CORS blocked or network error"),t(r,n._xhrRes(i,o)),r=null},e.onProgress&&i.upload&&(i.upload.onprogress=function(t){var n=t.total,o=t.loaded,r=Math.floor(100*o/n);e.onProgress({total:n,loaded:o,percent:(r>=100?100:r)/100})}),i.send(e.resources),i}},{key:"_xhrRes",value:function(e,t){var n={};return e.getAllResponseHeaders().trim().split("\n").forEach((function(e){if(e){var t=e.indexOf(":"),o=e.substr(0,t).trim().toLowerCase(),r=e.substr(t+1).trim();n[o]=r}})),{statusCode:e.status,statusMessage:e.statusText,headers:n,data:t}}},{key:"_xhrBody",value:function(e,t){return 200===e.status&&t?{location:t}:{response:e.responseText}}}]),e}(),v=["unknown","image","video","audio","log"],O=["name"],S=function(){function e(){o(this,e)}return a(e,[{key:"request",value:function(e,n){var o=this,r=e.resources,a=void 0===r?"":r,s=e.headers,f=void 0===s?{}:s,u=e.url,l=e.downloadUrl,c=void 0===l?"":l,d=null,p="",h=c.match(/^(https?:\/\/[^/]+\/)([^/]*\/?)(.*)$/),m={url:u,header:f,name:"file",filePath:a,formData:{key:p=(p=decodeURIComponent(h[3])).indexOf("?")>-1?p.split("?")[0]:p,success_action_status:200,"Content-Type":""},timeout:e.timeout||3e5};if(y){var b=m;b.name,m=t(t({},i(b,O)),{},{fileName:"file",fileType:v[e.fileType]})}return(d=g.uploadFile(t(t({},m),{},{success:function(e){o._handleResponse({response:e,downloadUrl:c,callback:n})},fail:function(e){o._handleResponse({response:e,downloadUrl:c,callback:n})}}))).onProgressUpdate((function(t){e.onProgress&&e.onProgress({total:t.totalBytesExpectedToSend,loaded:t.totalBytesSent,percent:Math.floor(t.progress)/100})})),d}},{key:"_handleResponse",value:function(e){var n=e.downloadUrl,o=e.response,r=e.callback,a=o.header,s={};if(a)for(var i in a)a.hasOwnProperty(i)&&(s[i.toLowerCase()]=a[i]);var f=+o.statusCode;200===f?r(null,{statusCode:f,headers:s,data:t(t({},o.data),{},{location:n})}):r({code:f,message:JSON.stringify(o.data)},{statusCode:f,headers:s,data:void 0})}}]),e}();return function(){function e(){o(this,e),console.log("TIMUploadPlugin.VERSION: ".concat("1.0.6")),this.retry=1,this.tryCount=0,this.systemClockOffset=0,this.httpRequest=p?new S:new b}return a(e,[{key:"uploadFile",value:function(e,t){var n=this;return this.httpRequest.request(e,(function(o,r){o&&n.tryCount=3e4&&(this.systemClockOffset=i-s,t=!0)}else 5===Math.floor(e.statusCode/100)&&(t=!0)}return t}}]),e}()},"object"==typeof exports&&"undefined"!=typeof module?module.exports=factory():"function"==typeof define&&define.amd?define(factory):(global=global||self).TIMUploadPlugin=factory();
diff --git a/TUIService/TUIKit/lib/tim-wx-sdk.js b/TUIService/TUIKit/lib/tim-wx-sdk.js
new file mode 100644
index 0000000..8639a34
--- /dev/null
+++ b/TUIService/TUIKit/lib/tim-wx-sdk.js
@@ -0,0 +1 @@
+'use strict';!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).TIM=t()}(this,(function(){function e(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function t(t){for(var n=1;n