fmode-ng 0.0.39 → 0.0.41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/fmode-ng.mjs +5 -10
- package/esm2022/lib/aigc/agent/agent.prompt.mjs +122 -10
- package/esm2022/lib/aigc/agent/index.mjs +2 -10
- package/esm2022/lib/aigc/avatar/avatar.module.mjs +45 -10
- package/esm2022/lib/aigc/avatar/comp-avatar-particle/avatar.role.mjs +2 -10
- package/esm2022/lib/aigc/avatar/comp-avatar-particle/comp-avatar-particle.component.mjs +315 -10
- package/esm2022/lib/aigc/avatar/comp-avatar-particle/index.mjs +3 -10
- package/esm2022/lib/aigc/avatar/comp-avatar-particle/role-points.class.mjs +57 -10
- package/esm2022/lib/aigc/avatar/comp-avatar-role-image/comp-avatar-role-image.component.mjs +97 -10
- package/esm2022/lib/aigc/avatar/comp-avatar-role-video/comp-avatar-role-video.component.mjs +104 -10
- package/esm2022/lib/aigc/avatar/comp-avatar-talk/comp-avatar-talk.component.mjs +111 -10
- package/esm2022/lib/aigc/avatar/index.mjs +8 -10
- package/esm2022/lib/aigc/avatar/interface-avatar-role.mjs +2 -10
- package/esm2022/lib/aigc/avatar/modal-chat-voice-input/modal-chat-voice-input.component.mjs +166 -8
- package/esm2022/lib/aigc/chat/chat-header-area/comp-header-area.component.mjs +36 -10
- package/esm2022/lib/aigc/chat/chat-header-area/index.mjs +2 -10
- package/esm2022/lib/aigc/chat/chat-list/chat-list.component.mjs +141 -8
- package/esm2022/lib/aigc/chat/chat-list/index.mjs +2 -10
- package/esm2022/lib/aigc/chat/chat-message-area/comp-message-area.component.mjs +40 -10
- package/esm2022/lib/aigc/chat/chat-message-area/index.mjs +2 -10
- package/esm2022/lib/aigc/chat/chat-message-card/comp-message-card.component.mjs +92 -10
- package/esm2022/lib/aigc/chat/chat-message-card/index.mjs +2 -10
- package/esm2022/lib/aigc/chat/chat-modal-input/index.mjs +2 -10
- package/esm2022/lib/aigc/chat/chat-modal-input/modal-audio-message/modal-audio-message.component.mjs +207 -8
- package/esm2022/lib/aigc/chat/chat-modal-input/modal-input.component.mjs +236 -10
- package/esm2022/lib/aigc/chat/chat-panel/chat-panel.component.mjs +137 -10
- package/esm2022/lib/aigc/chat/comp-role-prompt/comp-role-prompt.component.mjs +69 -10
- package/esm2022/lib/aigc/chat/comp-role-prompt/index.mjs +2 -10
- package/esm2022/lib/aigc/chat/index.mjs +8 -10
- package/esm2022/lib/aigc/comp-markdown-preview/clipboard.service.mjs +82 -10
- package/esm2022/lib/aigc/comp-markdown-preview/markdown-parse.mjs +269 -8
- package/esm2022/lib/aigc/comp-markdown-preview/markdown-preview.component.mjs +51 -10
- package/esm2022/lib/aigc/comp-markdown-preview/markdown-preview.module.mjs +24 -10
- package/esm2022/lib/aigc/comp-markdown-preview/plugins/md-mathjax/index.mjs +94 -10
- package/esm2022/lib/aigc/index.mjs +13 -10
- package/esm2022/lib/aigc/service-fmai/fmai.service.mjs +21 -10
- package/esm2022/lib/aigc/service-fmai/service-chat/chat-class.mjs +736 -8
- package/esm2022/lib/aigc/service-fmai/service-chat/chat.service.mjs +181 -8
- package/esm2022/lib/aigc/service-fmai/service-chat/index.mjs +7 -10
- package/esm2022/lib/aigc/service-fmai/service-chat/mask-list.mjs +194 -9
- package/esm2022/lib/aigc/service-fmai/service-chat/pipes/chat-content.pipe.mjs +27 -10
- package/esm2022/lib/aigc/service-fmai/service-chat/pipes/hidexml.pipe.mjs +27 -10
- package/esm2022/lib/aigc/service-fmai/service-chat/utilnow.pipe.mjs +68 -10
- package/esm2022/lib/aigc/service-fmai/service-imagine/imagine.service.mjs +229 -8
- package/esm2022/lib/aigc/service-fmai/service-imagine/index.mjs +2 -10
- package/esm2022/lib/aigc/voice/audio.player.mjs +52 -10
- package/esm2022/lib/aigc/voice/class-asr.mjs +79 -8
- package/esm2022/lib/aigc/voice/fmode-voice.service.mjs +501 -8
- package/esm2022/lib/aigc/voice/index.mjs +3 -10
- package/esm2022/lib/aigc/voice/lib/pcm2wav.mjs +38 -10
- package/esm2022/lib/aigc/voice/lib/resample.mjs +34 -10
- package/esm2022/lib/aigc/voice/tts/fmode-tts-class.mjs +233 -8
- package/esm2022/lib/aigc/voice/tts/index.mjs +2 -10
- package/esm2022/lib/map/comp-poi-picker/comp-poi-picker.component.mjs +190 -10
- package/esm2022/lib/map/comp-poi-picker/comp-poi-picker.module.mjs +33 -10
- package/esm2022/lib/map/index.mjs +4 -10
- package/esm2022/lib/map/map.module.mjs +61 -10
- package/esm2022/lib/map/page-loca-scatter/page-loca-scatter.component.mjs +110 -10
- package/esm2022/lib/map/page-map.start/page-map.start.component.mjs +98 -8
- package/esm2022/lib/map/page-plan-route/page-plan-route.component.mjs +100 -8
- package/esm2022/lib/nova-cloud/index.mjs +2 -10
- package/esm2022/lib/nova-cloud/nova-cloud.service.mjs +148 -10
- package/esm2022/lib/platform/cross.service.mjs +63 -10
- package/esm2022/lib/platform/index.mjs +2 -10
- package/esm2022/lib/social/index.mjs +2 -10
- package/esm2022/lib/social/wechat/wechat-jssdk.service.mjs +236 -8
- package/esm2022/lib/storage/comp-hwobs-manager/hwobs-manager.component.mjs +59 -10
- package/esm2022/lib/storage/index.mjs +5 -10
- package/esm2022/lib/storage/service-hwobs/hwobs.service.mjs +130 -8
- package/esm2022/lib/storage/service-upload/index.mjs +2 -10
- package/esm2022/lib/storage/service-upload/nova-upload.service.mjs +462 -8
- package/esm2022/lib/storage/service-upload/util-file-md5.mjs +28 -10
- package/esm2022/lib/storage/storage.module.mjs +41 -10
- package/esm2022/lib/user/account/account.service.mjs +221 -10
- package/esm2022/lib/user/captcha/captcha.component.mjs +135 -10
- package/esm2022/lib/user/comp-user-avatar/comp-user-avatar.component.mjs +62 -10
- package/esm2022/lib/user/index.mjs +17 -10
- package/esm2022/lib/user/login/auth.guard.mjs +28 -10
- package/esm2022/lib/user/login/auth.service.mjs +373 -8
- package/esm2022/lib/user/login/login.component.mjs +913 -10
- package/esm2022/lib/user/modal-user-login/modal-user-login.component.mjs +273 -10
- package/esm2022/lib/user/profile/auth-profile.guard.mjs +27 -10
- package/esm2022/lib/user/profile/auth-profile.service.mjs +122 -10
- package/esm2022/lib/user/profile/profile-bind/profile-bind.component.mjs +115 -10
- package/esm2022/lib/user/profile/profile.module.mjs +57 -10
- package/esm2022/lib/user/staff/index.mjs +4 -10
- package/esm2022/lib/user/staff/staff.guard.mjs +26 -10
- package/esm2022/lib/user/staff/staff.module.mjs +18 -10
- package/esm2022/lib/user/staff/staff.service.mjs +85 -10
- package/esm2022/lib/user/user-name.pipe.mjs +29 -10
- package/esm2022/lib/user/user.module.mjs +106 -10
- package/esm2022/lib/video/fm-video/fm-video.component.mjs +67 -10
- package/esm2022/lib/video/index.mjs +2 -10
- package/esm2022/public-api.mjs +13 -10
- package/fesm2022/fmode-ng.mjs +8895 -7
- package/fesm2022/fmode-ng.mjs.map +1 -1
- package/lib/user/login/auth.service.d.ts +18 -3
- package/lib/user/modal-user-login/modal-user-login.component.d.ts +4 -2
- package/package.json +1 -1
- package/LICENSE.md +0 -8
|
@@ -1,10 +1,464 @@
|
|
|
1
|
-
|
|
1
|
+
import { DatePipe } from '@angular/common';
|
|
2
|
+
import { Injectable } from '@angular/core';
|
|
3
|
+
import { Platform } from '@ionic/angular';
|
|
4
|
+
import { Camera, CameraResultType, CameraSource } from "@capacitor/camera";
|
|
5
|
+
import { Capacitor } from "@capacitor/core";
|
|
6
|
+
import { Filesystem } from "@capacitor/filesystem";
|
|
7
|
+
import { FilesystemWeb } from '@capacitor/filesystem/dist/esm/web.js';
|
|
8
|
+
import * as qiniu from "qiniu-js";
|
|
9
|
+
import Parse from "parse";
|
|
10
|
+
import { Diagnostic } from '@awesome-cordova-plugins/diagnostic/ngx';
|
|
11
|
+
import CryptoJS from "crypto-js";
|
|
12
|
+
/**
|
|
13
|
+
* MediaCapture插件
|
|
14
|
+
* @private
|
|
15
|
+
* @description
|
|
16
|
+
* 依赖:File
|
|
17
|
+
* npm i -S cordova-plugin-file @awesome-cordova-plugins/file
|
|
18
|
+
*/
|
|
19
|
+
import { MediaCapture } from "@awesome-cordova-plugins/media-capture";
|
|
20
|
+
import { calcFileMd5 } from './util-file-md5';
|
|
21
|
+
import * as i0 from "@angular/core";
|
|
22
|
+
import * as i1 from "@ionic/angular";
|
|
23
|
+
import * as i2 from "@awesome-cordova-plugins/diagnostic/ngx";
|
|
24
|
+
/**
|
|
25
|
+
* NovaUploadService 上传服务
|
|
26
|
+
* @public
|
|
27
|
+
*/
|
|
28
|
+
export class NovaUploadService {
|
|
29
|
+
constructor(platform, diagnostic) {
|
|
30
|
+
this.platform = platform;
|
|
31
|
+
this.diagnostic = diagnostic;
|
|
32
|
+
this.maxSize = 5 * 1024 * 1024;
|
|
33
|
+
this.getUptoken(true);
|
|
34
|
+
this.requestPermission();
|
|
35
|
+
this.queryDomain();
|
|
36
|
+
}
|
|
2
37
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
38
|
+
* 全端通用上传方法
|
|
39
|
+
* @params file:File 待上传文件
|
|
40
|
+
* @params onProgress:Function 上传进度回调函数
|
|
41
|
+
* @returns
|
|
42
|
+
* progressData {
|
|
43
|
+
"total": {
|
|
44
|
+
"size": 8491,
|
|
45
|
+
"loaded": 8490,
|
|
46
|
+
"percent": 99.98822282416675
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
* novafileData {
|
|
50
|
+
"id":"xxxxxxxxxx" // Attachment.objectId
|
|
51
|
+
"hash": "FoYHjpyTif1t8uOMv6N6sVIeGTvq",
|
|
52
|
+
"key": "E4KpGvTEto/20230901/053605467.jpg",
|
|
53
|
+
"url": "https://file-cloud.fmode.cn/E4KpGvTEto/20230901/053605467.jpg",
|
|
54
|
+
"name": "20230901173605.jpg",
|
|
55
|
+
"type": "image/jpg",
|
|
56
|
+
"size": 7853
|
|
57
|
+
}
|
|
7
58
|
*/
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
59
|
+
async upload(file, onProgress) {
|
|
60
|
+
// 解析文件类型,并获得文件后缀
|
|
61
|
+
let type = file.type;
|
|
62
|
+
let nameList = file.name?.split(".");
|
|
63
|
+
let format = nameList[nameList.length - 1]; // 文件后缀
|
|
64
|
+
// 计算文件md5
|
|
65
|
+
let md5File;
|
|
66
|
+
try {
|
|
67
|
+
md5File = await calcFileMd5(file);
|
|
68
|
+
}
|
|
69
|
+
catch (errmd5) { }
|
|
70
|
+
// 转换文件blob
|
|
71
|
+
let blob = this.fileToBlob(file);
|
|
72
|
+
// 图片上传
|
|
73
|
+
let uploadFile;
|
|
74
|
+
if (type.indexOf('image') > -1) {
|
|
75
|
+
uploadFile = await this.saveQiniuImageFile(blob, format, null, onProgress);
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
uploadFile = await this.saveQiniuMediaFile(file, blob, null, onProgress);
|
|
79
|
+
}
|
|
80
|
+
uploadFile.md5 = md5File;
|
|
81
|
+
// 纠正file.url
|
|
82
|
+
if (uploadFile?.url?.indexOf('undefined') > -1) {
|
|
83
|
+
uploadFile.url = (this.qiniuDomain || "https://file-cloud.fmode.cn/") + uploadFile.url.replace("undefined/", "");
|
|
84
|
+
}
|
|
85
|
+
// 保存附件
|
|
86
|
+
let attachment;
|
|
87
|
+
if (uploadFile?.url) {
|
|
88
|
+
attachment = await this.saveAttachment(uploadFile, this.qiniuDomain, null, this.getCompanyId());
|
|
89
|
+
}
|
|
90
|
+
if (attachment?.id) {
|
|
91
|
+
uploadFile.id = attachment?.id;
|
|
92
|
+
}
|
|
93
|
+
return uploadFile;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* 移动端上传专用方法
|
|
97
|
+
* @returns
|
|
98
|
+
*/
|
|
99
|
+
isCapacitor() {
|
|
100
|
+
return this.platform.is("capacitor") || this.platform.is("cordova");
|
|
101
|
+
}
|
|
102
|
+
async requestPermission() {
|
|
103
|
+
if (!this.isCapacitor())
|
|
104
|
+
return;
|
|
105
|
+
await this.requestStoagePermission();
|
|
106
|
+
await this.requestCameraPermission();
|
|
107
|
+
}
|
|
108
|
+
async requestStoagePermission() {
|
|
109
|
+
let isAvailable = await this.diagnostic.isExternalStorageAuthorized();
|
|
110
|
+
console.log("permisson_STORAGE:", isAvailable);
|
|
111
|
+
if (!isAvailable) {
|
|
112
|
+
let data = await this.diagnostic.requestExternalStorageAuthorization();
|
|
113
|
+
}
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
async requestCameraPermission() {
|
|
117
|
+
let isAvailable = await this.diagnostic.isCameraAuthorized();
|
|
118
|
+
console.log("permisson_Camera:", isAvailable);
|
|
119
|
+
if (!isAvailable) {
|
|
120
|
+
let data = await this.diagnostic.requestCameraAuthorization();
|
|
121
|
+
}
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* 上传Token获取方法
|
|
126
|
+
* @returns
|
|
127
|
+
*/
|
|
128
|
+
async getUptoken(refresh = false) {
|
|
129
|
+
console.log("getUptoken");
|
|
130
|
+
if (!this.qiniuConf && !refresh)
|
|
131
|
+
return;
|
|
132
|
+
try {
|
|
133
|
+
console.log(this.getCompanyId());
|
|
134
|
+
let data = await Parse.Cloud.run("qiniu_uptoken", {
|
|
135
|
+
company: this.getCompanyId(),
|
|
136
|
+
});
|
|
137
|
+
console.log(data);
|
|
138
|
+
this.qiniuConf = data;
|
|
139
|
+
}
|
|
140
|
+
catch (err) {
|
|
141
|
+
console.error(err);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* 生成文件上传Key值:<公司id>/<yyyymmdd>/<file.id><hhMMss>.<ext>
|
|
146
|
+
* @desc 用于对象存储含全路径的文件名称
|
|
147
|
+
*/
|
|
148
|
+
genFileKey(file, company) {
|
|
149
|
+
let today = new Date();
|
|
150
|
+
let dp = new DatePipe("en");
|
|
151
|
+
if (!company) {
|
|
152
|
+
company = this.getCompanyId();
|
|
153
|
+
}
|
|
154
|
+
return "" + company + "/" + dp.transform(today, "yMMdd") + "/" + String(file.id).substr(20, 6) + dp.transform(today, "hhmmssSSS") + /\.[^\.]+/.exec(file.name);
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* 获取当前登录用户公司ID
|
|
158
|
+
* @returns 公司ID
|
|
159
|
+
*/
|
|
160
|
+
getCompanyId() {
|
|
161
|
+
// 获取公司ID,或无指定值,则获取localStorage中company
|
|
162
|
+
if (this.company) {
|
|
163
|
+
return this.company;
|
|
164
|
+
}
|
|
165
|
+
let id = localStorage.getItem("company");
|
|
166
|
+
return id;
|
|
167
|
+
}
|
|
168
|
+
async queryDomain() {
|
|
169
|
+
let Company = new Parse.Query('Company');
|
|
170
|
+
let company = await Company.get(this.getCompanyId());
|
|
171
|
+
if (company.get("configQiniu") && company.get("configQiniu").domain) {
|
|
172
|
+
console.log(company.get("configQiniu").domain);
|
|
173
|
+
this.qiniuDomain = company.get("configQiniu").domain;
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
this.qiniuDomain = 'https://file-cloud.fmode.cn';
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* 保存上传信息至附件表 Attachment
|
|
181
|
+
* @param file 附件信息
|
|
182
|
+
* @returns attachment Parse.Object
|
|
183
|
+
*/
|
|
184
|
+
async saveAttachment(file, domain, cateId, company) {
|
|
185
|
+
let url = file.url;
|
|
186
|
+
if (url.startsWith("http")) {
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
url = domain + url;
|
|
190
|
+
}
|
|
191
|
+
url = url.replace(/undefined\//, "");
|
|
192
|
+
// 帐套参数默认加载本地存储
|
|
193
|
+
if (!company) {
|
|
194
|
+
company = localStorage.getItem("company");
|
|
195
|
+
}
|
|
196
|
+
let user = Parse.User.current();
|
|
197
|
+
// 检测文件是否存在
|
|
198
|
+
let query = new Parse.Query("Attachment");
|
|
199
|
+
query.equalTo("url", url);
|
|
200
|
+
let attachment = await query.first();
|
|
201
|
+
if (attachment && attachment.id) {
|
|
202
|
+
console.error("该文件已存在,无需重复上传");
|
|
203
|
+
return attachment;
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
let Attachment = Parse.Object.extend("Attachment");
|
|
207
|
+
attachment = new Attachment();
|
|
208
|
+
attachment.set("size", file.size);
|
|
209
|
+
attachment.set("url", url);
|
|
210
|
+
attachment.set("name", file.name);
|
|
211
|
+
attachment.set("mime", file.type);
|
|
212
|
+
attachment.set("md5", file?.md5);
|
|
213
|
+
if (user?.id) {
|
|
214
|
+
attachment.set("user", user.toPointer());
|
|
215
|
+
}
|
|
216
|
+
if (company) {
|
|
217
|
+
attachment.set("company", {
|
|
218
|
+
__type: "Pointer",
|
|
219
|
+
className: "Company",
|
|
220
|
+
objectId: localStorage.getItem("company")
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
if (cateId) {
|
|
224
|
+
attachment.set("category", {
|
|
225
|
+
__type: "Pointer",
|
|
226
|
+
className: "Category",
|
|
227
|
+
objectId: cateId
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
return await attachment.save();
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* 录像并上传
|
|
235
|
+
*/
|
|
236
|
+
async captureVideo(conf) {
|
|
237
|
+
this.qiniuConf = conf;
|
|
238
|
+
if (!this.isCapacitor())
|
|
239
|
+
return;
|
|
240
|
+
// {"name":"VID_20230513_182235.mp4","localURL":"https://localhost/__cdvfile_sdcard__/DCIM/Camera/VID_20230513_182235.mp4","type":"video/mp4","lastModified":null,"lastModifiedDate":1683973355000,"size":6100161,"start":0,"end":0,"fullPath":"file:///storage/emulated/0/DCIM/Camera/VID_20230513_182235.mp4"}
|
|
241
|
+
let mediaFile = await this.cameraCaptureVideoFile();
|
|
242
|
+
// let mediaData:string = await this.getMediaFileDataString(mediaFile);
|
|
243
|
+
let fileBlob = await this.getMediaFileDataString(mediaFile);
|
|
244
|
+
// let fileBlob = await this.base64ToBlobType(mediaData,mediaFile.type);
|
|
245
|
+
let qiniuFile = await this.saveQiniuMediaFile(mediaFile, fileBlob);
|
|
246
|
+
return qiniuFile;
|
|
247
|
+
}
|
|
248
|
+
async cameraCaptureVideoFile() {
|
|
249
|
+
let options = {
|
|
250
|
+
limit: 1,
|
|
251
|
+
// quality:50
|
|
252
|
+
};
|
|
253
|
+
let mediaCapture = MediaCapture;
|
|
254
|
+
let list = await mediaCapture.captureVideo(options);
|
|
255
|
+
if (list?.length > 0) {
|
|
256
|
+
return list[0];
|
|
257
|
+
}
|
|
258
|
+
return null;
|
|
259
|
+
}
|
|
260
|
+
async getMediaFileDataString(mediafile) {
|
|
261
|
+
let filesystem = new FilesystemWeb();
|
|
262
|
+
let path = mediafile.fullPath.replaceAll("///", "//");
|
|
263
|
+
let stat = await Filesystem.stat({ path: mediafile.fullPath });
|
|
264
|
+
let webUri = Capacitor.convertFileSrc(stat.uri);
|
|
265
|
+
let content = await fetch(webUri);
|
|
266
|
+
let blob = await content.blob();
|
|
267
|
+
console.log(blob.size);
|
|
268
|
+
console.log(JSON.stringify(stat));
|
|
269
|
+
// CapacitorConver
|
|
270
|
+
// file:///storage/emulated/0/DCIM/Camera/VID_20230612_125907030.mp4
|
|
271
|
+
// let filesystem = Filesystem
|
|
272
|
+
// let content = await filesystem.readFile({
|
|
273
|
+
// path:mediafile.fullPath
|
|
274
|
+
// })
|
|
275
|
+
console.log(JSON.stringify(content));
|
|
276
|
+
console.log(JSON.stringify(Object.keys(content)));
|
|
277
|
+
// console.log(content?.data)
|
|
278
|
+
if (blob) {
|
|
279
|
+
return blob;
|
|
280
|
+
}
|
|
281
|
+
else {
|
|
282
|
+
throw "读取文件失败";
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* 拍照并上传
|
|
287
|
+
* @returns -- {hash?:string,url:string,name:string,size:number,key:stirng}
|
|
288
|
+
*/
|
|
289
|
+
async takePicture(conf) {
|
|
290
|
+
this.qiniuConf = conf;
|
|
291
|
+
if (!this.isCapacitor())
|
|
292
|
+
return;
|
|
293
|
+
await this.getUptoken();
|
|
294
|
+
let image = await this.cameraTakePictureDataUrl();
|
|
295
|
+
// image.format
|
|
296
|
+
if (!image?.dataUrl)
|
|
297
|
+
return;
|
|
298
|
+
let blob = await this.base64ToBlob(image?.dataUrl);
|
|
299
|
+
let qiniuFile = await this.saveQiniuImageFile(blob, image?.format);
|
|
300
|
+
console.log(JSON.stringify(qiniuFile));
|
|
301
|
+
// this.saveAttachment()
|
|
302
|
+
return qiniuFile;
|
|
303
|
+
}
|
|
304
|
+
;
|
|
305
|
+
async cameraTakePictureDataUrl() {
|
|
306
|
+
if (!this.isCapacitor())
|
|
307
|
+
return;
|
|
308
|
+
const image = await Camera.getPhoto({
|
|
309
|
+
quality: 90,
|
|
310
|
+
allowEditing: false,
|
|
311
|
+
// saveToGallery:true,
|
|
312
|
+
source: CameraSource.Camera,
|
|
313
|
+
resultType: CameraResultType.DataUrl
|
|
314
|
+
});
|
|
315
|
+
return image;
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* 七牛上传函数:无需前端组件
|
|
319
|
+
* @param imageBlob: Blob
|
|
320
|
+
* @param format: string
|
|
321
|
+
*/
|
|
322
|
+
async saveQiniuImageFile(imageBlob, format, company, onProgress) {
|
|
323
|
+
// let that = this
|
|
324
|
+
let maxSize = this.maxSize;
|
|
325
|
+
if (imageBlob.size > maxSize) {
|
|
326
|
+
await console.log(`照片过大,超出限制5MB`);
|
|
327
|
+
throw "超出文件大小";
|
|
328
|
+
}
|
|
329
|
+
let dp = new DatePipe("en");
|
|
330
|
+
let id = dp.transform(new Date(), "yyyyMMddHHmmss");
|
|
331
|
+
let name = `${id}.${format}`;
|
|
332
|
+
let type = `image/${format}`;
|
|
333
|
+
// let file = new File([imageBlob], filename, { type: "image/jpeg" })
|
|
334
|
+
let putExtra = {
|
|
335
|
+
fname: name,
|
|
336
|
+
params: {},
|
|
337
|
+
mimeType: "image/*",
|
|
338
|
+
};
|
|
339
|
+
let config = {
|
|
340
|
+
useCdnDomain: true, //使用cdn加速
|
|
341
|
+
forceDirect: true // 强制不分片,放置上传报错
|
|
342
|
+
};
|
|
343
|
+
console.log(this.qiniuConf);
|
|
344
|
+
let qiniuFileKey = this.genFileKey({ id: id, name: name });
|
|
345
|
+
console.log("图片上传前");
|
|
346
|
+
return new Promise((resolve, reject) => {
|
|
347
|
+
console.log("进入了上传");
|
|
348
|
+
let observable = qiniu.upload(imageBlob, qiniuFileKey, this.qiniuConf?.uptoken, putExtra, config);
|
|
349
|
+
observable.subscribe({
|
|
350
|
+
next: (result_2) => {
|
|
351
|
+
// 主要用来展示进度
|
|
352
|
+
console.log(result_2);
|
|
353
|
+
onProgress && onProgress(result_2);
|
|
354
|
+
},
|
|
355
|
+
error: async (err_1) => {
|
|
356
|
+
// this.$notify('上传图片失败');
|
|
357
|
+
// await that.presentToast(`检测失败`, 1500, "danger")
|
|
358
|
+
console.log(err_1);
|
|
359
|
+
},
|
|
360
|
+
complete: (res_1) => {
|
|
361
|
+
console.log("上传完成");
|
|
362
|
+
console.log(`${this.qiniuConf?.domain}${res_1.key}`);
|
|
363
|
+
res_1.url = `${this.qiniuConf?.domain}${res_1.key}`;
|
|
364
|
+
res_1.name = name;
|
|
365
|
+
res_1.type = type;
|
|
366
|
+
res_1.size = imageBlob.size;
|
|
367
|
+
resolve(res_1);
|
|
368
|
+
},
|
|
369
|
+
});
|
|
370
|
+
});
|
|
371
|
+
}
|
|
372
|
+
async saveQiniuMediaFile(mediafile, fileBlob, company, onProgress) {
|
|
373
|
+
// let that = this
|
|
374
|
+
let name = mediafile.name;
|
|
375
|
+
let type = mediafile.type;
|
|
376
|
+
let size = mediafile.size;
|
|
377
|
+
let maxSize = 100 * 1024 * 1024; // 限100M
|
|
378
|
+
if (size > maxSize) {
|
|
379
|
+
console.log(`视频过大,超出限制100MB`);
|
|
380
|
+
throw "超出文件大小";
|
|
381
|
+
}
|
|
382
|
+
let dp = new DatePipe("en");
|
|
383
|
+
let id = dp.transform(new Date(), "yyyyMMddHHmmss");
|
|
384
|
+
// let file = new File([mediaBlob], filename, { type: "image/jpeg" })
|
|
385
|
+
let putExtra = {
|
|
386
|
+
fname: name,
|
|
387
|
+
params: {},
|
|
388
|
+
mimeType: type,
|
|
389
|
+
};
|
|
390
|
+
let config = {
|
|
391
|
+
useCdnDomain: true, //使用cdn加速
|
|
392
|
+
forceDirect: true // 强制不分片,放置上传报错
|
|
393
|
+
};
|
|
394
|
+
let qiniuFileKey = this.genFileKey({ id: id, name: name });
|
|
395
|
+
console.log("图片上传前");
|
|
396
|
+
console.log(mediafile.name, fileBlob.size);
|
|
397
|
+
console.log(fileBlob.size);
|
|
398
|
+
console.log(fileBlob.size / 1024 / 1024);
|
|
399
|
+
return new Promise((resolve, reject) => {
|
|
400
|
+
console.log("进入了上传");
|
|
401
|
+
let observable = qiniu.upload(fileBlob, qiniuFileKey, this.qiniuConf?.uptoken, putExtra, config);
|
|
402
|
+
observable.subscribe({
|
|
403
|
+
next: (result_2) => {
|
|
404
|
+
// 主要用来展示进度
|
|
405
|
+
console.log("主要用来展示进度");
|
|
406
|
+
onProgress && onProgress(result_2);
|
|
407
|
+
console.log(JSON.stringify(result_2));
|
|
408
|
+
},
|
|
409
|
+
error: async (err_1) => {
|
|
410
|
+
console.log("上传失败");
|
|
411
|
+
// this.$notify('上传图片失败');
|
|
412
|
+
// await that.presentToast(`检测失败`, 1500, "danger")
|
|
413
|
+
console.log(JSON.stringify(err_1));
|
|
414
|
+
},
|
|
415
|
+
complete: (res_1) => {
|
|
416
|
+
console.log("上传完成");
|
|
417
|
+
console.log(JSON.stringify(res_1));
|
|
418
|
+
// console.log(`${this.qiniuConf?.domain}${res_1.key}`)
|
|
419
|
+
// res_1.url = `${this.qiniuConf?.domain}${res_1.key}`
|
|
420
|
+
// res_1.name = name
|
|
421
|
+
// res_1.type= type
|
|
422
|
+
// res_1.size = size;
|
|
423
|
+
mediafile.key = res_1.key;
|
|
424
|
+
console.log(mediafile.type);
|
|
425
|
+
mediafile.url = `${this.qiniuConf?.domain}${res_1.key}`;
|
|
426
|
+
console.log(mediafile.url);
|
|
427
|
+
resolve(mediafile);
|
|
428
|
+
},
|
|
429
|
+
});
|
|
430
|
+
});
|
|
431
|
+
}
|
|
432
|
+
//string转File文件
|
|
433
|
+
async base64ToBlobType(string, type) {
|
|
434
|
+
let base64Response = await fetch(`data:${type};base64,${string}`);
|
|
435
|
+
let blob = await base64Response.blob();
|
|
436
|
+
return blob;
|
|
437
|
+
string = atob(string);
|
|
438
|
+
return new Blob([string], {
|
|
439
|
+
type: type
|
|
440
|
+
});
|
|
441
|
+
}
|
|
442
|
+
//base64转File文件
|
|
443
|
+
async base64ToBlob(base64Img) {
|
|
444
|
+
let base64Response = await fetch(base64Img);
|
|
445
|
+
let blob = await base64Response.blob();
|
|
446
|
+
return blob;
|
|
447
|
+
}
|
|
448
|
+
fileToBlob(file) {
|
|
449
|
+
const blob = file.slice(0, file.size, file.type);
|
|
450
|
+
return new Blob([blob], { type: file.type });
|
|
451
|
+
}
|
|
452
|
+
genMd5(inputString) {
|
|
453
|
+
return CryptoJS.MD5(inputString).toString();
|
|
454
|
+
}
|
|
455
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NovaUploadService, deps: [{ token: i1.Platform }, { token: i2.Diagnostic }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
456
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NovaUploadService, providedIn: 'root' }); }
|
|
457
|
+
}
|
|
458
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NovaUploadService, decorators: [{
|
|
459
|
+
type: Injectable,
|
|
460
|
+
args: [{
|
|
461
|
+
providedIn: 'root'
|
|
462
|
+
}]
|
|
463
|
+
}], ctorParameters: () => [{ type: i1.Platform }, { type: i2.Diagnostic }] });
|
|
464
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm92YS11cGxvYWQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Ztb2RlLW5nL3NyYy9saWIvc3RvcmFnZS9zZXJ2aWNlLXVwbG9hZC9ub3ZhLXVwbG9hZC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxQyxPQUFPLEVBQUUsTUFBTSxFQUFDLGdCQUFnQixFQUFFLFlBQVksRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBQ3pFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDbkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHVDQUF1QyxDQUFBO0FBQ3JFLE9BQU8sS0FBSyxLQUFLLE1BQU0sVUFBVSxDQUFBO0FBQ2pDLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDckUsT0FBTyxRQUFRLE1BQU0sV0FBVyxDQUFBO0FBRWhDOzs7Ozs7R0FNRztBQUNILE9BQU8sRUFBRSxZQUFZLEVBQTZDLE1BQU0sd0NBQXdDLENBQUE7QUFDaEgsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7O0FBZ0I5Qzs7O0dBR0c7QUFJSCxNQUFNLE9BQU8saUJBQWlCO0lBTzVCLFlBQ1UsUUFBaUIsRUFDakIsVUFBc0I7UUFEdEIsYUFBUSxHQUFSLFFBQVEsQ0FBUztRQUNqQixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBcVNoQyxZQUFPLEdBQUcsQ0FBQyxHQUFHLElB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QUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqRCxPQUFPLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUNELE1BQU0sQ0FBQyxXQUFrQjtRQUN2QixPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDOUMsQ0FBQzsrR0F2Y1UsaUJBQWlCO21IQUFqQixpQkFBaUIsY0FGaEIsTUFBTTs7NEZBRVAsaUJBQWlCO2tCQUg3QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGVQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFBsYXRmb3JtIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHsgQ2FtZXJhLENhbWVyYVJlc3VsdFR5cGUsIENhbWVyYVNvdXJjZSB9IGZyb20gXCJAY2FwYWNpdG9yL2NhbWVyYVwiXG5pbXBvcnQgeyBDYXBhY2l0b3IgfSBmcm9tIFwiQGNhcGFjaXRvci9jb3JlXCI7XG5pbXBvcnQgeyBGaWxlc3lzdGVtIH0gZnJvbSBcIkBjYXBhY2l0b3IvZmlsZXN5c3RlbVwiO1xuaW1wb3J0IHsgRmlsZXN5c3RlbVdlYiB9IGZyb20gJ0BjYXBhY2l0b3IvZmlsZXN5c3RlbS9kaXN0L2VzbS93ZWIuanMnXG5pbXBvcnQgKiBhcyBxaW5pdSBmcm9tIFwicWluaXUtanNcIlxuaW1wb3J0IFBhcnNlIGZyb20gXCJwYXJzZVwiO1xuaW1wb3J0IHsgRGlhZ25vc3RpYyB9IGZyb20gJ0Bhd2Vzb21lLWNvcmRvdmEtcGx1Z2lucy9kaWFnbm9zdGljL25neCc7XG5pbXBvcnQgQ3J5cHRvSlMgZnJvbSBcImNyeXB0by1qc1wiXG5cbi8qKlxuICogTWVkaWFDYXB0dXJl5o+S5Lu2XG4gKiBAcHJpdmF0ZVxuICogQGRlc2NyaXB0aW9uXG4gKiDkvp3otZbvvJpGaWxlXG4gKiBucG0gaSAtUyBjb3Jkb3ZhLXBsdWdpbi1maWxlIEBhd2Vzb21lLWNvcmRvdmEtcGx1Z2lucy9maWxlXG4gKi9cbmltcG9ydCB7IE1lZGlhQ2FwdHVyZSxNZWRpYUZpbGUsQ2FwdHVyZVZpZGVvT3B0aW9ucyxDYXB0dXJlRXJyb3IgfSBmcm9tIFwiQGF3ZXNvbWUtY29yZG92YS1wbHVnaW5zL21lZGlhLWNhcHR1cmVcIlxuaW1wb3J0IHsgY2FsY0ZpbGVNZDUgfSBmcm9tICcuL3V0aWwtZmlsZS1tZDUnO1xuXG4vKipcbiAqIE5vdmFGaWxlIOaWh+S7tuexu+Wei1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE5vdmFGaWxle1xuICBpZDpzdHJpbmdcbiAga2V5OnN0cmluZ1xuICB1cmw6c3RyaW5nXG4gIG5hbWU6c3RyaW5nXG4gIHR5cGU6c3RyaW5nXG4gIHNpemU6bnVtYmVyXG4gIG1kNT86c3RyaW5nXG59XG5cbi8qKlxuICogTm92YVVwbG9hZFNlcnZpY2Ug5LiK5Lyg5pyN5YqhXG4gKiBAcHVibGljXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIE5vdmFVcGxvYWRTZXJ2aWNlIHtcblxuICBjb21wYW55OnN0cmluZ1xuICB1cHRva2VuOnN0cmluZ1xuICBxaW5pdUNvbmY6YW55IFxuICBkb21haW46c3RyaW5nXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBwbGF0Zm9ybTpQbGF0Zm9ybSxcbiAgICBwcml2YXRlIGRpYWdub3N0aWM6IERpYWdub3N0aWMsIFxuICApIHsgXG4gICAgdGhpcy5nZXRVcHRva2VuKHRydWUpXG4gICAgdGhpcy5yZXF1ZXN0UGVybWlzc2lvbigpO1xuICAgIHRoaXMucXVlcnlEb21haW4oKTtcbiAgfVxuICAvKipcbiAgICog5YWo56uv6YCa55So5LiK5Lyg5pa55rOVXG4gICAqIEBwYXJhbXMgZmlsZTpGaWxlIOW+heS4iuS8oOaWh+S7tlxuICAgKiBAcGFyYW1zIG9uUHJvZ3Jlc3M6RnVuY3Rpb24g5LiK5Lyg6L+b5bqm5Zue6LCD5Ye95pWwXG4gICAqIEByZXR1cm5zXG4gICAqIHByb2dyZXNzRGF0YSB7XG4gICAgICAgICAgICBcInRvdGFsXCI6IHtcbiAgICAgICAgICAgICAgICBcInNpemVcIjogODQ5MSxcbiAgICAgICAgICAgICAgICBcImxvYWRlZFwiOiA4NDkwLFxuICAgICAgICAgICAgICAgIFwicGVyY2VudFwiOiA5OS45ODgyMjI4MjQxNjY3NVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAqIG5vdmFmaWxlRGF0YSB7XG4gICAgICAgIFwiaWRcIjpcInh4eHh4eHh4eHhcIiAvLyBBdHRhY2htZW50Lm9iamVjdElkXG4gICAgICBcImhhc2hcIjogXCJGb1lIanB5VGlmMXQ4dU9NdjZONnNWSWVHVHZxXCIsXG4gICAgICBcImtleVwiOiBcIkU0S3BHdlRFdG8vMjAyMzA5MDEvMDUzNjA1NDY3LmpwZ1wiLFxuICAgICAgXCJ1cmxcIjogXCJodHRwczovL2ZpbGUtY2xvdWQuZm1vZGUuY24vRTRLcEd2VEV0by8yMDIzMDkwMS8wNTM2MDU0NjcuanBnXCIsXG4gICAgICBcIm5hbWVcIjogXCIyMDIzMDkwMTE3MzYwNS5qcGdcIixcbiAgICAgIFwidHlwZVwiOiBcImltYWdlL2pwZ1wiLFxuICAgICAgXCJzaXplXCI6IDc4NTNcbiAgfVxuICAgKi9cbiAgYXN5bmMgdXBsb2FkKGZpbGU6RmlsZSxvblByb2dyZXNzPzpGdW5jdGlvbik6UHJvbWlzZTxOb3ZhRmlsZT57XG4gICAgLy8g6Kej5p6Q5paH5Lu257G75Z6L77yM5bm26I635b6X5paH5Lu25ZCO57yAXG4gICAgbGV0IHR5cGUgPSBmaWxlLnR5cGUgXG5cbiAgICBsZXQgbmFtZUxpc3QgPSBmaWxlLm5hbWU/LnNwbGl0KFwiLlwiKVxuICAgIGxldCBmb3JtYXQgPSBuYW1lTGlzdFtuYW1lTGlzdC5sZW5ndGgtMV0gLy8g5paH5Lu25ZCO57yAXG5cbiAgICAvLyDorqHnrpfmlofku7ZtZDVcbiAgICBsZXQgbWQ1RmlsZVxuICAgIHRyeXtcbiAgICAgIG1kNUZpbGUgPSBhd2FpdCBjYWxjRmlsZU1kNShmaWxlKVxuICAgIH1jYXRjaChlcnJtZDUpe31cbiAgICAvLyDovazmjaLmlofku7ZibG9iXG4gICAgbGV0IGJsb2IgPSB0aGlzLmZpbGVUb0Jsb2IoZmlsZSlcblxuICAgIC8vIOWbvueJh+S4iuS8oFxuICAgIGxldCB1cGxvYWRGaWxlOk5vdmFGaWxlXG4gICAgaWYodHlwZS5pbmRleE9mKCdpbWFnZScpPi0xKXtcbiAgICAgIHVwbG9hZEZpbGUgPSBhd2FpdCB0aGlzLnNhdmVRaW5pdUltYWdlRmlsZShibG9iLGZvcm1hdCxudWxsLG9uUHJvZ3Jlc3MpXG4gICAgfWVsc2V7XG4gICAgICB1cGxvYWRGaWxlID0gYXdhaXQgdGhpcy5zYXZlUWluaXVNZWRpYUZpbGUoZmlsZSxibG9iLG51bGwsb25Qcm9ncmVzcylcbiAgICB9XG4gICAgdXBsb2FkRmlsZS5tZDUgPSBtZDVGaWxlXG5cbiAgICAvLyDnuqDmraNmaWxlLnVybFxuICAgIGlmKHVwbG9hZEZpbGU/LnVybD8uaW5kZXhPZigndW5kZWZpbmVkJyk+LTEpe1xuICAgICAgdXBsb2FkRmlsZS51cmwgPSAodGhpcy5xaW5pdURvbWFpbiB8fCBcImh0dHBzOi8vZmlsZS1jbG91ZC5mbW9kZS5jbi9cIikgKyB1cGxvYWRGaWxlLnVybC5yZXBsYWNlKFwidW5kZWZpbmVkL1wiLCBcIlwiKTtcbiAgICB9XG5cbiAgICAvLyDkv53lrZjpmYTku7ZcbiAgICBsZXQgYXR0YWNobWVudFxuICAgIGlmKHVwbG9hZEZpbGU/LnVybCl7XG4gICAgICBhdHRhY2htZW50ID0gYXdhaXQgdGhpcy5zYXZlQXR0YWNobWVudCh1cGxvYWRGaWxlLHRoaXMucWluaXVEb21haW4sbnVsbCx0aGlzLmdldENvbXBhbnlJZCgpKVxuICAgIH1cbiAgICBpZihhdHRhY2htZW50Py5pZCl7XG4gICAgICB1cGxvYWRGaWxlLmlkID0gYXR0YWNobWVudD8uaWRcbiAgICB9XG4gICAgcmV0dXJuIHVwbG9hZEZpbGVcbiAgfVxuXG4gIC8qKlxuICAgKiDnp7vliqjnq6/kuIrkvKDkuJPnlKjmlrnms5VcbiAgICogQHJldHVybnMgXG4gICAqL1xuICBpc0NhcGFjaXRvcigpe1xuICAgIHJldHVybiB0aGlzLnBsYXRmb3JtLmlzKFwiY2FwYWNpdG9yXCIpIHx8IHRoaXMucGxhdGZvcm0uaXMoXCJjb3Jkb3ZhXCIpXG4gIH1cbiAgYXN5bmMgcmVxdWVzdFBlcm1pc3Npb24oKXtcbiAgICBpZighdGhpcy5pc0NhcGFjaXRvcigpKSByZXR1cm5cbiAgICBhd2FpdCB0aGlzLnJlcXVlc3RTdG9hZ2VQZXJtaXNzaW9uKCk7XG4gICAgYXdhaXQgdGhpcy5yZXF1ZXN0Q2FtZXJhUGVybWlzc2lvbigpO1xuICB9XG4gIGFzeW5jIHJlcXVlc3RTdG9hZ2VQZXJtaXNzaW9uKCl7XG4gICAgICBsZXQgaXNBdmFpbGFibGUgPSBhd2FpdCB0aGlzLmRpYWdub3N0aWMuaXNFeHRlcm5hbFN0b3JhZ2VBdXRob3JpemVkKClcbiAgICAgIGNvbnNvbGUubG9nKFwicGVybWlzc29uX1NUT1JBR0U6XCIsIGlzQXZhaWxhYmxlKVxuICAgICAgaWYgKCFpc0F2YWlsYWJsZSkge1xuICAgICAgICBsZXQgZGF0YSA9IGF3YWl0IHRoaXMuZGlhZ25vc3RpYy5yZXF1ZXN0RXh0ZXJuYWxTdG9yYWdlQXV0aG9yaXphdGlvbigpXG4gICAgICB9XG4gICAgICByZXR1cm5cbiAgfVxuICBhc3luYyByZXF1ZXN0Q2FtZXJhUGVybWlzc2lvbigpe1xuICAgIGxldCBpc0F2YWlsYWJsZSA9IGF3YWl0IHRoaXMuZGlhZ25vc3RpYy5pc0NhbWVyYUF1dGhvcml6ZWQoKVxuICAgIGNvbnNvbGUubG9nKFwicGVybWlzc29uX0NhbWVyYTpcIiwgaXNBdmFpbGFibGUpXG4gICAgaWYgKCFpc0F2YWlsYWJsZSkge1xuICAgICAgbGV0IGRhdGEgPSBhd2FpdCB0aGlzLmRpYWdub3N0aWMucmVxdWVzdENhbWVyYUF1dGhvcml6YXRpb24oKVxuICAgIH1cbiAgICByZXR1cm5cbn1cblxuLyoqXG4gKiDkuIrkvKBUb2tlbuiOt+WPluaWueazlVxuICogQHJldHVybnMgXG4gKi9cbiAgYXN5bmMgZ2V0VXB0b2tlbihyZWZyZXNoOmJvb2xlYW49ZmFsc2UpIHtcbiAgICBjb25zb2xlLmxvZyhcImdldFVwdG9rZW5cIilcbiAgICBpZighdGhpcy5xaW5pdUNvbmYgJiYgIXJlZnJlc2gpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgY29uc29sZS5sb2codGhpcy5nZXRDb21wYW55SWQoKSlcbiAgICAgIGxldCBkYXRhID0gYXdhaXQgUGFyc2UuQ2xvdWQucnVuKFwicWluaXVfdXB0b2tlblwiLCB7XG4gICAgICAgIGNvbXBhbnk6IHRoaXMuZ2V0Q29tcGFueUlkKCksXG4gICAgICB9KVxuICAgICAgY29uc29sZS5sb2coZGF0YSlcbiAgICAgIHRoaXMucWluaXVDb25mID0gZGF0YVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnIpXG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiDnlJ/miJDmlofku7bkuIrkvKBLZXnlgLzvvJo85YWs5Y+4aWQ+Lzx5eXl5bW1kZD4vPGZpbGUuaWQ+PGhoTU1zcz4uPGV4dD5cbiAgICogQGRlc2Mg55So5LqO5a+56LGh5a2Y5YKo5ZCr5YWo6Lev5b6E55qE5paH5Lu25ZCN56ewXG4gICAqL1xuICBnZW5GaWxlS2V5KGZpbGU6e2lkOnN0cmluZyxuYW1lOnN0cmluZ30sY29tcGFueT8pe1xuICAgIGxldCB0b2RheSA9IG5ldyBEYXRlKClcbiAgICBsZXQgZHAgPSBuZXcgRGF0ZVBpcGUoXCJlblwiKVxuICAgIGlmKCFjb21wYW55KXtcbiAgICAgIGNvbXBhbnkgPSB0aGlzLmdldENvbXBhbnlJZCgpO1xuICAgIH1cbiAgICByZXR1cm4gXCJcIiArIGNvbXBhbnkgKyBcIi9cIiArIGRwLnRyYW5zZm9ybSh0b2RheSwgXCJ5TU1kZFwiKSArIFwiL1wiICsgU3RyaW5nKGZpbGUuaWQpLnN1YnN0cigyMCwgNikgKyBkcC50cmFuc2Zvcm0odG9kYXksIFwiaGhtbXNzU1NTXCIpICsgL1xcLlteXFwuXSsvLmV4ZWMoZmlsZS5uYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5blvZPliY3nmbvlvZXnlKjmiLflhazlj7hJRFxuICAgKiBAcmV0dXJucyDlhazlj7hJRFxuICAgKi9cbiAgZ2V0Q29tcGFueUlkKCl7XG4gICAgLy8g6I635Y+W5YWs5Y+4SUTvvIzmiJbml6DmjIflrprlgLzvvIzliJnojrflj5Zsb2NhbFN0b3JhZ2XkuK1jb21wYW55XG4gICAgaWYodGhpcy5jb21wYW55KXtcbiAgICAgIHJldHVybiB0aGlzLmNvbXBhbnlcbiAgICB9XG4gICAgbGV0IGlkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJjb21wYW55XCIpXG4gICAgcmV0dXJuIGlkXG4gIH1cbiAgcWluaXVEb21haW46c3RyaW5nXG4gIGFzeW5jIHF1ZXJ5RG9tYWluKCkge1xuICAgIGxldCBDb21wYW55ID0gbmV3IFBhcnNlLlF1ZXJ5KCdDb21wYW55JylcbiAgICBsZXQgY29tcGFueSA9IGF3YWl0IENvbXBhbnkuZ2V0KHRoaXMuZ2V0Q29tcGFueUlkKCkpXG4gICAgaWYgKGNvbXBhbnkuZ2V0KFwiY29uZmlnUWluaXVcIikgJiYgY29tcGFueS5nZXQoXCJjb25maWdRaW5pdVwiKS5kb21haW4pIHtcbiAgICAgIGNvbnNvbGUubG9nKGNvbXBhbnkuZ2V0KFwiY29uZmlnUWluaXVcIikuZG9tYWluKVxuICAgICAgdGhpcy5xaW5pdURvbWFpbiA9IGNvbXBhbnkuZ2V0KFwiY29uZmlnUWluaXVcIikuZG9tYWluO1xuICAgIH0gZWxzZXtcbiAgICAgIHRoaXMucWluaXVEb21haW4gPSAnaHR0cHM6Ly9maWxlLWNsb3VkLmZtb2RlLmNuJztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5L+d5a2Y5LiK5Lyg5L+h5oGv6Iez6ZmE5Lu26KGoIEF0dGFjaG1lbnRcbiAgICogQHBhcmFtIGZpbGUg6ZmE5Lu25L+h5oGvXG4gICAqIEByZXR1cm5zIGF0dGFjaG1lbnQgUGFyc2UuT2JqZWN0XG4gICAqL1xuICBhc3luYyBzYXZlQXR0YWNobWVudChmaWxlOk5vdmFGaWxlfHt1cmw6c3RyaW5nLHNpemU6c3RyaW5nLG5hbWU6c3RyaW5nLHR5cGU6c3RyaW5nLG1kNT86c3RyaW5nfSxkb21haW4sY2F0ZUlkPyxjb21wYW55Pyk6UHJvbWlzZTxQYXJzZS5PYmplY3Q+IHtcbiAgICBsZXQgdXJsID0gZmlsZS51cmxcbiAgICBpZiAodXJsLnN0YXJ0c1dpdGgoXCJodHRwXCIpKSB7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdXJsID0gZG9tYWluICsgdXJsXG4gICAgfVxuICAgIHVybCA9IHVybC5yZXBsYWNlKC91bmRlZmluZWRcXC8vLCBcIlwiKTtcblxuXG4gICAgLy8g5biQ5aWX5Y+C5pWw6buY6K6k5Yqg6L295pys5Zyw5a2Y5YKoXG4gICAgaWYoIWNvbXBhbnkpe1xuICAgICAgY29tcGFueSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiY29tcGFueVwiKVxuICAgIH1cbiAgICBsZXQgdXNlciA9IFBhcnNlLlVzZXIuY3VycmVudCgpO1xuXG4gICAgLy8g5qOA5rWL5paH5Lu25piv5ZCm5a2Y5ZyoXG4gICAgbGV0IHF1ZXJ5ID0gbmV3IFBhcnNlLlF1ZXJ5KFwiQXR0YWNobWVudFwiKTtcbiAgICBxdWVyeS5lcXVhbFRvKFwidXJsXCIsIHVybCk7XG4gICAgbGV0IGF0dGFjaG1lbnQgPSBhd2FpdCBxdWVyeS5maXJzdCgpO1xuXG4gICAgaWYgKGF0dGFjaG1lbnQgJiYgYXR0YWNobWVudC5pZCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwi6K+l5paH5Lu25bey5a2Y5Zyo77yM5peg6ZyA6YeN5aSN5LiK5LygXCIpO1xuICAgICAgICByZXR1cm4gYXR0YWNobWVudFxuICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBBdHRhY2htZW50ID0gUGFyc2UuT2JqZWN0LmV4dGVuZChcIkF0dGFjaG1lbnRcIilcbiAgICAgICAgYXR0YWNobWVudCA9IG5ldyBBdHRhY2htZW50KCk7XG4gICAgICAgIGF0dGFjaG1lbnQuc2V0KFwic2l6ZVwiLCBmaWxlLnNpemUpXG4gICAgICAgIGF0dGFjaG1lbnQuc2V0KFwidXJsXCIsIHVybClcbiAgICAgICAgYXR0YWNobWVudC5zZXQoXCJuYW1lXCIsIGZpbGUubmFtZSlcbiAgICAgICAgYXR0YWNobWVudC5zZXQoXCJtaW1lXCIsIGZpbGUudHlwZSlcbiAgICAgICAgYXR0YWNobWVudC5zZXQoXCJtZDVcIixmaWxlPy5tZDUpXG4gICAgICAgIGlmKHVzZXI/LmlkKXtcbiAgICAgICAgICBhdHRhY2htZW50LnNldChcInVzZXJcIix1c2VyLnRvUG9pbnRlcigpKVxuICAgICAgICB9XG4gICAgICAgIGlmKGNvbXBhbnkpe1xuICAgICAgICAgIGF0dGFjaG1lbnQuc2V0KFwiY29tcGFueVwiLCB7XG4gICAgICAgICAgICBfX3R5cGU6IFwiUG9pbnRlclwiLFxuICAgICAgICAgICAgY2xhc3NOYW1lOiBcIkNvbXBhbnlcIixcbiAgICAgICAgICAgIG9iamVjdElkOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImNvbXBhbnlcIilcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIGlmIChjYXRlSWQpIHtcbiAgICAgICAgICAgIGF0dGFjaG1lbnQuc2V0KFwiY2F0ZWdvcnlcIiwge1xuICAgICAgICAgICAgICAgIF9fdHlwZTogXCJQb2ludGVyXCIsXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcIkNhdGVnb3J5XCIsXG4gICAgICAgICAgICAgICAgb2JqZWN0SWQ6IGNhdGVJZFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgYXR0YWNobWVudC5zYXZlKClcbiAgICB9XG59XG5cbi8qKlxuICog5b2V5YOP5bm25LiK5LygXG4gKi9cbmFzeW5jIGNhcHR1cmVWaWRlbyhjb25mKTogUHJvbWlzZTxhbnk+e1xuICB0aGlzLnFpbml1Q29uZiA9IGNvbmY7XG4gIGlmKCF0aGlzLmlzQ2FwYWNpdG9yKCkpIHJldHVybjtcbiAgLy8ge1wibmFtZVwiOlwiVklEXzIwMjMwNTEzXzE4MjIzNS5tcDRcIixcImxvY2FsVVJMXCI6XCJodHRwczovL2xvY2FsaG9zdC9fX2NkdmZpbGVfc2RjYXJkX18vRENJTS9DYW1lcmEvVklEXzIwMjMwNTEzXzE4MjIzNS5tcDRcIixcInR5cGVcIjpcInZpZGVvL21wNFwiLFwibGFzdE1vZGlmaWVkXCI6bnVsbCxcImxhc3RNb2RpZmllZERhdGVcIjoxNjgzOTczMzU1MDAwLFwic2l6ZVwiOjYxMDAxNjEsXCJzdGFydFwiOjAsXCJlbmRcIjowLFwiZnVsbFBhdGhcIjpcImZpbGU6Ly8vc3RvcmFnZS9lbXVsYXRlZC8wL0RDSU0vQ2FtZXJhL1ZJRF8yMDIzMDUxM18xODIyMzUubXA0XCJ9XG4gIGxldCBtZWRpYUZpbGU6YW55ID0gYXdhaXQgdGhpcy5jYW1lcmFDYXB0dXJlVmlkZW9GaWxlKCk7XG4gIC8vIGxldCBtZWRpYURhdGE6c3RyaW5nID0gYXdhaXQgdGhpcy5nZXRNZWRpYUZpbGVEYXRhU3RyaW5nKG1lZGlhRmlsZSk7XG4gIGxldCBmaWxlQmxvYiA9IGF3YWl0IHRoaXMuZ2V0TWVkaWFGaWxlRGF0YVN0cmluZyhtZWRpYUZpbGUpO1xuICAvLyBsZXQgZmlsZUJsb2IgPSBhd2FpdCB0aGlzLmJhc2U2NFRvQmxvYlR5cGUobWVkaWFEYXRhLG1lZGlhRmlsZS50eXBlKTtcbiAgbGV0IHFpbml1RmlsZSA9IGF3YWl0IHRoaXMuc2F2ZVFpbml1TWVkaWFGaWxlKG1lZGlhRmlsZSxmaWxlQmxvYilcbiAgcmV0dXJuIHFpbml1RmlsZVxufVxuYXN5bmMgY2FtZXJhQ2FwdHVyZVZpZGVvRmlsZSgpOlByb21pc2U8TWVkaWFGaWxlfGFueXxudWxsPntcbiAgbGV0IG9wdGlvbnM6IENhcHR1cmVWaWRlb09wdGlvbnMgPSB7XG4gICAgbGltaXQ6MSxcbiAgICAvLyBxdWFsaXR5OjUwXG4gIH1cbiAgbGV0IG1lZGlhQ2FwdHVyZSA9IE1lZGlhQ2FwdHVyZTtcbiAgbGV0IGxpc3Q6TWVkaWFGaWxlW10gfCBDYXB0dXJlRXJyb3IgIHwgYW55PSBhd2FpdCBtZWRpYUNhcHR1cmUuY2FwdHVyZVZpZGVvKG9wdGlvbnMpXG4gIGlmKGxpc3Q/Lmxlbmd0aD4wKXtcbiAgICByZXR1cm4gbGlzdFswXVxuICB9XG4gIHJldHVybiBudWxsXG59XG5cblxuYXN5bmMgZ2V0TWVkaWFGaWxlRGF0YVN0cmluZyhtZWRpYWZpbGUpe1xuICBsZXQgZmlsZXN5c3RlbSA9IG5ldyBGaWxlc3lzdGVtV2ViKClcbiAgbGV0IHBhdGggPSBtZWRpYWZpbGUuZnVsbFBhdGgucmVwbGFjZUFsbChcIi8vL1wiLFwiLy9cIilcbiAgXG4gIGxldCBzdGF0ID0gYXdhaXQgRmlsZXN5c3RlbS5zdGF0KHsgcGF0aDptZWRpYWZpbGUuZnVsbFBhdGh9KTtcbiAgbGV0IHdlYlVyaSA9IENhcGFjaXRvci5jb252ZXJ0RmlsZVNyYyhzdGF0LnVyaSlcbiAgbGV0IGNvbnRlbnQgPSBhd2FpdCBmZXRjaCh3ZWJVcmkpXG4gIGxldCBibG9iID0gYXdhaXQgY29udGVudC5ibG9iKClcbiAgY29uc29sZS5sb2coYmxvYi5zaXplKVxuICBcbiAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoc3RhdCkpXG4gIC8vIENhcGFjaXRvckNvbnZlclxuXG4gIC8vIGZpbGU6Ly8vc3RvcmFnZS9lbXVsYXRlZC8wL0RDSU0vQ2FtZXJhL1ZJRF8yMDIzMDYxMl8xMjU5MDcwMzAubXA0XG4gIC8vIGxldCBmaWxlc3lzdGVtID0gRmlsZXN5c3RlbVxuICAvLyBsZXQgY29udGVudCA9IGF3YWl0IGZpbGVzeXN0ZW0ucmVhZEZpbGUoe1xuICAvLyAgIHBhdGg6bWVkaWFmaWxlLmZ1bGxQYXRoXG4gIC8vIH0pXG4gIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGNvbnRlbnQpKVxuICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShPYmplY3Qua2V5cyhjb250ZW50KSkpXG4gIC8vIGNvbnNvbGUubG9nKGNvbnRlbnQ/LmRhdGEpXG4gIGlmKGJsb2Ipe1xuICAgIHJldHVybiBibG9iXG4gIH1lbHNle1xuICAgIHRocm93IFwi6K+75Y+W5paH5Lu25aSx6LSlXCJcbiAgfVxufVxuICAvKipcbiAgICog5ouN54Wn5bm25LiK5LygXG4gICAqIEByZXR1cm5zIC0tIHtoYXNoPzpzdHJpbmcsdXJsOnN0cmluZyxuYW1lOnN0cmluZyxzaXplOm51bWJlcixrZXk6c3Rpcm5nfVxuICAgKi9cbiAgYXN5bmMgdGFrZVBpY3R1cmUoY29uZik6IFByb21pc2U8YW55PntcbiAgICB0aGlzLnFpbml1Q29uZiA9IGNvbmY7XG4gICAgaWYoIXRoaXMuaXNDYXBhY2l0b3IoKSkgcmV0dXJuXG4gICAgYXdhaXQgdGhpcy5nZXRVcHRva2VuKCk7XG4gICAgbGV0IGltYWdlID0gYXdhaXQgdGhpcy5jYW1lcmFUYWtlUGljdHVyZURhdGFVcmwoKVxuICAgIC8vIGltYWdlLmZvcm1hdFxuICAgIGlmKCFpbWFnZT8uZGF0YVVybCkgcmV0dXJuXG4gICAgbGV0IGJsb2IgPSBhd2FpdCB0aGlzLmJhc2U2NFRvQmxvYihpbWFnZT8uZGF0YVVybClcbiAgICBsZXQgcWluaXVGaWxlID0gYXdhaXQgdGhpcy5zYXZlUWluaXVJbWFnZUZpbGUoYmxvYixpbWFnZT8uZm9ybWF0KVxuICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHFpbml1RmlsZSkpXG4gICAgLy8gdGhpcy5zYXZlQXR0YWNobWVudCgpXG4gICAgcmV0dXJuIHFpbml1RmlsZVxuICB9O1xuICBhc3luYyBjYW1lcmFUYWtlUGljdHVyZURhdGFVcmwoKXsgLy8gV2ViVXJsICsgQmFzZTY0XG4gICAgaWYoIXRoaXMuaXNDYXBhY2l0b3IoKSkgcmV0dXJuXG4gICAgY29uc3QgaW1hZ2UgPSBhd2FpdCBDYW1lcmEuZ2V0UGhvdG8oe1xuICAgICAgcXVhbGl0eTogOTAsXG4gICAgICBhbGxvd0VkaXRpbmc6IGZhbHNlLFxuICAgICAgLy8gc2F2ZVRvR2FsbGVyeTp0cnVlLFxuICAgICAgc291cmNlOkNhbWVyYVNvdXJjZS5DYW1lcmEsXG4gICAgICByZXN1bHRUeXBlOiBDYW1lcmFSZXN1bHRUeXBlLkRhdGFVcmxcbiAgICB9KTtcbiAgICByZXR1cm4gaW1hZ2U7XG4gIH1cblxuICBtYXhTaXplID0gNSAqIDEwMjQgKiAxMDI0XG4gIC8qKlxuICAgKiDkuIPniZvkuIrkvKDlh73mlbDvvJrml6DpnIDliY3nq6/nu4Tku7ZcbiAgICogQHBhcmFtIGltYWdlQmxvYjogQmxvYlxuICAgKiBAcGFyYW0gZm9ybWF0OiBzdHJpbmdcbiAgICovXG4gICBhc3luYyBzYXZlUWluaXVJbWFnZUZpbGUoaW1hZ2VCbG9iOiBCbG9iLGZvcm1hdDpzdHJpbmcsY29tcGFueT86c3RyaW5nLG9uUHJvZ3Jlc3M/OkZ1bmN0aW9uKTogUHJvbWlzZTxOb3ZhRmlsZXxhbnk+IHtcbiAgICAvLyBsZXQgdGhhdCA9IHRoaXNcbiAgICBsZXQgbWF4U2l6ZSA9IHRoaXMubWF4U2l6ZVxuICAgIGlmIChpbWFnZUJsb2Iuc2l6ZSA+IG1heFNpemUpIHtcbiAgICAgIGF3YWl0IGNvbnNvbGUubG9nKGDnhafniYfov4flpKfvvIzotoXlh7rpmZDliLY1TUJgKVxuICAgICAgdGhyb3cgXCLotoXlh7rmlofku7blpKflsI9cIlxuICAgIH1cbiAgICBsZXQgZHAgPSBuZXcgRGF0ZVBpcGUoXCJlblwiKVxuICAgIGxldCBpZCA9IGRwLnRyYW5zZm9ybShuZXcgRGF0ZSgpLCBcInl5eXlNTWRkSEhtbXNzXCIpXG4gICAgbGV0IG5hbWUgPSBgJHtpZH0uJHtmb3JtYXR9YFxuICAgIGxldCB0eXBlID0gYGltYWdlLyR7Zm9ybWF0fWBcbiAgICAvLyBsZXQgZmlsZSA9IG5ldyBGaWxlKFtpbWFnZUJsb2JdLCBmaWxlbmFtZSwgeyB0eXBlOiBcImltYWdlL2pwZWdcIiB9KVxuICAgIGxldCBwdXRFeHRyYSA9IHtcbiAgICAgIGZuYW1lOiBuYW1lLFxuICAgICAgcGFyYW1zOiB7fSxcbiAgICAgIG1pbWVUeXBlOiBcImltYWdlLypcIixcbiAgICB9XG4gICAgbGV0IGNvbmZpZyA9IHtcbiAgICAgIHVzZUNkbkRvbWFpbjogdHJ1ZSwgLy/kvb/nlKhjZG7liqDpgJ9cbiAgICAgIGZvcmNlRGlyZWN0OnRydWUgLy8g5by65Yi25LiN5YiG54mH77yM5pS+572u5LiK5Lyg5oql6ZSZXG4gICAgfVxuICAgIGNvbnNvbGUubG9nKHRoaXMucWluaXVDb25mKVxuXG4gICAgbGV0IHFpbml1RmlsZUtleSA9IHRoaXMuZ2VuRmlsZUtleSh7aWQ6aWQsbmFtZTpuYW1lfSlcbiAgICBjb25zb2xlLmxvZyhcIuWbvueJh+S4iuS8oOWJjVwiKVxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coXCLov5vlhaXkuobkuIrkvKBcIilcbiAgICAgICAgbGV0IG9ic2VydmFibGUgPSAocWluaXUgYXMgYW55KS51cGxvYWQoXG4gICAgICAgICAgaW1hZ2VCbG9iLFxuICAgICAgICAgIHFpbml1RmlsZUtleSxcbiAgICAgICAgICB0aGlzLnFpbml1Q29uZj8udXB0b2tlbixcbiAgICAgICAgICBwdXRFeHRyYSxcbiAgICAgICAgICBjb25maWdcbiAgICAgICAgKVxuICAgICAgICBvYnNlcnZhYmxlLnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dDogKHJlc3VsdF8yKSA9PiB7XG4gICAgICAgICAgICAvLyDkuLvopoHnlKjmnaXlsZXnpLrov5vluqZcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlc3VsdF8yKVxuICAgICAgICAgICAgb25Qcm9ncmVzcyYmb25Qcm9ncmVzcyhyZXN1bHRfMilcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVycm9yOiBhc3luYyAoZXJyXzEpID0+IHtcbiAgICAgICAgICAgIC8vIHRoaXMuJG5vdGlmeSgn5LiK5Lyg5Zu+54mH5aSx6LSlJyk7XG4gICAgICAgICAgICAvLyBhd2FpdCB0aGF0LnByZXNlbnRUb2FzdChg5qOA5rWL5aSx6LSlYCwgMTUwMCwgXCJkYW5nZXJcIilcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycl8xKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgY29tcGxldGU6IChyZXNfMSkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCLkuIrkvKDlrozmiJBcIilcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGAke3RoaXMucWluaXVDb25mPy5kb21haW59JHtyZXNfMS5rZXl9YClcbiAgICAgICAgICAgIHJlc18xLnVybCA9IGAke3RoaXMucWluaXVDb25mPy5kb21haW59JHtyZXNfMS5rZXl9YFxuICAgICAgICAgICAgcmVzXzEubmFtZSA9IG5hbWVcbiAgICAgICAgICAgIHJlc18xLnR5cGU9IHR5cGVcbiAgICAgICAgICAgIHJlc18xLnNpemUgPSBpbWFnZUJsb2Iuc2l6ZTtcbiAgICAgICAgICAgIHJlc29sdmUocmVzXzEpXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gIH1cbiAgYXN5bmMgc2F2ZVFpbml1TWVkaWFGaWxlKG1lZGlhZmlsZTphbnksZmlsZUJsb2I6IEJsb2IsY29tcGFueT86c3RyaW5nLG9uUHJvZ3Jlc3M/OkZ1bmN0aW9uKTogUHJvbWlzZTxOb3ZhRmlsZXxhbnk+IHtcbiAgICAvLyBsZXQgdGhhdCA9IHRoaXNcbiAgICBsZXQgbmFtZSA9IG1lZGlhZmlsZS5uYW1lXG4gICAgbGV0IHR5cGUgPSBtZWRpYWZpbGUudHlwZVxuICAgIGxldCBzaXplID0gbWVkaWFmaWxlLnNpemVcbiAgICBsZXQgbWF4U2l6ZSA9IDEwMCAqIDEwMjQgKiAxMDI0IC8vIOmZkDEwME1cbiAgICBpZiAoc2l6ZSA+IG1heFNpemUpIHtcbiAgICAgIGNvbnNvbGUubG9nKGDop4bpopHov4flpKfvvIzotoXlh7rpmZDliLYxMDBNQmApXG4gICAgICB0aHJvdyBcIui2heWHuuaWh+S7tuWkp+Wwj1wiXG4gICAgfVxuICAgIGxldCBkcCA9IG5ldyBEYXRlUGlwZShcImVuXCIpXG4gICAgbGV0IGlkID0gZHAudHJhbnNmb3JtKG5ldyBEYXRlKCksIFwieXl5eU1NZGRISG1tc3NcIilcbiAgICAvLyBsZXQgZmlsZSA9IG5ldyBGaWxlKFttZWRpYUJsb2JdLCBmaWxlbmFtZSwgeyB0eXBlOiBcImltYWdlL2pwZWdcIiB9KVxuICAgIGxldCBwdXRFeHRyYSA9IHtcbiAgICAgIGZuYW1lOiBuYW1lLFxuICAgICAgcGFyYW1zOiB7fSxcbiAgICAgIG1pbWVUeXBlOiB0eXBlLFxuICAgIH1cbiAgICBsZXQgY29uZmlnID0ge1xuICAgICAgdXNlQ2RuRG9tYWluOiB0cnVlLCAvL+S9v+eUqGNkbuWKoOmAn1xuICAgICAgZm9yY2VEaXJlY3Q6dHJ1ZSAvLyDlvLrliLbkuI3liIbniYfvvIzmlL7nva7kuIrkvKDmiqXplJlcbiAgICB9XG5cbiAgICBsZXQgcWluaXVGaWxlS2V5ID0gdGhpcy5nZW5GaWxlS2V5KHtpZDppZCxuYW1lOm5hbWV9KVxuICAgIGNvbnNvbGUubG9nKFwi5Zu+54mH5LiK5Lyg5YmNXCIpXG4gICAgY29uc29sZS5sb2cobWVkaWFmaWxlLm5hbWUsZmlsZUJsb2Iuc2l6ZSlcbiAgICBjb25zb2xlLmxvZyhmaWxlQmxvYi5zaXplKVxuICAgIGNvbnNvbGUubG9nKGZpbGVCbG9iLnNpemUvMTAyNC8xMDI0KVxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coXCLov5vlhaXkuobkuIrkvKBcIilcbiAgICAgICAgbGV0IG9ic2VydmFibGUgPSAocWluaXUgYXMgYW55KS51cGxvYWQoXG4gICAgICAgICAgZmlsZUJsb2IsXG4gICAgICAgICAgcWluaXVGaWxlS2V5LFxuICAgICAgICAgIHRoaXMucWluaXVDb25mPy51cHRva2VuLFxuICAgICAgICAgIHB1dEV4dHJhLFxuICAgICAgICAgIGNvbmZpZ1xuICAgICAgICApXG4gICAgICAgIG9ic2VydmFibGUuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0OiAocmVzdWx0XzIpID0+IHtcbiAgICAgICAgICAgIC8vIOS4u+imgeeUqOadpeWxleekuui/m+W6plxuICAgICAgICAgICAgY29uc29sZS5sb2coXCLkuLvopoHnlKjmnaXlsZXnpLrov5vluqZcIilcbiAgICAgICAgICAgIG9uUHJvZ3Jlc3MmJm9uUHJvZ3Jlc3MocmVzdWx0XzIpXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShyZXN1bHRfMikpXG4gICAgICAgICAgfSxcbiAgICAgICAgICBlcnJvcjogYXN5bmMgKGVycl8xKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIuS4iuS8oOWksei0pVwiKVxuICAgICAgICAgICAgLy8gdGhpcy4kbm90aWZ5KCfkuIrkvKDlm77niYflpLHotKUnKTtcbiAgICAgICAgICAgIC8vIGF3YWl0IHRoYXQucHJlc2VudFRvYXN0KGDmo4DmtYvlpLHotKVgLCAxNTAwLCBcImRhbmdlclwiKVxuICAgICAgICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoZXJyXzEpKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgY29tcGxldGU6IChyZXNfMSkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCLkuIrkvKDlrozmiJBcIilcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHJlc18xKSlcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGAke3RoaXMucWluaXVDb25mPy5kb21haW59JHtyZXNfMS5rZXl9YClcbiAgICAgICAgICAgIC8vIHJlc18xLnVybCA9IGAke3RoaXMucWluaXVDb25mPy5kb21haW59JHtyZXNfMS5rZXl9YFxuICAgICAgICAgICAgLy8gcmVzXzEubmFtZSA9IG5hbWVcbiAgICAgICAgICAgIC8vIHJlc18xLnR5cGU9IHR5cGVcbiAgICAgICAgICAgIC8vIHJlc18xLnNpemUgPSBzaXplO1xuICAgICAgICAgICAgbWVkaWFmaWxlLmtleSA9IHJlc18xLmtleVxuICAgICAgICAgICAgY29uc29sZS5sb2cobWVkaWFmaWxlLnR5cGUpXG4gICAgICAgICAgICBtZWRpYWZpbGUudXJsID0gYCR7dGhpcy5xaW5pdUNvbmY/LmRvbWFpbn0ke3Jlc18xLmtleX1gXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhtZWRpYWZpbGUudXJsKVxuICAgICAgICAgICAgcmVzb2x2ZShtZWRpYWZpbGUpXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gIH1cblxuICAvL3N0cmluZ+i9rEZpbGXmlofku7ZcbiAgYXN5bmMgYmFzZTY0VG9CbG9iVHlwZShzdHJpbmcsdHlwZSl7XG4gICAgbGV0IGJhc2U2NFJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYGRhdGE6JHt0eXBlfTtiYXNlNjQsJHtzdHJpbmd9YCk7XG4gICAgbGV0IGJsb2IgPSBhd2FpdCBiYXNlNjRSZXNwb25zZS5ibG9iKCk7XG4gICAgcmV0dXJuIGJsb2JcbiAgICBzdHJpbmcgPSBhdG9iKHN0cmluZylcbiAgICByZXR1cm4gbmV3IEJsb2IoW3N0cmluZ10se1xuICAgICAgdHlwZTp0eXBlXG4gICAgfSlcbiAgfVxuICAvL2Jhc2U2NOi9rEZpbGXmlofku7ZcbiAgYXN5bmMgYmFzZTY0VG9CbG9iKGJhc2U2NEltZzogc3RyaW5nKSB7XG4gICAgbGV0IGJhc2U2NFJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYmFzZTY0SW1nKTtcbiAgICBsZXQgYmxvYiA9IGF3YWl0IGJhc2U2NFJlc3BvbnNlLmJsb2IoKTtcbiAgICByZXR1cm4gYmxvYlxuICB9XG4gIGZpbGVUb0Jsb2IoZmlsZTpGaWxlKTpCbG9iIHtcbiAgICBjb25zdCBibG9iID0gZmlsZS5zbGljZSgwLCBmaWxlLnNpemUsIGZpbGUudHlwZSk7XG4gICAgcmV0dXJuIG5ldyBCbG9iKFtibG9iXSwgeyB0eXBlOiBmaWxlLnR5cGUgfSk7XG4gIH1cbiAgZ2VuTWQ1KGlucHV0U3RyaW5nOnN0cmluZyl7XG4gICAgcmV0dXJuIENyeXB0b0pTLk1ENShpbnB1dFN0cmluZykudG9TdHJpbmcoKTtcbiAgfVxufVxuIl19
|
|
@@ -1,10 +1,28 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
1
|
+
import SparkMD5 from 'spark-md5';
|
|
2
|
+
export function calcFileMd5(file) {
|
|
3
|
+
return new Promise((resolve, reject) => {
|
|
4
|
+
const reader = new FileReader();
|
|
5
|
+
reader.onload = (event) => {
|
|
6
|
+
try {
|
|
7
|
+
const data = event.target?.result;
|
|
8
|
+
if (data) {
|
|
9
|
+
const spark = new SparkMD5.ArrayBuffer();
|
|
10
|
+
spark.append(data);
|
|
11
|
+
const hash = spark.end();
|
|
12
|
+
resolve(hash);
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
reject(new Error("Failed to load file"));
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
reject(error);
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
reader.onerror = (error) => {
|
|
23
|
+
reject(error);
|
|
24
|
+
};
|
|
25
|
+
reader.readAsArrayBuffer(file);
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC1maWxlLW1kNS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Ztb2RlLW5nL3NyYy9saWIvc3RvcmFnZS9zZXJ2aWNlLXVwbG9hZC91dGlsLWZpbGUtbWQ1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sUUFBUSxNQUFNLFdBQVcsQ0FBQztBQUNqQyxNQUFNLFVBQVUsV0FBVyxDQUFDLElBQVU7SUFDbEMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUNuQyxNQUFNLE1BQU0sR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN0QixJQUFJLENBQUM7Z0JBQ0QsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUM7Z0JBQ2xDLElBQUksSUFBSSxFQUFFLENBQUM7b0JBQ1AsTUFBTSxLQUFLLEdBQUcsSUFBSSxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7b0JBQ3pDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBbUIsQ0FBQyxDQUFDO29CQUNsQyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7b0JBQ3pCLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDbEIsQ0FBQztxQkFBTSxDQUFDO29CQUNKLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUM7Z0JBQzdDLENBQUM7WUFDTCxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDYixNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbEIsQ0FBQztRQUNMLENBQUMsQ0FBQztRQUNGLE1BQU0sQ0FBQyxPQUFPLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN2QixNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEIsQ0FBQyxDQUFDO1FBQ0YsTUFBTSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25DLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBTcGFya01ENSBmcm9tICdzcGFyay1tZDUnO1xuZXhwb3J0IGZ1bmN0aW9uIGNhbGNGaWxlTWQ1KGZpbGU6IEZpbGUpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICAgIHJlYWRlci5vbmxvYWQgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGV2ZW50LnRhcmdldD8ucmVzdWx0O1xuICAgICAgICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwYXJrID0gbmV3IFNwYXJrTUQ1LkFycmF5QnVmZmVyKCk7XG4gICAgICAgICAgICAgICAgICAgIHNwYXJrLmFwcGVuZChkYXRhIGFzIEFycmF5QnVmZmVyKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFzaCA9IHNwYXJrLmVuZCgpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGhhc2gpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoXCJGYWlsZWQgdG8gbG9hZCBmaWxlXCIpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJlYWRlci5vbmVycm9yID0gKGVycm9yKSA9PiB7XG4gICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9O1xuICAgICAgICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoZmlsZSk7XG4gICAgfSk7XG59XG4iXX0=
|