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.
Files changed (100) hide show
  1. package/esm2022/fmode-ng.mjs +5 -10
  2. package/esm2022/lib/aigc/agent/agent.prompt.mjs +122 -10
  3. package/esm2022/lib/aigc/agent/index.mjs +2 -10
  4. package/esm2022/lib/aigc/avatar/avatar.module.mjs +45 -10
  5. package/esm2022/lib/aigc/avatar/comp-avatar-particle/avatar.role.mjs +2 -10
  6. package/esm2022/lib/aigc/avatar/comp-avatar-particle/comp-avatar-particle.component.mjs +315 -10
  7. package/esm2022/lib/aigc/avatar/comp-avatar-particle/index.mjs +3 -10
  8. package/esm2022/lib/aigc/avatar/comp-avatar-particle/role-points.class.mjs +57 -10
  9. package/esm2022/lib/aigc/avatar/comp-avatar-role-image/comp-avatar-role-image.component.mjs +97 -10
  10. package/esm2022/lib/aigc/avatar/comp-avatar-role-video/comp-avatar-role-video.component.mjs +104 -10
  11. package/esm2022/lib/aigc/avatar/comp-avatar-talk/comp-avatar-talk.component.mjs +111 -10
  12. package/esm2022/lib/aigc/avatar/index.mjs +8 -10
  13. package/esm2022/lib/aigc/avatar/interface-avatar-role.mjs +2 -10
  14. package/esm2022/lib/aigc/avatar/modal-chat-voice-input/modal-chat-voice-input.component.mjs +166 -8
  15. package/esm2022/lib/aigc/chat/chat-header-area/comp-header-area.component.mjs +36 -10
  16. package/esm2022/lib/aigc/chat/chat-header-area/index.mjs +2 -10
  17. package/esm2022/lib/aigc/chat/chat-list/chat-list.component.mjs +141 -8
  18. package/esm2022/lib/aigc/chat/chat-list/index.mjs +2 -10
  19. package/esm2022/lib/aigc/chat/chat-message-area/comp-message-area.component.mjs +40 -10
  20. package/esm2022/lib/aigc/chat/chat-message-area/index.mjs +2 -10
  21. package/esm2022/lib/aigc/chat/chat-message-card/comp-message-card.component.mjs +92 -10
  22. package/esm2022/lib/aigc/chat/chat-message-card/index.mjs +2 -10
  23. package/esm2022/lib/aigc/chat/chat-modal-input/index.mjs +2 -10
  24. package/esm2022/lib/aigc/chat/chat-modal-input/modal-audio-message/modal-audio-message.component.mjs +207 -8
  25. package/esm2022/lib/aigc/chat/chat-modal-input/modal-input.component.mjs +236 -10
  26. package/esm2022/lib/aigc/chat/chat-panel/chat-panel.component.mjs +137 -10
  27. package/esm2022/lib/aigc/chat/comp-role-prompt/comp-role-prompt.component.mjs +69 -10
  28. package/esm2022/lib/aigc/chat/comp-role-prompt/index.mjs +2 -10
  29. package/esm2022/lib/aigc/chat/index.mjs +8 -10
  30. package/esm2022/lib/aigc/comp-markdown-preview/clipboard.service.mjs +82 -10
  31. package/esm2022/lib/aigc/comp-markdown-preview/markdown-parse.mjs +269 -8
  32. package/esm2022/lib/aigc/comp-markdown-preview/markdown-preview.component.mjs +51 -10
  33. package/esm2022/lib/aigc/comp-markdown-preview/markdown-preview.module.mjs +24 -10
  34. package/esm2022/lib/aigc/comp-markdown-preview/plugins/md-mathjax/index.mjs +94 -10
  35. package/esm2022/lib/aigc/index.mjs +13 -10
  36. package/esm2022/lib/aigc/service-fmai/fmai.service.mjs +21 -10
  37. package/esm2022/lib/aigc/service-fmai/service-chat/chat-class.mjs +736 -8
  38. package/esm2022/lib/aigc/service-fmai/service-chat/chat.service.mjs +181 -8
  39. package/esm2022/lib/aigc/service-fmai/service-chat/index.mjs +7 -10
  40. package/esm2022/lib/aigc/service-fmai/service-chat/mask-list.mjs +194 -9
  41. package/esm2022/lib/aigc/service-fmai/service-chat/pipes/chat-content.pipe.mjs +27 -10
  42. package/esm2022/lib/aigc/service-fmai/service-chat/pipes/hidexml.pipe.mjs +27 -10
  43. package/esm2022/lib/aigc/service-fmai/service-chat/utilnow.pipe.mjs +68 -10
  44. package/esm2022/lib/aigc/service-fmai/service-imagine/imagine.service.mjs +229 -8
  45. package/esm2022/lib/aigc/service-fmai/service-imagine/index.mjs +2 -10
  46. package/esm2022/lib/aigc/voice/audio.player.mjs +52 -10
  47. package/esm2022/lib/aigc/voice/class-asr.mjs +79 -8
  48. package/esm2022/lib/aigc/voice/fmode-voice.service.mjs +501 -8
  49. package/esm2022/lib/aigc/voice/index.mjs +3 -10
  50. package/esm2022/lib/aigc/voice/lib/pcm2wav.mjs +38 -10
  51. package/esm2022/lib/aigc/voice/lib/resample.mjs +34 -10
  52. package/esm2022/lib/aigc/voice/tts/fmode-tts-class.mjs +233 -8
  53. package/esm2022/lib/aigc/voice/tts/index.mjs +2 -10
  54. package/esm2022/lib/map/comp-poi-picker/comp-poi-picker.component.mjs +190 -10
  55. package/esm2022/lib/map/comp-poi-picker/comp-poi-picker.module.mjs +33 -10
  56. package/esm2022/lib/map/index.mjs +4 -10
  57. package/esm2022/lib/map/map.module.mjs +61 -10
  58. package/esm2022/lib/map/page-loca-scatter/page-loca-scatter.component.mjs +110 -10
  59. package/esm2022/lib/map/page-map.start/page-map.start.component.mjs +98 -8
  60. package/esm2022/lib/map/page-plan-route/page-plan-route.component.mjs +100 -8
  61. package/esm2022/lib/nova-cloud/index.mjs +2 -10
  62. package/esm2022/lib/nova-cloud/nova-cloud.service.mjs +148 -10
  63. package/esm2022/lib/platform/cross.service.mjs +63 -10
  64. package/esm2022/lib/platform/index.mjs +2 -10
  65. package/esm2022/lib/social/index.mjs +2 -10
  66. package/esm2022/lib/social/wechat/wechat-jssdk.service.mjs +236 -8
  67. package/esm2022/lib/storage/comp-hwobs-manager/hwobs-manager.component.mjs +59 -10
  68. package/esm2022/lib/storage/index.mjs +5 -10
  69. package/esm2022/lib/storage/service-hwobs/hwobs.service.mjs +130 -8
  70. package/esm2022/lib/storage/service-upload/index.mjs +2 -10
  71. package/esm2022/lib/storage/service-upload/nova-upload.service.mjs +462 -8
  72. package/esm2022/lib/storage/service-upload/util-file-md5.mjs +28 -10
  73. package/esm2022/lib/storage/storage.module.mjs +41 -10
  74. package/esm2022/lib/user/account/account.service.mjs +221 -10
  75. package/esm2022/lib/user/captcha/captcha.component.mjs +135 -10
  76. package/esm2022/lib/user/comp-user-avatar/comp-user-avatar.component.mjs +62 -10
  77. package/esm2022/lib/user/index.mjs +17 -10
  78. package/esm2022/lib/user/login/auth.guard.mjs +28 -10
  79. package/esm2022/lib/user/login/auth.service.mjs +373 -8
  80. package/esm2022/lib/user/login/login.component.mjs +913 -10
  81. package/esm2022/lib/user/modal-user-login/modal-user-login.component.mjs +273 -10
  82. package/esm2022/lib/user/profile/auth-profile.guard.mjs +27 -10
  83. package/esm2022/lib/user/profile/auth-profile.service.mjs +122 -10
  84. package/esm2022/lib/user/profile/profile-bind/profile-bind.component.mjs +115 -10
  85. package/esm2022/lib/user/profile/profile.module.mjs +57 -10
  86. package/esm2022/lib/user/staff/index.mjs +4 -10
  87. package/esm2022/lib/user/staff/staff.guard.mjs +26 -10
  88. package/esm2022/lib/user/staff/staff.module.mjs +18 -10
  89. package/esm2022/lib/user/staff/staff.service.mjs +85 -10
  90. package/esm2022/lib/user/user-name.pipe.mjs +29 -10
  91. package/esm2022/lib/user/user.module.mjs +106 -10
  92. package/esm2022/lib/video/fm-video/fm-video.component.mjs +67 -10
  93. package/esm2022/lib/video/index.mjs +2 -10
  94. package/esm2022/public-api.mjs +13 -10
  95. package/fesm2022/fmode-ng.mjs +8895 -7
  96. package/fesm2022/fmode-ng.mjs.map +1 -1
  97. package/lib/user/login/auth.service.d.ts +18 -3
  98. package/lib/user/modal-user-login/modal-user-login.component.d.ts +4 -2
  99. package/package.json +1 -1
  100. 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
- * @copyright © 未来飞马 © 未来全栈 www.fmode.cn
4
- * 版权所有 © 未来飞马 © 江西脑控科技有限公司 Copyright © Fmode Technology Co., Ltd.
5
- * 保留所有权利 All Rights Reserved.
6
- * /home/ryan/workspace/nova/nova-admin/dist/fmode-ng/esm2022/lib/storage/service-upload/nova-upload.service.mjs
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
- import{DatePipe}from"@angular/common";import{Injectable}from"@angular/core";import{Platform}from"@ionic/angular";import{Camera,CameraResultType,CameraSource}from"@capacitor/camera";import{Capacitor}from"@capacitor/core";import{Filesystem}from"@capacitor/filesystem";import{FilesystemWeb}from"@capacitor/filesystem/dist/esm/web.js";import*as qiniu from"qiniu-js";import Parse from"parse";import{Diagnostic}from"@awesome-cordova-plugins/diagnostic/ngx";import CryptoJS from"crypto-js";import{MediaCapture}from"@awesome-cordova-plugins/media-capture";import{calcFileMd5}from"./util-file-md5";import*as i0 from"@angular/core";import*as i1 from"@ionic/angular";import*as i2 from"@awesome-cordova-plugins/diagnostic/ngx";export class NovaUploadService{constructor(e,i){this.platform=e,this.diagnostic=i,this.maxSize=5242880,this.getUptoken(!0),this.requestPermission(),this.queryDomain()}async upload(e,i){let t,a=e.type,o=e.name?.split("."),r=o[o.length-1];try{t=await calcFileMd5(e)}catch(e){}let n,s,l=this.fileToBlob(e);return n=a.indexOf("image")>-1?await this.saveQiniuImageFile(l,r,null,i):await this.saveQiniuMediaFile(e,l,null,i),n.md5=t,n?.url?.indexOf("undefined")>-1&&(n.url=(this.qiniuDomain||"https://file-cloud.fmode.cn/")+n.url.replace("undefined/","")),n?.url&&(s=await this.saveAttachment(n,this.qiniuDomain,null,this.getCompanyId())),s?.id&&(n.id=s?.id),n}isCapacitor(){return this.platform.is("capacitor")||this.platform.is("cordova")}async requestPermission(){this.isCapacitor()&&(await this.requestStoagePermission(),await this.requestCameraPermission())}async requestStoagePermission(){let e=await this.diagnostic.isExternalStorageAuthorized();if(console.log("permisson_STORAGE:",e),!e){await this.diagnostic.requestExternalStorageAuthorization()}}async requestCameraPermission(){let e=await this.diagnostic.isCameraAuthorized();if(console.log("permisson_Camera:",e),!e){await this.diagnostic.requestCameraAuthorization()}}async getUptoken(e=!1){if(console.log("getUptoken"),this.qiniuConf||e)try{console.log(this.getCompanyId());let e=await Parse.Cloud.run("qiniu_uptoken",{company:this.getCompanyId()});console.log(e),this.qiniuConf=e}catch(e){console.error(e)}}genFileKey(e,i){let t=new Date,a=new DatePipe("en");return i||(i=this.getCompanyId()),i+"/"+a.transform(t,"yMMdd")+"/"+String(e.id).substr(20,6)+a.transform(t,"hhmmssSSS")+/\.[^\.]+/.exec(e.name)}getCompanyId(){if(this.company)return this.company;return localStorage.getItem("company")}async queryDomain(){let e=new Parse.Query("Company"),i=await e.get(this.getCompanyId());i.get("configQiniu")&&i.get("configQiniu").domain?(console.log(i.get("configQiniu").domain),this.qiniuDomain=i.get("configQiniu").domain):this.qiniuDomain="https://file-cloud.fmode.cn"}async saveAttachment(e,i,t,a){let o=e.url;o.startsWith("http")||(o=i+o),o=o.replace(/undefined\//,""),a||(a=localStorage.getItem("company"));let r=Parse.User.current(),n=new Parse.Query("Attachment");n.equalTo("url",o);let s=await n.first();if(s&&s.id)return console.error("该文件已存在,无需重复上传"),s;return s=new(Parse.Object.extend("Attachment")),s.set("size",e.size),s.set("url",o),s.set("name",e.name),s.set("mime",e.type),s.set("md5",e?.md5),r?.id&&s.set("user",r.toPointer()),a&&s.set("company",{__type:"Pointer",className:"Company",objectId:localStorage.getItem("company")}),t&&s.set("category",{__type:"Pointer",className:"Category",objectId:t}),await s.save()}async captureVideo(e){if(this.qiniuConf=e,!this.isCapacitor())return;let i=await this.cameraCaptureVideoFile(),t=await this.getMediaFileDataString(i);return await this.saveQiniuMediaFile(i,t)}async cameraCaptureVideoFile(){let e=MediaCapture,i=await e.captureVideo({limit:1});return i?.length>0?i[0]:null}async getMediaFileDataString(e){new FilesystemWeb,e.fullPath.replaceAll("///","//");let i=await Filesystem.stat({path:e.fullPath}),t=Capacitor.convertFileSrc(i.uri),a=await fetch(t),o=await a.blob();if(console.log(o.size),console.log(JSON.stringify(i)),console.log(JSON.stringify(a)),console.log(JSON.stringify(Object.keys(a))),o)return o;throw"读取文件失败"}async takePicture(e){if(this.qiniuConf=e,!this.isCapacitor())return;await this.getUptoken();let i=await this.cameraTakePictureDataUrl();if(!i?.dataUrl)return;let t=await this.base64ToBlob(i?.dataUrl),a=await this.saveQiniuImageFile(t,i?.format);return console.log(JSON.stringify(a)),a}async cameraTakePictureDataUrl(){if(!this.isCapacitor())return;return await Camera.getPhoto({quality:90,allowEditing:!1,source:CameraSource.Camera,resultType:CameraResultType.DataUrl})}async saveQiniuImageFile(e,i,t,a){let o=this.maxSize;if(e.size>o)throw await console.log("照片过大,超出限制5MB"),"超出文件大小";let r=new DatePipe("en").transform(new Date,"yyyyMMddHHmmss"),n=`${r}.${i}`,s=`image/${i}`,l={fname:n,params:{},mimeType:"image/*"},c={useCdnDomain:!0,forceDirect:!0};console.log(this.qiniuConf);let m=this.genFileKey({id:r,name:n});return console.log("图片上传前"),new Promise(((i,t)=>{console.log("进入了上传"),qiniu.upload(e,m,this.qiniuConf?.uptoken,l,c).subscribe({next:e=>{console.log(e),a&&a(e)},error:async e=>{console.log(e)},complete:t=>{console.log("上传完成"),console.log(`${this.qiniuConf?.domain}${t.key}`),t.url=`${this.qiniuConf?.domain}${t.key}`,t.name=n,t.type=s,t.size=e.size,i(t)}})}))}async saveQiniuMediaFile(e,i,t,a){let o=e.name,r=e.type;if(e.size>104857600)throw console.log("视频过大,超出限制100MB"),"超出文件大小";let n=new DatePipe("en").transform(new Date,"yyyyMMddHHmmss"),s={fname:o,params:{},mimeType:r},l={useCdnDomain:!0,forceDirect:!0},c=this.genFileKey({id:n,name:o});return console.log("图片上传前"),console.log(e.name,i.size),console.log(i.size),console.log(i.size/1024/1024),new Promise(((t,o)=>{console.log("进入了上传"),qiniu.upload(i,c,this.qiniuConf?.uptoken,s,l).subscribe({next:e=>{console.log("主要用来展示进度"),a&&a(e),console.log(JSON.stringify(e))},error:async e=>{console.log("上传失败"),console.log(JSON.stringify(e))},complete:i=>{console.log("上传完成"),console.log(JSON.stringify(i)),e.key=i.key,console.log(e.type),e.url=`${this.qiniuConf?.domain}${i.key}`,console.log(e.url),t(e)}})}))}async base64ToBlobType(e,i){let t=await fetch(`data:${i};base64,${e}`);return await t.blob()}async base64ToBlob(e){let i=await fetch(e);return await i.blob()}fileToBlob(e){const i=e.slice(0,e.size,e.type);return new Blob([i],{type:e.type})}genMd5(e){return CryptoJS.MD5(e).toString()}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})}static{this.ɵprov=i0.ɵɵngDeclareInjectable({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:NovaUploadService,providedIn:"root"})}}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:NovaUploadService,decorators:[{type:Injectable,args:[{providedIn:"root"}]}],ctorParameters:()=>[{type:i1.Platform},{type:i2.Diagnostic}]});
9
- var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9zdG9yYWdlL3NlcnZpY2UtdXBsb2FkL25vdmEtdXBsb2FkLnNlcnZpY2UubWpz`
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
- * @copyright © 未来飞马 © 未来全栈 www.fmode.cn
4
- * 版权所有 © 未来飞马 © 江西脑控科技有限公司 Copyright © Fmode Technology Co., Ltd.
5
- * 保留所有权利 All Rights Reserved.
6
- * /home/ryan/workspace/nova/nova-admin/dist/fmode-ng/esm2022/lib/storage/service-upload/util-file-md5.mjs
7
- */
8
- import SparkMD5 from"spark-md5";export function calcFileMd5(r){return new Promise(((e,o)=>{const n=new FileReader;n.onload=r=>{try{const n=r.target?.result;if(n){const r=new SparkMD5.ArrayBuffer;r.append(n);const o=r.end();e(o)}else o(new Error("Failed to load file"))}catch(r){o(r)}},n.onerror=r=>{o(r)},n.readAsArrayBuffer(r)}))}
9
- var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9zdG9yYWdlL3NlcnZpY2UtdXBsb2FkL3V0aWwtZmlsZS1tZDUubWpz`
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=